diff --git a/.config/lingua.dic b/.config/lingua.dic new file mode 100644 index 0000000000000000000000000000000000000000..74981374ca7e6ebbbb169df0f32ab9b7456d479c --- /dev/null +++ b/.config/lingua.dic @@ -0,0 +1,88 @@ +90 +annualised/MS +Apache-2.0/M +api/SM +API/SM +APIs +async +BFT/M +bitfield/MS +blake2/MS +blockchain/MS +borked +BTC/S +CLI/MS +config/MS +crypto/MS +customizable/B +debian/M +decodable/MS +DOT/S +ed25519 +enum/MS +ERC-20 +ethereum/MS +externality/MS +extrinsic/MS +extrinsics +fedora/M +GiB/S +GPL/M +GPLv3/M +Handler/MS +https +inherent/MS +initialize/RG +instantiate/B +intrinsic/MS +intrinsics +io +js +keccak256/M +KSM/S +kusama/S +KYC/M +merkle/MS +misbehavior/SM +misbehaviors +MIT/M +multivalidator/SM +oneshot/MS +others' +parablock/MS +parachain/MS +parameterize/D +polkadot/MS +pov-block/MS +PoV/MS +promethius +promethius' +provisioner/MS +redhat/M +repo/MS +RPC/MS +runtime/MS +rustc/MS +sr25519 +struct/MS +subsystem/MS +subsystems' +taskmanager/MS +teleport/RG +teleportation/SM +teleporter/SM +teleporters +testnet/MS +trie/MS +trustless/Y +ubuntu/M +union/MSG +unservable/B +validator/SM +w3f/MS +wasm/M +WND/S +XCM/S +XCMP/M +include/BG +isolate/BG \ No newline at end of file diff --git a/.config/spellcheck.toml b/.config/spellcheck.toml new file mode 100644 index 0000000000000000000000000000000000000000..0e7d6b1309b16180cc6175cc754fbfa64639f901 --- /dev/null +++ b/.config/spellcheck.toml @@ -0,0 +1,12 @@ +[hunspell] +lang = "en_US" +search_dirs = ["."] +extra_dictionaries = ["lingua.dic"] + +[hunspell.quirks] +# `Type`'s +# 5x +# He tagged it as 'TheGreatestOfAllTimes' +transform_regex = ["^'([^\\s])'$", "^[0-9]+(?:\\.[0-9]*)?x$", "^'s$", "^\\+$"] +allow_concatenation = true +allow_dashes = true diff --git a/.github/ISSUE_TEMPLATE/release.md b/.github/ISSUE_TEMPLATE/release.md new file mode 100644 index 0000000000000000000000000000000000000000..7dcf9ed1908e3c747278fd8f7e129ea0ac889889 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/release.md @@ -0,0 +1,142 @@ +--- +name: Release issue template +about: Tracking issue for new releases +title: Polkadot {{ env.VERSION }} Release checklist +--- +# Release Checklist + +This is the release checklist for Polkadot {{ env.VERSION }}. **All** following +checks should be completed before publishing a new release of the +Polkadot/Kusama/Westend runtime or client. The current release candidate can be +checked out with `git checkout release-{{ env.VERSION }}` + +### Runtime Releases + +These checks should be performed on the codebase prior to forking to a release- +candidate branch. + +- [ ] Verify [`spec_version`](#spec-version) has been incremented since the + last release for any native runtimes from any existing use on public + (non-private/test) networks. +- [ ] Verify previously [completed migrations](#old-migrations-removed) are + removed for any public (non-private/test) networks. +- [ ] Verify pallet and [extrinsic ordering](#extrinsic-ordering) has stayed + the same. Bump `transaction_version` if not. +- [ ] Verify new extrinsics have been correctly whitelisted/blacklisted for + [proxy filters](#proxy-filtering). +- [ ] Verify [benchmarks](#benchmarks) have been updated for any modified + runtime logic. + +The following checks can be performed after we have forked off to the release- +candidate branch. + +- [ ] Verify [new migrations](#new-migrations) complete successfully, and the + runtime state is correctly updated for any public (non-private/test) + networks. +- [ ] Verify [Polkadot JS API](#polkadot-js) are up to date with the latest + runtime changes. + +### All Releases + +- [ ] Check that the new client versions have [run on the network](#burn-in) + without issue for 12 hours. +- [ ] Check that a draft release has been created at + https://github.com/paritytech/polkadot/releases with relevant [release + notes](#release-notes) +- [ ] Check that [build artifacts](#build-artifacts) have been added to the + draft-release + +## Notes + +### Burn In + +Ensure that Parity DevOps has run the new release on Westend, Kusama, and +Polkadot validators for at least 12 hours prior to publishing the release. + +### Build Artifacts + +Add any necessary assets to the release. They should include: + +- Linux binary +- GPG signature of the Linux binary +- SHA256 of binary +- Source code +- Wasm binaries of any runtimes + +### Release notes + +The release notes should list: + +- The priority of the release (i.e., how quickly users should upgrade) - this is + based on the max priority of any *client* changes. +- Which native runtimes and their versions are included +- The proposal hashes of the runtimes as built with + [srtool](https://gitlab.com/chevdor/srtool) +- Any changes in this release that are still awaiting audit + +The release notes may also list: + +- Free text at the beginning of the notes mentioning anything important + regarding this release +- Notable changes (those labelled with B[1-9]-* labels) separated into sections + +### Spec Version + +A runtime upgrade must bump the spec number. This may follow a pattern with the +client release (e.g. runtime v12 corresponds to v0.8.12, even if the current +runtime is not v11). + +### Old Migrations Removed + +Any previous `on_runtime_upgrade` functions from old upgrades must be removed +to prevent them from executing a second time. The `on_runtime_upgrade` function +can be found in `runtime//src/lib.rs`. + +### New Migrations + +Ensure that any migrations that are required due to storage or logic changes +are included in the `on_runtime_upgrade` function of the appropriate pallets. + +### Extrinsic Ordering + +Offline signing libraries depend on a consistent ordering of call indices and +functions. Compare the metadata of the current and new runtimes and ensure that +the `module index, call index` tuples map to the same set of functions. In case +of a breaking change, increase `transaction_version`. + +To verify the order has not changed: + +1. Download the latest release-candidate binary either from the draft-release +on Github, or +[AWS](https://releases.parity.io/polkadot/x86_64-debian:stretch/{{ env.VERSION }}-rc1/polkadot) +(adjust the rc in this URL as necessary). +2. Run the release-candidate binary using a local chain: +`./polkadot --chain=polkadot-local` or `./polkadot --chain=kusama.local` +3. Use [`polkadot-js-tools`](https://github.com/polkadot-js/tools) to compare +the metadata: + - For Polkadot: `docker run --network host jacogr/polkadot-js-tools metadata wss://rpc.polkadot.io ws://localhost:9944` + - For Kusama: `docker run --network host jacogr/polkadot-js-tools metadata wss://kusama-rpc.polkadot.io ws://localhost:9944` +4. Things to look for in the output are lines like: + - `[Identity] idx 28 -> 25 (calls 15)` - indicates the index for `Identity` has changed + - `[+] Society, Recovery` - indicates the new version includes 2 additional modules/pallets. + - If no indices have changed, every modules line should look something like `[Identity] idx 25 (calls 15)` + +Note: Adding new functions to the runtime does not constitute a breaking change +as long as they are added to the end of a pallet (i.e., does not break any +other call index). + +### Proxy Filtering + +The runtime contains proxy filters that map proxy types to allowable calls. If +the new runtime contains any new calls, verify that the proxy filters are up to +date to include them. + +### Benchmarks + +Run the benchmarking suite with the new runtime and update any function weights +if necessary. + +### Polkadot JS + +Ensure that a release of [Polkadot JS API]() contains any new types or +interfaces necessary to interact with the new runtime. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000000000000000000000000000000000..f2b6dfc4f0ec1f01a54f2933ca561532e94ba14a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +version: 2 +updates: + - package-ecosystem: "cargo" + directory: "/" + labels: ["A2-insubstantial", "B0-silent", "C1-low"] + # Handle updates for crates from github.com/paritytech/substrate manually. + ignore: + - dependency-name: "substrate-*" + - dependency-name: "sc-*" + - dependency-name: "sp-*" + - dependency-name: "frame-*" + - dependency-name: "fork-tree" + - dependency-name: "pallet-*" + schedule: + interval: "daily" diff --git a/.github/workflows/burnin-label-notification.yml b/.github/workflows/burnin-label-notification.yml index 203685b706d59da2dbc6f5f6a7c26c01f9e6723c..5b9fbcab96625c114d886be475b504096529a22d 100644 --- a/.github/workflows/burnin-label-notification.yml +++ b/.github/workflows/burnin-label-notification.yml @@ -9,7 +9,7 @@ jobs: steps: - name: Notify devops if: github.event.label.name == 'A1-needsburnin' - uses: s3krit/matrix-message-action@v0.0.2 + uses: s3krit/matrix-message-action@v0.0.3 with: room_id: ${{ secrets.POLKADOT_DEVOPS_MATRIX_ROOM_ID }} access_token: ${{ secrets.POLKADOT_DEVOPS_MATRIX_ACCESS_TOKEN }} diff --git a/.github/workflows/publish-docker-release.yml b/.github/workflows/publish-docker-release.yml new file mode 100644 index 0000000000000000000000000000000000000000..811849c561a5bb5d813f9069eca89ab75d165247 --- /dev/null +++ b/.github/workflows/publish-docker-release.yml @@ -0,0 +1,43 @@ +name: Publish Docker image for new releases + +on: + release: + types: + - published + +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - name: Cache Docker layers + uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + - name: Login to Dockerhub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + id: docker_build + uses: docker/build-push-action@v2 + with: + push: true + file: scripts/docker/release.Dockerfile + tags: | + parity/polkadot:latest + parity/polkadot:${{ github.event.release.tag_name }} + build-args: | + POLKADOT_VERSION=${{ github.event.release.tag_name }} + VCS_REF=${{ github.ref }} + BUILD_DATE=${{ github.event.release.published_at }} + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache + - name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/.github/workflows/publish-draft-release.yml b/.github/workflows/publish-draft-release.yml index b81c9f739e6d98ef3da13d0c6f545107aecf00a9..05b5dc652ea63f54405d1a98e4fd89932c61f610 100644 --- a/.github/workflows/publish-draft-release.yml +++ b/.github/workflows/publish-draft-release.yml @@ -3,7 +3,8 @@ name: Publish draft release on: push: tags: - - v**.**.** + # Catches v1.2.3 and v1.2.3-rc1 + - v[0-9]+.[0-9]+.[0-9]+* jobs: build-runtimes: @@ -12,12 +13,12 @@ jobs: matrix: runtime: ['polkadot', 'kusama'] container: - image: chevdor/srtool:nightly-2020-07-20 + image: paritytech/srtool:nightly-2020-10-27 volumes: - ${{ github.workspace }}:/build env: PACKAGE: ${{ matrix.runtime }}-runtime - RUSTC_VERSION: nightly-2020-07-20 + RUSTC_VERSION: nightly-2020-10-27 steps: - uses: actions/checkout@v2 - name: Cache target dir @@ -99,19 +100,6 @@ jobs: release_name: Polkadot ${{ github.ref }} body_path: ./release_text.md draft: true - - post_to_matrix: - runs-on: ubuntu-latest - needs: publish-draft-release - steps: - - name: Internal polkadot channel - uses: s3krit/matrix-message-action@v0.0.2 - with: - room_id: ${{ secrets.INTERNAL_POLKADOT_MATRIX_ROOM_ID }} - access_token: ${{ secrets.MATRIX_ACCESS_TOKEN }} - message: "**New version of polkadot tagged**: ${{ github.ref }}
Gav: Draft release created: ${{ needs.publish-draft-release.outputs.release_url }}" - server: "matrix.parity.io" - publish-runtimes: runs-on: ubuntu-latest needs: ['publish-draft-release'] @@ -141,3 +129,15 @@ jobs: asset_path: ./${{ matrix.runtime }}_runtime.compact.wasm asset_name: ${{ matrix.runtime }}_runtime-v${{ steps.get-runtime-ver.outputs.runtime_ver }}.compact.wasm asset_content_type: application/wasm + + post_to_matrix: + runs-on: ubuntu-latest + needs: publish-draft-release + steps: + - name: Internal polkadot channel + uses: s3krit/matrix-message-action@v0.0.2 + with: + room_id: ${{ secrets.INTERNAL_POLKADOT_MATRIX_ROOM_ID }} + access_token: ${{ secrets.MATRIX_ACCESS_TOKEN }} + message: "**New version of polkadot tagged**: ${{ github.ref }}
Draft release created: ${{ needs.publish-draft-release.outputs.release_url }}" + server: "matrix.parity.io" diff --git a/.github/workflows/release-bot.yml b/.github/workflows/release-bot.yml index a153cddb056a8f9ce3b5599671a5963974dd60db..0b37a2c6245c3a88d415b8cc848be37162750d1f 100644 --- a/.github/workflows/release-bot.yml +++ b/.github/workflows/release-bot.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Internal Release Notes Channel - uses: s3krit/matrix-message-action@v0.0.2 + uses: s3krit/matrix-message-action@v0.0.3 with: room_id: ${{ secrets.MATRIX_ROOM_ID }} access_token: ${{ secrets.MATRIX_ACCESS_TOKEN }} @@ -16,7 +16,7 @@ jobs: server: "matrix.parity.io" - name: Validator Lounge - uses: s3krit/matrix-message-action@v0.0.2 + uses: s3krit/matrix-message-action@v0.0.3 with: room_id: ${{ secrets.VALIDATOR_LOUNGE_MATRIX_ROOM_ID }} access_token: ${{ secrets.MATRIX_ACCESS_TOKEN }} @@ -24,7 +24,7 @@ jobs: server: "matrix.parity.io" - name: Polkadot Announcements - uses: s3krit/matrix-message-action@v0.0.2 + uses: s3krit/matrix-message-action@v0.0.3 with: room_id: ${{ secrets.KUSAMA_ANNOUNCEMENTS_MATRIX_ROOM_ID }} access_token: ${{ secrets.MATRIX_ACCESS_TOKEN }} diff --git a/.github/workflows/release-candidate.yml b/.github/workflows/release-candidate.yml new file mode 100644 index 0000000000000000000000000000000000000000..515d9a143b4f0bd2d2caa75ccb1ca5705c5de4c8 --- /dev/null +++ b/.github/workflows/release-candidate.yml @@ -0,0 +1,57 @@ +name: Release-candidate automation +on: + push: + branches: + - release-v[0-9]+.[0-9]+.[0-9]+ +jobs: + tag_rc: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - id: compute_tag + name: Compute next rc tag + shell: bash + run: | + # Get last rc tag if exists, else set it to {version}-rc1 + version=${GITHUB_REF#refs/heads/release-} + echo "$version" + echo "::set-output name=version::$version" + git tag -l + last_rc=$(git tag -l "$version-rc*" | sort -V | tail -n 1) + if [ -n "$last_rc" ]; then + suffix=$(echo "$last_rc" | grep -Eo '[0-9]+$') + echo $suffix + ((suffix++)) + echo $suffix + echo "::set-output name=new_tag::$version-rc$suffix" + echo "::set-output name=first_rc::false" + else + echo "::set-output name=new_tag::$version-rc1" + echo "::set-output name=first_rc::true" + fi + - name: Apply new tag + uses: tvdias/github-tagger@v0.0.2 + with: + # We can't use the normal GITHUB_TOKEN for the following reason: + # https://docs.github.com/en/actions/reference/events-that-trigger-workflows#triggering-new-workflows-using-a-personal-access-token + # RELEASE_BRANCH_TOKEN requires public_repo OAuth scope + repo-token: "${{ secrets.RELEASE_BRANCH_TOKEN }}" + tag: ${{ steps.compute_tag.outputs.new_tag }} + - id: create-issue + uses: JasonEtco/create-an-issue@v2 + # Only create the issue if it's the first release candidate + if: steps.compute_tag.outputs.first_rc == 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VERSION: ${{ steps.compute_tag.outputs.version }} + with: + filename: .github/ISSUE_TEMPLATE/release.md + - uses: s3krit/matrix-message-action@v0.0.2 + if: steps.create-issue.outputs.url != '' + with: + room_id: ${{ secrets.INTERNAL_POLKADOT_MATRIX_ROOM_ID }} + access_token: ${{ secrets.MATRIX_ACCESS_TOKEN }} + server: "matrix.parity.io" + message: "Release process for polkadot ${{ steps.compute_tag.outputs.version }} has been started. Tracking issue: ${{ steps.create-issue.outputs.url }}" diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b83725cb0e061002d80d8863617c99614722a047..0dac0d005f9d0bedb474b3bd5e494b5c6186ea96 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,6 +13,11 @@ stages: image: paritytech/ci-linux:production +workflow: + rules: + - if: $CI_COMMIT_TAG + - if: $CI_COMMIT_BRANCH + variables: GIT_STRATEGY: fetch GIT_DEPTH: 100 @@ -53,19 +58,19 @@ variables: - sccache -s .build-refs: &build-refs - only: - - master - - schedules - - web - - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + rules: + - if: $CI_PIPELINE_SOURCE == "web" + - if: $CI_PIPELINE_SOURCE == "schedule" + - if: $CI_COMMIT_REF_NAME == "master" + - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 .test-refs: &test-refs - only: - - master - - schedules - - web - - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 - - /^[0-9]+$/ + rules: + - if: $CI_PIPELINE_SOURCE == "web" + - if: $CI_PIPELINE_SOURCE == "schedule" + - if: $CI_COMMIT_REF_NAME == "master" + - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs + - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 #### stage: test @@ -73,8 +78,8 @@ check-runtime: stage: test image: paritytech/tools:latest <<: *kubernetes-env - only: - - /^[0-9]+$/ + rules: + - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs variables: GITLAB_API: "https://gitlab.parity.io/api/v4" GITHUB_API_PROJECT: "parity%2Finfrastructure%2Fgithub-api" @@ -87,8 +92,8 @@ check-line-width: stage: test image: paritytech/tools:latest <<: *kubernetes-env - only: - - /^[0-9]+$/ + rules: + - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs script: - ./scripts/gitlab/check_line_width.sh interruptible: true @@ -97,7 +102,6 @@ check-line-width: test-deterministic-wasm: stage: test <<: *docker-env - except: script: - ./scripts/gitlab/test_deterministic_wasm.sh @@ -112,6 +116,9 @@ test-linux-stable: &test # but still want to have debug assertions. RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" TARGET: native + artifacts: + paths: + - ./target/release/polkadot script: - ./scripts/gitlab/test_linux_stable.sh - sccache -s @@ -137,14 +144,24 @@ check-runtime-benchmarks: &test - ./scripts/gitlab/check_runtime_benchmarks.sh - sccache -s +check-transaction-versions: + image: node:15 + stage: build + needs: + - job: test-linux-stable + before_script: + - npm install -g @polkadot/metadata-cmp + - git fetch origin release + script: "scripts/gitlab/check_extrinsics_ordering.sh" + build-wasm-release: stage: build <<: *collect-artifacts <<: *docker-env <<: *compiler_info - # Note: We likely only want to do this for tagged releases, hence the 'only:' - only: - - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + # Note: We likely only want to do this for tagged releases, hence the 'rules:' + rules: + - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 script: - time wasm-pack build --target web --out-dir wasm --release cli -- --no-default-features --features browser - mkdir -p ./artifacts/wasm @@ -155,9 +172,17 @@ build-wasm-release: build-linux-release: &build stage: build <<: *collect-artifacts - <<: *build-refs <<: *docker-env <<: *compiler_info + rules: + # .build-refs with manual on PRs + - if: $CI_PIPELINE_SOURCE == "web" + - if: $CI_PIPELINE_SOURCE == "schedule" + - if: $CI_COMMIT_REF_NAME == "master" + - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs + when: manual + allow_failure: true script: - time cargo build --release --verbose - mkdir -p ./artifacts @@ -177,19 +202,6 @@ build-linux-release: &build - cp -r scripts/docker/* ./artifacts - sccache -s -build-linux-release-pr: &build - stage: build - <<: *collect-artifacts - <<: *test-refs - <<: *docker-env - <<: *compiler_info - script: - - time cargo build --release --verbose - - mkdir -p ./artifacts - - mv ./target/release/polkadot ./artifacts/. - - sha256sum ./artifacts/polkadot | tee ./artifacts/polkadot.sha256 - when: manual - generate-impl-guide: stage: build image: @@ -213,33 +225,37 @@ generate-impl-guide: - EXTRATAG="$(cat ./artifacts/EXTRATAG)" - echo "Polkadot version = ${VERSION} (EXTRATAG ${EXTRATAG})" -publish-docker-release: +publish-docker: <<: *publish-build - image: docker:stable - services: - - docker:dind + image: quay.io/buildah/stable <<: *collect-artifacts + # Don't run on releases - this is handled by the Github Action here: + # .github/workflows/publish-docker-release.yml + rules: + - if: $CI_PIPELINE_SOURCE == "web" + - if: $CI_PIPELINE_SOURCE == "schedule" + - if: $CI_COMMIT_REF_NAME == "master" variables: - DOCKER_HOST: tcp://localhost:2375 - DOCKER_DRIVER: overlay2 GIT_STRATEGY: none # DOCKERFILE: scripts/docker/Dockerfile - CONTAINER_IMAGE: parity/polkadot + IMAGE_NAME: docker.io/parity/polkadot script: - - test "$Docker_Hub_User_Parity" -a "$Docker_Hub_Pass_Parity" - || ( echo "no docker credentials provided"; exit 1 ) - - docker login -u "$Docker_Hub_User_Parity" -p "$Docker_Hub_Pass_Parity" - - docker info + - test "$Docker_Hub_User_Parity" -a "$Docker_Hub_Pass_Parity" || + ( echo "no docker credentials provided"; exit 1 ) - cd ./artifacts - - docker build - --build-arg VCS_REF="${CI_COMMIT_SHA}" - --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" - --tag $CONTAINER_IMAGE:$VERSION - --tag $CONTAINER_IMAGE:$EXTRATAG . - - docker push $CONTAINER_IMAGE:$VERSION - - docker push $CONTAINER_IMAGE:$EXTRATAG + - buildah bud + --format=docker + --build-arg VCS_REF="${CI_COMMIT_SHA}" + --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" + --tag "$IMAGE_NAME:$VERSION" + --tag "$IMAGE_NAME:$EXTRATAG" . + - echo "$Docker_Hub_Pass_Parity" | + buildah login --username "$Docker_Hub_User_Parity" --password-stdin docker.io + - buildah info + - buildah push --format=v2s2 "$IMAGE_NAME:$VERSION" + - buildah push --format=v2s2 "$IMAGE_NAME:$EXTRATAG" after_script: - - docker logout + - buildah logout "$IMAGE_NAME" # only VERSION information is needed for the deployment - find ./artifacts/ -depth -not -name VERSION -not -name artifacts -delete @@ -288,7 +304,7 @@ check-labels: stage: .post image: paritytech/tools:latest <<: *kubernetes-env - only: - - /^[0-9]+$/ + rules: + - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs script: - ./scripts/gitlab/check_labels.sh diff --git a/Cargo.lock b/Cargo.lock index f43d0053ba2198f37268433895df6f06e3d1d1b1..84793ba8b02122584e66c47bb06cc4d809f74628 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,7 +31,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" dependencies = [ - "generic-array 0.14.2", + "generic-array 0.14.4", ] [[package]] @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4925647ee64e5056cf231608957ce7c81e12d6d6e316b9ce1404778cc1d35fa7" dependencies = [ "block-cipher", - "byteorder 1.3.4", + "byteorder", "opaque-debug 0.2.3", ] @@ -81,18 +81,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f33b5018f120946c1dcf279194f238a9f146725593ead1c08fa47ff22b0b5d3" -dependencies = [ - "const-random", -] - -[[package]] -name = "ahash" -version = "0.3.8" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" +checksum = "f6789e291be47ace86a60303502173d84af8327e3627ecf334356ee0f87a164c" [[package]] name = "aho-corasick" @@ -103,17 +94,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "alga" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f823d037a7ec6ea2197046bafd4ae150e6bc36f9ca347404f46a46823fa84f2" -dependencies = [ - "approx", - "num-complex", - "num-traits 0.2.12", -] - [[package]] name = "ansi_term" version = "0.11.0" @@ -134,9 +114,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.31" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bb70cc08ec97ca5450e6eba421deeea5f172c0fc61f78b5357b2a8e8be195f" +checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7" [[package]] name = "approx" @@ -170,9 +150,9 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "asn1_der" @@ -190,17 +170,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d0864d84b8e07b145449be9a8537db86bf9de5ce03b913214694643b4743502" dependencies = [ "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "assert_cmd" -version = "0.12.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936fcf2c692b37c696cd0002c57752b2d9478402450c9ca4a463f6afae16d6f5" +checksum = "3dc1679af9a1ab4bea16f228b05d18f8363f8327b1fa8db00d2760cfafc6b61e" dependencies = [ "doc-comment", - "escargot", "predicates", "predicates-core", "predicates-tree", @@ -209,15 +188,15 @@ dependencies = [ [[package]] name = "assert_matches" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" +checksum = "695579f0f2520f3774bb40461e5adb066459d4e0af4d59d20175484fb8e9edf1" [[package]] name = "async-channel" -version = "1.1.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee81ba99bee79f3c8ae114ae4baa7eaa326f63447cf2ec65e4393618b63f8770" +checksum = "59740d83946db6a5af71ae25ddf9562c2b176b2ca42cf99a455f09f4a220d6b9" dependencies = [ "concurrent-queue", "event-listener", @@ -226,94 +205,143 @@ dependencies = [ [[package]] name = "async-executor" -version = "0.1.2" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d373d78ded7d0b3fa8039375718cde0aace493f2e34fb60f51cbf567562ca801" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "once_cell", + "vec-arena", +] + +[[package]] +name = "async-global-executor" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f47c78ea98277cb1f5e6f60ba4fc762f5eafe9f6511bc2f7dfd8b75c225650" +checksum = "124ac8c265e407641c3362b8f4d39cdb4e243885b71eef087be27199790f5a3a" dependencies = [ + "async-executor", "async-io", "futures-lite", - "multitask", - "parking", - "scoped-tls", - "waker-fn", + "num_cpus", + "once_cell", ] [[package]] name = "async-io" -version = "0.1.5" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8126ef9fb99355c6fd27575d691be4887b884137a5b6f48c2d961f13590c51" +checksum = "9315f8f07556761c3e48fec2e6b276004acf426e6dc068b2c2251854d65ee0fd" dependencies = [ - "cfg-if", "concurrent-queue", + "fastrand", "futures-lite", "libc", - "once_cell 1.4.0", + "log", + "nb-connect", + "once_cell", "parking", - "socket2", + "polling", "vec-arena", - "wepoll-sys-stjepang", + "waker-fn", + "winapi 0.3.9", +] + +[[package]] +name = "async-mutex" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-process" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8cea09c1fb10a317d1b5af8024eeba256d6554763e85ecd90ff8df31c7bbda" +dependencies = [ + "async-io", + "blocking", + "cfg-if 0.1.10", + "event-listener", + "futures-lite", + "once_cell", + "signal-hook", "winapi 0.3.9", ] [[package]] name = "async-std" -version = "1.6.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00d68a33ebc8b57800847d00787307f84a562224a14db069b0acefe4c2abbf5d" +checksum = "8f9f84f1280a2b436a2c77c2582602732b6c2f4321d5494d6e799e6c367859a8" dependencies = [ - "async-task", - "crossbeam-utils", + "async-channel", + "async-global-executor", + "async-io", + "async-mutex", + "async-process", + "blocking", + "crossbeam-utils 0.8.1", "futures-channel", "futures-core", "futures-io", - "futures-timer 3.0.2", + "futures-lite", + "gloo-timers", "kv-log-macro", - "log 0.4.11", + "log", "memchr", "num_cpus", - "once_cell 1.4.0", - "pin-project-lite", + "once_cell", + "pin-project-lite 0.2.0", "pin-utils", "slab", - "smol 0.1.18", "wasm-bindgen-futures", ] [[package]] name = "async-task" -version = "3.0.0" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17772156ef2829aadc587461c7753af20b7e8db1529bc66855add962a3b35d3" +checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0" [[package]] name = "async-tls" -version = "0.8.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df097e3f506bec0e1a24f06bb3c962c228f36671de841ff579cb99f371772634" +checksum = "2f23d769dbf1838d5df5156e7b1ad404f4c463d1ac2c6aeb6cd943630f8a8400" dependencies = [ - "futures 0.3.5", - "rustls", + "futures-core", + "futures-io", + "rustls 0.19.0", "webpki", - "webpki-roots 0.19.0", + "webpki-roots", ] [[package]] name = "async-trait" -version = "0.1.36" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a265e3abeffdce30b2e26b7a11b222fe37c6067404001b434101457d0385eb92" +checksum = "8d3a45e77e34375a7923b1e8febb049bb011f064714a8e17a1a616fef01da13d" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "atomic" -version = "0.4.6" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f46ca51dca4837f1520754d1c8c36636356b81553d928dc9c177025369a06e" +checksum = "c3410529e8288c463bedb5930f82833bc0c90e5d2fe639a56582a4d09220b281" +dependencies = [ + "autocfg", +] [[package]] name = "atomic-waker" @@ -332,12 +360,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "autocfg" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" - [[package]] name = "autocfg" version = "1.0.0" @@ -351,7 +373,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46254cf2fdcdf1badb5934448c1bcbe046a56537b3987d96c51a7afc5d03f293" dependencies = [ "addr2line", - "cfg-if", + "cfg-if 0.1.10", "libc", "miniz_oxide", "object 0.20.0", @@ -376,13 +398,19 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + [[package]] name = "bincode" version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" dependencies = [ - "byteorder 1.3.4", + "byteorder", "serde", ] @@ -394,15 +422,15 @@ checksum = "66c0bb6167449588ff70803f4127f0684f9063097eca5016f37eb52b92c2cf36" dependencies = [ "bitflags", "cexpr", - "cfg-if", + "cfg-if 0.1.10", "clang-sys", "clap", - "env_logger", + "env_logger 0.7.1", "lazy_static", "lazycell", - "log 0.4.11", + "log", "peeking_take_while", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", "regex", "rustc-hash", @@ -410,33 +438,12 @@ dependencies = [ "which", ] -[[package]] -name = "bip39" -version = "0.6.0-beta.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7059804e226b3ac116519a252d7f5fb985a5ccc0e93255e036a5f7e7283323f4" -dependencies = [ - "failure", - "hashbrown 0.1.8", - "hmac", - "once_cell 0.1.8", - "pbkdf2", - "rand 0.6.5", - "sha2 0.8.2", -] - [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "bitmask" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" - [[package]] name = "bitvec" version = "0.17.4" @@ -454,7 +461,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84ce5b6108f8e154604bd4eb76a2f726066c3464d5a552a4229262a18c9bb471" dependencies = [ "byte-tools", - "byteorder 1.3.4", + "byteorder", "crypto-mac 0.8.0", "digest 0.9.0", "opaque-debug 0.2.3", @@ -477,18 +484,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" dependencies = [ "arrayref", - "arrayvec 0.5.1", - "constant_time_eq", -] - -[[package]] -name = "blake2s_simd" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab9e07352b829279624ceb7c64adb4f585dacdb81d35cafae81139ccd617cf44" -dependencies = [ - "arrayref", - "arrayvec 0.5.1", + "arrayvec 0.5.2", "constant_time_eq", ] @@ -498,9 +494,9 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ - "block-padding", + "block-padding 0.1.5", "byte-tools", - "byteorder 1.3.4", + "byteorder", "generic-array 0.12.3", ] @@ -510,7 +506,8 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array 0.14.2", + "block-padding 0.2.1", + "generic-array 0.14.4", ] [[package]] @@ -519,7 +516,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa136449e765dc7faa244561ccae839c394048667929af599b5d931ebe7b7f10" dependencies = [ - "generic-array 0.14.2", + "generic-array 0.14.4", ] [[package]] @@ -532,37 +529,30 @@ dependencies = [ ] [[package]] -name = "blocking" -version = "0.4.7" +name = "block-padding" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2468ff7bf85066b4a3678fede6fe66db31846d753ff0adfbfab2c6a6e81612b" -dependencies = [ - "async-channel", - "atomic-waker", - "futures-lite", - "once_cell 1.4.0", - "parking", - "waker-fn", -] +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" [[package]] name = "blocking" -version = "0.5.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e94bf99b692f54c9d05f97454d3faf11134523fe5b180564a3fb6ed63bcc0a" +checksum = "c5e170dbede1f740736619b776d7251cb1b9095c435c34d8ca9f57fcd2f335e9" dependencies = [ "async-channel", + "async-task", "atomic-waker", + "fastrand", "futures-lite", - "once_cell 1.4.0", - "waker-fn", + "once_cell", ] [[package]] name = "bs58" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bstr" @@ -573,6 +563,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "build-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" +dependencies = [ + "semver 0.6.0", +] + [[package]] name = "bumpalo" version = "3.4.0" @@ -591,12 +590,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" -[[package]] -name = "byteorder" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" - [[package]] name = "byteorder" version = "1.3.4" @@ -609,7 +602,7 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" dependencies = [ - "byteorder 1.3.4", + "byteorder", "either", "iovec", ] @@ -621,16 +614,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] -name = "c_linked_list" +name = "cache-padded" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" +checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" [[package]] -name = "cache-padded" -version = "1.1.1" +name = "cargo_metadata" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" +checksum = "83f95cf4bf0dda0ac2e65371ae7215d0dce3c187613a9dbf23aaa9374186f97a" +dependencies = [ + "semver 0.11.0", + "semver-parser 0.10.0", + "serde", + "serde_json", +] [[package]] name = "cc" @@ -656,13 +655,19 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + [[package]] name = "chacha20" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "086c0f07ac275808b7bf9a39f2fd013aae1498be83632814c8c4e0bd53f2dc58" dependencies = [ - "stream-cipher 0.4.1", + "stream-cipher", "zeroize", ] @@ -675,7 +680,7 @@ dependencies = [ "aead", "chacha20", "poly1305", - "stream-cipher 0.4.1", + "stream-cipher", "zeroize", ] @@ -692,6 +697,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "cipher" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +dependencies = [ + "generic-array 0.14.4", +] + [[package]] name = "clang-sys" version = "0.29.3" @@ -737,52 +751,59 @@ dependencies = [ ] [[package]] -name = "concurrent-queue" -version = "1.1.1" +name = "color-eyre" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83c06aff61f2d899eb87c379df3cbf7876f14471dcab474e0b6dc90ab96c080" +checksum = "7b29030875fd8376e4a28ef497790d5b4a7843d8d1396bf08ce46f5eec562c5c" dependencies = [ - "cache-padded", + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", ] [[package]] -name = "console_error_panic_hook" +name = "color-spantrace" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211" +checksum = "b6eee477a4a8a72f4addd4de416eb56d54bc307b284d6601bafdee1f4ea462d1" dependencies = [ - "cfg-if", - "wasm-bindgen", + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", ] [[package]] -name = "console_log" -version = "0.1.2" +name = "concurrent-queue" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7871d2947441b0fdd8e2bd1ce2a2f75304f896582c0d572162d48290683c48" +checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" dependencies = [ - "log 0.4.11", - "web-sys", + "cache-padded", ] [[package]] -name = "const-random" -version = "0.1.8" +name = "console_error_panic_hook" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f1af9ac737b2dd2d577701e59fd09ba34822f6f2ebdb30a7647405d9e55e16a" +checksum = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211" dependencies = [ - "const-random-macro", - "proc-macro-hack", + "cfg-if 0.1.10", + "wasm-bindgen", ] [[package]] -name = "const-random-macro" -version = "0.1.8" +name = "console_log" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e4c606eb459dd29f7c57b2e0879f2b6f14ee130918c2b78ccb58a9624e6c7a" +checksum = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494" dependencies = [ - "getrandom", - "proc-macro-hack", + "log", + "web-sys", ] [[package]] @@ -828,16 +849,16 @@ version = "0.66.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d9badfe36176cb653506091693bc2bb1970c9bddfcd6ec7fac404f7eaec6f38" dependencies = [ - "byteorder 1.3.4", + "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", "gimli 0.21.0", - "log 0.4.11", + "log", "regalloc", "serde", - "smallvec 1.4.2", + "smallvec 1.6.1", "target-lexicon", "thiserror", ] @@ -874,8 +895,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ef419efb4f94ecc02e5d9fbcc910d2bb7f0040e2de570e63a454f883bc891d6" dependencies = [ "cranelift-codegen", - "log 0.4.11", - "smallvec 1.4.2", + "log", + "smallvec 1.6.1", "target-lexicon", ] @@ -899,7 +920,7 @@ dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", - "log 0.4.11", + "log", "serde", "thiserror", "wasmparser 0.59.0", @@ -911,7 +932,7 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", ] [[package]] @@ -921,7 +942,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" dependencies = [ "crossbeam-epoch", - "crossbeam-utils", + "crossbeam-utils 0.7.2", "maybe-uninit", ] @@ -931,13 +952,13 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ - "autocfg 1.0.0", - "cfg-if", - "crossbeam-utils", + "autocfg", + "cfg-if 0.1.10", + "crossbeam-utils 0.7.2", "lazy_static", "maybe-uninit", "memoffset", - "scopeguard 1.1.0", + "scopeguard", ] [[package]] @@ -946,8 +967,8 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" dependencies = [ - "cfg-if", - "crossbeam-utils", + "cfg-if 0.1.10", + "crossbeam-utils 0.7.2", "maybe-uninit", ] @@ -957,8 +978,19 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ - "autocfg 1.0.0", - "cfg-if", + "autocfg", + "cfg-if 0.1.10", + "lazy_static", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", "lazy_static", ] @@ -984,7 +1016,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array 0.14.2", + "generic-array 0.14.4", "subtle 2.2.3", ] @@ -997,14 +1029,25 @@ dependencies = [ "sct", ] +[[package]] +name = "ctor" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbaabec2c953050352311293be5c6aba8e141ba19d6811862b232d6fd020484" +dependencies = [ + "quote 1.0.7", + "syn 1.0.58", +] + [[package]] name = "cuckoofilter" -version = "0.3.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" +checksum = "b810a8449931679f64cd7eef1bbd0fa315801b6d5d9cdc1ace2804d6529eee18" dependencies = [ - "byteorder 0.5.3", - "rand 0.3.23", + "byteorder", + "fnv", + "rand 0.7.3", ] [[package]] @@ -1013,7 +1056,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d85653f070353a16313d0046f173f70d1aadd5b42600a14de626f0dfb3473a5" dependencies = [ - "byteorder 1.3.4", + "byteorder", "digest 0.8.1", "rand_core 0.5.1", "subtle 2.2.3", @@ -1021,46 +1064,33 @@ dependencies = [ ] [[package]] -name = "data-encoding" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72aa14c04dfae8dd7d8a2b1cb7ca2152618cd01336dbfe704b8dcbf8d41dbd69" - -[[package]] -name = "derive_more" -version = "0.14.1" +name = "curve25519-dalek" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" +checksum = "c8492de420e9e60bc9a1d66e2dbb91825390b738a388606600663fc529b4b307" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "rustc_version", - "syn 0.15.44", + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle 2.2.3", + "zeroize", ] [[package]] -name = "derive_more" -version = "0.15.0" +name = "data-encoding" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a141330240c921ec6d074a3e188a7c7ef95668bb95e7d44fa0e5778ec2a7afe" -dependencies = [ - "lazy_static", - "proc-macro2 0.4.30", - "quote 0.6.13", - "regex", - "rustc_version", - "syn 0.15.44", -] +checksum = "993a608597367c6377b258c25d7120740f00ed23a2252b729b1932dd7866f908" [[package]] name = "derive_more" -version = "0.99.9" +version = "0.99.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298998b1cf6b5b2c8a7b023dfd45821825ce3ba8a8af55c921a0e734e4653f76" +checksum = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -1084,7 +1114,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.2", + "generic-array 0.14.4", ] [[package]] @@ -1093,7 +1123,16 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "551a778172a450d7fc12e629ca3b0428d00f6afa9a43da1b630d54604e97371c" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", + "dirs-sys", +] + +[[package]] +name = "directories" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fed639d60b58d0f53498ab13d26f621fd77569cc6edb031f4cc36a2ad9da0f" +dependencies = [ "dirs-sys", ] @@ -1110,9 +1149,9 @@ dependencies = [ [[package]] name = "dlmalloc" -version = "0.1.4" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35055b1021724f4eb5262eb49130eebff23fc59fc5a14160e05faad8eeb36673" +checksum = "332570860c2edf2d57914987bf9e24835425f75825086b6ba7d1e6a3e4f1f254" dependencies = [ "libc", ] @@ -1123,8 +1162,8 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" dependencies = [ - "byteorder 1.3.4", - "quick-error", + "byteorder", + "quick-error 1.2.3", ] [[package]] @@ -1149,9 +1188,9 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -1160,12 +1199,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c53dc3a653e0f64081026e4bf048d48fec9fce90c66e8326ca7292df0ff2d82" -[[package]] -name = "easy-parallel" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd4afd79212583ff429b913ad6605242ed7eec277e950b1438f300748f948f4" - [[package]] name = "ed25519" version = "1.0.1" @@ -1177,15 +1210,15 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "1.0.0-pre.4" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a8a37f4e8b35af971e6db5e3897e7a6344caa3f92f6544f88125a1f5f0035a" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ - "curve25519-dalek", + "curve25519-dalek 3.0.0", "ed25519", "rand 0.7.3", "serde", - "sha2 0.8.2", + "sha2 0.9.1", "zeroize", ] @@ -1219,9 +1252,9 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -1231,17 +1264,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" dependencies = [ "atty", - "humantime", - "log 0.4.11", + "humantime 1.3.0", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "env_logger" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26ecb66b4bdca6c1409b40fb255eefc2bd4f6d135dab3c3124f80ffa2a9661e" +dependencies = [ + "atty", + "humantime 2.0.1", + "log", "regex", "termcolor", ] [[package]] name = "environmental" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516aa8d7a71cb00a1c4146f0798549b93d083d4f189b3ced8f3de6b8f11ee6c4" +checksum = "6576a1755ddffd988788025e75bce9e74b018f7cc226198fe931d077911c6d7e" [[package]] name = "erased-serde" @@ -1273,23 +1319,11 @@ dependencies = [ "libc", ] -[[package]] -name = "escargot" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74cf96bec282dcdb07099f7e31d9fed323bca9435a09aba7b6d99b7617bca96d" -dependencies = [ - "lazy_static", - "log 0.4.11", - "serde", - "serde_json", -] - [[package]] name = "event-listener" -version = "2.2.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "699d84875f1b72b4da017e6b0f77dfa88c0137f089958a88974d15938cbc2976" +checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" [[package]] name = "exit-future" @@ -1297,7 +1331,17 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", +] + +[[package]] +name = "eyre" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534ce924bff9118be8b28b24ede6bf7e96a00b53e4ded25050aa7b526e051e1a" +dependencies = [ + "indenter", + "once_cell", ] [[package]] @@ -1316,9 +1360,9 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", "synstructure", ] @@ -1336,30 +1380,34 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "1.3.3" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36a9cb09840f81cd211e435d00a4e487edd263dc3c8ff815c32dd76ad668ebed" +checksum = "ca5faf057445ce5c9d4329e382b2ce7ca38550ef3b73a5348362d5f24e0c7fe3" +dependencies = [ + "instant", +] [[package]] name = "fdlimit" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47bc6e222b8349b2bd0acb85a1d16d22852376b3ceed2a7f09c2692c3d8a78d0" +checksum = "2c4c9e43643f5a3be4ca5b67d26b98031ff9db6806c3440ae32e02e3ceac3f1b" dependencies = [ "libc", ] [[package]] name = "femme" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b6b21baebbed15551f2170010ca4101b9ed3fdc05822791c8bd4631840eab81" +checksum = "2af1a24f391a5a94d756db5092c6576aad494b88a71a5a36b20c67b63e0df034" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "js-sys", - "log 0.4.11", + "log", "serde", "serde_derive", + "serde_json", "wasm-bindgen", "web-sys", ] @@ -1370,8 +1418,8 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b3937f028664bd0e13df401ba49a4567ccda587420365823242977f06609ed1" dependencies = [ - "env_logger", - "log 0.4.11", + "env_logger 0.7.1", + "log", ] [[package]] @@ -1381,9 +1429,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8feb87a63249689640ac9c011742c33139204e3c134293d3054022276869133b" dependencies = [ "either", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 2.0.2", - "log 0.4.11", + "log", "num-traits 0.2.12", "parity-scale-codec", "parking_lot 0.9.0", @@ -1391,12 +1439,12 @@ dependencies = [ [[package]] name = "fixed-hash" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11498d382790b7a8f2fd211780bec78619bba81cdad3a283997c0c41f836759c" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" dependencies = [ - "byteorder 1.3.4", - "rand 0.7.3", + "byteorder", + "rand 0.8.1", "rustc-hex", "static_assertions", ] @@ -1413,7 +1461,7 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68c90b0fc46cf89d227cc78b40e494ff81287a92dd07631e5af0d06fe3cf885e" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "crc32fast", "libc", "libz-sys", @@ -1428,16 +1476,26 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", ] +[[package]] +name = "form_urlencoded" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00" +dependencies = [ + "matches", + "percent-encoding 2.1.0", +] + [[package]] name = "frame-benchmarking" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", @@ -1454,17 +1512,22 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ + "Inflector", + "chrono", "frame-benchmarking", + "handlebars", "parity-scale-codec", "sc-cli", "sc-client-db", "sc-executor", "sc-service", + "serde", "sp-core", "sp-externalities", + "sp-keystore", "sp-runtime", "sp-state-machine", "structopt", @@ -1472,13 +1535,14 @@ dependencies = [ [[package]] name = "frame-executive" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", "serde", + "sp-core", "sp-io", "sp-runtime", "sp-std", @@ -1487,8 +1551,8 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "11.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "12.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "serde", @@ -1498,19 +1562,19 @@ dependencies = [ [[package]] name = "frame-support" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "bitmask", + "bitflags", "frame-metadata", "frame-support-procedural", - "impl-trait-for-tuples", - "log 0.4.11", - "once_cell 1.4.0", + "impl-trait-for-tuples 0.2.0", + "log", + "once_cell", "parity-scale-codec", "paste", "serde", - "smallvec 1.4.2", + "smallvec 1.6.1", "sp-arithmetic", "sp-core", "sp-inherents", @@ -1523,44 +1587,45 @@ dependencies = [ [[package]] name = "frame-support-procedural" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ + "Inflector", "frame-support-procedural-tools", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "frame-support-procedural-tools" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "frame-support-procedural-tools-derive" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "frame-system" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", - "impl-trait-for-tuples", + "impl-trait-for-tuples 0.2.0", "parity-scale-codec", "serde", "sp-core", @@ -1572,8 +1637,8 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", @@ -1586,8 +1651,8 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "sp-api", @@ -1641,9 +1706,9 @@ checksum = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" [[package]] name = "futures" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" +checksum = "9b3b0c040a1fe6529d30b3c5944b280c7f0dcb2930d2c3062bca967b602583d0" dependencies = [ "futures-channel", "futures-core", @@ -1656,34 +1721,19 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" +checksum = "4b7109687aa4e177ef6fe84553af6280ef2778bdb7783ba44c9dc3399110fe64" dependencies = [ "futures-core", "futures-sink", ] -[[package]] -name = "futures-channel-preview" -version = "0.3.0-alpha.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5e5f4df964fa9c1c2f8bddeb5c3611631cacd93baf810fc8bb2fb4b495c263a" -dependencies = [ - "futures-core-preview", -] - [[package]] name = "futures-core" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" - -[[package]] -name = "futures-core-preview" -version = "0.3.0-alpha.19" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35b6263fb1ef523c3056565fa67b1d16f0a8604ff12b11b08c25f28a734c60a" +checksum = "847ce131b72ffb13b6109a221da9ad97a64cbe48feb1028356b836b47b8f1748" [[package]] name = "futures-cpupool" @@ -1702,20 +1752,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdcef58a173af8148b182684c9f2d5250875adbcaff7b5794073894f9d8634a9" dependencies = [ "futures 0.1.29", - "futures 0.3.5", + "futures 0.3.8", "lazy_static", - "log 0.4.11", + "log", "parking_lot 0.9.0", - "pin-project", + "pin-project 0.4.23", "serde", "serde_json", ] [[package]] name = "futures-executor" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" +checksum = "4caa2b2b68b880003057c1dd49f1ed937e38f22fcf6c212188a121f08cf40a65" dependencies = [ "futures-core", "futures-task", @@ -1725,50 +1775,50 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" +checksum = "611834ce18aaa1bd13c4b374f5d653e1027cf99b6b502584ff8c9a64413b30bb" [[package]] name = "futures-lite" -version = "0.1.10" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe71459749b2e8e66fb95df721b22fa08661ad384a0c5b519e11d3893b4692a" +checksum = "5e6c079abfac3ab269e2927ec048dabc89d009ebfdda6b8ee86624f30c689658" dependencies = [ "fastrand", "futures-core", "futures-io", "memchr", "parking", - "pin-project-lite", + "pin-project-lite 0.1.7", "waker-fn", ] [[package]] name = "futures-macro" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" +checksum = "77408a692f1f97bcc61dc001d752e00643408fbc922e4d634c655df50d595556" dependencies = [ "proc-macro-hack", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "futures-sink" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" +checksum = "f878195a49cee50e006b02b93cf7e0a95a38ac7b776b4c4d9cc1207cd20fcb3d" [[package]] name = "futures-task" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" +checksum = "7c554eb5bf48b2426c4771ab68c6b14468b6e76cc90996f528c3338d761a4d0d" dependencies = [ - "once_cell 1.4.0", + "once_cell", ] [[package]] @@ -1789,9 +1839,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" +checksum = "d304cff4a7b99cfb7986f7d43fbe93d175e72e704a8860787cc95e9ffd85cbd2" dependencies = [ "futures 0.1.29", "futures-channel", @@ -1801,25 +1851,13 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project", + "pin-project 1.0.3", "pin-utils", "proc-macro-hack", "proc-macro-nested", "slab", ] -[[package]] -name = "futures-util-preview" -version = "0.3.0-alpha.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce968633c17e5f97936bd2797b6e38fb56cf16a7422319f7ec2e30d3c470e8d" -dependencies = [ - "futures-channel-preview", - "futures-core-preview", - "pin-utils", - "slab", -] - [[package]] name = "futures_codec" version = "0.4.1" @@ -1827,9 +1865,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce54d63f8b0c75023ed920d46fd71d0cbbb830b0ee012726b5b4f506fb6dea5b" dependencies = [ "bytes 0.5.6", - "futures 0.3.5", + "futures 0.3.8", "memchr", - "pin-project", + "pin-project 0.4.23", ] [[package]] @@ -1838,6 +1876,19 @@ version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" +[[package]] +name = "generator" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cdc09201b2e8ca1b19290cf7e65de2246b8e91fb6874279722189c4de7b94dc" +dependencies = [ + "cc", + "libc", + "log", + "rustc_version", + "winapi 0.3.9", +] + [[package]] name = "generic-array" version = "0.12.3" @@ -1849,45 +1900,45 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.2" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac746a5f3bbfdadd6106868134545e684693d54d9d44f6e9588a7d54af0bf980" +checksum = "0ed1e761351b56f54eb9dcd0cfaca9fd0daecf93918e1cfc01c8a3d26ee7adcd" dependencies = [ "typenum", - "version_check", ] [[package]] -name = "get_if_addrs" -version = "0.5.3" +name = "generic-array" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" dependencies = [ - "c_linked_list", - "get_if_addrs-sys", - "libc", - "winapi 0.2.8", + "typenum", + "version_check", ] [[package]] -name = "get_if_addrs-sys" -version = "0.1.1" +name = "getrandom" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" dependencies = [ - "gcc", + "cfg-if 0.1.10", "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.1.14" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +checksum = "4060f4657be78b8e766215b02b18a2e862d83745545de804638e2b545e81aee6" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", + "js-sys", "libc", - "wasi", + "wasi 0.10.0+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -1932,7 +1983,7 @@ dependencies = [ "aho-corasick", "bstr", "fnv", - "log 0.4.11", + "log", "regex", ] @@ -1955,13 +2006,13 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" dependencies = [ - "byteorder 1.3.4", + "byteorder", "bytes 0.4.12", "fnv", "futures 0.1.29", "http 0.1.21", "indexmap", - "log 0.4.11", + "log", "slab", "string", "tokio-io", @@ -1980,12 +2031,26 @@ dependencies = [ "futures-util", "http 0.2.1", "indexmap", - "log 0.4.11", + "log", "slab", "tokio 0.2.21", "tokio-util", ] +[[package]] +name = "handlebars" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2764f9796c0ddca4b82c07f25dd2cb3db30b9a8f47940e78e1c883d9e95c3db9" +dependencies = [ + "log", + "pest", + "pest_derive", + "quick-error 2.0.0", + "serde", + "serde_json", +] + [[package]] name = "hash-db" version = "0.15.2" @@ -2003,32 +2068,11 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" -dependencies = [ - "byteorder 1.3.4", - "scopeguard 0.3.3", -] - -[[package]] -name = "hashbrown" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" -dependencies = [ - "ahash 0.2.18", - "autocfg 0.1.7", -] - -[[package]] -name = "hashbrown" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab9b7860757ce258c89fd48d28b68c41713e597a7b09e793f6c6a6e2ea37c827" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" dependencies = [ - "ahash 0.3.8", - "autocfg 1.0.0", + "ahash", ] [[package]] @@ -2055,31 +2099,12 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" -[[package]] -name = "hex-literal" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "961de220ec9a91af2e1e5bd80d02109155695e516771762381ef8581317066e0" -dependencies = [ - "hex-literal-impl", - "proc-macro-hack", -] - [[package]] name = "hex-literal" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5af1f635ef1bc545d78392b136bfe1c9809e029023c84a3638a864a10b8819c8" -[[package]] -name = "hex-literal-impl" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "853f769599eb31de176303197b7ba4973299c38c7a7604a6bc88c3eef05b9b46" -dependencies = [ - "proc-macro-hack", -] - [[package]] name = "hex_fmt" version = "0.3.0" @@ -2096,6 +2121,16 @@ dependencies = [ "digest 0.8.1", ] +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac 0.8.0", + "digest 0.9.0", +] + [[package]] name = "hmac-drbg" version = "0.2.0" @@ -2104,7 +2139,7 @@ checksum = "c6e570451493f10f6581b48cdd530413b63ea9e780f544bfd3bdcaa0d89d1a7b" dependencies = [ "digest 0.8.1", "generic-array 0.12.3", - "hmac", + "hmac 0.7.1", ] [[package]] @@ -2157,15 +2192,27 @@ version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" +[[package]] +name = "httpdate" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" + [[package]] name = "humantime" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" dependencies = [ - "quick-error", + "quick-error 1.2.3", ] +[[package]] +name = "humantime" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c1ad908cc71012b7bea4d0c53ba96a8cba9962f048fa68d143376143d863b7a" + [[package]] name = "hyper" version = "0.12.35" @@ -2181,13 +2228,13 @@ dependencies = [ "httparse", "iovec", "itoa", - "log 0.4.11", + "log", "net2", "rustc_version", "time", "tokio 0.1.22", "tokio-buf", - "tokio-executor 0.1.10", + "tokio-executor", "tokio-io", "tokio-reactor", "tokio-tcp", @@ -2198,9 +2245,9 @@ dependencies = [ [[package]] name = "hyper" -version = "0.13.6" +version = "0.13.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e7655b9594024ad0ee439f3b5a7299369dc2a3f459b47c696f9ff676f9aa1f" +checksum = "f6ad767baac13b44d4529fcf58ba2cd0995e36e7b435bc5b039de6f47e880dbf" dependencies = [ "bytes 0.5.6", "futures-channel", @@ -2210,13 +2257,13 @@ dependencies = [ "http 0.2.1", "http-body 0.3.1", "httparse", + "httpdate", "itoa", - "log 0.4.11", - "pin-project", + "pin-project 1.0.3", "socket2", - "time", "tokio 0.2.21", "tower-service", + "tracing", "want 0.3.0", ] @@ -2229,9 +2276,9 @@ dependencies = [ "bytes 0.5.6", "ct-logs", "futures-util", - "hyper 0.13.6", - "log 0.4.11", - "rustls", + "hyper 0.13.9", + "log", + "rustls 0.18.0", "rustls-native-certs", "tokio 0.2.21", "tokio-rustls", @@ -2260,6 +2307,43 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "if-addrs" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28538916eb3f3976311f5dfbe67b5362d0add1293d0a9cad17debf86f8e3aa48" +dependencies = [ + "if-addrs-sys", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "if-addrs-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de74b9dd780476e837e5eb5ab7c88b49ed304126e412030a0adba99c8efe79ea" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "if-watch" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d7c5e361e6b05c882b4847dd98992534cebc6fcde7f4bc98225bcf10fd6d0d" +dependencies = [ + "async-io", + "futures 0.3.8", + "futures-lite", + "if-addrs", + "ipnet", + "libc", + "log", + "winapi 0.3.9", +] + [[package]] name = "impl-codec" version = "0.4.2" @@ -2284,18 +2368,36 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef5550a42e3740a0e71f909d4c861056a284060af885ae7aa6242820f920d9d" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.58", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f65a8ecf74feeacdab8d38cb129e550ca871cccaa7d1921d8636ecd75534903" +dependencies = [ + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] +[[package]] +name = "indenter" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0bd112d44d9d870a6819eb505d04dd92b5e4d94bb8c304924a0872ae7016fb5" + [[package]] name = "indexmap" -version = "1.4.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c398b2b113b55809ceb9ee3e753fcbac793f1956663f3c36549c1346015c2afe" +checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" dependencies = [ - "autocfg 1.0.0", + "autocfg", + "hashbrown", "serde", ] @@ -2304,6 +2406,17 @@ name = "instant" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b141fdc7836c525d4d594027d318c84161ca17aaf8113ab1f81ab93ae897485" +dependencies = [ + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "integer-encoding" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4ebd0bd29be0f11973e9b3e219005661042a019fd757798c36a47c87852625" [[package]] name = "integer-sqrt" @@ -2317,7 +2430,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64fa110ec7b8f493f416eed552740d10e7030ad5f63b2308f82c9608ec2df275" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "futures-timer 2.0.2", ] @@ -2398,24 +2511,24 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.41" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b9172132a62451e56142bff9afc91c8e4a4500aa5b847da36815b63bfda916" +checksum = "cf3d7383929f7c9c7c2d0fa596f325832df98c3704f2c60553080f7127a58175" dependencies = [ "wasm-bindgen", ] [[package]] name = "jsonrpc-client-transports" -version = "14.2.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecbdaacc17243168d9d1fa6b2bd7556a27e1e60a621d8a2a6e590ae2b145d158" +checksum = "489b9c612e60c766f751ab40fcb43cbb55a1e10bb44a9b4307ed510ca598cbd7" dependencies = [ "failure", "futures 0.1.29", "jsonrpc-core", "jsonrpc-pubsub", - "log 0.4.11", + "log", "serde", "serde_json", "url 1.7.2", @@ -2423,12 +2536,12 @@ dependencies = [ [[package]] name = "jsonrpc-core" -version = "14.2.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0747307121ffb9703afd93afbd0fb4f854c38fb873f2c8b90e0e902f27c7b62" +checksum = "0745a6379e3edc893c84ec203589790774e4247420033e71a76d3ab4687991fa" dependencies = [ "futures 0.1.29", - "log 0.4.11", + "log", "serde", "serde_derive", "serde_json", @@ -2436,35 +2549,35 @@ dependencies = [ [[package]] name = "jsonrpc-core-client" -version = "14.2.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34221123bc79b66279a3fde2d3363553835b43092d629b34f2e760c44dc94713" +checksum = "6f764902d7b891344a0acb65625f32f6f7c6db006952143bd650209fbe7d94db" dependencies = [ "jsonrpc-client-transports", ] [[package]] name = "jsonrpc-derive" -version = "14.2.1" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fadf6945e227246825a583514534d864554e9f23d80b3c77d034b10983db5ef" +checksum = "99a847f9ec7bb52149b2786a17c9cb260d6effc6b8eeb8c16b343a487a7563a3" dependencies = [ "proc-macro-crate", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "jsonrpc-http-server" -version = "14.2.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da906d682799df05754480dac1b9e70ec92e12c19ebafd2662a5ea1c9fd6522" +checksum = "4fb5c4513b7b542f42da107942b7b759f27120b5cc894729f88254b28dff44b7" dependencies = [ "hyper 0.12.35", "jsonrpc-core", "jsonrpc-server-utils", - "log 0.4.11", + "log", "net2", "parking_lot 0.10.2", "unicase", @@ -2472,13 +2585,13 @@ dependencies = [ [[package]] name = "jsonrpc-ipc-server" -version = "14.2.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dedccd693325d833963b549e959137f30a7a0ea650cde92feda81dc0c1393cb5" +checksum = "cf50e53e4eea8f421a7316c5f63e395f7bc7c4e786a6dc54d76fab6ff7aa7ce7" dependencies = [ "jsonrpc-core", "jsonrpc-server-utils", - "log 0.4.11", + "log", "parity-tokio-ipc", "parking_lot 0.10.2", "tokio-service", @@ -2486,12 +2599,12 @@ dependencies = [ [[package]] name = "jsonrpc-pubsub" -version = "14.2.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d44f5602a11d657946aac09357956d2841299ed422035edf140c552cb057986" +checksum = "639558e0604013be9787ae52f798506ae42bf4220fe587bdc5625871cc8b9c77" dependencies = [ "jsonrpc-core", - "log 0.4.11", + "log", "parking_lot 0.10.2", "rand 0.7.3", "serde", @@ -2499,15 +2612,15 @@ dependencies = [ [[package]] name = "jsonrpc-server-utils" -version = "14.2.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56cbfb462e7f902e21121d9f0d1c2b77b2c5b642e1a4e8f4ebfa2e15b94402bb" +checksum = "72f1f3990650c033bd8f6bd46deac76d990f9bbfb5f8dc8c4767bf0a00392176" dependencies = [ "bytes 0.4.12", "globset", "jsonrpc-core", "lazy_static", - "log 0.4.11", + "log", "tokio 0.1.22", "tokio-codec", "unicase", @@ -2515,16 +2628,16 @@ dependencies = [ [[package]] name = "jsonrpc-ws-server" -version = "14.2.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903d3109fe7c4acb932b567e1e607e0f524ed04741b09fb0e61841bc40a022fc" +checksum = "6596fe75209b73a2a75ebe1dce4e60e03b88a2b25e8807b667597f6315150d22" dependencies = [ "jsonrpc-core", "jsonrpc-server-utils", - "log 0.4.11", + "log", + "parity-ws", "parking_lot 0.10.2", "slab", - "ws", ] [[package]] @@ -2545,7 +2658,7 @@ dependencies = [ [[package]] name = "kusama-runtime" -version = "0.8.24" +version = "0.8.27" dependencies = [ "bitvec", "frame-benchmarking", @@ -2554,17 +2667,17 @@ dependencies = [ "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", - "hex-literal 0.2.1", + "hex-literal", "libsecp256k1", - "log 0.3.9", + "log", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", "pallet-balances", + "pallet-bounties", "pallet-collective", "pallet-democracy", "pallet-elections-phragmen", - "pallet-finality-tracker", "pallet-grandpa", "pallet-identity", "pallet-im-online", @@ -2584,6 +2697,7 @@ dependencies = [ "pallet-staking", "pallet-staking-reward-curve", "pallet-timestamp", + "pallet-tips", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", @@ -2593,10 +2707,11 @@ dependencies = [ "polkadot-primitives", "polkadot-runtime-common", "rustc-hex", + "separator", "serde", "serde_derive", "serde_json", - "smallvec 1.4.2", + "smallvec 1.6.1", "sp-api", "sp-authority-discovery", "sp-block-builder", @@ -2614,8 +2729,8 @@ dependencies = [ "sp-trie", "sp-version", "static_assertions", - "substrate-wasm-builder-runner", - "tiny-keccak 1.5.0", + "substrate-wasm-builder", + "tiny-keccak", ] [[package]] @@ -2624,61 +2739,62 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" dependencies = [ - "log 0.4.11", + "log", ] [[package]] name = "kvdb" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0315ef2f688e33844400b31f11c263f2b3dc21d8b9355c6891c5f185fae43f9a" +checksum = "92312348daade49976a6dc59263ad39ed54f840aacb5664874f7c9aa16e5f848" dependencies = [ "parity-util-mem", - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] name = "kvdb-memorydb" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73de822b260a3bdfb889dbbb65bb2d473eee2253973d6fa4a5d149a2a4a7c66e" +checksum = "986052a8d16c692eaebe775391f9a3ac26714f3907132658500b601dec94c8c2" dependencies = [ "kvdb", "parity-util-mem", - "parking_lot 0.10.2", + "parking_lot 0.11.1", ] [[package]] name = "kvdb-rocksdb" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44947dd392f09475af614d740fe0320b66d01cb5b977f664bbbb5e45a70ea4c1" +checksum = "8d92c36be64baba5ea549116ff0d7ffd445456a7be8aaee21ec05882b980cd11" dependencies = [ "fs-swap", "kvdb", - "log 0.4.11", + "log", "num_cpus", "owning_ref", "parity-util-mem", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "regex", "rocksdb", - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] name = "kvdb-web" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2701a1369d6ea4f1b9f606db46e5e2a4a8e47f22530a07823d653f85ab1f6c34" +checksum = "f7bfe11b3202691673766b1224c432996f6b8047db17ceb743675bef3404e714" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "js-sys", "kvdb", "kvdb-memorydb", - "log 0.4.11", + "log", "parity-util-mem", - "send_wrapper 0.3.0", + "parking_lot 0.11.1", + "send_wrapper 0.5.0", "wasm-bindgen", "web-sys", ] @@ -2703,9 +2819,9 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" [[package]] name = "libc" -version = "0.2.72" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f8082297d534141b30c8d39e9b1773713ab50fdbe4ff30f750d063b3bfd701" +checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "libloading" @@ -2725,13 +2841,13 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" -version = "0.28.1" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "571f5a4604c1a40d75651da141dfde29ad15329f537a779528803297d2220274" +checksum = "2e17c636b5fe5ff900ccc2840b643074bfac321551d821243a781d0d46f06588" dependencies = [ "atomic", "bytes 0.5.6", - "futures 0.3.5", + "futures 0.3.8", "lazy_static", "libp2p-core", "libp2p-core-derive", @@ -2754,236 +2870,236 @@ dependencies = [ "libp2p-wasm-ext", "libp2p-websocket", "libp2p-yamux", - "multihash", "parity-multiaddr", - "parking_lot 0.10.2", - "pin-project", - "smallvec 1.4.2", + "parking_lot 0.11.1", + "pin-project 1.0.3", + "smallvec 1.6.1", "wasm-timer", ] [[package]] name = "libp2p-core" -version = "0.22.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f13ba8c7df0768af2eb391696d562c7de88cc3a35122531aaa6a7d77754d25" +checksum = "e1cb706da14c064dce54d8864ade6836b3486b51689300da74eeb7053aa4551e" dependencies = [ "asn1_der", "bs58", "ed25519-dalek", "either", "fnv", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", "lazy_static", "libsecp256k1", - "log 0.4.11", + "log", "multihash", "multistream-select", "parity-multiaddr", - "parking_lot 0.10.2", - "pin-project", + "parking_lot 0.11.1", + "pin-project 1.0.3", "prost", "prost-build", "rand 0.7.3", "ring", "rw-stream-sink", - "sha2 0.8.2", - "smallvec 1.4.2", + "sha2 0.9.1", + "smallvec 1.6.1", "thiserror", - "unsigned-varint 0.4.0", + "unsigned-varint", "void", "zeroize", ] [[package]] name = "libp2p-core-derive" -version = "0.20.2" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f753d9324cd3ec14bf04b8a8cd0d269c87f294153d6bf2a84497a63a5ad22213" +checksum = "f4bc40943156e42138d22ed3c57ff0e1a147237742715937622a99b10fbe0156" dependencies = [ "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "libp2p-deflate" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74029ae187f35f4b8ddf26b9779a68b340045d708528a103917cdca49a296db5" +checksum = "e3257a41f376aa23f237231971fee7e350e4d8353cfcf233aef34d6d6b638f0c" dependencies = [ "flate2", - "futures 0.3.5", + "futures 0.3.8", "libp2p-core", ] [[package]] name = "libp2p-dns" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cf319822e08dd65c8e060d2354e9f952895bbc433f5706c75ed010c152aee5e" +checksum = "2e09bab25af01326b4ed9486d31325911437448edda30bc57681502542d49f20" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "libp2p-core", - "log 0.4.11", + "log", ] [[package]] name = "libp2p-floodsub" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a9acb43a3e4a4e413e0c4abe0fa49308df7c6335c88534757b647199cb8a51" +checksum = "6fd8cdd5ef1dd0b7346975477216d752de976b92e43051bc8bd808c372ea6cec" dependencies = [ "cuckoofilter", "fnv", - "futures 0.3.5", + "futures 0.3.8", "libp2p-core", "libp2p-swarm", + "log", "prost", "prost-build", "rand 0.7.3", - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] name = "libp2p-gossipsub" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab20fcb60edebe3173bbb708c6ac3444afdf1e3152dc2866b10c4f5497f17467" +checksum = "d489531aa9d4ba8726a08b3b74e21c2e10a518ad266ebca98d79040123ab0036" dependencies = [ - "base64 0.11.0", - "byteorder 1.3.4", + "base64 0.13.0", + "byteorder", "bytes 0.5.6", "fnv", - "futures 0.3.5", + "futures 0.3.8", "futures_codec", "hex_fmt", "libp2p-core", "libp2p-swarm", - "log 0.4.11", + "log", "lru_time_cache", "prost", "prost-build", "rand 0.7.3", - "sha2 0.8.2", - "smallvec 1.4.2", - "unsigned-varint 0.4.0", + "sha2 0.9.1", + "smallvec 1.6.1", + "unsigned-varint", "wasm-timer", ] [[package]] name = "libp2p-identify" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56396ee63aa9164eacf40c2c5d2bda8c4133c2f57e1b0425d51d3a4e362583b1" +checksum = "c43bc51a9bc3780288c526615ba0f5f8216820ea6dcc02b89e8daee526c5fccb" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "libp2p-core", "libp2p-swarm", - "log 0.4.11", + "log", "prost", "prost-build", - "smallvec 1.4.2", + "smallvec 1.6.1", "wasm-timer", ] [[package]] name = "libp2p-kad" -version = "0.23.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7fa9047f8b8f544278a35c2d9d45d3b2c1785f2d86d4e1629d6edf97be3955" +checksum = "a226956b49438a10f3206480b8faf5e61fc445c349ea9d9cc37766a83745fa9a" dependencies = [ - "arrayvec 0.5.1", + "arrayvec 0.5.2", "bytes 0.5.6", "either", "fnv", - "futures 0.3.5", + "futures 0.3.8", "futures_codec", "libp2p-core", "libp2p-swarm", - "log 0.4.11", - "multihash", + "log", "prost", "prost-build", "rand 0.7.3", - "sha2 0.8.2", - "smallvec 1.4.2", - "uint", - "unsigned-varint 0.4.0", + "sha2 0.9.1", + "smallvec 1.6.1", + "uint 0.8.3", + "unsigned-varint", "void", "wasm-timer", ] [[package]] name = "libp2p-mdns" -version = "0.22.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3173b5a6b2f690c29ae07798d85b9441a131ac76ddae9015ef22905b623d0c69" +checksum = "8a9e12688e8f14008c950c1efde587cb44dbf316fa805f419cd4e524991236f5" dependencies = [ - "async-std", + "async-io", "data-encoding", "dns-parser", - "either", - "futures 0.3.5", + "futures 0.3.8", + "if-watch", "lazy_static", "libp2p-core", "libp2p-swarm", - "log 0.4.11", - "net2", + "log", "rand 0.7.3", - "smallvec 1.4.2", + "smallvec 1.6.1", + "socket2", "void", - "wasm-timer", ] [[package]] name = "libp2p-mplex" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a73a799cc8410b36e40b8f4c4b6babbcb9efd3727111bf517876e4acfa612d3" +checksum = "ce3200fbe6608e623bd9efa459cc8bafa0e4efbb0a2dfcdd0e1387ff4181264b" dependencies = [ "bytes 0.5.6", - "fnv", - "futures 0.3.5", + "futures 0.3.8", "futures_codec", "libp2p-core", - "log 0.4.11", - "parking_lot 0.10.2", - "unsigned-varint 0.4.0", + "log", + "nohash-hasher", + "parking_lot 0.11.1", + "rand 0.7.3", + "smallvec 1.6.1", + "unsigned-varint", ] [[package]] name = "libp2p-noise" -version = "0.24.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef6c490042f549fb1025f2892dfe6083d97a77558f450c1feebe748ca9eb15a" +checksum = "0580e0d18019d254c9c349c03ff7b22e564b6f2ada70c045fc39738e144f2139" dependencies = [ "bytes 0.5.6", - "curve25519-dalek", - "futures 0.3.5", + "curve25519-dalek 3.0.0", + "futures 0.3.8", "lazy_static", "libp2p-core", - "log 0.4.11", + "log", "prost", "prost-build", "rand 0.7.3", - "sha2 0.8.2", + "sha2 0.9.1", "snow", "static_assertions", - "x25519-dalek", + "x25519-dalek 1.1.0", "zeroize", ] [[package]] name = "libp2p-ping" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad063c21dfcea4518ac9e8bd4119d33a5b26c41e674f602f41f05617a368a5c8" +checksum = "50b2ec86a18cbf09d7df440e7786a2409640c774e476e9a3b4d031382c3d7588" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "libp2p-core", "libp2p-swarm", - "log 0.4.11", + "log", "rand 0.7.3", "void", "wasm-timer", @@ -2991,31 +3107,30 @@ dependencies = [ [[package]] name = "libp2p-plaintext" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903a12e99c72dbebefea258de887982adeacc7025baa1ceb10b7fa9928f54791" +checksum = "6a7b1bdcbe46a3a2159c231601ed29645282653c0a96ce3a2ad8352c9fbe6800" dependencies = [ "bytes 0.5.6", - "futures 0.3.5", + "futures 0.3.8", "futures_codec", "libp2p-core", - "log 0.4.11", + "log", "prost", "prost-build", - "rw-stream-sink", - "unsigned-varint 0.4.0", + "unsigned-varint", "void", ] [[package]] name = "libp2p-pnet" -version = "0.19.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d0db10e139d22d7af0b23ed7949449ec86262798aa0fd01595abdbcb02dc87" +checksum = "6ce3374f3b28162db9d3442c9347c4f14cb01e8290052615c7d341d40eae0599" dependencies = [ - "futures 0.3.5", - "log 0.4.11", - "pin-project", + "futures 0.3.8", + "log", + "pin-project 1.0.3", "rand 0.7.3", "salsa20", "sha3", @@ -3023,75 +3138,75 @@ dependencies = [ [[package]] name = "libp2p-request-response" -version = "0.3.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0c9e8a4cd69d97e9646c54313d007512f411aba8c5226cfcda16df6a6e84a3" +checksum = "620e2950decbf77554b5aed3824f7d0e2c04923f28c70f9bff1a402c47ef6b1e" dependencies = [ "async-trait", "bytes 0.5.6", - "futures 0.3.5", + "futures 0.3.8", "libp2p-core", "libp2p-swarm", - "log 0.4.11", - "lru 0.6.0", + "log", + "lru", "minicbor", "rand 0.7.3", - "smallvec 1.4.2", - "unsigned-varint 0.5.1", + "smallvec 1.6.1", + "unsigned-varint", "wasm-timer", ] [[package]] name = "libp2p-swarm" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7193e444210132237b81b755ec7fe53f1c4bd2f53cf719729b94c0c72eb6eaa1" +checksum = "fdf5894ee1ee63a38aa58d58a16e3dcf7ede6b59ea7b22302c00c1a41d7aec41" dependencies = [ "either", - "futures 0.3.5", + "futures 0.3.8", "libp2p-core", - "log 0.4.11", + "log", "rand 0.7.3", - "smallvec 1.4.2", + "smallvec 1.6.1", "void", "wasm-timer", ] [[package]] name = "libp2p-tcp" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f42ec130d7a37a7e47bf4398026b7ad9185c08ed26972e2720f8b94112796f" +checksum = "1d2113a7dab2b502c55fe290910cd7399a2aa04fe70a2f5a415a87a1db600c0e" dependencies = [ "async-std", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", - "get_if_addrs", + "if-addrs", "ipnet", "libp2p-core", - "log 0.4.11", + "log", "socket2", ] [[package]] name = "libp2p-uds" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea7acb0a034f70d7db94c300eba3f65c0f6298820105624088a9609c9974d77" +checksum = "af05fe92c2a3aa320bc82a308ddb7b33bef3b060154c5a4b9fb0b01f15385fc0" dependencies = [ "async-std", - "futures 0.3.5", + "futures 0.3.8", "libp2p-core", - "log 0.4.11", + "log", ] [[package]] name = "libp2p-wasm-ext" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34c1faac6f92c21fbe155417957863ea822fba9e9fd5eb24c0912336a100e63f" +checksum = "37cd44ea05a4523f40183f60ab6e6a80e400a5ddfc98b0df1c55edeb85576cd9" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "js-sys", "libp2p-core", "parity-send-wrapper", @@ -3101,33 +3216,33 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.23.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d650534ebd99f48f6fa292ed5db10d30df2444943afde4407ceeddab8e513fca" +checksum = "270c80528e21089ea25b41dd1ab8fd834bdf093ebee422fed3b68699a857a083" dependencies = [ "async-tls", "either", - "futures 0.3.5", + "futures 0.3.8", "libp2p-core", - "log 0.4.11", + "log", "quicksink", - "rustls", + "rustls 0.19.0", "rw-stream-sink", "soketto", - "url 2.1.1", + "url 2.2.0", "webpki", - "webpki-roots 0.18.0", + "webpki-roots", ] [[package]] name = "libp2p-yamux" -version = "0.25.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781d9b9f043dcdabc40640807125368596b849fd4d96cdca2dcf052fdf6f33fd" +checksum = "36799de9092c35782f080032eddbc8de870f94a0def87cf9f8883efccd5cacf0" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "libp2p-core", - "parking_lot 0.11.0", + "parking_lot 0.11.1", "thiserror", "yamux", ] @@ -3189,31 +3304,21 @@ dependencies = [ [[package]] name = "linregress" -version = "0.1.7" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9290cf6f928576eeb9c096c6fad9d8d452a0a1a70a2bbffa6e36064eedc0aac9" +checksum = "0d0ad4b5cc8385a881c561fac3501353d63d2a2b7a357b5064d71815c9a92724" dependencies = [ - "failure", "nalgebra", "statrs", ] -[[package]] -name = "lock_api" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" -dependencies = [ - "scopeguard 0.3.3", -] - [[package]] name = "lock_api" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" dependencies = [ - "scopeguard 1.1.0", + "scopeguard", ] [[package]] @@ -3222,16 +3327,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28247cc5a5be2f05fbcd76dd0cf2c7d3b5400cb978a28042abcd4fa0b3f8261c" dependencies = [ - "scopeguard 1.1.0", -] - -[[package]] -name = "log" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -dependencies = [ - "log 0.4.11", + "scopeguard", ] [[package]] @@ -3240,32 +3336,36 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", ] [[package]] -name = "lru" -version = "0.4.3" +name = "loom" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0609345ddee5badacf857d4f547e0e5a2e987db77085c24cd887f73573a04237" +checksum = "a0e8460f2f2121162705187214720353c517b97bdfb3494c0b1e33d83ebe4bed" dependencies = [ - "hashbrown 0.6.3", + "cfg-if 0.1.10", + "generator", + "scoped-tls", + "serde", + "serde_json", ] [[package]] name = "lru" -version = "0.6.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111b945ac72ec09eb7bc62a0fbdc3cc6e80555a7245f52a69d3921a75b53b153" +checksum = "3aae342b73d57ad0b8b364bd12584819f2c1fe9114285dfcf8b0722607671635" dependencies = [ - "hashbrown 0.8.0", + "hashbrown", ] [[package]] name = "lru_time_cache" -version = "0.10.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb241df5c4caeb888755363fc95f8a896618dc0d435e9e775f7930cb099beab" +checksum = "ebac060fafad3adedd0c66a80741a92ff4bc8e94a273df2ba3770ab206f2e29a" [[package]] name = "mach" @@ -3334,17 +3434,17 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c198b026e1bbf08a937e94c6c60f9ec4a2267f5b0d2eec9c1b21b061ce2be55f" dependencies = [ - "autocfg 1.0.0", + "autocfg", ] [[package]] name = "memory-db" -version = "0.24.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0777fbb396f666701d939e9b3876c18ada6b3581257d88631f2590bc366d8ebe" +checksum = "6cbd2a22f201c03cc1706a727842490abfea17b7b53260358239828208daba3c" dependencies = [ "hash-db", - "hashbrown 0.8.0", + "hashbrown", "parity-util-mem", ] @@ -3369,30 +3469,41 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6feca46f4fa3443a01769d768727f10c10a20fdb65e52dc16a81f0c8269bb78" dependencies = [ - "byteorder 1.3.4", + "byteorder", "keccak", "rand_core 0.5.1", "zeroize", ] +[[package]] +name = "mick-jaeger" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c023c3f16109e7f33aa451f773fd61070e265b4977d0b6e344a51049296dd7df" +dependencies = [ + "futures 0.3.8", + "rand 0.7.3", + "thrift", +] + [[package]] name = "minicbor" -version = "0.5.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc03ad6f8f548db7194a5ff5a6f96342ecae4e3ef67d2bf18bacc0e245cd041" +checksum = "0164190d1771b1458c3742075b057ed55d25cd9dfb930aade99315a1eb1fe12d" dependencies = [ "minicbor-derive", ] [[package]] name = "minicbor-derive" -version = "0.4.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c214bf3d90099b52f3e4b328ae0fe34837fd0fab683ad1e10fceb4629106df48" +checksum = "2e071b3159835ee91df62dbdbfdd7ec366b7ea77c838f43aff4acda6b61bcfb9" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -3410,13 +3521,13 @@ version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "fuchsia-zircon", "fuchsia-zircon-sys", "iovec", "kernel32-sys", "libc", - "log 0.4.11", + "log", "miow 0.2.1", "net2", "slab", @@ -3430,7 +3541,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" dependencies = [ "lazycell", - "log 0.4.11", + "log", "mio", "slab", ] @@ -3441,7 +3552,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" dependencies = [ - "log 0.4.11", + "log", "mio", "miow 0.3.5", "winapi 0.3.9", @@ -3488,17 +3599,29 @@ checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" [[package]] name = "multihash" -version = "0.11.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75db05d738947aa5389863aadafbcf2e509d7ba099dc2ddcdf4fc66bf7a9e03" +checksum = "fb63389ee5fcd4df3f8727600f4a0c3df53c541f0ed4e8b50a9ae51a80fc1efe" dependencies = [ - "blake2b_simd", - "blake2s_simd", - "digest 0.8.1", - "sha-1", - "sha2 0.8.2", - "sha3", - "unsigned-varint 0.3.3", + "digest 0.9.0", + "generic-array 0.14.4", + "multihash-derive", + "sha2 0.9.1", + "unsigned-varint", +] + +[[package]] +name = "multihash-derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f5653449cd45d502a53480ee08d7a599e8f4893d2bacb33c63d65bc20af6c1a" +dependencies = [ + "proc-macro-crate", + "proc-macro-error", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.58", + "synstructure", ] [[package]] @@ -3509,43 +3632,33 @@ checksum = "d8883adfde9756c1d30b0f519c9b8c502a94b41ac62f696453c37c7fc0a958ce" [[package]] name = "multistream-select" -version = "0.8.2" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9157e87afbc2ef0d84cc0345423d715f445edde00141c93721c162de35a05e5" +checksum = "dda822043bba2d6da31c4e14041f9794f8fb130a5959289038d0b809d8888614" dependencies = [ "bytes 0.5.6", - "futures 0.3.5", - "log 0.4.11", - "pin-project", - "smallvec 1.4.2", - "unsigned-varint 0.4.0", -] - -[[package]] -name = "multitask" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c09c35271e7dcdb5f709779111f2c8e8ab8e06c1b587c1c6a9e179d865aaa5b4" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", + "futures 0.3.8", + "log", + "pin-project 1.0.3", + "smallvec 1.6.1", + "unsigned-varint", ] [[package]] name = "nalgebra" -version = "0.18.1" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaa9fddbc34c8c35dd2108515587b8ce0cab396f17977b8c738568e4edb521a2" +checksum = "d6b6147c3d50b4f3cdabfe2ecc94a0191fd3d6ad58aefd9664cf396285883486" dependencies = [ - "alga", "approx", - "generic-array 0.12.3", + "generic-array 0.13.2", "matrixmultiply", "num-complex", "num-rational", "num-traits 0.2.12", - "rand 0.6.5", + "rand 0.7.3", + "rand_distr", + "simba", "typenum", ] @@ -3558,13 +3671,23 @@ dependencies = [ "rand 0.3.23", ] +[[package]] +name = "nb-connect" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8123a81538e457d44b933a02faf885d3fe8408806b23fa700e8f01c6c3a98998" +dependencies = [ + "libc", + "winapi 0.3.9", +] + [[package]] name = "net2" version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "libc", "winapi 0.3.9", ] @@ -3577,7 +3700,7 @@ checksum = "b7fd5681d13fda646462cfbd4e5f2051279a89a544d50eb98c365b507246839f" dependencies = [ "bitflags", "bytes 0.4.12", - "cfg-if", + "cfg-if 0.1.10", "gcc", "libc", "void", @@ -3585,15 +3708,14 @@ dependencies = [ [[package]] name = "nix" -version = "0.17.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" +checksum = "b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2" dependencies = [ "bitflags", "cc", - "cfg-if", + "cfg-if 1.0.0", "libc", - "void", ] [[package]] @@ -3624,7 +3746,7 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ - "autocfg 1.0.0", + "autocfg", "num-integer", "num-traits 0.2.12", ] @@ -3635,7 +3757,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" dependencies = [ - "autocfg 1.0.0", + "autocfg", "num-traits 0.2.12", ] @@ -3645,7 +3767,7 @@ version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" dependencies = [ - "autocfg 1.0.0", + "autocfg", "num-traits 0.2.12", ] @@ -3655,7 +3777,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" dependencies = [ - "autocfg 1.0.0", + "autocfg", "num-bigint", "num-integer", "num-traits 0.2.12", @@ -3676,7 +3798,7 @@ version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" dependencies = [ - "autocfg 1.0.0", + "autocfg", "libm", ] @@ -3709,21 +3831,18 @@ dependencies = [ [[package]] name = "once_cell" -version = "0.1.8" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" +checksum = "260e51e7efe62b592207e9e13a68e43692a7a279171d6ba57abd208bf23645ad" dependencies = [ - "parking_lot 0.7.1", + "parking_lot 0.11.1", ] [[package]] -name = "once_cell" -version = "1.4.0" +name = "oorandom" +version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" -dependencies = [ - "parking_lot 0.10.2", -] +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "opaque-debug" @@ -3743,6 +3862,24 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" +[[package]] +name = "ordered-float" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3741934be594d77de1c8461ebcbbe866f585ea616a9753aa78f2bdc69f0e4579" +dependencies = [ + "num-traits 0.2.12", +] + +[[package]] +name = "output_vt100" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "owning_ref" version = "0.4.1" @@ -3752,10 +3889,16 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "owo-colors" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13370dae44474229701bb69b90b4f4dca6404cb0357a2d50d635f1171dc3aa7b" + [[package]] name = "pallet-authority-discovery" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", @@ -3770,12 +3913,12 @@ dependencies = [ [[package]] name = "pallet-authorship" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", - "impl-trait-for-tuples", + "impl-trait-for-tuples 0.2.0", "parity-scale-codec", "sp-authorship", "sp-inherents", @@ -3785,8 +3928,8 @@ dependencies = [ [[package]] name = "pallet-babe" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", @@ -3810,8 +3953,8 @@ dependencies = [ [[package]] name = "pallet-balances" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", @@ -3823,77 +3966,75 @@ dependencies = [ ] [[package]] -name = "pallet-collective" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +name = "pallet-bounties" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "pallet-treasury", "parity-scale-codec", "serde", - "sp-core", - "sp-io", "sp-runtime", "sp-std", ] [[package]] -name = "pallet-democracy" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +name = "pallet-collective" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", "serde", + "sp-core", "sp-io", "sp-runtime", "sp-std", ] [[package]] -name = "pallet-elections-phragmen" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +name = "pallet-democracy" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", "serde", - "sp-npos-elections", + "sp-io", "sp-runtime", "sp-std", ] [[package]] -name = "pallet-finality-tracker" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +name = "pallet-elections-phragmen" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", - "impl-trait-for-tuples", "parity-scale-codec", "serde", - "sp-finality-tracker", - "sp-inherents", + "sp-npos-elections", "sp-runtime", "sp-std", ] [[package]] name = "pallet-grandpa" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "pallet-authorship", - "pallet-finality-tracker", "pallet-session", "parity-scale-codec", "serde", @@ -3908,8 +4049,8 @@ dependencies = [ [[package]] name = "pallet-identity" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "enumflags2", "frame-benchmarking", @@ -3924,8 +4065,8 @@ dependencies = [ [[package]] name = "pallet-im-online" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", @@ -3944,9 +4085,10 @@ dependencies = [ [[package]] name = "pallet-indices" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", @@ -3960,8 +4102,8 @@ dependencies = [ [[package]] name = "pallet-membership" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", @@ -3974,9 +4116,10 @@ dependencies = [ [[package]] name = "pallet-multisig" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", @@ -3989,8 +4132,8 @@ dependencies = [ [[package]] name = "pallet-nicks" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", @@ -4003,8 +4146,8 @@ dependencies = [ [[package]] name = "pallet-offences" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", @@ -4018,8 +4161,8 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", @@ -4039,9 +4182,10 @@ dependencies = [ [[package]] name = "pallet-proxy" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.1" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", @@ -4054,8 +4198,8 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", @@ -4067,8 +4211,8 @@ dependencies = [ [[package]] name = "pallet-recovery" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "enumflags2", "frame-support", @@ -4082,8 +4226,8 @@ dependencies = [ [[package]] name = "pallet-scheduler" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", @@ -4097,12 +4241,12 @@ dependencies = [ [[package]] name = "pallet-session" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", - "impl-trait-for-tuples", + "impl-trait-for-tuples 0.1.3", "pallet-timestamp", "parity-scale-codec", "serde", @@ -4117,8 +4261,8 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", @@ -4133,8 +4277,8 @@ dependencies = [ [[package]] name = "pallet-society" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", @@ -4147,8 +4291,8 @@ dependencies = [ [[package]] name = "pallet-staking" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", @@ -4169,19 +4313,19 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "proc-macro-crate", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "pallet-sudo" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", @@ -4194,13 +4338,13 @@ dependencies = [ [[package]] name = "pallet-timestamp" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "impl-trait-for-tuples", + "impl-trait-for-tuples 0.2.0", "parity-scale-codec", "serde", "sp-inherents", @@ -4210,17 +4354,32 @@ dependencies = [ "sp-timestamp", ] +[[package]] +name = "pallet-tips" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-treasury", + "parity-scale-codec", + "serde", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-transaction-payment" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "frame-system", "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", "serde", - "smallvec 1.4.2", + "smallvec 1.6.1", "sp-core", "sp-io", "sp-runtime", @@ -4229,8 +4388,8 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4247,8 +4406,8 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-support", "parity-scale-codec", @@ -4260,12 +4419,13 @@ dependencies = [ [[package]] name = "pallet-treasury" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "impl-trait-for-tuples 0.2.0", "pallet-balances", "parity-scale-codec", "serde", @@ -4275,8 +4435,8 @@ dependencies = [ [[package]] name = "pallet-utility" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-benchmarking", "frame-support", @@ -4291,8 +4451,8 @@ dependencies = [ [[package]] name = "pallet-vesting" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4313,36 +4473,36 @@ dependencies = [ "blake2-rfc", "crc32fast", "libc", - "log 0.4.11", + "log", "memmap", "parking_lot 0.10.2", ] [[package]] name = "parity-multiaddr" -version = "0.9.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2165a93382a93de55868dcbfa11e4a8f99676a9164eee6a2b4a9479ad319c257" +checksum = "2f51a30667591b14f96068b2d12f1306d07a41ebd98239d194356d4d9707ac16" dependencies = [ "arrayref", "bs58", - "byteorder 1.3.4", + "byteorder", "data-encoding", "multihash", "percent-encoding 2.1.0", "serde", "static_assertions", - "unsigned-varint 0.4.0", - "url 2.1.1", + "unsigned-varint", + "url 2.2.0", ] [[package]] name = "parity-scale-codec" -version = "1.3.4" +version = "1.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34d38aeaffc032ec69faa476b3caaca8d4dd7f3f798137ff30359e5c7869ceb6" +checksum = "7c740e5fbcb6847058b40ac7e5574766c6388f585e184d769910fe0d3a2ca861" dependencies = [ - "arrayvec 0.5.1", + "arrayvec 0.5.2", "bitvec", "byte-slice-cast", "parity-scale-codec-derive", @@ -4351,14 +4511,14 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd20ff7e0399b274a5f5bb37b712fccb5b3a64b9128200d1c3cc40fe709cb073" +checksum = "198db82bb1c18fc00176004462dd809b2a6d851669550aa17af6dacd21ae0c14" dependencies = [ "proc-macro-crate", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -4376,7 +4536,7 @@ dependencies = [ "bytes 0.4.12", "futures 0.1.29", "libc", - "log 0.4.11", + "log", "mio-named-pipes", "miow 0.3.5", "rand 0.7.3", @@ -4388,18 +4548,18 @@ dependencies = [ [[package]] name = "parity-util-mem" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297ff91fa36aec49ce183484b102f6b75b46776822bd81525bfc4cc9b0dd0f5c" +checksum = "8f17f15cb05897127bf36a240085a1f0bbef7bce3024849eccf7f93f6171bc27" dependencies = [ - "cfg-if", - "hashbrown 0.8.0", - "impl-trait-for-tuples", + "cfg-if 1.0.0", + "hashbrown", + "impl-trait-for-tuples 0.2.0", "jemallocator", "parity-util-mem-derive", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "primitive-types", - "smallvec 1.4.2", + "smallvec 1.6.1", "winapi 0.3.9", ] @@ -4409,33 +4569,50 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" dependencies = [ - "proc-macro2 1.0.18", - "syn 1.0.33", + "proc-macro2 1.0.24", + "syn 1.0.58", "synstructure", ] [[package]] name = "parity-wasm" -version = "0.41.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" +checksum = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" +dependencies = [ + "byteorder", +] [[package]] -name = "parking" -version = "1.0.5" +name = "parity-wasm" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d4a6da31f8144a32532fe38fe8fb439a6842e0ec633f0037f0144c14e7f907" +checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" [[package]] -name = "parking_lot" -version = "0.7.1" +name = "parity-ws" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" +checksum = "9e02a625dd75084c2a7024f07c575b61b782f729d18702dabb3cdbf31911dc61" dependencies = [ - "lock_api 0.1.5", - "parking_lot_core 0.4.0", + "byteorder", + "bytes 0.4.12", + "httparse", + "log", + "mio", + "mio-extras", + "rand 0.7.3", + "sha-1", + "slab", + "url 2.2.0", ] +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + [[package]] name = "parking_lot" version = "0.9.0" @@ -4459,35 +4636,22 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4893845fa2ca272e647da5d0e46660a314ead9c2fdd9a883aabc32e481a8733" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" dependencies = [ "instant", "lock_api 0.4.1", "parking_lot_core 0.8.0", ] -[[package]] -name = "parking_lot_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -dependencies = [ - "libc", - "rand 0.6.5", - "rustc_version", - "smallvec 0.6.13", - "winapi 0.3.9", -] - [[package]] name = "parking_lot_core" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "cloudabi 0.0.3", "libc", "redox_syscall", @@ -4502,11 +4666,11 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "cloudabi 0.0.3", "libc", "redox_syscall", - "smallvec 1.4.2", + "smallvec 1.6.1", "winapi 0.3.9", ] @@ -4516,12 +4680,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "cloudabi 0.1.0", "instant", "libc", "redox_syscall", - "smallvec 1.4.2", + "smallvec 1.6.1", "winapi 0.3.9", ] @@ -4550,9 +4714,17 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" dependencies = [ - "byteorder 1.3.4", + "byteorder", "crypto-mac 0.7.0", - "rayon", +] + +[[package]] +name = "pbkdf2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +dependencies = [ + "crypto-mac 0.8.0", ] [[package]] @@ -4579,6 +4751,49 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.58", +] + +[[package]] +name = "pest_meta" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +dependencies = [ + "maplit", + "pest", + "sha-1", +] + [[package]] name = "petgraph" version = "0.5.1" @@ -4595,7 +4810,16 @@ version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca4433fff2ae79342e497d9f8ee990d174071408f28f726d6d83af93e58e48aa" dependencies = [ - "pin-project-internal", + "pin-project-internal 0.4.23", +] + +[[package]] +name = "pin-project" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a83804639aad6ba65345661744708855f9fbcb71176ea8d28d05aeb11d975e7" +dependencies = [ + "pin-project-internal 1.0.3", ] [[package]] @@ -4604,9 +4828,20 @@ version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c0e815c3ee9a031fdf5af21c10aa17c573c9c6a566328d99e3936c34e36461f" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.58", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7bcc46b8f73443d15bc1c5fecbb315718491fa9187fa483f0e359323cde8b3a" +dependencies = [ + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -4615,6 +4850,12 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282adbf10f2698a7a77f8e983a74b2d18176c19a7fd32a45446139ae7b02b715" +[[package]] +name = "pin-project-lite" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b063f57ec186e6140e2b8b6921e5f1bd89c7356dda5b33acc5401203ca6131c" + [[package]] name = "pin-utils" version = "0.1.0" @@ -4635,15 +4876,17 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "polkadot" -version = "0.8.24" +version = "0.8.27" dependencies = [ "assert_cmd", - "futures 0.3.5", - "nix 0.17.0", + "color-eyre", + "futures 0.3.8", + "nix 0.19.1", "parity-util-mem", "polkadot-cli", "polkadot-service", "tempfile", + "thiserror", ] [[package]] @@ -4652,24 +4895,21 @@ version = "0.1.0" dependencies = [ "assert_matches", "bitvec", - "env_logger", - "futures 0.3.5", - "futures-timer 3.0.2", - "log 0.4.11", + "env_logger 0.8.2", + "futures 0.3.8", + "log", "maplit", "parity-scale-codec", - "parking_lot 0.11.0", - "polkadot-network-bridge", "polkadot-node-network-protocol", - "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-node-subsystem-util", "polkadot-primitives", - "sc-network", - "smol 0.3.3", + "sp-application-crypto", "sp-core", - "streamunordered", + "sp-keystore", + "tracing", + "tracing-futures", ] [[package]] @@ -4677,50 +4917,43 @@ name = "polkadot-availability-distribution" version = "0.1.0" dependencies = [ "assert_matches", - "bitvec", - "derive_more 0.99.9", - "env_logger", - "futures 0.3.5", - "futures-timer 3.0.2", - "log 0.4.11", + "futures 0.3.8", + "maplit", "parity-scale-codec", - "parking_lot 0.11.0", "polkadot-erasure-coding", - "polkadot-network-bridge", "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-node-subsystem-util", "polkadot-primitives", "sc-keystore", - "smallvec 1.4.2", + "sp-application-crypto", "sp-core", "sp-keyring", - "streamunordered", + "sp-keystore", + "sp-tracing", + "thiserror", + "tracing", + "tracing-futures", ] [[package]] name = "polkadot-cli" -version = "0.8.24" +version = "0.8.27" dependencies = [ "frame-benchmarking-cli", - "futures 0.3.5", - "log 0.4.11", + "log", + "polkadot-parachain", "polkadot-service", - "polkadot-service-new", "sc-cli", - "sc-client-api", - "sc-client-db", - "sc-executor", "sc-service", - "sp-api", "sp-core", - "sp-runtime", "sp-trie", "structopt", "substrate-browser-utils", "substrate-build-script-utils", - "tokio 0.2.21", + "thiserror", + "tracing-futures", "wasm-bindgen", "wasm-bindgen-futures", ] @@ -4730,22 +4963,20 @@ name = "polkadot-collator-protocol" version = "0.1.0" dependencies = [ "assert_matches", - "derive_more 0.99.9", - "env_logger", - "futures 0.3.5", + "env_logger 0.8.2", + "futures 0.3.8", "futures-timer 3.0.2", - "log 0.4.11", - "parity-scale-codec", - "polkadot-network-bridge", + "log", "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-node-subsystem-util", "polkadot-primitives", - "smallvec 1.4.2", - "smol-timeout", "sp-core", "sp-keyring", + "thiserror", + "tracing", + "tracing-futures", ] [[package]] @@ -4760,14 +4991,14 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" -version = "0.8.24" +version = "0.8.27" dependencies = [ - "derive_more 0.15.0", "parity-scale-codec", "polkadot-primitives", "reed-solomon-erasure", "sp-core", "sp-trie", + "thiserror", ] [[package]] @@ -4775,29 +5006,27 @@ name = "polkadot-network-bridge" version = "0.1.0" dependencies = [ "assert_matches", - "futures 0.3.5", - "futures-timer 3.0.2", - "log 0.4.11", + "async-trait", + "futures 0.3.8", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-primitives", + "sc-authority-discovery", "sc-network", "sp-core", "sp-keyring", - "sp-runtime", - "streamunordered", + "tracing", + "tracing-futures", ] [[package]] name = "polkadot-node-collation-generation" version = "0.1.0" dependencies = [ - "derive_more 0.99.9", - "futures 0.3.5", - "log 0.4.11", + "futures 0.3.8", "polkadot-erasure-coding", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -4805,6 +5034,9 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "sp-core", + "thiserror", + "tracing", + "tracing-futures", ] [[package]] @@ -4812,19 +5044,25 @@ name = "polkadot-node-core-av-store" version = "0.1.0" dependencies = [ "assert_matches", - "derive_more 0.99.9", - "futures 0.3.5", + "env_logger 0.8.2", + "futures 0.3.8", + "futures-timer 3.0.2", "kvdb", "kvdb-memorydb", "kvdb-rocksdb", - "log 0.4.11", + "log", "parity-scale-codec", "polkadot-erasure-coding", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", + "polkadot-node-subsystem-util", "polkadot-overseer", "polkadot-primitives", + "sc-service", "sp-core", + "thiserror", + "tracing", + "tracing-futures", ] [[package]] @@ -4833,9 +5071,7 @@ version = "0.1.0" dependencies = [ "assert_matches", "bitvec", - "derive_more 0.99.9", - "futures 0.3.5", - "log 0.4.11", + "futures 0.3.8", "polkadot-erasure-coding", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -4843,26 +5079,28 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "polkadot-statement-table", - "sc-client-api", "sc-keystore", - "sp-api", - "sp-blockchain", + "sp-application-crypto", "sp-core", "sp-keyring", + "sp-keystore", + "thiserror", + "tracing", + "tracing-futures", ] [[package]] name = "polkadot-node-core-bitfield-signing" version = "0.1.0" dependencies = [ - "bitvec", - "derive_more 0.99.9", - "futures 0.3.5", - "log 0.4.11", + "futures 0.3.8", "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", - "sc-keystore", + "sp-keystore", + "thiserror", + "tracing", + "tracing-futures", "wasm-timer", ] @@ -4870,14 +5108,15 @@ dependencies = [ name = "polkadot-node-core-candidate-selection" version = "0.1.0" dependencies = [ - "derive_more 0.99.9", - "futures 0.3.5", - "log 0.4.11", - "polkadot-node-primitives", + "futures 0.3.8", "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", "sp-core", + "sp-keystore", + "thiserror", + "tracing", + "tracing-futures", ] [[package]] @@ -4885,48 +5124,48 @@ name = "polkadot-node-core-candidate-validation" version = "0.1.0" dependencies = [ "assert_matches", - "derive_more 0.99.9", - "futures 0.3.5", - "log 0.4.11", + "futures 0.3.8", "parity-scale-codec", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", + "polkadot-node-subsystem-util", "polkadot-parachain", "polkadot-primitives", - "sp-blockchain", "sp-core", "sp-keyring", + "tracing", + "tracing-futures", ] [[package]] name = "polkadot-node-core-chain-api" version = "0.1.0" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "maplit", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", + "polkadot-node-subsystem-util", "polkadot-primitives", "sp-blockchain", "sp-core", + "tracing", + "tracing-futures", ] [[package]] name = "polkadot-node-core-proposer" version = "0.1.0" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", - "log 0.4.11", - "parity-scale-codec", "polkadot-node-subsystem", "polkadot-overseer", "polkadot-primitives", "sc-basic-authorship", "sc-block-builder", "sc-client-api", - "sc-telemetry", "sp-api", "sp-blockchain", "sp-consensus", @@ -4934,8 +5173,8 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-transaction-pool", - "tokio-executor 0.2.0-alpha.6", - "wasm-timer", + "substrate-prometheus-endpoint", + "tracing", ] [[package]] @@ -4943,29 +5182,46 @@ name = "polkadot-node-core-provisioner" version = "0.1.0" dependencies = [ "bitvec", - "derive_more 0.99.9", - "futures 0.3.5", - "lazy_static", - "log 0.4.11", + "futures 0.3.8", + "futures-timer 3.0.2", "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", - "sp-core", - "tokio 0.2.21", + "sp-application-crypto", + "sp-keystore", + "thiserror", + "tracing", + "tracing-futures", ] [[package]] name = "polkadot-node-core-runtime-api" version = "0.1.0" dependencies = [ - "futures 0.3.5", - "polkadot-node-primitives", + "futures 0.3.8", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", + "polkadot-node-subsystem-util", "polkadot-primitives", "sp-api", - "sp-blockchain", "sp-core", + "tracing", + "tracing-futures", +] + +[[package]] +name = "polkadot-node-jaeger" +version = "0.1.0" +dependencies = [ + "async-std", + "lazy_static", + "log", + "mick-jaeger", + "parking_lot 0.11.1", + "polkadot-primitives", + "sc-network", + "sp-core", + "thiserror", ] [[package]] @@ -4973,21 +5229,21 @@ name = "polkadot-node-network-protocol" version = "0.1.0" dependencies = [ "parity-scale-codec", + "polkadot-node-jaeger", "polkadot-node-primitives", "polkadot-primitives", "sc-network", - "sp-core", - "sp-runtime", ] [[package]] name = "polkadot-node-primitives" version = "0.1.0" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "parity-scale-codec", "polkadot-primitives", "polkadot-statement-table", + "sp-consensus-vrf", "sp-core", "sp-runtime", ] @@ -4997,23 +5253,30 @@ name = "polkadot-node-subsystem" version = "0.1.0" dependencies = [ "assert_matches", + "async-std", "async-trait", - "derive_more 0.99.9", - "futures 0.3.5", + "derive_more", + "futures 0.3.8", "futures-timer 3.0.2", - "log 0.4.11", + "lazy_static", + "log", + "mick-jaeger", "parity-scale-codec", - "parking_lot 0.10.2", - "pin-project", + "parking_lot 0.11.1", + "pin-project 1.0.3", + "polkadot-node-jaeger", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem-test-helpers", "polkadot-primitives", "polkadot-statement-table", "sc-network", - "smallvec 1.4.2", + "smallvec 1.6.1", "sp-core", "substrate-prometheus-endpoint", + "thiserror", + "tracing", + "tracing-futures", ] [[package]] @@ -5021,21 +5284,22 @@ name = "polkadot-node-subsystem-test-helpers" version = "0.1.0" dependencies = [ "async-trait", - "derive_more 0.99.9", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", - "log 0.4.11", "parity-scale-codec", - "parking_lot 0.10.2", - "pin-project", + "parking_lot 0.11.1", + "pin-project 1.0.3", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", + "polkadot-overseer", "polkadot-primitives", "polkadot-statement-table", "sc-network", - "smallvec 1.4.2", + "smallvec 1.6.1", "sp-core", + "tracing", + "tracing-futures", ] [[package]] @@ -5044,24 +5308,27 @@ version = "0.1.0" dependencies = [ "assert_matches", "async-trait", - "derive_more 0.99.9", - "env_logger", - "futures 0.3.5", + "env_logger 0.8.2", + "futures 0.3.8", "futures-timer 3.0.2", - "log 0.4.11", + "log", "parity-scale-codec", - "parking_lot 0.10.2", - "pin-project", + "parking_lot 0.11.1", + "pin-project 1.0.3", + "polkadot-node-jaeger", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-primitives", - "polkadot-statement-table", - "sc-keystore", "sc-network", - "smallvec 1.4.2", + "sp-application-crypto", "sp-core", + "sp-keystore", "streamunordered", + "substrate-prometheus-endpoint", + "thiserror", + "tracing", + "tracing-futures", ] [[package]] @@ -5070,28 +5337,30 @@ version = "0.1.0" dependencies = [ "async-trait", "femme", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", "kv-log-macro", - "log 0.4.11", + "oorandom", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", + "polkadot-node-subsystem-util", "polkadot-primitives", "sc-client-api", "sp-core", - "streamunordered", + "tracing", + "tracing-futures", ] [[package]] name = "polkadot-parachain" -version = "0.8.24" +version = "0.8.27" dependencies = [ - "derive_more 0.99.9", - "futures 0.3.5", - "log 0.4.11", + "derive_more", + "futures 0.3.8", + "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "polkadot-core-primitives", "sc-executor", "serde", @@ -5099,8 +5368,10 @@ dependencies = [ "sp-core", "sp-externalities", "sp-io", + "sp-runtime", "sp-std", "sp-wasm-interface", + "thiserror", ] [[package]] @@ -5108,27 +5379,28 @@ name = "polkadot-pov-distribution" version = "0.1.0" dependencies = [ "assert_matches", - "futures 0.3.5", - "futures-timer 3.0.2", - "log 0.4.11", - "parity-scale-codec", - "parking_lot 0.10.2", + "env_logger 0.8.2", + "futures 0.3.8", + "log", "polkadot-node-network-protocol", - "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", + "polkadot-node-subsystem-util", "polkadot-primitives", "sp-core", - "sp-runtime", - "streamunordered", + "sp-keyring", + "thiserror", + "tracing", + "tracing-futures", ] [[package]] name = "polkadot-primitives" -version = "0.8.24" +version = "0.8.27" dependencies = [ "bitvec", "frame-system", + "hex-literal", "parity-scale-codec", "polkadot-core-primitives", "polkadot-parachain", @@ -5137,8 +5409,11 @@ dependencies = [ "sp-api", "sp-application-crypto", "sp-arithmetic", + "sp-authority-discovery", "sp-core", "sp-inherents", + "sp-io", + "sp-keystore", "sp-runtime", "sp-serializer", "sp-staking", @@ -5149,12 +5424,13 @@ dependencies = [ [[package]] name = "polkadot-rpc" -version = "0.8.24" +version = "0.8.27" dependencies = [ "jsonrpc-core", "pallet-transaction-payment-rpc", "parity-scale-codec", "polkadot-primitives", + "sc-chain-spec", "sc-client-api", "sc-consensus-babe", "sc-consensus-babe-rpc", @@ -5163,11 +5439,13 @@ dependencies = [ "sc-finality-grandpa-rpc", "sc-keystore", "sc-rpc", + "sc-sync-state-rpc", "sp-api", "sp-block-builder", "sp-blockchain", "sp-consensus", "sp-consensus-babe", + "sp-keystore", "sp-runtime", "sp-transaction-pool", "substrate-frame-rpc-system", @@ -5175,7 +5453,7 @@ dependencies = [ [[package]] name = "polkadot-runtime" -version = "0.8.24" +version = "0.8.27" dependencies = [ "bitvec", "frame-benchmarking", @@ -5184,17 +5462,17 @@ dependencies = [ "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", - "hex-literal 0.2.1", + "hex-literal", "libsecp256k1", - "log 0.3.9", + "log", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", "pallet-balances", + "pallet-bounties", "pallet-collective", "pallet-democracy", "pallet-elections-phragmen", - "pallet-finality-tracker", "pallet-grandpa", "pallet-identity", "pallet-im-online", @@ -5212,6 +5490,7 @@ dependencies = [ "pallet-staking", "pallet-staking-reward-curve", "pallet-timestamp", + "pallet-tips", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", @@ -5224,7 +5503,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "smallvec 1.4.2", + "smallvec 1.6.1", "sp-api", "sp-authority-discovery", "sp-block-builder", @@ -5242,22 +5521,22 @@ dependencies = [ "sp-trie", "sp-version", "static_assertions", - "substrate-wasm-builder-runner", - "tiny-keccak 1.5.0", + "substrate-wasm-builder", + "tiny-keccak", "trie-db", ] [[package]] name = "polkadot-runtime-common" -version = "0.8.24" +version = "0.8.27" dependencies = [ "bitvec", "frame-benchmarking", "frame-support", "frame-system", - "hex-literal 0.2.1", + "hex-literal", "libsecp256k1", - "log 0.3.9", + "log", "pallet-authorship", "pallet-babe", "pallet-balances", @@ -5290,6 +5569,7 @@ dependencies = [ "sp-trie", "static_assertions", "trie-db", + "xcm", ] [[package]] @@ -5297,12 +5577,15 @@ name = "polkadot-runtime-parachains" version = "0.8.0" dependencies = [ "bitvec", + "derive_more", "frame-benchmarking", "frame-support", "frame-system", - "hex-literal 0.2.1", + "futures 0.3.8", + "hex-literal", "libsecp256k1", - "log 0.3.9", + "log", + "pallet-authority-discovery", "pallet-authorship", "pallet-babe", "pallet-balances", @@ -5316,11 +5599,11 @@ dependencies = [ "pallet-vesting", "parity-scale-codec", "polkadot-primitives", - "rand 0.7.3", - "rand_chacha 0.2.2", + "rand 0.8.1", + "rand_chacha 0.3.0", "rustc-hex", + "sc-keystore", "serde", - "serde_derive", "serde_json", "sp-api", "sp-application-crypto", @@ -5328,98 +5611,57 @@ dependencies = [ "sp-inherents", "sp-io", "sp-keyring", + "sp-keystore", "sp-runtime", "sp-session", "sp-staking", "sp-std", "sp-trie", "sp-version", + "xcm", + "xcm-executor", ] [[package]] name = "polkadot-service" -version = "0.8.24" -dependencies = [ - "env_logger", - "frame-benchmarking", - "frame-system-rpc-runtime-api", - "futures 0.3.5", - "hex-literal 0.2.1", - "kusama-runtime", - "lazy_static", - "log 0.4.11", - "pallet-babe", - "pallet-im-online", - "pallet-staking", - "pallet-transaction-payment-rpc-runtime-api", - "parity-scale-codec", - "parking_lot 0.9.0", - "polkadot-primitives", - "polkadot-rpc", - "polkadot-runtime", - "polkadot-test-runtime-client", - "polkadot-validation", - "sc-authority-discovery", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-client-db", - "sc-consensus", - "sc-consensus-babe", - "sc-executor", - "sc-finality-grandpa", - "sc-keystore", - "sc-network", - "sc-service", - "sc-telemetry", - "sc-transaction-pool", - "serde", - "slog", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-core", - "sp-finality-grandpa", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-storage", - "sp-transaction-pool", - "sp-trie", - "substrate-prometheus-endpoint", - "westend-runtime", -] - -[[package]] -name = "polkadot-service-new" version = "0.8.3" dependencies = [ - "env_logger", + "env_logger 0.8.2", "frame-benchmarking", "frame-system-rpc-runtime-api", - "futures 0.3.5", - "hex-literal 0.2.1", + "futures 0.3.8", + "hex-literal", "kusama-runtime", - "lazy_static", - "log 0.4.11", "pallet-babe", "pallet-im-online", "pallet-staking", "pallet-transaction-payment-rpc-runtime-api", - "parity-scale-codec", - "parking_lot 0.9.0", + "polkadot-availability-bitfield-distribution", + "polkadot-availability-distribution", + "polkadot-collator-protocol", + "polkadot-network-bridge", + "polkadot-node-collation-generation", + "polkadot-node-core-av-store", + "polkadot-node-core-backing", + "polkadot-node-core-bitfield-signing", + "polkadot-node-core-candidate-selection", + "polkadot-node-core-candidate-validation", + "polkadot-node-core-chain-api", "polkadot-node-core-proposer", + "polkadot-node-core-provisioner", + "polkadot-node-core-runtime-api", "polkadot-node-subsystem", + "polkadot-node-subsystem-util", "polkadot-overseer", + "polkadot-parachain", + "polkadot-pov-distribution", "polkadot-primitives", "polkadot-rpc", "polkadot-runtime", - "polkadot-test-runtime-client", + "polkadot-runtime-parachains", + "polkadot-statement-distribution", + "polkadot-test-client", + "rococo-runtime", "sc-authority-discovery", "sc-block-builder", "sc-chain-spec", @@ -5427,15 +5669,14 @@ dependencies = [ "sc-client-db", "sc-consensus", "sc-consensus-babe", + "sc-consensus-slots", "sc-executor", "sc-finality-grandpa", - "sc-keystore", "sc-network", "sc-service", "sc-telemetry", "sc-transaction-pool", "serde", - "slog", "sp-api", "sp-authority-discovery", "sp-block-builder", @@ -5446,12 +5687,18 @@ dependencies = [ "sp-finality-grandpa", "sp-inherents", "sp-io", + "sp-keystore", "sp-offchain", "sp-runtime", "sp-session", + "sp-state-machine", + "sp-storage", "sp-transaction-pool", "sp-trie", "substrate-prometheus-endpoint", + "thiserror", + "tracing", + "tracing-futures", "westend-runtime", ] @@ -5459,52 +5706,75 @@ dependencies = [ name = "polkadot-statement-distribution" version = "0.1.0" dependencies = [ - "arrayvec 0.5.1", + "arrayvec 0.5.2", "assert_matches", - "futures 0.3.5", - "futures-timer 3.0.2", + "futures 0.3.8", "indexmap", - "log 0.4.11", - "parity-scale-codec", - "parking_lot 0.10.2", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", + "polkadot-node-subsystem-util", "polkadot-primitives", + "sc-keystore", + "sp-application-crypto", "sp-core", "sp-keyring", - "sp-runtime", + "sp-keystore", "sp-staking", - "streamunordered", + "tracing", + "tracing-futures", ] [[package]] name = "polkadot-statement-table" -version = "0.8.24" +version = "0.8.27" +dependencies = [ + "parity-scale-codec", + "polkadot-primitives", + "sp-core", +] + +[[package]] +name = "polkadot-test-client" +version = "0.8.27" dependencies = [ "parity-scale-codec", + "polkadot-node-subsystem", "polkadot-primitives", + "polkadot-test-runtime", + "polkadot-test-service", + "sc-block-builder", + "sc-consensus", + "sc-service", + "sp-api", + "sp-blockchain", + "sp-consensus", "sp-core", + "sp-inherents", + "sp-keyring", + "sp-runtime", + "sp-state-machine", + "sp-timestamp", + "substrate-test-client", ] [[package]] name = "polkadot-test-runtime" -version = "0.8.24" +version = "0.8.27" dependencies = [ "bitvec", "frame-executive", "frame-support", "frame-system", "frame-system-rpc-runtime-api", - "hex-literal 0.2.1", + "hex-literal", "libsecp256k1", - "log 0.3.9", + "log", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", "pallet-balances", - "pallet-finality-tracker", "pallet-grandpa", "pallet-indices", "pallet-nicks", @@ -5522,11 +5792,12 @@ dependencies = [ "polkadot-parachain", "polkadot-primitives", "polkadot-runtime-common", + "polkadot-runtime-parachains", "rustc-hex", "serde", "serde_derive", "serde_json", - "smallvec 1.4.2", + "smallvec 1.6.1", "sp-api", "sp-authority-discovery", "sp-block-builder", @@ -5543,65 +5814,47 @@ dependencies = [ "sp-transaction-pool", "sp-trie", "sp-version", - "substrate-wasm-builder-runner", - "tiny-keccak 1.5.0", -] - -[[package]] -name = "polkadot-test-runtime-client" -version = "2.0.0" -dependencies = [ - "futures 0.3.5", - "pallet-timestamp", - "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-test-runtime", - "polkadot-test-service", - "sc-block-builder", - "sc-client-api", - "sc-consensus", - "sc-light", - "sc-service", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-runtime", - "substrate-test-client", + "substrate-wasm-builder", + "tiny-keccak", ] [[package]] name = "polkadot-test-service" -version = "0.8.2" +version = "0.8.27" dependencies = [ "frame-benchmarking", "frame-system", "futures 0.1.29", - "futures 0.3.5", + "futures 0.3.8", "hex", - "log 0.4.11", "pallet-balances", "pallet-staking", "pallet-transaction-payment", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-parachain", "polkadot-primitives", "polkadot-rpc", "polkadot-runtime-common", + "polkadot-runtime-parachains", "polkadot-service", "polkadot-test-runtime", - "rand 0.7.3", + "rand 0.8.1", "sc-authority-discovery", "sc-chain-spec", + "sc-cli", "sc-client-api", "sc-consensus", "sc-consensus-babe", "sc-executor", "sc-finality-grandpa", - "sc-informant", "sc-network", "sc-service", "sc-transaction-pool", "serde_json", "sp-arithmetic", + "sp-authority-discovery", "sp-blockchain", "sp-consensus", "sp-consensus-babe", @@ -5615,15 +5868,16 @@ dependencies = [ "substrate-test-utils", "tempfile", "tokio 0.2.21", + "tracing", + "tracing-futures", ] [[package]] name = "polkadot-validation" -version = "0.8.24" +version = "0.8.27" dependencies = [ - "derive_more 0.14.1", - "futures 0.3.5", - "log 0.4.11", + "futures 0.3.8", + "log", "parity-scale-codec", "polkadot-parachain", "polkadot-primitives", @@ -5643,6 +5897,20 @@ dependencies = [ "sp-transaction-pool", "sp-trie", "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "polling" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a7bc6b2a29e632e45451c941832803a18cce6781db04de8a04696cdca8bde4" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "log", + "wepoll-sys", + "winapi 0.3.9", ] [[package]] @@ -5660,7 +5928,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9a50142b55ab3ed0e9f68dfb3709f1d90d29da24e91033f28b96330643107dc" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "universal-hash", ] @@ -5698,66 +5966,66 @@ dependencies = [ [[package]] name = "pretty_assertions" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a029430f0d744bc3d15dd474d591bed2402b645d024583082b9f63bb936dac6" +checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" dependencies = [ "ansi_term 0.11.0", + "ctor", "difference", + "output_vt100", ] [[package]] name = "primitive-types" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55c21c64d0eaa4d7ed885d959ef2d62d9e488c27c0e02d9aa5ce6c877b7d5f8" +checksum = "b3824ae2c5e27160113b9e029a10ec9e3f0237bad8029f69c7724393c9fdefd8" dependencies = [ "fixed-hash", "impl-codec", "impl-serde", - "uint", + "uint 0.9.0", ] [[package]] name = "proc-macro-crate" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ "toml", ] [[package]] name = "proc-macro-error" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc175e9777c3116627248584e8f8b3e2987405cabe1c0adf7d1dd28f09dc7880" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", "version_check", ] [[package]] name = "proc-macro-error-attr" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc9795ca17eb581285ec44936da7fc2335a3f34f2ddd13118b6f4d515435c50" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", - "syn-mid", "version_check", ] [[package]] name = "proc-macro-hack" -version = "0.5.16" +version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro-nested" @@ -5776,9 +6044,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.18" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" dependencies = [ "unicode-xid 0.2.1", ] @@ -5789,10 +6057,10 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d70cf4412832bcac9cffe27906f4a66e450d323525e977168c70d1b36120ae" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "fnv", "lazy_static", - "parking_lot 0.11.0", + "parking_lot 0.11.1", "regex", "thiserror", ] @@ -5816,7 +6084,7 @@ dependencies = [ "bytes 0.5.6", "heck", "itertools 0.8.2", - "log 0.4.11", + "log", "multimap", "petgraph", "prost", @@ -5833,9 +6101,9 @@ checksum = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" dependencies = [ "anyhow", "itertools 0.8.2", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -5854,9 +6122,9 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f53bc2558e8376358ebdc28301546471d67336584f6438ed4b7c7457a055fd7" dependencies = [ - "byteorder 1.3.4", - "log 0.4.11", - "parity-wasm", + "byteorder", + "log", + "parity-wasm 0.41.0", ] [[package]] @@ -5865,6 +6133,12 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quick-error" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ac73b1112776fc109b2e61909bc46c7e1bf0d7f690ffb1676553acce16d5cda" + [[package]] name = "quicksink" version = "0.1.2" @@ -5873,7 +6147,7 @@ checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858" dependencies = [ "futures-core", "futures-sink", - "pin-project-lite", + "pin-project-lite 0.1.7", ] [[package]] @@ -5891,7 +6165,7 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", ] [[package]] @@ -5923,60 +6197,30 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "rand" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -dependencies = [ - "cloudabi 0.0.3", - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "winapi 0.3.9", -] - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.7", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg 0.1.2", - "rand_xorshift", - "winapi 0.3.9", -] - [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.14", "libc", "rand_chacha 0.2.2", "rand_core 0.5.1", "rand_hc 0.2.0", - "rand_pcg 0.2.1", + "rand_pcg", ] [[package]] -name = "rand_chacha" -version = "0.1.1" +name = "rand" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +checksum = "c24fcd450d3fa2b592732565aa4f17a27a61c65ece4726353e000939b0edee34" dependencies = [ - "autocfg 0.1.7", - "rand_core 0.3.1", + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.1", + "rand_hc 0.3.0", ] [[package]] @@ -5989,6 +6233,16 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.1", +] + [[package]] name = "rand_core" version = "0.3.1" @@ -6010,70 +6264,43 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - -[[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", + "getrandom 0.1.14", ] [[package]] -name = "rand_isaac" -version = "0.1.1" +name = "rand_core" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +checksum = "c026d7df8b298d90ccbbc5190bd04d85e159eaf5576caeacf8741da93ccbd2e5" dependencies = [ - "rand_core 0.3.1", + "getrandom 0.2.1", ] [[package]] -name = "rand_jitter" -version = "0.1.4" +name = "rand_distr" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +checksum = "96977acbdd3a6576fb1d27391900035bf3863d4a16422973a409b488cf29ffb2" dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi 0.3.9", + "rand 0.7.3", ] [[package]] -name = "rand_os" -version = "0.1.3" +name = "rand_hc" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "cloudabi 0.0.3", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "wasm-bindgen", - "winapi 0.3.9", + "rand_core 0.5.1", ] [[package]] -name = "rand_pcg" -version = "0.1.2" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" dependencies = [ - "autocfg 0.1.7", - "rand_core 0.4.2", + "rand_core 0.6.1", ] [[package]] @@ -6085,15 +6312,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - [[package]] name = "raw-cpuid" version = "7.0.3" @@ -6117,7 +6335,7 @@ version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62f02856753d04e03e26929f820d0a0a337ebe71f849801eea335d464b349080" dependencies = [ - "autocfg 1.0.0", + "autocfg", "crossbeam-deque", "either", "rayon-core", @@ -6131,7 +6349,7 @@ checksum = "e92e15d89083484e11353891f1af602cc661426deb9564c298b270c726973280" dependencies = [ "crossbeam-deque", "crossbeam-queue", - "crossbeam-utils", + "crossbeam-utils 0.7.2", "lazy_static", "num_cpus", ] @@ -6157,7 +6375,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" dependencies = [ - "getrandom", + "getrandom 0.1.14", "redox_syscall", "rust-argon2", ] @@ -6168,7 +6386,7 @@ version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a415a013dd7c5d4221382329a5a3482566da675737494935cbbbcdec04662f9d" dependencies = [ - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] @@ -6186,9 +6404,9 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d21b475ab879ef0e315ad99067fa25778c3b0377f57f1b00207448dac1a3144" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -6197,16 +6415,16 @@ version = "0.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9ba8aaf5fe7cf307c6dbdaeed85478961d29e25e3bee5169e11b92fa9f027a8" dependencies = [ - "log 0.4.11", + "log", "rustc-hash", - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] name = "regex" -version = "1.3.9" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" +checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c" dependencies = [ "aho-corasick", "memchr", @@ -6220,15 +6438,15 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" dependencies = [ - "byteorder 1.3.4", + "byteorder", "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.18" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" +checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189" [[package]] name = "region" @@ -6251,27 +6469,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "rental" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8545debe98b2b139fb04cad8618b530e9b07c152d99a5de83c860b877d67847f" -dependencies = [ - "rental-impl", - "stable_deref_trait", -] - -[[package]] -name = "rental-impl" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "475e68978dc5b743f2f40d8e0a8fdc83f1c5e78cbf4b8fa5e74e73beebc340de" -dependencies = [ - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", -] - [[package]] name = "retain_mut" version = "0.1.1" @@ -6286,7 +6483,7 @@ checksum = "952cd6b98c85bbc30efa1ba5783b8abf12fec8b3287ffa52605b9432313e34e4" dependencies = [ "cc", "libc", - "once_cell 1.4.0", + "once_cell", "spin", "untrusted", "web-sys", @@ -6304,8 +6501,8 @@ dependencies = [ ] [[package]] -name = "rococo-v1-runtime" -version = "0.8.24" +name = "rococo-runtime" +version = "0.8.27" dependencies = [ "frame-executive", "frame-support", @@ -6322,6 +6519,7 @@ dependencies = [ "pallet-session", "pallet-staking", "pallet-staking-reward-curve", + "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -6332,7 +6530,7 @@ dependencies = [ "polkadot-runtime-parachains", "serde", "serde_derive", - "smallvec 1.4.2", + "smallvec 1.6.1", "sp-api", "sp-authority-discovery", "sp-block-builder", @@ -6347,14 +6545,17 @@ dependencies = [ "sp-std", "sp-transaction-pool", "sp-version", - "substrate-wasm-builder-runner", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] name = "rpassword" -version = "4.0.5" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" +checksum = "d755237fc0f99d98641540e66abac8bc46a0652f19148ac9e21de2da06b326c9" dependencies = [ "libc", "winapi 0.3.9", @@ -6369,7 +6570,7 @@ dependencies = [ "base64 0.11.0", "blake2b_simd", "constant_time_eq", - "crossbeam-utils", + "crossbeam-utils 0.7.2", ] [[package]] @@ -6402,7 +6603,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver", + "semver 0.9.0", ] [[package]] @@ -6412,7 +6613,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cac94b333ee2aac3284c5b8a1b7fb4dd11cba88c244e3fe33cdbd047af0eb693" dependencies = [ "base64 0.12.3", - "log 0.4.11", + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064fd21ff87c6e87ed4506e68beb42459caa4a0e2eb144932e6776768556980b" +dependencies = [ + "base64 0.13.0", + "log", "ring", "sct", "webpki", @@ -6425,7 +6639,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "629d439a7672da82dd955498445e496ee2096fe2117b9f796558a43fdb9e59b8" dependencies = [ "openssl-probe", - "rustls", + "rustls 0.18.0", "schannel", "security-framework", ] @@ -6436,8 +6650,8 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4da5fcb054c46f5a5dff833b129285a93d3f0179531735e6c866e8cc307d2020" dependencies = [ - "futures 0.3.5", - "pin-project", + "futures 0.3.8", + "pin-project 0.4.23", "static_assertions", ] @@ -6458,60 +6672,58 @@ dependencies = [ [[package]] name = "salsa20" -version = "0.3.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2324b0e8c3bb9a586a571fdb3136f70e7e2c748de00a78043f86e0cff91f91fe" +checksum = "399f290ffc409596022fce5ea5d4138184be4784f2b28c62c59f0d8389059a15" dependencies = [ - "byteorder 1.3.4", - "salsa20-core", - "stream-cipher 0.3.2", + "cipher", ] [[package]] -name = "salsa20-core" -version = "0.2.3" +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fe6cc1b9f5a5867853ade63099de70f042f7679e408d1ffe52821c9248e6e69" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ - "stream-cipher 0.3.2", + "winapi-util", ] [[package]] name = "sc-authority-discovery" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "bytes 0.5.6", - "derive_more 0.99.9", + "async-trait", + "derive_more", "either", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", "libp2p", - "log 0.4.11", + "log", "parity-scale-codec", "prost", "prost-build", "rand 0.7.3", "sc-client-api", - "sc-keystore", "sc-network", "serde_json", "sp-api", "sp-authority-discovery", "sp-blockchain", "sp-core", + "sp-keystore", "sp-runtime", "substrate-prometheus-endpoint", ] [[package]] name = "sc-basic-authorship" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", - "log 0.4.11", + "log", "parity-scale-codec", "sc-block-builder", "sc-client-api", @@ -6525,13 +6737,12 @@ dependencies = [ "sp-runtime", "sp-transaction-pool", "substrate-prometheus-endpoint", - "tokio-executor 0.2.0-alpha.6", ] [[package]] name = "sc-block-builder" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -6547,58 +6758,55 @@ dependencies = [ [[package]] name = "sc-chain-spec" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "impl-trait-for-tuples", + "impl-trait-for-tuples 0.2.0", "parity-scale-codec", "sc-chain-spec-derive", + "sc-consensus-babe", + "sc-consensus-epochs", + "sc-finality-grandpa", "sc-network", "sc-telemetry", "serde", "serde_json", "sp-chain-spec", + "sp-consensus-babe", "sp-core", "sp-runtime", ] [[package]] name = "sc-chain-spec-derive" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "proc-macro-crate", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "sc-cli" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "ansi_term 0.12.1", "atty", - "bip39", "chrono", - "derive_more 0.99.9", - "env_logger", "fdlimit", - "futures 0.3.5", + "futures 0.3.8", "hex", - "lazy_static", "libp2p", - "log 0.4.11", + "log", "names", - "nix 0.17.0", "parity-scale-codec", - "parity-util-mem", "rand 0.7.3", "regex", "rpassword", + "sc-cli-proc-macro", "sc-client-api", - "sc-informant", "sc-keystore", "sc-network", "sc-service", @@ -6609,34 +6817,46 @@ dependencies = [ "sp-blockchain", "sp-core", "sp-keyring", + "sp-keystore", "sp-panic-handler", "sp-runtime", - "sp-state-machine", "sp-utils", "sp-version", "structopt", - "substrate-prometheus-endpoint", - "time", + "thiserror", + "tiny-bip39", "tokio 0.2.21", + "tracing", + "tracing-log", + "tracing-subscriber", +] + +[[package]] +name = "sc-cli-proc-macro" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.58", ] [[package]] name = "sc-client-api" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", + "derive_more", "fnv", - "futures 0.3.5", + "futures 0.3.8", "hash-db", - "hex-literal 0.3.1", "kvdb", "lazy_static", - "log 0.4.11", + "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "sc-executor", - "sc-telemetry", "sp-api", "sp-blockchain", "sp-consensus", @@ -6644,7 +6864,7 @@ dependencies = [ "sp-database", "sp-externalities", "sp-inherents", - "sp-keyring", + "sp-keystore", "sp-runtime", "sp-state-machine", "sp-std", @@ -6658,8 +6878,8 @@ dependencies = [ [[package]] name = "sc-client-db" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "blake2-rfc", "hash-db", @@ -6667,11 +6887,11 @@ dependencies = [ "kvdb-memorydb", "kvdb-rocksdb", "linked-hash-map", - "log 0.4.11", + "log", "parity-db", "parity-scale-codec", "parity-util-mem", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "sc-client-api", "sc-executor", "sc-state-db", @@ -6688,8 +6908,8 @@ dependencies = [ [[package]] name = "sc-consensus" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6699,20 +6919,20 @@ dependencies = [ [[package]] name = "sc-consensus-babe" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", + "derive_more", "fork-tree", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", - "log 0.4.11", + "log", "merlin", "num-bigint", "num-rational", "num-traits 0.2.12", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "pdqselect", "rand 0.7.3", "retain_mut", @@ -6734,6 +6954,7 @@ dependencies = [ "sp-core", "sp-inherents", "sp-io", + "sp-keystore", "sp-runtime", "sp-timestamp", "sp-utils", @@ -6743,17 +6964,16 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", - "futures 0.3.5", + "derive_more", + "futures 0.3.8", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", "sc-consensus-babe", "sc-consensus-epochs", - "sc-keystore", "sc-rpc-api", "serde", "sp-api", @@ -6762,17 +6982,18 @@ dependencies = [ "sp-consensus", "sp-consensus-babe", "sp-core", + "sp-keystore", "sp-runtime", ] [[package]] name = "sc-consensus-epochs" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "fork-tree", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "sc-client-api", "sp-blockchain", "sp-runtime", @@ -6780,18 +7001,19 @@ dependencies = [ [[package]] name = "sc-consensus-slots" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", - "log 0.4.11", + "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "sc-client-api", "sc-telemetry", "sp-api", "sp-application-crypto", + "sp-arithmetic", "sp-blockchain", "sp-consensus", "sp-consensus-slots", @@ -6799,14 +7021,16 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-state-machine", + "sp-trie", + "thiserror", ] [[package]] name = "sc-consensus-uncles" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "log 0.4.11", + "log", "sc-client-api", "sp-authorship", "sp-consensus", @@ -6817,16 +7041,16 @@ dependencies = [ [[package]] name = "sc-executor" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", + "derive_more", "lazy_static", "libsecp256k1", - "log 0.4.11", + "log", "parity-scale-codec", - "parity-wasm", - "parking_lot 0.10.2", + "parity-wasm 0.41.0", + "parking_lot 0.11.1", "sc-executor-common", "sc-executor-wasmi", "sc-executor-wasmtime", @@ -6837,6 +7061,7 @@ dependencies = [ "sp-panic-handler", "sp-runtime-interface", "sp-serializer", + "sp-tasks", "sp-trie", "sp-version", "sp-wasm-interface", @@ -6845,27 +7070,26 @@ dependencies = [ [[package]] name = "sc-executor-common" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", - "log 0.4.11", + "derive_more", "parity-scale-codec", - "parity-wasm", + "parity-wasm 0.41.0", "sp-allocator", "sp-core", - "sp-runtime-interface", "sp-serializer", "sp-wasm-interface", + "thiserror", "wasmi", ] [[package]] name = "sc-executor-wasmi" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "log 0.4.11", + "log", "parity-scale-codec", "sc-executor-common", "sp-allocator", @@ -6877,12 +7101,12 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "log 0.4.11", + "log", "parity-scale-codec", - "parity-wasm", + "parity-wasm 0.41.0", "pwasm-utils", "sc-executor-common", "scoped-tls", @@ -6895,18 +7119,18 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", + "derive_more", "finality-grandpa", "fork-tree", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", - "log 0.4.11", + "log", "parity-scale-codec", - "parking_lot 0.10.2", - "pin-project", + "parking_lot 0.11.1", + "pin-project 0.4.23", "rand 0.7.3", "sc-block-builder", "sc-client-api", @@ -6923,8 +7147,8 @@ dependencies = [ "sp-consensus", "sp-core", "sp-finality-grandpa", - "sp-finality-tracker", "sp-inherents", + "sp-keystore", "sp-runtime", "sp-utils", "substrate-prometheus-endpoint", @@ -6932,34 +7156,36 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", + "derive_more", "finality-grandpa", - "futures 0.3.5", + "futures 0.3.8", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", "jsonrpc-pubsub", - "log 0.4.11", + "log", "parity-scale-codec", + "sc-client-api", "sc-finality-grandpa", "sc-rpc", "serde", "serde_json", + "sp-blockchain", "sp-core", "sp-runtime", ] [[package]] name = "sc-informant" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "ansi_term 0.12.1", - "futures 0.3.5", - "log 0.4.11", + "futures 0.3.8", + "log", "parity-util-mem", "sc-client-api", "sc-network", @@ -6972,29 +7198,33 @@ dependencies = [ [[package]] name = "sc-keystore" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", + "async-trait", + "derive_more", + "futures 0.3.8", + "futures-util", "hex", "merlin", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "rand 0.7.3", "serde_json", "sp-application-crypto", "sp-core", + "sp-keystore", "subtle 2.2.3", ] [[package]] name = "sc-light" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "hash-db", "lazy_static", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "sc-client-api", "sc-executor", "sp-api", @@ -7007,20 +7237,20 @@ dependencies = [ [[package]] name = "sc-network" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "async-std", "async-trait", "bitflags", "bs58", "bytes 0.5.6", - "derive_more 0.99.9", + "derive_more", "either", "erased-serde", "fnv", "fork-tree", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", "futures_codec", "hex", @@ -7028,12 +7258,11 @@ dependencies = [ "libp2p", "linked-hash-map", "linked_hash_set", - "log 0.4.11", - "lru 0.4.3", + "log", "nohash-hasher", "parity-scale-codec", - "parking_lot 0.10.2", - "pin-project", + "parking_lot 0.11.1", + "pin-project 0.4.23", "prost", "prost-build", "rand 0.7.3", @@ -7044,7 +7273,7 @@ dependencies = [ "serde_json", "slog", "slog_derive", - "smallvec 0.6.13", + "smallvec 1.6.1", "sp-arithmetic", "sp-blockchain", "sp-consensus", @@ -7053,7 +7282,7 @@ dependencies = [ "sp-utils", "substrate-prometheus-endpoint", "thiserror", - "unsigned-varint 0.4.0", + "unsigned-varint", "void", "wasm-timer", "zeroize", @@ -7061,14 +7290,14 @@ dependencies = [ [[package]] name = "sc-network-gossip" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", "libp2p", - "log 0.4.11", - "lru 0.4.3", + "log", + "lru", "sc-network", "sp-runtime", "wasm-timer", @@ -7076,19 +7305,19 @@ dependencies = [ [[package]] name = "sc-offchain" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "bytes 0.5.6", "fnv", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", - "hyper 0.13.6", + "hyper 0.13.9", "hyper-rustls", - "log 0.4.11", + "log", "num_cpus", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "rand 0.7.3", "sc-client-api", "sc-keystore", @@ -7103,12 +7332,12 @@ dependencies = [ [[package]] name = "sc-peerset" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "libp2p", - "log 0.4.11", + "log", "serde_json", "sp-utils", "wasm-timer", @@ -7116,35 +7345,37 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "log 0.4.11", + "log", "substrate-prometheus-endpoint", ] [[package]] name = "sc-rpc" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "hash-db", "jsonrpc-core", "jsonrpc-pubsub", - "log 0.4.11", + "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "sc-block-builder", "sc-client-api", "sc-executor", "sc-keystore", "sc-rpc-api", + "sc-tracing", "serde_json", "sp-api", "sp-blockchain", "sp-chain-spec", "sp-core", + "sp-keystore", "sp-offchain", "sp-rpc", "sp-runtime", @@ -7157,18 +7388,18 @@ dependencies = [ [[package]] name = "sc-rpc-api" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", - "futures 0.3.5", + "derive_more", + "futures 0.3.8", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", "jsonrpc-pubsub", - "log 0.4.11", + "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "serde", "serde_json", "sp-chain-spec", @@ -7181,40 +7412,41 @@ dependencies = [ [[package]] name = "sc-rpc-server" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ + "futures 0.1.29", "jsonrpc-core", "jsonrpc-http-server", "jsonrpc-ipc-server", "jsonrpc-pubsub", "jsonrpc-ws-server", - "log 0.4.11", + "log", "serde", "serde_json", "sp-runtime", + "substrate-prometheus-endpoint", ] [[package]] name = "sc-service" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", - "directories", + "directories 3.0.1", "exit-future", "futures 0.1.29", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", "hash-db", "jsonrpc-core", "jsonrpc-pubsub", "lazy_static", - "log 0.4.11", + "log", "parity-scale-codec", "parity-util-mem", - "parking_lot 0.10.2", - "pin-project", + "parking_lot 0.11.1", + "pin-project 0.4.23", "rand 0.7.3", "sc-block-builder", "sc-chain-spec", @@ -7243,44 +7475,69 @@ dependencies = [ "sp-externalities", "sp-inherents", "sp-io", + "sp-keystore", "sp-runtime", "sp-session", "sp-state-machine", + "sp-tracing", "sp-transaction-pool", "sp-trie", "sp-utils", "sp-version", "substrate-prometheus-endpoint", "tempfile", + "thiserror", "tracing", + "tracing-futures", "wasm-timer", ] [[package]] name = "sc-state-db" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "log 0.4.11", + "log", "parity-scale-codec", "parity-util-mem", "parity-util-mem-derive", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "sc-client-api", "sp-core", + "thiserror", +] + +[[package]] +name = "sc-sync-state-rpc" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" +dependencies = [ + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "sc-chain-spec", + "sc-client-api", + "sc-consensus-babe", + "sc-consensus-epochs", + "sc-finality-grandpa", + "sc-rpc-api", + "serde_json", + "sp-blockchain", + "sp-runtime", + "thiserror", ] [[package]] name = "sc-telemetry" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", "libp2p", - "log 0.4.11", - "parking_lot 0.10.2", - "pin-project", + "log", + "parking_lot 0.11.1", + "pin-project 0.4.23", "rand 0.7.3", "serde", "slog", @@ -7293,12 +7550,16 @@ dependencies = [ [[package]] name = "sc-tracing" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ + "ansi_term 0.12.1", "erased-serde", - "log 0.4.11", - "parking_lot 0.10.2", + "lazy_static", + "log", + "once_cell", + "parking_lot 0.11.1", + "regex", "rustc-hash", "sc-telemetry", "serde", @@ -7306,20 +7567,22 @@ dependencies = [ "slog", "sp-tracing", "tracing", + "tracing-core", + "tracing-log", "tracing-subscriber", ] [[package]] name = "sc-transaction-graph" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", - "futures 0.3.5", + "derive_more", + "futures 0.3.8", "linked-hash-map", - "log 0.4.11", + "log", "parity-util-mem", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "retain_mut", "serde", "sp-blockchain", @@ -7327,22 +7590,22 @@ dependencies = [ "sp-runtime", "sp-transaction-pool", "sp-utils", + "thiserror", "wasm-timer", ] [[package]] name = "sc-transaction-pool" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", - "futures 0.3.5", + "futures 0.3.8", "futures-diagnose", "intervalier", - "log 0.4.11", + "log", "parity-scale-codec", "parity-util-mem", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "sc-client-api", "sc-transaction-graph", "sp-api", @@ -7353,6 +7616,7 @@ dependencies = [ "sp-transaction-pool", "sp-utils", "substrate-prometheus-endpoint", + "thiserror", "wasm-timer", ] @@ -7373,12 +7637,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" dependencies = [ "arrayref", - "arrayvec 0.5.1", - "curve25519-dalek", - "getrandom", + "arrayvec 0.5.2", + "curve25519-dalek 2.1.0", + "getrandom 0.1.14", "merlin", "rand 0.7.3", "rand_core 0.5.1", + "serde", "sha2 0.8.2", "subtle 2.2.3", "zeroize", @@ -7390,12 +7655,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" -[[package]] -name = "scopeguard" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" - [[package]] name = "scopeguard" version = "1.1.0" @@ -7417,9 +7676,9 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e367622f934864ffa1c704ba2b82280aab856e3d8213c84c5720257eb34b15b9" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -7434,9 +7693,9 @@ dependencies = [ [[package]] name = "secrecy" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9182278ed645df3477a9c27bfee0621c621aa16f6972635f7f795dae3d81070f" +checksum = "0673d6a6449f5e7d12a1caf424fd9363e2af3a4953023ed455e3c4beef4597c0" dependencies = [ "zeroize", ] @@ -7464,13 +7723,32 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +dependencies = [ + "semver-parser 0.7.0", +] + [[package]] name = "semver" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser", + "semver-parser 0.7.0", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser 0.10.0", + "serde", ] [[package]] @@ -7480,48 +7758,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] -name = "send_wrapper" -version = "0.2.0" +name = "semver-parser" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" +checksum = "0e012c6c5380fb91897ba7b9261a0f565e624e869d42fe1a1d03fa0d68a083d5" +dependencies = [ + "pest", + "pest_derive", +] [[package]] name = "send_wrapper" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686ef91cf020ad8d4aca9a7047641fd6add626b7b89e14546c2b6a76781cf822" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" [[package]] name = "send_wrapper" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" +checksum = "930c0acf610d3fdb5e2ab6213019aaa04e227ebe9547b0649ba599b16d788bd7" + +[[package]] +name = "separator" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f97841a747eef040fcd2e7b3b9a220a7205926e60488e673d9e4926d27772ce5" [[package]] name = "serde" -version = "1.0.114" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3" +checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.114" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e" +checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "serde_json" -version = "1.0.56" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3433e879a558dde8b5e8feb2a04899cf34fdde1fafb894687e52105fc1162ac3" +checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" dependencies = [ "itoa", "ryu", @@ -7559,7 +7847,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2933378ddfeda7ea26f48c555bdad8bb446bf8a3d17832dc83e380d444cfb8c1" dependencies = [ "block-buffer 0.9.0", - "cfg-if", + "cfg-if 0.1.10", "cpuid-bool", "digest 0.9.0", "opaque-debug 0.3.0", @@ -7567,24 +7855,24 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.2" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" dependencies = [ - "block-buffer 0.7.3", - "byte-tools", - "digest 0.8.1", + "block-buffer 0.9.0", + "digest 0.9.0", "keccak", - "opaque-debug 0.2.3", + "opaque-debug 0.3.0", ] [[package]] name = "sharded-slab" -version = "0.0.9" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d5a3f5166fb5b42a5439f2eee8b9de149e235961e3eb21c5808fc3ea17ff3e" +checksum = "7b4921be914e16899a80adefb821f8ddb7974e3f1250223575a44ed994882127" dependencies = [ "lazy_static", + "loom", ] [[package]] @@ -7593,13 +7881,13 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf3ab0cdff84d6c66fc9e268010ea6508e58ee942575afb66f2cf194bb218bb4" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "enum_primitive", "libc", - "log 0.4.11", + "log", "memrange", "nix 0.10.0", - "quick-error", + "quick-error 1.2.3", "rand 0.4.6", "shared_memory_derive", "theban_interval_tree", @@ -7623,6 +7911,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" +[[package]] +name = "signal-hook" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604508c1418b99dfe1925ca9224829bb2a8a9a04dda655cc01fcad46f4ab05ed" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" version = "1.2.0" @@ -7639,6 +7937,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65211b7b6fc3f14ff9fc7a2011a434e3e6880585bd2e9e9396315ae24cbf7852" +[[package]] +name = "simba" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb931b1367faadea6b1ab1c306a860ec17aaa5fa39f367d0c744e69d971a1fb2" +dependencies = [ + "approx", + "num-complex", + "num-traits 0.2.12", + "paste", +] + [[package]] name = "slab" version = "0.4.2" @@ -7684,9 +7994,9 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a945ec7f7ce853e89ffa36be1e27dce9a43e82ff9093bf3461c30d5da74ed11b" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -7700,56 +8010,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" - -[[package]] -name = "smol" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "620cbb3c6e34da57d3a248cda0cd01cd5848164dc062e764e65d06fe3ea7aed5" -dependencies = [ - "async-task", - "blocking 0.4.7", - "concurrent-queue", - "fastrand", - "futures-io", - "futures-util", - "libc", - "once_cell 1.4.0", - "scoped-tls", - "slab", - "socket2", - "wepoll-sys-stjepang", - "winapi 0.3.9", -] - -[[package]] -name = "smol" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67583f4ccc13bbb105a0752058d8ad66c47753d85445952809bcaca891954f83" -dependencies = [ - "async-channel", - "async-executor", - "async-io", - "blocking 0.5.0", - "cfg-if", - "easy-parallel", - "futures-lite", - "num_cpus", -] - -[[package]] -name = "smol-timeout" -version = "0.1.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "024818c1f00b80e8171ddcfcee33860134293aa3aced60c9cbd7a5a2d41db392" -dependencies = [ - "pin-project", - "smol 0.1.18", -] +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "snow" @@ -7766,16 +8029,16 @@ dependencies = [ "rustc_version", "sha2 0.9.1", "subtle 2.2.3", - "x25519-dalek", + "x25519-dalek 0.6.0", ] [[package]] name = "socket2" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918" +checksum = "2c29947abdee2a218277abeca306f25789c938e500ea5a9d4b12a5a504466902" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall", "winapi 0.3.9", @@ -7790,29 +8053,29 @@ dependencies = [ "base64 0.12.3", "bytes 0.5.6", "flate2", - "futures 0.3.5", + "futures 0.3.8", "httparse", - "log 0.4.11", + "log", "rand 0.7.3", "sha-1", ] [[package]] name = "sp-allocator" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", - "log 0.4.11", + "log", "sp-core", "sp-std", "sp-wasm-interface", + "thiserror", ] [[package]] name = "sp-api" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "hash-db", "parity-scale-codec", @@ -7822,24 +8085,25 @@ dependencies = [ "sp-state-machine", "sp-std", "sp-version", + "thiserror", ] [[package]] name = "sp-api-proc-macro" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "blake2-rfc", "proc-macro-crate", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "sp-application-crypto" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "serde", @@ -7850,8 +8114,8 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "integer-sqrt", "num-traits 0.2.12", @@ -7863,8 +8127,8 @@ dependencies = [ [[package]] name = "sp-authority-discovery" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "sp-api", @@ -7875,8 +8139,8 @@ dependencies = [ [[package]] name = "sp-authorship" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7886,8 +8150,8 @@ dependencies = [ [[package]] name = "sp-block-builder" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "sp-api", @@ -7898,25 +8162,26 @@ dependencies = [ [[package]] name = "sp-blockchain" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", - "log 0.4.11", - "lru 0.4.3", + "futures 0.3.8", + "log", + "lru", "parity-scale-codec", - "parking_lot 0.10.2", - "sp-block-builder", + "parking_lot 0.11.1", + "sp-api", "sp-consensus", "sp-database", "sp-runtime", "sp-state-machine", + "thiserror", ] [[package]] name = "sp-chain-spec" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "serde", "serde_json", @@ -7924,16 +8189,15 @@ dependencies = [ [[package]] name = "sp-consensus" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", "libp2p", - "log 0.4.11", + "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "serde", "sp-api", "sp-core", @@ -7945,13 +8209,14 @@ dependencies = [ "sp-utils", "sp-version", "substrate-prometheus-endpoint", + "thiserror", "wasm-timer", ] [[package]] name = "sp-consensus-babe" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "merlin", "parity-scale-codec", @@ -7962,6 +8227,7 @@ dependencies = [ "sp-consensus-vrf", "sp-core", "sp-inherents", + "sp-keystore", "sp-runtime", "sp-std", "sp-timestamp", @@ -7969,8 +8235,8 @@ dependencies = [ [[package]] name = "sp-consensus-slots" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7978,8 +8244,8 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7990,28 +8256,27 @@ dependencies = [ [[package]] name = "sp-core" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "base58", "blake2-rfc", - "byteorder 1.3.4", - "derive_more 0.99.9", + "byteorder", "dyn-clonable", "ed25519-dalek", - "futures 0.3.5", + "futures 0.3.8", "hash-db", "hash256-std-hasher", "hex", "impl-serde", "lazy_static", "libsecp256k1", - "log 0.4.11", + "log", "merlin", "num-traits 0.2.12", "parity-scale-codec", "parity-util-mem", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "primitive-types", "rand 0.7.3", "regex", @@ -8025,8 +8290,9 @@ dependencies = [ "sp-std", "sp-storage", "substrate-bip39", + "thiserror", "tiny-bip39", - "tiny-keccak 2.0.2", + "tiny-keccak", "twox-hash", "wasmi", "zeroize", @@ -8034,27 +8300,27 @@ dependencies = [ [[package]] name = "sp-database" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "kvdb", - "parking_lot 0.10.2", + "parking_lot 0.11.1", ] [[package]] name = "sp-debug-derive" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "sp-externalities" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "environmental", "parity-scale-codec", @@ -8064,67 +8330,61 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "finality-grandpa", - "log 0.4.11", + "log", "parity-scale-codec", "serde", "sp-api", "sp-application-crypto", "sp-core", + "sp-keystore", "sp-runtime", "sp-std", ] -[[package]] -name = "sp-finality-tracker" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" -dependencies = [ - "parity-scale-codec", - "sp-inherents", - "sp-std", -] - [[package]] name = "sp-inherents" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "sp-core", "sp-std", + "thiserror", ] [[package]] name = "sp-io" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "hash-db", "libsecp256k1", - "log 0.4.11", + "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "sp-core", "sp-externalities", + "sp-keystore", "sp-runtime-interface", "sp-state-machine", "sp-std", "sp-tracing", "sp-trie", "sp-wasm-interface", + "tracing", + "tracing-core", ] [[package]] name = "sp-keyring" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "lazy_static", "sp-core", @@ -8132,10 +8392,27 @@ dependencies = [ "strum", ] +[[package]] +name = "sp-keystore" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" +dependencies = [ + "async-trait", + "derive_more", + "futures 0.3.8", + "merlin", + "parity-scale-codec", + "parking_lot 0.11.1", + "schnorrkel", + "serde", + "sp-core", + "sp-externalities", +] + [[package]] name = "sp-npos-elections" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "serde", @@ -8146,19 +8423,19 @@ dependencies = [ [[package]] name = "sp-npos-elections-compact" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "proc-macro-crate", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "sp-offchain" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "sp-api", "sp-core", @@ -8167,17 +8444,16 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "backtrace", - "log 0.4.11", ] [[package]] name = "sp-rpc" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "serde", "sp-core", @@ -8185,13 +8461,13 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "either", "hash256-std-hasher", - "impl-trait-for-tuples", - "log 0.4.11", + "impl-trait-for-tuples 0.2.0", + "log", "parity-scale-codec", "parity-util-mem", "paste", @@ -8200,16 +8476,16 @@ dependencies = [ "sp-application-crypto", "sp-arithmetic", "sp-core", - "sp-inherents", "sp-io", "sp-std", ] [[package]] name = "sp-runtime-interface" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ + "impl-trait-for-tuples 0.2.0", "parity-scale-codec", "primitive-types", "sp-externalities", @@ -8223,20 +8499,20 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "Inflector", "proc-macro-crate", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "sp-serializer" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "serde", "serde_json", @@ -8244,8 +8520,8 @@ dependencies = [ [[package]] name = "sp-session" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "sp-api", @@ -8257,8 +8533,8 @@ dependencies = [ [[package]] name = "sp-staking" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -8267,34 +8543,35 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "hash-db", - "log 0.4.11", + "log", "num-traits 0.2.12", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.11.1", "rand 0.7.3", - "smallvec 1.4.2", + "smallvec 1.6.1", "sp-core", "sp-externalities", "sp-panic-handler", "sp-std", "sp-trie", + "thiserror", "trie-db", "trie-root", ] [[package]] name = "sp-std" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" [[package]] name = "sp-storage" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8304,12 +8581,25 @@ dependencies = [ "sp-std", ] +[[package]] +name = "sp-tasks" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" +dependencies = [ + "log", + "sp-core", + "sp-externalities", + "sp-io", + "sp-runtime-interface", + "sp-std", +] + [[package]] name = "sp-timestamp" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "impl-trait-for-tuples", + "impl-trait-for-tuples 0.2.0", "parity-scale-codec", "sp-api", "sp-inherents", @@ -8320,33 +8610,37 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "log 0.4.11", - "rental", + "log", + "parity-scale-codec", + "sp-std", "tracing", + "tracing-core", + "tracing-subscriber", ] [[package]] name = "sp-transaction-pool" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "derive_more 0.99.9", - "futures 0.3.5", - "log 0.4.11", + "derive_more", + "futures 0.3.8", + "log", "parity-scale-codec", "serde", "sp-api", "sp-blockchain", "sp-runtime", + "thiserror", ] [[package]] name = "sp-trie" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "hash-db", "memory-db", @@ -8359,10 +8653,10 @@ dependencies = [ [[package]] name = "sp-utils" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "futures-core", "futures-timer 3.0.2", "lazy_static", @@ -8371,8 +8665,8 @@ dependencies = [ [[package]] name = "sp-version" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "impl-serde", "parity-scale-codec", @@ -8383,10 +8677,10 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "impl-trait-for-tuples", + "impl-trait-for-tuples 0.2.0", "parity-scale-codec", "sp-std", "wasmi", @@ -8412,20 +8706,11 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "statrs" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10102ac8d55e35db2b3fafc26f81ba8647da2e15879ab686a67e6d19af2685e8" -dependencies = [ - "rand 0.5.6", -] - -[[package]] -name = "stream-cipher" -version = "0.3.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8131256a5896cabcf5eb04f4d6dacbe1aefda854b0d9896e09cb58829ec5638c" +checksum = "cce16f6de653e88beca7bd13780d08e09d4489dbca1f9210e041bc4852481382" dependencies = [ - "generic-array 0.12.3", + "rand 0.7.3", ] [[package]] @@ -8434,7 +8719,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09f8ed9974042b8c3672ff3030a69fcc03b74c47c3d1ecb7755e8a3626011e88" dependencies = [ - "generic-array 0.14.2", + "generic-array 0.14.4", ] [[package]] @@ -8466,9 +8751,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "structopt" -version = "0.3.15" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de2f5e239ee807089b62adce73e48c625e0ed80df02c7ab3f068f5db5281065c" +checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c" dependencies = [ "clap", "lazy_static", @@ -8477,15 +8762,15 @@ dependencies = [ [[package]] name = "structopt-derive" -version = "0.4.8" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510413f9de616762a4fbeab62509bf15c729603b72d7cd71280fbca431b1c118" +checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90" dependencies = [ "heck", "proc-macro-error", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -8504,9 +8789,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0054a7df764039a6cd8592b9de84be4bec368ff081d203a7d5371cbfa8e65c81" dependencies = [ "heck", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -8515,8 +8800,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bed6646a0159b9935b5d045611560eeef842b78d7adc3ba36f5ca325a13a0236" dependencies = [ - "hmac", - "pbkdf2", + "hmac 0.7.1", + "pbkdf2 0.3.0", "schnorrkel", "sha2 0.8.2", "zeroize", @@ -8524,20 +8809,20 @@ dependencies = [ [[package]] name = "substrate-browser-utils" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "chrono", "console_error_panic_hook", "console_log", "futures 0.1.29", - "futures 0.3.5", + "futures 0.3.8", "futures-timer 3.0.2", + "getrandom 0.2.1", "js-sys", "kvdb-web", "libp2p-wasm-ext", - "log 0.4.11", - "rand 0.6.5", + "log", "rand 0.7.3", "sc-chain-spec", "sc-informant", @@ -8550,23 +8835,23 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "platforms", ] [[package]] name = "substrate-frame-rpc-system" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "frame-system-rpc-runtime-api", - "futures 0.3.5", + "futures 0.3.8", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", - "log 0.4.11", + "log", "parity-scale-codec", "sc-client-api", "sc-rpc-api", @@ -8581,25 +8866,25 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "async-std", - "derive_more 0.99.9", + "derive_more", "futures-util", - "hyper 0.13.6", - "log 0.4.11", + "hyper 0.13.9", + "log", "prometheus", "tokio 0.2.21", ] [[package]] name = "substrate-test-client" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "futures 0.1.29", - "futures 0.3.5", + "futures 0.3.8", "hash-db", "hex", "parity-scale-codec", @@ -8615,35 +8900,46 @@ dependencies = [ "sp-consensus", "sp-core", "sp-keyring", + "sp-keystore", "sp-runtime", "sp-state-machine", ] [[package]] name = "substrate-test-utils" -version = "2.0.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "substrate-test-utils-derive", "tokio 0.2.21", ] [[package]] name = "substrate-test-utils-derive" -version = "0.8.0-rc6" -source = "git+https://github.com/paritytech/substrate#364d6154a4610a66f2e5f5ebccf500cdc4327426" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate#c9d93653e567f10867273b0171f3025419795c37" dependencies = [ "proc-macro-crate", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] -name = "substrate-wasm-builder-runner" -version = "1.0.6" +name = "substrate-wasm-builder" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a965994514ab35d3893e9260245f2947fd1981cdd4fffd2c6e6d1a9ce02e6a" +checksum = "79091baab813855ddf65b191de9fe53e656b6b67c1e9bd23fdcbff8788164684" +dependencies = [ + "ansi_term 0.12.1", + "atty", + "build-helper", + "cargo_metadata", + "tempfile", + "toml", + "walkdir", + "wasm-gc-api", +] [[package]] name = "subtle" @@ -8670,35 +8966,24 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.33" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d5d96e8cbb005d6959f119f773bfaebb5684296108fb32600c00cde305b2cd" +checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", "unicode-xid 0.2.1", ] -[[package]] -name = "syn-mid" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" -dependencies = [ - "proc-macro2 1.0.18", - "quote 1.0.7", - "syn 1.0.33", -] - [[package]] name = "synstructure" version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", "unicode-xid 0.2.1", ] @@ -8720,7 +9005,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ - "cfg-if", + "cfg-if 0.1.10", "libc", "rand 0.7.3", "redox_syscall", @@ -8739,22 +9024,48 @@ dependencies = [ [[package]] name = "test-parachain-adder" -version = "0.8.24" +version = "0.8.27" dependencies = [ "dlmalloc", "parity-scale-codec", "polkadot-parachain", "sp-io", "sp-std", - "substrate-wasm-builder-runner", - "tiny-keccak 1.5.0", + "substrate-wasm-builder", + "tiny-keccak", +] + +[[package]] +name = "test-parachain-adder-collator" +version = "0.7.26" +dependencies = [ + "futures 0.3.8", + "futures-timer 3.0.2", + "log", + "parity-scale-codec", + "polkadot-cli", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-service", + "polkadot-test-service", + "sc-authority-discovery", + "sc-cli", + "sc-service", + "sp-core", + "sp-keyring", + "structopt", + "substrate-test-utils", + "test-parachain-adder", + "tokio 0.2.21", ] [[package]] name = "test-parachain-halt" -version = "0.8.24" +version = "0.8.27" dependencies = [ - "substrate-wasm-builder-runner", + "substrate-wasm-builder", ] [[package]] @@ -8766,7 +9077,7 @@ dependencies = [ "sp-core", "test-parachain-adder", "test-parachain-halt", - "tiny-keccak 1.5.0", + "tiny-keccak", ] [[package]] @@ -8791,22 +9102,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08" +checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" +checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -8827,6 +9138,19 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "thrift" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6d965454947cc7266d22716ebfd07b18d84ebaf35eec558586bbb2a8cb6b5b" +dependencies = [ + "byteorder", + "integer-encoding", + "log", + "ordered-float", + "threadpool", +] + [[package]] name = "time" version = "0.1.43" @@ -8839,27 +9163,20 @@ dependencies = [ [[package]] name = "tiny-bip39" -version = "0.7.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0165e045cc2ae1660270ca65e1676dbaab60feb0f91b10f7d0665e9b47e31f2" +checksum = "d9e44c4759bae7f1032e286a7ef990bd9ed23fe831b7eeba0beb97484c2e59b8" dependencies = [ - "failure", - "hmac", - "once_cell 1.4.0", - "pbkdf2", + "anyhow", + "hmac 0.8.1", + "once_cell", + "pbkdf2 0.4.0", "rand 0.7.3", "rustc-hash", - "sha2 0.8.2", + "sha2 0.9.1", + "thiserror", "unicode-normalization", -] - -[[package]] -name = "tiny-keccak" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2" -dependencies = [ - "crunchy", + "zeroize", ] [[package]] @@ -8889,11 +9206,11 @@ dependencies = [ "num_cpus", "tokio-codec", "tokio-current-thread", - "tokio-executor 0.1.10", + "tokio-executor", "tokio-fs", "tokio-io", "tokio-reactor", - "tokio-sync 0.1.8", + "tokio-sync", "tokio-tcp", "tokio-threadpool", "tokio-timer", @@ -8917,7 +9234,7 @@ dependencies = [ "mio", "mio-uds", "num_cpus", - "pin-project-lite", + "pin-project-lite 0.1.7", "signal-hook-registry", "slab", "tokio-macros", @@ -8953,7 +9270,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" dependencies = [ "futures 0.1.29", - "tokio-executor 0.1.10", + "tokio-executor", ] [[package]] @@ -8962,21 +9279,10 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" dependencies = [ - "crossbeam-utils", + "crossbeam-utils 0.7.2", "futures 0.1.29", ] -[[package]] -name = "tokio-executor" -version = "0.2.0-alpha.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee9ceecf69145923834ea73f32ba40c790fd877b74a7817dd0b089f1eb9c7c8" -dependencies = [ - "futures-util-preview", - "lazy_static", - "tokio-sync 0.2.0-alpha.6", -] - [[package]] name = "tokio-fs" version = "0.1.7" @@ -8996,7 +9302,7 @@ checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" dependencies = [ "bytes 0.4.12", "futures 0.1.29", - "log 0.4.11", + "log", ] [[package]] @@ -9005,9 +9311,9 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] @@ -9029,17 +9335,17 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" dependencies = [ - "crossbeam-utils", + "crossbeam-utils 0.7.2", "futures 0.1.29", "lazy_static", - "log 0.4.11", + "log", "mio", "num_cpus", "parking_lot 0.9.0", "slab", - "tokio-executor 0.1.10", + "tokio-executor", "tokio-io", - "tokio-sync 0.1.8", + "tokio-sync", ] [[package]] @@ -9049,7 +9355,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "228139ddd4fea3fa345a29233009635235833e52807af7ea6448ead03890d6a9" dependencies = [ "futures-core", - "rustls", + "rustls 0.18.0", "tokio 0.2.21", "webpki", ] @@ -9073,17 +9379,6 @@ dependencies = [ "futures 0.1.29", ] -[[package]] -name = "tokio-sync" -version = "0.2.0-alpha.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1aaeb685540f7407ea0e27f1c9757d258c7c6bf4e3eb19da6fc59b747239d2" -dependencies = [ - "fnv", - "futures-core-preview", - "futures-util-preview", -] - [[package]] name = "tokio-tcp" version = "0.1.4" @@ -9106,13 +9401,13 @@ checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" dependencies = [ "crossbeam-deque", "crossbeam-queue", - "crossbeam-utils", + "crossbeam-utils 0.7.2", "futures 0.1.29", "lazy_static", - "log 0.4.11", + "log", "num_cpus", "slab", - "tokio-executor 0.1.10", + "tokio-executor", ] [[package]] @@ -9121,10 +9416,10 @@ version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" dependencies = [ - "crossbeam-utils", + "crossbeam-utils 0.7.2", "futures 0.1.29", "slab", - "tokio-executor 0.1.10", + "tokio-executor", ] [[package]] @@ -9135,7 +9430,7 @@ checksum = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" dependencies = [ "bytes 0.4.12", "futures 0.1.29", - "log 0.4.11", + "log", "mio", "tokio-codec", "tokio-io", @@ -9152,7 +9447,7 @@ dependencies = [ "futures 0.1.29", "iovec", "libc", - "log 0.4.11", + "log", "mio", "mio-uds", "tokio-codec", @@ -9169,8 +9464,8 @@ dependencies = [ "bytes 0.5.6", "futures-core", "futures-sink", - "log 0.4.11", - "pin-project-lite", + "log", + "pin-project-lite 0.1.7", "tokio 0.2.21", ] @@ -9191,35 +9486,57 @@ checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" [[package]] name = "tracing" -version = "0.1.18" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0aae59226cf195d8e74d4b34beae1859257efb4e5fed3f147d2dc2c7d372178" +checksum = "9f47026cdc4080c07e49b37087de021820269d996f581aac150ef9e5583eefe3" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", + "log", + "pin-project-lite 0.2.0", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0693bf8d6f2bf22c690fc61a9d21ac69efdbb894a17ed596b9af0f01e64b84b" +checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", ] [[package]] name = "tracing-core" -version = "0.1.13" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d593f98af59ebc017c0648f0117525db358745a8894a8d684e185ba3f45954f9" +checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" dependencies = [ "lazy_static", ] +[[package]] +name = "tracing-error" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4d7c0b83d4a500748fa5879461652b361edf5c9d51ede2a2ac03875ca185e24" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-futures" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" +dependencies = [ + "pin-project 0.4.23", + "tracing", +] + [[package]] name = "tracing-log" version = "0.1.1" @@ -9227,15 +9544,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9" dependencies = [ "lazy_static", - "log 0.4.11", + "log", "tracing-core", ] [[package]] name = "tracing-serde" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6ccba2f8f16e0ed268fc765d9b7ff22e965e7185d32f8f1ec8294fe17d86e79" +checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" dependencies = [ "serde", "tracing-core", @@ -9243,9 +9560,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abd165311cc4d7a555ad11cc77a37756df836182db0d81aac908c8184c584f40" +checksum = "a1fa8f0c8f4c594e4fc9debc1990deab13238077271ba84dd853d54902ee3401" dependencies = [ "ansi_term 0.12.1", "chrono", @@ -9255,8 +9572,9 @@ dependencies = [ "serde", "serde_json", "sharded-slab", - "smallvec 1.4.2", + "smallvec 1.6.1", "thread_local", + "tracing", "tracing-core", "tracing-log", "tracing-serde", @@ -9270,15 +9588,15 @@ checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" [[package]] name = "trie-db" -version = "0.22.0" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39f1a9a9252d38c5337cf0c5392988821a5cf1b2103245016968f2ab41de9e38" +checksum = "5cc176c377eb24d652c9c69c832c832019011b6106182bf84276c66b66d5c9a6" dependencies = [ "hash-db", - "hashbrown 0.8.0", - "log 0.4.11", + "hashbrown", + "log", "rustc-hex", - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] @@ -9311,18 +9629,36 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + [[package]] name = "uint" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "173cd16430c206dc1a430af8a89a0e9c076cf15cb42b4aedb10e8cc8fee73681" dependencies = [ - "byteorder 1.3.4", + "byteorder", "crunchy", "rustc-hex", "static_assertions", ] +[[package]] +name = "uint" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11fe9a9348741cf134085ad57c249508345fe16411b3d7fb4ff2da2f1d6382e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicase" version = "2.6.0" @@ -9380,36 +9716,20 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402" dependencies = [ - "generic-array 0.14.2", + "generic-array 0.14.4", "subtle 2.2.3", ] -[[package]] -name = "unsigned-varint" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f67332660eb59a6f1eb24ff1220c9e8d01738a8503c6002e30bcfe4bd9f2b4a9" - -[[package]] -name = "unsigned-varint" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "669d776983b692a906c881fcd0cfb34271a48e197e4d6cb8df32b05bfc3d3fa5" -dependencies = [ - "bytes 0.5.6", - "futures-io", - "futures-util", - "futures_codec", -] - [[package]] name = "unsigned-varint" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7fdeedbf205afadfe39ae559b75c3240f24e257d0ca27e85f85cb82aa19ac35" dependencies = [ + "bytes 0.5.6", "futures-io", "futures-util", + "futures_codec", ] [[package]] @@ -9431,10 +9751,11 @@ dependencies = [ [[package]] name = "url" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" +checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e" dependencies = [ + "form_urlencoded", "idna 0.2.0", "matches", "percent-encoding 2.1.0", @@ -9448,9 +9769,9 @@ checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" [[package]] name = "vec-arena" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17dfb54bf57c9043f4616cb03dab30eff012cc26631b797d8354b916708db919" +checksum = "eafc1b9b2dfc6f5529177b62cf806484db55b32dc7c9658a118e11bbeb33061d" [[package]] name = "vec_map" @@ -9481,9 +9802,20 @@ dependencies = [ [[package]] name = "waker-fn" -version = "1.0.0" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + +[[package]] +name = "walkdir" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9571542c2ce85ce642e6b58b3364da2fb53526360dfb7c211add4f5c23105ff7" +checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" +dependencies = [ + "same-file", + "winapi 0.3.9", + "winapi-util", +] [[package]] name = "want" @@ -9492,7 +9824,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" dependencies = [ "futures 0.1.29", - "log 0.4.11", + "log", "try-lock", ] @@ -9502,7 +9834,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" dependencies = [ - "log 0.4.11", + "log", "try-lock", ] @@ -9512,13 +9844,19 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasm-bindgen" -version = "0.2.64" +version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a634620115e4a229108b71bde263bb4220c483b3f07f5ba514ee8d15064c4c2" +checksum = "3cd364751395ca0f68cafb17666eee36b63077fb5ecd972bbcd74c90c4bf736e" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "serde", "serde_json", "wasm-bindgen-macro", @@ -9526,26 +9864,26 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.64" +version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e53963b583d18a5aa3aaae4b4c1cb535218246131ba22a71f05b518098571df" +checksum = "1114f89ab1f4106e5b55e688b828c0ab0ea593a1ea7c094b141b14cbaaec2d62" dependencies = [ "bumpalo", "lazy_static", - "log 0.4.11", - "proc-macro2 1.0.18", + "log", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.14" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba48d66049d2a6cc8488702e7259ab7afc9043ad0dc5448444f46f2a453b362" +checksum = "1fe9756085a84584ee9457a002b7cdfe0bfff169f45d2591d8be1345a6780e35" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "wasm-bindgen", "web-sys", @@ -9553,9 +9891,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.64" +version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fcfd5ef6eec85623b4c6e844293d4516470d8f19cd72d0d12246017eb9060b8" +checksum = "7a6ac8995ead1f084a8dea1e65f194d0973800c7f571f6edd70adf06ecf77084" dependencies = [ "quote 1.0.7", "wasm-bindgen-macro-support", @@ -9563,34 +9901,44 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.64" +version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9adff9ee0e94b926ca81b57f57f86d5545cdcb1d259e21ec9bdd95b901754c75" +checksum = "b5a48c72f299d80557c7c62e37e7225369ecc0c963964059509fbafe917c7549" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.64" +version = "0.2.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7811dd7f9398f14cc76efd356f98f03aa30419dea46aa810d71e819fc97158" + +[[package]] +name = "wasm-gc-api" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7b90ea6c632dd06fd765d44542e234d5e63d9bb917ecd64d79778a13bd79ae" +checksum = "d0c32691b6c7e6c14e7f8fd55361a9088b507aa49620fcd06c09b3a1082186b9" +dependencies = [ + "log", + "parity-wasm 0.32.0", + "rustc-demangle", +] [[package]] name = "wasm-timer" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324c5e65a08699c9c4334ba136597ab22b85dccd4b65dd1e36ccf8f723a95b54" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" dependencies = [ - "futures 0.3.5", + "futures 0.3.8", "js-sys", - "parking_lot 0.9.0", + "parking_lot 0.11.1", "pin-utils", - "send_wrapper 0.2.0", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -9606,7 +9954,7 @@ dependencies = [ "memory_units", "num-rational", "num-traits 0.2.12", - "parity-wasm", + "parity-wasm 0.41.0", "wasmi-validation", ] @@ -9616,7 +9964,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea78c597064ba73596099281e2f4cfc019075122a65cdda3205af94f0b264d93" dependencies = [ - "parity-wasm", + "parity-wasm 0.41.0", ] [[package]] @@ -9639,13 +9987,13 @@ checksum = "1cd3c4f449382779ef6e0a7c3ec6752ae614e20a42e4100000c3efdc973100e2" dependencies = [ "anyhow", "backtrace", - "cfg-if", + "cfg-if 0.1.10", "lazy_static", "libc", - "log 0.4.11", + "log", "region", "rustc-demangle", - "smallvec 1.4.2", + "smallvec 1.6.1", "target-lexicon", "wasmparser 0.59.0", "wasmtime-environ", @@ -9681,17 +10029,17 @@ dependencies = [ "anyhow", "base64 0.12.3", "bincode", - "cfg-if", + "cfg-if 0.1.10", "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "cranelift-wasm", - "directories", + "directories 2.0.2", "errno", "file-per-thread-logger", "indexmap", "libc", - "log 0.4.11", + "log", "more-asserts", "rayon", "serde", @@ -9710,14 +10058,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e914c013c7a9f15f4e429d5431f2830fb8adb56e40567661b69c5ec1d645be23" dependencies = [ "anyhow", - "cfg-if", + "cfg-if 0.1.10", "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "cranelift-native", "cranelift-wasm", "gimli 0.21.0", - "log 0.4.11", + "log", "more-asserts", "object 0.20.0", "region", @@ -9753,7 +10101,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e8d4d1af8dd5f7096cfcc89dd668d358e52980c38cce199643372ffd6590e27" dependencies = [ "anyhow", - "cfg-if", + "cfg-if 0.1.10", "gimli 0.21.0", "lazy_static", "libc", @@ -9773,11 +10121,11 @@ checksum = "3a25f140bbbaadb07c531cba99ce1a966dba216138dc1b2a0ddecec851a01a93" dependencies = [ "backtrace", "cc", - "cfg-if", + "cfg-if 0.1.10", "indexmap", "lazy_static", "libc", - "log 0.4.11", + "log", "memoffset", "more-asserts", "region", @@ -9806,9 +10154,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.41" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863539788676619aac1a23e2df3655e96b32b0e05eb72ca34ba045ad573c625d" +checksum = "222b1ef9334f92a21d3fb53dc3fd80f30836959a90f9274a626d7e06315ba3c3" dependencies = [ "js-sys", "wasm-bindgen", @@ -9826,34 +10174,25 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4" -dependencies = [ - "webpki", -] - -[[package]] -name = "webpki-roots" -version = "0.19.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8eff4b7516a57307f9349c64bf34caa34b940b66fed4b2fb3136cb7386e5739" +checksum = "82015b7e0b8bad8185994674a13a93306bea76cf5a16c5a181382fd3a5ec2376" dependencies = [ "webpki", ] [[package]] -name = "wepoll-sys-stjepang" -version = "1.0.6" +name = "wepoll-sys" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd319e971980166b53e17b1026812ad66c6b54063be879eb182342b55284694" +checksum = "0fcb14dea929042224824779fbc82d9fab8d2e6d3cbc0ac404de8edf489e77ff" dependencies = [ "cc", ] [[package]] name = "westend-runtime" -version = "0.8.24" +version = "0.8.27" dependencies = [ "bitvec", "frame-benchmarking", @@ -9862,9 +10201,9 @@ dependencies = [ "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", - "hex-literal 0.2.1", + "hex-literal", "libsecp256k1", - "log 0.3.9", + "log", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", @@ -9872,7 +10211,6 @@ dependencies = [ "pallet-collective", "pallet-democracy", "pallet-elections-phragmen", - "pallet-finality-tracker", "pallet-grandpa", "pallet-identity", "pallet-im-online", @@ -9906,7 +10244,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "smallvec 1.4.2", + "smallvec 1.6.1", "sp-api", "sp-authority-discovery", "sp-block-builder", @@ -9924,8 +10262,8 @@ dependencies = [ "sp-trie", "sp-version", "static_assertions", - "substrate-wasm-builder-runner", - "tiny-keccak 1.5.0", + "substrate-wasm-builder", + "tiny-keccak", ] [[package]] @@ -9980,24 +10318,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "ws" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51a2c47b5798ccc774ffb93ff536aec7c4275d722fd9c740c83cdd1af1f2d94" -dependencies = [ - "byteorder 1.3.4", - "bytes 0.4.12", - "httparse", - "log 0.4.11", - "mio", - "mio-extras", - "rand 0.7.3", - "sha-1", - "slab", - "url 2.1.1", -] - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -10014,30 +10334,78 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "637ff90c9540fa3073bb577e65033069e4bae7c79d49d74aa3ffdf5342a53217" dependencies = [ - "curve25519-dalek", + "curve25519-dalek 2.1.0", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "x25519-dalek" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc614d95359fd7afc321b66d2107ede58b246b844cf5d8a0adcca413e439f088" +dependencies = [ + "curve25519-dalek 3.0.0", "rand_core 0.5.1", "zeroize", ] +[[package]] +name = "xcm" +version = "0.8.22" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "xcm-builder" +version = "0.8.22" +dependencies = [ + "frame-support", + "parity-scale-codec", + "polkadot-parachain", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", +] + +[[package]] +name = "xcm-executor" +version = "0.8.22" +dependencies = [ + "frame-support", + "impl-trait-for-tuples 0.2.0", + "parity-scale-codec", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", +] + [[package]] name = "yamux" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aeb8c4043cac71c3c299dff107171c220d179492350ea198e109a414981b83c" dependencies = [ - "futures 0.3.5", - "log 0.4.11", + "futures 0.3.8", + "log", "nohash-hasher", - "parking_lot 0.11.0", + "parking_lot 0.11.1", "rand 0.7.3", "static_assertions", ] [[package]] name = "zeroize" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cbac2ed2ba24cc90f5e06485ac8c7c1e5449fe8911aef4d8877218af021a5b8" +checksum = "81a974bcdd357f0dca4d41677db03436324d45a4c9ed2d0b873a5a360ce41c36" dependencies = [ "zeroize_derive", ] @@ -10048,9 +10416,9 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", - "syn 1.0.33", + "syn 1.0.58", "synstructure", ] diff --git a/Cargo.toml b/Cargo.toml index 78047a1a58da3bdcbd42c2cf96503e88a4141543..a3d026e7298db48f19fd9944c70935f24cd2d14e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,20 +6,22 @@ path = "src/main.rs" name = "polkadot" description = "Implementation of a https://polkadot.network node in Rust based on the Substrate framework." license = "GPL-3.0-only" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" readme = "README.md" [dependencies] cli = { package = "polkadot-cli", path = "cli" } -futures = "0.3.4" -service = { package = "polkadot-service", path = "service" } +color-eyre = "0.5.10" +thiserror = "1.0.23" +futures = "0.3.8" +service = { package = "polkadot-service", path = "node/service" } parity-util-mem = { version = "*", default-features = false, features = ["jemalloc-global"] } [dev-dependencies] -assert_cmd = "0.12" -nix = "0.17" +assert_cmd = "1.0.2" +nix = "0.19.1" tempfile = "3.1.0" [workspace] @@ -32,15 +34,14 @@ members = [ "runtime/parachains", "runtime/polkadot", "runtime/kusama", - "runtime/rococo-v1", + "runtime/rococo", "runtime/westend", "runtime/test-runtime", - "runtime/test-runtime/client", - "service", "statement-table", - "service", "validation", - + "xcm", + "xcm/xcm-builder", + "xcm/xcm-executor", "node/collation-generation", "node/core/av-store", "node/core/backing", @@ -64,24 +65,29 @@ members = [ "node/subsystem", "node/subsystem-test-helpers", "node/subsystem-util", - "node/test-service", - + "node/jaeger", + "node/test/client", + "node/test/service", "parachain/test-parachains", "parachain/test-parachains/adder", + "parachain/test-parachains/adder/collator", ] [badges] maintenance = { status = "actively-developed" } +# make sure dev builds with backtrace do +# not slow us down +[profile.dev.package.backtrace] +opt-level = 3 + [profile.release] # Polkadot runtime requires unwinding. panic = "unwind" [features] runtime-benchmarks=["cli/runtime-benchmarks"] -service-rewr= [ - "cli/service-rewr", -] +real-overseer=["cli/real-overseer"] # Configuration for building a .deb package - for use with `cargo-deb` [package.metadata.deb] diff --git a/README.md b/README.md index d254535f8b8c0c7e50c0d792c84f8a360700cdf3..0b54f90ebac2b1f5a485d577b8440f512354e451 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,9 @@ gpg --export 9D4B2B6EB8F97156D19669A9FF0812D491B96798 > /usr/share/keyrings/pari # Add the Parity repository and update the package index echo 'deb [signed-by=/usr/share/keyrings/parity.gpg] https://releases.parity.io/deb release main' > /etc/apt/sources.list.d/parity.list apt update +# Install the `parity-keyring` package - This will ensure the GPG key +# used by APT remains up-to-date +apt install parity-keyring # Install polkadot apt install polkadot diff --git a/RELEASE.md b/RELEASE.md index b5c5e443b44dbb7a90d314d546392fd5c295af58..554cfb8e455e27b26a670f171d9996c31be735e3 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,96 +1,56 @@ -# Release Checklist - -The following checks should be completed before publishing a new release of the -Polkadot/Kusama/Westend runtime or client. - -### Runtime Releases - -The following should be done *prior* to tagging the potential release. Upon -completion, tag the commit and proceed with the [All Releases](#all-releases) steps. - -- [ ] List any [native runtime](#native-runtimes) versions associated with the release. -- [ ] Has incremented [`spec_version`](#spec-version) for any native runtimes from any existing use on public (non-private/test) networks. -- [ ] Verify [new migrations](#new-migrations) complete successfully, and the runtime state is - correctly updated. -- [ ] Verify previously [completed migrations](#old-migrations-removed) are removed. -- [ ] Verify pallet and [extrinsic ordering](#extrinsic-ordering) has stayed the same. Bump - `transaction_version` if not. -- [ ] Verify new extrinsics have been correctly whitelisted/blacklisted for - [proxy filters](#proxy-filtering). -- [ ] Verify [benchmarks](#benchmarks) have been updated for any modified runtime logic. -- [ ] Verify [Polkadot JS API](#polkadot-js) are up to date with the latest runtime changes. - -### All Releases - -- [ ] Check that the new client versions have [run on the network](#burn-in) without issue for 12 - hours. -- [ ] Check that a draft release has been created at https://github.com/paritytech/polkadot/releases with relevant [release notes](#release-notes) -- [ ] Check that [build artifacts](#build-artifacts) have been added to the draft-release - -## Notes - -### Burn In - -Ensure that Parity DevOps has run the new release on Westend, Kusama, and Polkadot validators for -at least 12 hours prior to publishing the release. - -### Build Artifacts - -Add any necessary assets to the release. They should include: - -- Linux binary -- GPG signature of the Linux binary -- SHA256 of binary -- Source code -- Wasm binaries of any runtimes - -### Release notes - -The release notes should list: - -- The priority of the release (i.e., how quickly users should upgrade) -- Which native runtimes and their versions are included -- The proposal hashes of the runtimes as built with [srtool](https://gitlab.com/chevdor/srtool) - -The release notes may also list: - -- Free text at the beginning of the notes mentioning anything important regarding this release -- Notable changes (those labelled with B[1-9]-* labels) separated into sections - -### Spec Version - -A runtime upgrade must bump the spec number. This may follow a pattern with the client release -(e.g. runtime v12 corresponds to v0.8.12, even if the current runtime is not v11). - -### New Migrations - -Ensure that any migrations that are required due to storage or logic changes are included in the -`on_runtime_upgrade` function of the appropriate pallets. - -### Old Migrations Removed - -Any previous `on_runtime_upgrade` functions from old upgrades must be removed to prevent them from -executing a second time. - -### Extrinsic Ordering - -Offline signing libraries depend on a consistent ordering of call indices and functions. Compare -the metadata of the current and new runtimes and ensure that the `module index, call index` tuples -map to the same set of functions. In case of a breaking change, increase `transaction_version`. - -Note: Adding new functions to the runtime does not constitute a breaking change as long as they are -added to the end of a pallet (i.e., does not break any other call index). - -### Proxy Filtering - -The runtime contains proxy filters that map proxy types to allowable calls. If the new runtime -contains any new calls, verify that the proxy filters are up to date to include them. - -### Benchmarks - -Run the benchmarking suite with the new runtime and update any function weights if necessary. - -### Polkadot JS - -Ensure that a release of [Polkadot JS API]() contains any new types or interfaces necessary to -interact with the new runtime. +Polkadot Release Process +------------------------ + +### Branches +* release-candidate branch: The branch used for staging of the next release. + Named like `release-v0.8.26` +* release branch: The branch to which successful release-candidates are merged + and tagged with the new version. Named literally `release`. + +### Notes +* The release-candidate branch *must* be made in the paritytech/polkadot repo in +order for release automation to work correctly +* Any new pushes/merges to the release-candidate branch (for example, +refs/heads/release-v0.8.26) will result in the rc index being bumped (e.g., v0.8.26-rc1 +to v0.8.26-rc2) and new wasms built. + +### Release workflow + +Below are the steps of the release workflow. Steps prefixed with NOACTION are +automated and require no human action. + +1. To initiate the release process, branch master off to a release branch and push it to Github: + - `git checkout master; git pull; git checkout -b release-v0.8.26; git push origin refs/heads/release-v0.8.26` +2. NOACTION: The current HEAD of the release-candidate branch is tagged `v0.8.26-rc1` +3. NOACTION: A draft release and runtime WASMs are created for this + release-candidate automatically. A link to the draft release will be linked in + the internal polkadot matrix channel. +4. NOACTION: A new Github issue is created containing a checklist of manual + steps to be completed before we are confident with the release. This will be + linked in Matrix. +5. Complete the steps in the issue created in step 4, signing them off as + completed +6. (optional) If a fix is required to the release-candidate: + 1. Merge the fix with `master` first + 2. Cherry-pick the commit from `master` to `release-v0.8.26`, fixing any + merge conflicts. Try to avoid unnecessarily bumping crates. + 3. Push the release-candidate branch to Github - this is now the new release- + candidate + 4. Depending on the cherry-picked changes, it may be necessary to perform some + or all of the manual tests again. +7. Once happy with the release-candidate, perform the release using the release + script located at `scripts/release.sh` (or perform the steps in that script + manually): + - `./scripts/release.sh v0.8.26` +8. NOACTION: The HEAD of the `release` branch will be tagged with `v0.8.26`, + and a final draft release will be created on Github. + +### Security releases + +Occasionally there may be changes that need to be made to the most recently +released version of Polkadot, without taking *every* change to `master` since +the last release. For example, in the event of a security vulnerability being +found, where releasing a fixed version is a matter of some expediency. In cases +like this, the fix should first be merged with master, cherry-picked to a branch +forked from `release`, tested, and then finally merged with `release`. A +sensible versioning scheme for changes like this is `vX.Y.Z-1`. diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 9ee9dc83125bdcde1db80c830670f0ba5d7d9280..2984e9dadd67a275d0938432470ce702311d4b34 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-cli" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] description = "Polkadot Relay-chain Client Node" edition = "2018" @@ -14,26 +14,22 @@ wasm-opt = false crate-type = ["cdylib", "rlib"] [dependencies] -log = "0.4.8" -futures = { version = "0.3.4", features = ["compat"] } -structopt = "0.3.8" -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } +log = "0.4.11" +thiserror = "1.0.23" +structopt = { version = "0.3.21", optional = true } +wasm-bindgen = { version = "0.2.69", optional = true } +wasm-bindgen-futures = { version = "0.4.19", optional = true } + +service = { package = "polkadot-service", path = "../node/service", default-features = false, optional = true } +polkadot-parachain = { path = "../parachain", optional = true } + sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-db = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } -service = { package = "polkadot-service", path = "../service", default-features = false, optional = true } -service-new = { package = "polkadot-service-new", path = "../node/service", default-features = false, optional = true } - -tokio = { version = "0.2.13", features = ["rt-threaded"], optional = true } +tracing-futures = "0.2.4" frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } sc-service = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -wasm-bindgen = { version = "0.2.57", optional = true } -wasm-bindgen-futures = { version = "0.4.7", optional = true } browser-utils = { package = "substrate-browser-utils", git = "https://github.com/paritytech/substrate", branch = "master", optional = true } + # this crate is used only to enable `trie-memory-tracker` feature # see https://github.com/paritytech/substrate/pull/6745 sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -42,16 +38,15 @@ sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } [features] -default = [ "wasmtime", "db", "cli", "service-old", "trie-memory-tracker" ] +default = [ "wasmtime", "db", "cli", "full-node", "trie-memory-tracker", "polkadot-parachain" ] wasmtime = [ "sc-cli/wasmtime" ] db = [ "service/db" ] cli = [ - "tokio", + "structopt", "sc-cli", "sc-service", "frame-benchmarking-cli", ] -service-old = [ "service/full-node" ] browser = [ "wasm-bindgen", "wasm-bindgen-futures", @@ -59,5 +54,6 @@ browser = [ "service", ] runtime-benchmarks = [ "service/runtime-benchmarks" ] -service-rewr = [ "service-new/full-node" ] trie-memory-tracker = [ "sp-trie/memory-tracker" ] +full-node = [ "service/full-node" ] +real-overseer = [ "service/real-overseer" ] diff --git a/cli/browser-demo/index.html b/cli/browser-demo/index.html index 91ef075fc06d572b5da60736b070c39262eb539d..e8419281b7502160e538e877cdfc01465dc17abc 100644 --- a/cli/browser-demo/index.html +++ b/cli/browser-demo/index.html @@ -16,7 +16,7 @@ async function start() { await init('./pkg/polkadot_cli_bg.wasm'); log('Successfully loaded WASM'); log('Fetching chain spec'); - const chain_spec_response = await fetch("https://raw.githubusercontent.com/paritytech/polkadot/master/service/res/westend.json"); + const chain_spec_response = await fetch("https://raw.githubusercontent.com/paritytech/polkadot/master/node/service/res/westend.json"); const chain_spec_text = await chain_spec_response.text(); // Build our client. diff --git a/cli/src/browser.rs b/cli/src/browser.rs index d3523e92a60005ff305963cf7bff516e1a67341a..5b0255430cd68addcf936928bf59dc00553715a3 100644 --- a/cli/src/browser.rs +++ b/cli/src/browser.rs @@ -20,7 +20,6 @@ use browser_utils::{ Client, browser_configuration, set_console_error_panic_hook, init_console_log, }; -use std::str::FromStr; /// Starts the client. #[wasm_bindgen] diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 154aaa14dc22ddc1aad50370ebc1e142e090e70d..8c4bfb1e74e54b496cf7669ce4fd30aaac91cf80 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -24,9 +24,6 @@ pub enum Subcommand { /// Build a chain specification. BuildSpec(sc_cli::BuildSpecCmd), - /// Build a chain specification with a light client sync state. - BuildSyncSpec(sc_cli::BuildSyncSpecCmd), - /// Validate blocks. CheckBlock(sc_cli::CheckBlockCmd), @@ -55,6 +52,9 @@ pub enum Subcommand { about = "Benchmark runtime pallets." )] Benchmark(frame_benchmarking_cli::BenchmarkCmd), + + /// Key management cli utilities + Key(sc_cli::KeySubcommand), } #[allow(missing_docs)] @@ -79,19 +79,9 @@ pub struct RunCmd { #[structopt(long = "force-westend")] pub force_westend: bool, - /// Enable the authority discovery module on validator or sentry nodes. - /// - /// When enabled: - /// - /// (1) As a validator node: Make oneself discoverable by publishing either - /// ones own network addresses, or the ones of ones sentry nodes - /// (configured via the `sentry-nodes` flag). - /// - /// (2) As a validator or sentry node: Discover addresses of validators or - /// addresses of their sentry nodes and maintain a permanent connection - /// to a subset. - #[structopt(long = "enable-authority-discovery")] - pub authority_discovery_enabled: bool, + /// Force using Rococo native runtime. + #[structopt(long = "force-rococo")] + pub force_rococo: bool, /// Setup a GRANDPA scheduled voting pause. /// @@ -101,6 +91,13 @@ pub struct RunCmd { /// elapsed (i.e. until a block at height `pause_block + delay` is imported). #[structopt(long = "grandpa-pause", number_of_values(2))] pub grandpa_pause: Vec, + + /// Add the destination address to the jaeger agent. + /// + /// Must be valid socket address, of format `IP:Port` + /// commonly `127.0.0.1:6831`. + #[structopt(long)] + pub jaeger_agent: Option, } #[allow(missing_docs)] @@ -108,7 +105,6 @@ pub struct RunCmd { pub struct Cli { #[structopt(subcommand)] pub subcommand: Option, - #[structopt(flatten)] pub run: RunCmd, } diff --git a/cli/src/command.rs b/cli/src/command.rs index 5ea0319c832d49999786858d0e5cd2e87f65873e..45e0750c3fb70f6c0dd2b824e402aab0550e0ceb 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -15,13 +15,32 @@ // along with Polkadot. If not, see . use log::info; -#[cfg(not(feature = "service-rewr"))] use service::{IdentifyVariant, self}; -#[cfg(feature = "service-rewr")] -use service_new::{IdentifyVariant, self as service}; -use sc_cli::{SubstrateCli, Result, RuntimeVersion, Role}; +use sc_cli::{SubstrateCli, RuntimeVersion, Role}; use crate::cli::{Cli, Subcommand}; -use std::sync::Arc; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error(transparent)] + PolkadotService(#[from] service::Error), + + #[error(transparent)] + SubstrateCli(#[from] sc_cli::Error), + + #[error(transparent)] + SubstrateService(#[from] sc_service::Error), + + #[error("Other: {0}")] + Other(String), +} + +impl std::convert::From for Error { + fn from(s: String) -> Self { + Self::Other(s) + } +} + +type Result = std::result::Result; fn get_exec_name() -> Option { std::env::current_exe() @@ -48,7 +67,7 @@ impl SubstrateCli for Cli { fn load_spec(&self, id: &str) -> std::result::Result, String> { let id = if id == "" { let n = get_exec_name().unwrap_or_default(); - ["polkadot", "kusama", "westend"].iter() + ["polkadot", "kusama", "westend", "rococo"].iter() .cloned() .find(|&chain| n.starts_with(chain)) .unwrap_or("polkadot") @@ -66,6 +85,9 @@ impl SubstrateCli for Cli { "westend-dev" => Box::new(service::chain_spec::westend_development_config()?), "westend-local" => Box::new(service::chain_spec::westend_local_testnet_config()?), "westend-staging" => Box::new(service::chain_spec::westend_staging_testnet_config()?), + "rococo-staging" => Box::new(service::chain_spec::rococo_staging_testnet_config()?), + "rococo-local" => Box::new(service::chain_spec::rococo_local_testnet_config()?), + "rococo" => Box::new(service::chain_spec::rococo_config()?), path => { let path = std::path::PathBuf::from(path); @@ -75,7 +97,9 @@ impl SubstrateCli for Cli { // When `force_*` is given or the file name starts with the name of one of the known chains, // we use the chain spec for the specific chain. - if self.run.force_kusama || starts_with("kusama") { + if self.run.force_rococo || starts_with("rococo") { + Box::new(service::RococoChainSpec::from_json_file(path)?) + } else if self.run.force_kusama || starts_with("kusama") { Box::new(service::KusamaChainSpec::from_json_file(path)?) } else if self.run.force_westend || starts_with("westend") { Box::new(service::WestendChainSpec::from_json_file(path)?) @@ -91,6 +115,8 @@ impl SubstrateCli for Cli { &service::kusama_runtime::VERSION } else if spec.is_westend() { &service::westend_runtime::VERSION + } else if spec.is_rococo() { + &service::rococo_runtime::VERSION } else { &service::polkadot_runtime::VERSION } @@ -122,7 +148,6 @@ pub fn run() -> Result<()> { set_default_ss58_version(chain_spec); - let authority_discovery_enabled = cli.run.authority_discovery_enabled; let grandpa_pause = if cli.run.grandpa_pause.is_empty() { None } else { @@ -137,56 +162,29 @@ pub fn run() -> Result<()> { info!("----------------------------"); } - runner.run_node_until_exit(|config| { + let jaeger_agent = cli.run.jaeger_agent; + + Ok(runner.run_node_until_exit(move |config| async move { let role = config.role.clone(); - match role { - Role::Light => service::build_light(config).map(|(task_manager, _)| task_manager), + let task_manager = match role { + Role::Light => service::build_light(config).map(|(task_manager, _)| task_manager) + .map_err(|e| sc_service::Error::Other(e.to_string())), _ => service::build_full( config, - None, - authority_discovery_enabled, + service::IsCollator::No, grandpa_pause, - ).map(|r| r.0), - } - }) + jaeger_agent, + ).map(|full| full.task_manager) + .map_err(|e| sc_service::Error::Other(e.to_string()) ) + }; + task_manager + }).map_err(|e| -> sc_cli::Error { e.into() })?) + }, Some(Subcommand::BuildSpec(cmd)) => { let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| cmd.run(config.chain_spec, config.network)) - }, - Some(Subcommand::BuildSyncSpec(cmd)) => { - let runner = cli.create_runner(cmd)?; - let chain_spec = &runner.config().chain_spec; - - set_default_ss58_version(chain_spec); - - let authority_discovery_enabled = cli.run.authority_discovery_enabled; - let grandpa_pause = if cli.run.grandpa_pause.is_empty() { - None - } else { - Some((cli.run.grandpa_pause[0], cli.run.grandpa_pause[1])) - }; - - if chain_spec.is_kusama() { - info!("----------------------------"); - info!("This chain is not in any way"); - info!(" endorsed by the "); - info!(" KUSAMA FOUNDATION "); - info!("----------------------------"); - } - - runner.async_run(|config| { - let chain_spec = config.chain_spec.cloned_box(); - let network_config = config.network.clone(); - let service::NewFull { task_manager, client, network_status_sinks, .. } - = service::new_full_nongeneric( - config, None, authority_discovery_enabled, grandpa_pause, false, - )?; - let client = Arc::new(client); - - Ok((cmd.run(chain_spec, network_config, client, network_status_sinks), task_manager)) - }) + Ok(runner.sync_run(|config| cmd.run(config.chain_spec, config.network))?) }, Some(Subcommand::CheckBlock(cmd)) => { let runner = cli.create_runner(cmd)?; @@ -195,7 +193,8 @@ pub fn run() -> Result<()> { set_default_ss58_version(chain_spec); runner.async_run(|mut config| { - let (client, _, import_queue, task_manager) = service::new_chain_ops(&mut config)?; + let (client, _, import_queue, task_manager) = service::new_chain_ops(&mut config, None) + .map_err(|e| sc_service::Error::Other(e.to_string()))?; Ok((cmd.run(client, import_queue), task_manager)) }) }, @@ -206,7 +205,8 @@ pub fn run() -> Result<()> { set_default_ss58_version(chain_spec); runner.async_run(|mut config| { - let (client, _, _, task_manager) = service::new_chain_ops(&mut config)?; + let (client, _, _, task_manager) = service::new_chain_ops(&mut config, None) + .map_err(|e| sc_service::Error::Other(e.to_string()))?; Ok((cmd.run(client, config.database), task_manager)) }) }, @@ -217,7 +217,8 @@ pub fn run() -> Result<()> { set_default_ss58_version(chain_spec); runner.async_run(|mut config| { - let (client, _, _, task_manager) = service::new_chain_ops(&mut config)?; + let (client, _, _, task_manager) = service::new_chain_ops(&mut config, None) + .map_err(|e| sc_service::Error::Other(e.to_string()))?; Ok((cmd.run(client, config.chain_spec), task_manager)) }) }, @@ -228,13 +229,15 @@ pub fn run() -> Result<()> { set_default_ss58_version(chain_spec); runner.async_run(|mut config| { - let (client, _, import_queue, task_manager) = service::new_chain_ops(&mut config)?; + let (client, _, import_queue, task_manager) = service::new_chain_ops(&mut config, None) + .map_err(|e| sc_service::Error::Other(e.to_string()))?; Ok((cmd.run(client, import_queue), task_manager)) }) }, Some(Subcommand::PurgeChain(cmd)) => { let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| cmd.run(config.database)) + Ok(runner.sync_run(|config| cmd.run(config.database)) + .map_err(|e| sc_service::Error::Other(e.to_string()))?) }, Some(Subcommand::Revert(cmd)) => { let runner = cli.create_runner(cmd)?; @@ -243,18 +246,27 @@ pub fn run() -> Result<()> { set_default_ss58_version(chain_spec); runner.async_run(|mut config| { - let (client, backend, _, task_manager) = service::new_chain_ops(&mut config)?; + let (client, backend, _, task_manager) = service::new_chain_ops(&mut config, None) + .map_err(|e| sc_service::Error::Other(e.to_string()))?; Ok((cmd.run(client, backend), task_manager)) }) }, Some(Subcommand::ValidationWorker(cmd)) => { - sc_cli::init_logger(""); - - if cfg!(feature = "browser") { + let _ = sc_cli::init_logger( + sc_cli::InitLoggerParams { + pattern: "".into(), + tracing_receiver: Default::default(), + tracing_targets: None, + disable_log_reloading: false, + disable_log_color: true, + }, + ); + + if cfg!(feature = "browser") || cfg!(target_os = "android") { Err(sc_cli::Error::Input("Cannot run validation worker in browser".into())) } else { - #[cfg(all(not(feature = "browser"), not(feature = "service-rewr")))] - service::run_validation_worker(&cmd.mem_id)?; + #[cfg(not(any(target_os = "android", feature = "browser")))] + polkadot_parachain::wasm_executor::run_worker(&cmd.mem_id)?; Ok(()) } }, @@ -268,5 +280,7 @@ pub fn run() -> Result<()> { cmd.run::(config) }) }, - } + Some(Subcommand::Key(cmd)) => cmd.run(&cli), + }?; + Ok(()) } diff --git a/cli/src/lib.rs b/cli/src/lib.rs index 385a24d364c8582065827054dcd6d52b88da26d8..43b8da81f9695a7eaa19706ba7cb531f0368e80d 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -17,7 +17,6 @@ //! Polkadot CLI library. #![warn(missing_docs)] -#![warn(unused_extern_crates)] #[cfg(feature = "browser")] mod browser; @@ -26,17 +25,10 @@ mod cli; #[cfg(feature = "cli")] mod command; -#[cfg(not(feature = "service-rewr"))] pub use service::{ - ProvideRuntimeApi, CoreApi, ParachainHost, IdentifyVariant, - Block, self, RuntimeApiCollection, TFullClient -}; - -#[cfg(feature = "service-rewr")] -pub use service_new::{ - self as service, - ProvideRuntimeApi, CoreApi, ParachainHost, IdentifyVariant, - Block, self, RuntimeApiCollection, TFullClient + self, + ProvideRuntimeApi, CoreApi, IdentifyVariant, + Block, RuntimeApiCollection, TFullClient }; #[cfg(feature = "cli")] diff --git a/core-primitives/Cargo.toml b/core-primitives/Cargo.toml index cd4dac0f187d1cf4ced8ba938b48521fc3bf2669..6c45bad3c28b82a47c38130d51c7e39e63051757 100644 --- a/core-primitives/Cargo.toml +++ b/core-primitives/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = [ "derive" ] } +parity-scale-codec = { version = "1.3.5", default-features = false, features = [ "derive" ] } [features] default = [ "std" ] @@ -16,5 +16,5 @@ std = [ "sp-core/std", "sp-runtime/std", "sp-std/std", - "codec/std", + "parity-scale-codec/std", ] diff --git a/core-primitives/src/lib.rs b/core-primitives/src/lib.rs index ffb346467d9e53c0c64ebca4438a9260492fdd8e..e96d0b4a5f611aacbac4b2f59f0f038517b9ba44 100644 --- a/core-primitives/src/lib.rs +++ b/core-primitives/src/lib.rs @@ -21,6 +21,7 @@ //! These core Polkadot types are used by the relay chain and the Parachains. use sp_runtime::{generic, MultiSignature, traits::{Verify, BlakeTwo256, IdentifyAccount}}; +use parity_scale_codec::{Encode, Decode}; /// The block number type used by Polkadot. /// 32-bits will allow for 136 years of blocks assuming 1 block per second. @@ -50,6 +51,21 @@ pub type ChainId = u32; /// A hash of some data used by the relay chain. pub type Hash = sp_core::H256; +/// Unit type wrapper around [`Hash`] that represents a candidate hash. +/// +/// This type is produced by [`CandidateReceipt::hash`]. +/// +/// This type makes it easy to enforce that a hash is a candidate hash on the type level. +#[derive(Clone, Copy, Encode, Decode, Hash, Eq, PartialEq, Debug, Default)] +pub struct CandidateHash(pub Hash); + +#[cfg(feature="std")] +impl std::fmt::Display for CandidateHash { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + /// Index of a transaction in the relay chain. 32-bit should be plenty. pub type Nonce = u32; @@ -79,20 +95,39 @@ pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; /// the parachain. pub type Remark = [u8; 32]; -/// These are special "control" messages that can be passed from the Relaychain to a parachain. -/// They should be handled by all parachains. -#[derive(codec::Encode, codec::Decode, Clone, sp_runtime::RuntimeDebug, PartialEq)] -pub enum DownwardMessage { - /// Some funds were transferred into the parachain's account. The hash is the identifier that - /// was given with the transfer. - TransferInto(AccountId, Balance, Remark), - /// An opaque blob of data. The relay chain must somehow know how to form this so that the - /// destination parachain does something sensible. - /// - /// NOTE: Be very careful not to allow users to place arbitrary size information in here. - Opaque(sp_std::vec::Vec), - /// XCMP message for the Parachain. - XCMPMessage(sp_std::vec::Vec), +/// A message sent from the relay-chain down to a parachain. +/// +/// The size of the message is limited by the `config.max_downward_message_size` parameter. +pub type DownwardMessage = sp_std::vec::Vec; + +/// A wrapped version of `DownwardMessage`. The difference is that it has attached the block number when +/// the message was sent. +#[derive(Encode, Decode, Clone, sp_runtime::RuntimeDebug, PartialEq)] +pub struct InboundDownwardMessage { + /// The block number at which this messages was put into the downward message queue. + pub sent_at: BlockNumber, + /// The actual downward message to processes. + pub msg: DownwardMessage, +} + +/// An HRMP message seen from the perspective of a recipient. +#[derive(Encode, Decode, Clone, sp_runtime::RuntimeDebug, PartialEq)] +pub struct InboundHrmpMessage { + /// The block number at which this message was sent. + /// Specifically, it is the block number at which the candidate that sends this message was + /// enacted. + pub sent_at: BlockNumber, + /// The message payload. + pub data: sp_std::vec::Vec, +} + +/// An HRMP message seen from the perspective of a sender. +#[derive(Encode, Decode, Clone, sp_runtime::RuntimeDebug, PartialEq, Eq, Hash)] +pub struct OutboundHrmpMessage { + /// The para that will get this message in its downward message queue. + pub recipient: Id, + /// The message payload. + pub data: sp_std::vec::Vec, } /// V1 primitives. diff --git a/doc/docker.md b/doc/docker.md index 814323ae74b2734e703b21972624fc541f83b0c5..1d3b860a06f1706e37efd7689b2442d10d3fa6be 100644 --- a/doc/docker.md +++ b/doc/docker.md @@ -1,36 +1,38 @@ ### The easiest way -The easiest/faster option is to use the latest image. +The easiest/faster option to run Polkadot in docker is to use the latest +release images. These are small images that use the latest official release of +the polkadot binary, pulled from our package repository. Let´s first check the version we have. The first time you run this command, the polkadot docker image will be downloaded. This takes a bit of time and bandwidth, be patient: ```bash -docker run --rm -it chevdor/polkadot:latest polkadot --version +docker run --rm -it parity/polkadot:latest --version ``` You can also pass any argument/flag that polkadot supports: ```bash -docker run --rm -it chevdor/polkadot:latest polkadot --chain westend --name "PolkaDocker" +docker run --rm -it parity/polkadot:latest --chain westend --name "PolkaDocker" ``` Once you are done experimenting and picking the best node name :) you can start polkadot as daemon, exposes the polkadot ports and mount a volume that will keep your blockchain data locally: ```bash -docker run -d -p 30333:30333 -p 9933:9933 -v /my/local/folder:/data chevdor/polkadot:latest polkadot --chain westend +docker run -d -p 30333:30333 -p 9933:9933 -v /my/local/folder:/data parity/polkadot:latest --chain westend ``` Additionally if you want to have custom node name you can add the `--name "YourName"` at the end ```bash -docker run -d -p 30333:30333 -p 9933:9933 -v /my/local/folder:/data chevdor/polkadot:latest polkadot --chain westend --name "PolkaDocker" +docker run -d -p 30333:30333 -p 9933:9933 -v /my/local/folder:/data parity/polkadot:latest --chain westend --name "PolkaDocker" ``` ```bash -docker run -d -p 30333:30333 -p 9933:9933 -v /my/local/folder:/data chevdor/polkadot:latest polkadot --rpc-external --chain westend +docker run -d -p 30333:30333 -p 9933:9933 -v /my/local/folder:/data parity/polkadot:latest --rpc-external --chain westend ``` -if you want to connect to rpc port 9933, then must add polkadot startup parameter: `--rpc-external`. +If you want to connect to rpc port 9933, then must add polkadot startup parameter: `--rpc-external`. **Note:** The `--chain westend` argument is important and you need to add it to the command line. If you are running older node versions (pre 0.3) you don't need it. @@ -68,7 +70,7 @@ If you run into issues with polkadot when using docker, please run the following (replace the tag with the appropriate one if you do not use latest): ```bash -docker run --rm -it chevdor/polkadot:latest polkadot --version +docker run --rm -it parity/polkadot:latest --version ``` This will show you the polkadot version as well as the git commit ref that was used to build your container. diff --git a/docker/Dockerfile b/docker/Dockerfile index 0a0746f27be6a151eee23fc53f181a365191b1ba..0cb7904fd7b5c2eb45aa2210d9bbf227f77c4c68 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,4 @@ -FROM phusion/baseimage:0.11 as builder -LABEL maintainer "chevdor@gmail.com" +FROM paritytech/ci-linux:production as builder LABEL description="This is the build stage for Polkadot. Here we create the binary." ARG PROFILE=release @@ -7,27 +6,16 @@ WORKDIR /polkadot COPY . /polkadot -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y cmake pkg-config libssl-dev git clang -RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ - export PATH=$PATH:$HOME/.cargo/bin && \ - scripts/init.sh && \ - cargo build --$PROFILE +RUN cargo build --$PROFILE # ===== SECOND STAGE ====== -FROM phusion/baseimage:0.11 -LABEL maintainer "chevdor@gmail.com" +FROM debian:buster-slim LABEL description="This is the 2nd stage: a very small image where we copy the Polkadot binary." ARG PROFILE=release COPY --from=builder /polkadot/target/$PROFILE/polkadot /usr/local/bin -RUN mv /usr/share/ca* /tmp && \ - rm -rf /usr/share/* && \ - mv /tmp/ca-certificates /usr/share/ && \ - rm -rf /usr/lib/python* && \ - useradd -m -u 1000 -U -s /bin/sh -d /polkadot polkadot && \ +RUN useradd -m -u 1000 -U -s /bin/sh -d /polkadot polkadot && \ mkdir -p /polkadot/.local/share/polkadot && \ chown -R polkadot:polkadot /polkadot/.local && \ ln -s /polkadot/.local/share/polkadot /data && \ diff --git a/docker/build.sh b/docker/build.sh index a4c6831676ff26af54898a37a4f6b75d48fb18ce..6456383fcdeaed28e48f757063a4f22af546a8b0 100755 --- a/docker/build.sh +++ b/docker/build.sh @@ -9,12 +9,12 @@ cd $PROJECT_ROOT # Find the current version from Cargo.toml VERSION=`grep "^version" ./Cargo.toml | egrep -o "([0-9\.]+)"` -GITUSER=chevdor +GITUSER=parity GITREPO=polkadot # Build the image echo "Building ${GITUSER}/${GITREPO}:latest docker image, hang on!" -time docker build -f ./docker/Dockerfile --build-arg PROFILE=release -t ${GITUSER}/${GITREPO}:latest . +time docker build -f ./docker/Dockerfile --build-arg RUSTC_WRAPPER= --build-arg PROFILE=release -t ${GITUSER}/${GITREPO}:latest . # Show the list of available images for this repo echo "Image is ready" diff --git a/erasure-coding/Cargo.toml b/erasure-coding/Cargo.toml index bb880232e63d600b6b0f57e4b1e6af4e087b9ced..311ad873ed4023db97f4d5d0d6e8861002700e6d 100644 --- a/erasure-coding/Cargo.toml +++ b/erasure-coding/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "polkadot-erasure-coding" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" [dependencies] primitives = { package = "polkadot-primitives", path = "../primitives" } -reed_solomon = { package = "reed-solomon-erasure", version = "4.0.2"} -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } +reed_solomon = { package = "reed-solomon-erasure", version = "4.0.2" } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } trie = { package = "sp-trie", git = "https://github.com/paritytech/substrate", branch = "master" } -derive_more = "0.15.0" +thiserror = "1.0.23" diff --git a/erasure-coding/fuzzer/Cargo.lock b/erasure-coding/fuzzer/Cargo.lock new file mode 100644 index 0000000000000000000000000000000000000000..4af40a99bbf6a506955f61ab6b4df0aed59cec9c --- /dev/null +++ b/erasure-coding/fuzzer/Cargo.lock @@ -0,0 +1,2621 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c0929d69e78dd9bf5408269919fcbcaeb2e35e5d43e5815517cdc6a8e11a423" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" + +[[package]] +name = "ahash" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" + +[[package]] +name = "aho-corasick" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7" + +[[package]] +name = "arbitrary" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db55d72333851e17d572bec876e390cd3b11eb1ef53ae821dd9f3b653d2b4569" + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" +dependencies = [ + "nodrop", +] + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "async-trait" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3a45e77e34375a7923b1e8febb049bb011f064714a8e17a1a616fef01da13d" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "backtrace" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef5140344c85b01f9bbb4d4b7288a8aa4b3287ccef913a14bcc78a1063623598" +dependencies = [ + "addr2line", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base58" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "bitvec" +version = "0.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" +dependencies = [ + "either", + "radium", +] + +[[package]] +name = "blake2-rfc" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" +dependencies = [ + "arrayvec 0.4.12", + "constant_time_eq", +] + +[[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.3", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.4", +] + +[[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 = "byte-slice-cast" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "bytes" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +dependencies = [ + "byteorder", + "iovec", +] + +[[package]] +name = "cc" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95752358c8f7552394baf48cd82695b345628ad3f170d607de3ca03b8dacca15" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits 0.2.14", + "time", + "winapi", +] + +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "cloudabi" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467" +dependencies = [ + "bitflags", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "cpuid-bool" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-mac" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" +dependencies = [ + "generic-array 0.12.3", + "subtle 1.0.0", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array 0.14.4", + "subtle 2.3.0", +] + +[[package]] +name = "curve25519-dalek" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d85653f070353a16313d0046f173f70d1aadd5b42600a14de626f0dfb3473a5" +dependencies = [ + "byteorder", + "digest 0.8.1", + "rand_core 0.5.1", + "subtle 2.3.0", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8492de420e9e60bc9a1d66e2dbb91825390b738a388606600663fc529b4b307" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle 2.3.0", + "zeroize", +] + +[[package]] +name = "derive_more" +version = "0.99.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.3", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.4", +] + +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "dyn-clone" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55796afa1b20c2945ca8eabfc421839f2b766619209f1ede813cf2484f31804" + +[[package]] +name = "ed25519" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c66a534cbb46ab4ea03477eae19d5c22c01da8258030280b7bd9d8433fb6ef" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek 3.0.0", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.2", + "zeroize", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "enum_primitive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" +dependencies = [ + "num-traits 0.1.43", +] + +[[package]] +name = "environmental" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6576a1755ddffd988788025e75bce9e74b018f7cc226198fe931d077911c6d7e" + +[[package]] +name = "erasure_coding_fuzzer" +version = "0.1.0" +dependencies = [ + "honggfuzz", + "polkadot-erasure-coding", + "polkadot-primitives", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fixed-hash" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11498d382790b7a8f2fd211780bec78619bba81cdad3a283997c0c41f836759c" +dependencies = [ + "byteorder", + "rand 0.7.3", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "frame-metadata" +version = "12.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "parity-scale-codec", + "serde", + "sp-core", + "sp-std", +] + +[[package]] +name = "frame-support" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "bitflags", + "frame-metadata", + "frame-support-procedural", + "impl-trait-for-tuples", + "log", + "once_cell", + "parity-scale-codec", + "paste", + "serde", + "smallvec", + "sp-arithmetic", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-tracing", +] + +[[package]] +name = "frame-support-procedural" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "frame-support-procedural-tools", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "frame-support-procedural-tools" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "frame-support-procedural-tools-derive", + "proc-macro-crate", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "frame-support-procedural-tools-derive" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "frame-system" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "frame-support", + "impl-trait-for-tuples", + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + +[[package]] +name = "futures" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3b0c040a1fe6529d30b3c5944b280c7f0dcb2930d2c3062bca967b602583d0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b7109687aa4e177ef6fe84553af6280ef2778bdb7783ba44c9dc3399110fe64" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "847ce131b72ffb13b6109a221da9ad97a64cbe48feb1028356b836b47b8f1748" + +[[package]] +name = "futures-executor" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4caa2b2b68b880003057c1dd49f1ed937e38f22fcf6c212188a121f08cf40a65" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "611834ce18aaa1bd13c4b374f5d653e1027cf99b6b502584ff8c9a64413b30bb" + +[[package]] +name = "futures-macro" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77408a692f1f97bcc61dc001d752e00643408fbc922e4d634c655df50d595556" +dependencies = [ + "proc-macro-hack", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "futures-sink" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f878195a49cee50e006b02b93cf7e0a95a38ac7b776b4c4d9cc1207cd20fcb3d" + +[[package]] +name = "futures-task" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c554eb5bf48b2426c4771ab68c6b14468b6e76cc90996f528c3338d761a4d0d" +dependencies = [ + "once_cell", +] + +[[package]] +name = "futures-util" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d304cff4a7b99cfb7986f7d43fbe93d175e72e704a8860787cc95e9ffd85cbd2" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", +] + +[[package]] +name = "gcc" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" + +[[package]] +name = "generator" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cdc09201b2e8ca1b19290cf7e65de2246b8e91fb6874279722189c4de7b94dc" +dependencies = [ + "cc", + "libc", + "log", + "rustc_version", + "winapi", +] + +[[package]] +name = "generic-array" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + +[[package]] +name = "hash-db" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" + +[[package]] +name = "hash256-std-hasher" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b62f79061a0bc2e046024cb7ba44b08419ed238ecbd9adbd787434b9e8c25" +dependencies = [ + "ahash", + "autocfg", +] + +[[package]] +name = "hermit-abi" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" + +[[package]] +name = "hmac" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" +dependencies = [ + "crypto-mac 0.7.0", + "digest 0.8.1", +] + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac 0.8.0", + "digest 0.9.0", +] + +[[package]] +name = "hmac-drbg" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e570451493f10f6581b48cdd530413b63ea9e780f544bfd3bdcaa0d89d1a7b" +dependencies = [ + "digest 0.8.1", + "generic-array 0.12.3", + "hmac 0.7.1", +] + +[[package]] +name = "honggfuzz" +version = "0.5.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f085725a5828d7e959f014f624773094dfe20acc91be310ef106923c30594bc" +dependencies = [ + "arbitrary", + "lazy_static", + "memmap", +] + +[[package]] +name = "impl-codec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-serde" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47ca4d2b6931707a55fce5cf66aff80e2178c8b63bbb4ecb5695cbc870ddf6f" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef5550a42e3740a0e71f909d4c861056a284060af885ae7aa6242820f920d9d" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "instant" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits 0.2.14", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + +[[package]] +name = "itoa" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" + +[[package]] +name = "keccak" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614" + +[[package]] +name = "libsecp256k1" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc1e2c808481a63dc6da2074752fdd4336a3c8fcc68b83db6f1fd5224ae7962" +dependencies = [ + "arrayref", + "crunchy", + "digest 0.8.1", + "hmac-drbg", + "rand 0.7.3", + "sha2 0.8.2", + "subtle 2.3.0", + "typenum", +] + +[[package]] +name = "lock_api" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "lock_api" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" +dependencies = [ + "cfg-if 0.1.10", +] + +[[package]] +name = "loom" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0e8460f2f2121162705187214720353c517b97bdfb3494c0b1e33d83ebe4bed" +dependencies = [ + "cfg-if 0.1.10", + "generator", + "scoped-tls", + "serde", + "serde_json", +] + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" + +[[package]] +name = "memmap" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "memory-db" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f36ddb0b2cdc25d38babba472108798e3477f02be5165f038c5e393e50c57a" +dependencies = [ + "hash-db", + "hashbrown", + "parity-util-mem", +] + +[[package]] +name = "memory_units" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" + +[[package]] +name = "memrange" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc29ba65898edc4fdc252cb31cd3925f37c1a8ba25bb46eec883569984976530" +dependencies = [ + "rustc-serialize", +] + +[[package]] +name = "merlin" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6feca46f4fa3443a01769d768727f10c10a20fdb65e52dc16a81f0c8269bb78" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "nix" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7fd5681d13fda646462cfbd4e5f2051279a89a544d50eb98c365b507246839f" +dependencies = [ + "bitflags", + "bytes", + "cfg-if 0.1.10", + "gcc", + "libc", + "void", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits 0.2.14", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits 0.2.14", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits 0.2.14", +] + +[[package]] +name = "num-traits" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +dependencies = [ + "num-traits 0.2.14", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" + +[[package]] +name = "once_cell" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" +dependencies = [ + "parking_lot 0.11.1", +] + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "parity-scale-codec" +version = "1.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c740e5fbcb6847058b40ac7e5574766c6388f585e184d769910fe0d3a2ca861" +dependencies = [ + "arrayvec 0.5.2", + "bitvec", + "byte-slice-cast", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db82bb1c18fc00176004462dd809b2a6d851669550aa17af6dacd21ae0c14" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "parity-util-mem" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297ff91fa36aec49ce183484b102f6b75b46776822bd81525bfc4cc9b0dd0f5c" +dependencies = [ + "cfg-if 0.1.10", + "hashbrown", + "impl-trait-for-tuples", + "parity-util-mem-derive", + "parking_lot 0.10.2", + "primitive-types", + "winapi", +] + +[[package]] +name = "parity-util-mem-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" +dependencies = [ + "proc-macro2 1.0.24", + "syn 1.0.51", + "synstructure", +] + +[[package]] +name = "parity-wasm" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" + +[[package]] +name = "parking_lot" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" +dependencies = [ + "lock_api 0.3.4", + "parking_lot_core 0.7.2", +] + +[[package]] +name = "parking_lot" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +dependencies = [ + "instant", + "lock_api 0.4.2", + "parking_lot_core 0.8.0", +] + +[[package]] +name = "parking_lot_core" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" +dependencies = [ + "cfg-if 0.1.10", + "cloudabi 0.0.3", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b" +dependencies = [ + "cfg-if 0.1.10", + "cloudabi 0.1.0", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "paste" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880" +dependencies = [ + "paste-impl", + "proc-macro-hack", +] + +[[package]] +name = "paste-impl" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6" +dependencies = [ + "proc-macro-hack", +] + +[[package]] +name = "pbkdf2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" +dependencies = [ + "byteorder", + "crypto-mac 0.7.0", +] + +[[package]] +name = "pbkdf2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +dependencies = [ + "crypto-mac 0.8.0", +] + +[[package]] +name = "pin-project" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ccc2237c2c489783abd8c4c80e5450fc0e98644555b1364da68cc29aa151ca7" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8e8d2bf0b23038a4424865103a4df472855692821aab4e4f5c3312d461d9e5f" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b063f57ec186e6140e2b8b6921e5f1bd89c7356dda5b33acc5401203ca6131c" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "polkadot-core-primitives" +version = "0.7.30" +dependencies = [ + "parity-scale-codec", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "polkadot-erasure-coding" +version = "0.8.26" +dependencies = [ + "parity-scale-codec", + "polkadot-primitives", + "reed-solomon-erasure", + "sp-core", + "sp-trie", + "thiserror", +] + +[[package]] +name = "polkadot-parachain" +version = "0.8.26" +dependencies = [ + "derive_more", + "futures", + "log", + "parity-scale-codec", + "parking_lot 0.11.1", + "polkadot-core-primitives", + "sc-executor", + "serde", + "shared_memory", + "sp-core", + "sp-externalities", + "sp-io", + "sp-runtime", + "sp-std", + "sp-wasm-interface", + "thiserror", +] + +[[package]] +name = "polkadot-primitives" +version = "0.8.26" +dependencies = [ + "bitvec", + "frame-system", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "serde", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-authority-discovery", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-trie", + "sp-version", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "primitive-types" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd39dcacf71411ba488570da7bbc89b717225e46478b30ba99b92db6b149809" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-serde", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro-nested" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a" + +[[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]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid 0.2.1", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2 1.0.24", +] + +[[package]] +name = "radium" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" + +[[package]] +name = "rand" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" +dependencies = [ + "libc", + "rand 0.4.6", +] + +[[package]] +name = "rand" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +dependencies = [ + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[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]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "reed-solomon-erasure" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a415a013dd7c5d4221382329a5a3482566da675737494935cbbbcdec04662f9d" +dependencies = [ + "smallvec", +] + +[[package]] +name = "ref-cast" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17626b2f4bcf35b84bf379072a66e28cfe5c3c6ae58b38e4914bb8891dabece" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c523ccaed8ac4b0288948849a350b37d3035827413c458b6a40ddb614bb4f72" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "regex" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-automata" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +dependencies = [ + "byteorder", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189" + +[[package]] +name = "rustc-demangle" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc-serialize" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "sc-executor" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "derive_more", + "lazy_static", + "libsecp256k1", + "log", + "parity-scale-codec", + "parity-wasm", + "parking_lot 0.10.2", + "sc-executor-common", + "sc-executor-wasmi", + "sp-api", + "sp-core", + "sp-externalities", + "sp-io", + "sp-panic-handler", + "sp-runtime-interface", + "sp-serializer", + "sp-tasks", + "sp-trie", + "sp-version", + "sp-wasm-interface", + "wasmi", +] + +[[package]] +name = "sc-executor-common" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "derive_more", + "log", + "parity-scale-codec", + "parity-wasm", + "sp-allocator", + "sp-core", + "sp-runtime-interface", + "sp-serializer", + "sp-wasm-interface", + "wasmi", +] + +[[package]] +name = "sc-executor-wasmi" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "log", + "parity-scale-codec", + "sc-executor-common", + "sp-allocator", + "sp-core", + "sp-runtime-interface", + "sp-wasm-interface", + "wasmi", +] + +[[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.0", + "getrandom", + "merlin", + "rand 0.7.3", + "rand_core 0.5.1", + "sha2 0.8.2", + "subtle 2.3.0", + "zeroize", +] + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "secrecy" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0673d6a6449f5e7d12a1caf424fd9363e2af3a4953023ed455e3c4beef4597c0" +dependencies = [ + "zeroize", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "serde_json" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha2" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7aab86fe2149bad8c507606bdb3f4ef5e7b2380eb92350f56122cca72a42a8" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpuid-bool", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sharded-slab" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4921be914e16899a80adefb821f8ddb7974e3f1250223575a44ed994882127" +dependencies = [ + "lazy_static", + "loom", +] + +[[package]] +name = "shared_memory" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3ab0cdff84d6c66fc9e268010ea6508e58ee942575afb66f2cf194bb218bb4" +dependencies = [ + "cfg-if 0.1.10", + "enum_primitive", + "libc", + "log", + "memrange", + "nix", + "quick-error", + "rand 0.4.6", + "shared_memory_derive", + "theban_interval_tree", + "winapi", +] + +[[package]] +name = "shared_memory_derive" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "767a14f1304be2f0b04e69860252f8ae9cfae0afaa9cc07b675147c43425dd3a" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", +] + +[[package]] +name = "signature" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" + +[[package]] +name = "smallvec" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7acad6f34eb9e8a259d3283d1e8c1d34d7415943d4895f65cc73813c7396fc85" + +[[package]] +name = "sp-allocator" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "derive_more", + "log", + "sp-core", + "sp-std", + "sp-wasm-interface", +] + +[[package]] +name = "sp-api" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "hash-db", + "parity-scale-codec", + "sp-api-proc-macro", + "sp-core", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-version", +] + +[[package]] +name = "sp-api-proc-macro" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "blake2-rfc", + "proc-macro-crate", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "sp-application-crypto" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "parity-scale-codec", + "serde", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "sp-arithmetic" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "integer-sqrt", + "num-traits 0.2.14", + "parity-scale-codec", + "serde", + "sp-debug-derive", + "sp-std", +] + +[[package]] +name = "sp-authority-discovery" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "parity-scale-codec", + "sp-api", + "sp-application-crypto", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-core" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "base58", + "blake2-rfc", + "byteorder", + "dyn-clonable", + "ed25519-dalek", + "futures", + "hash-db", + "hash256-std-hasher", + "hex", + "impl-serde", + "lazy_static", + "libsecp256k1", + "log", + "merlin", + "num-traits 0.2.14", + "parity-scale-codec", + "parity-util-mem", + "parking_lot 0.10.2", + "primitive-types", + "rand 0.7.3", + "regex", + "schnorrkel", + "secrecy", + "serde", + "sha2 0.8.2", + "sp-debug-derive", + "sp-externalities", + "sp-runtime-interface", + "sp-std", + "sp-storage", + "substrate-bip39", + "thiserror", + "tiny-bip39", + "tiny-keccak", + "twox-hash", + "wasmi", + "zeroize", +] + +[[package]] +name = "sp-debug-derive" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "sp-externalities" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std", + "sp-storage", +] + +[[package]] +name = "sp-inherents" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "parity-scale-codec", + "parking_lot 0.10.2", + "sp-core", + "sp-std", + "thiserror", +] + +[[package]] +name = "sp-io" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "futures", + "hash-db", + "libsecp256k1", + "log", + "parity-scale-codec", + "parking_lot 0.10.2", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-runtime-interface", + "sp-state-machine", + "sp-std", + "sp-tracing", + "sp-trie", + "sp-wasm-interface", + "tracing", + "tracing-core", +] + +[[package]] +name = "sp-keystore" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "async-trait", + "derive_more", + "futures", + "merlin", + "parity-scale-codec", + "parking_lot 0.10.2", + "schnorrkel", + "sp-core", + "sp-externalities", +] + +[[package]] +name = "sp-panic-handler" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "backtrace", +] + +[[package]] +name = "sp-runtime" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "parity-util-mem", + "paste", + "rand 0.7.3", + "serde", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "sp-runtime-interface" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "parity-scale-codec", + "primitive-types", + "sp-externalities", + "sp-runtime-interface-proc-macro", + "sp-std", + "sp-storage", + "sp-tracing", + "sp-wasm-interface", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "Inflector", + "proc-macro-crate", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "sp-serializer" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "sp-staking" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "parity-scale-codec", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-state-machine" +version = "0.8.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "hash-db", + "log", + "num-traits 0.2.14", + "parity-scale-codec", + "parking_lot 0.10.2", + "rand 0.7.3", + "smallvec", + "sp-core", + "sp-externalities", + "sp-panic-handler", + "sp-std", + "sp-trie", + "thiserror", + "trie-db", + "trie-root", +] + +[[package]] +name = "sp-std" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" + +[[package]] +name = "sp-storage" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive", + "sp-std", +] + +[[package]] +name = "sp-tasks" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "log", + "sp-core", + "sp-externalities", + "sp-io", + "sp-runtime-interface", + "sp-std", +] + +[[package]] +name = "sp-tracing" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "log", + "parity-scale-codec", + "sp-std", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "sp-trie" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "hash-db", + "memory-db", + "parity-scale-codec", + "sp-core", + "sp-std", + "trie-db", + "trie-root", +] + +[[package]] +name = "sp-version" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "serde", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-wasm-interface" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=master#cff25fbc37c9fc564f8816eefdcd8dce15e1606b" +dependencies = [ + "impl-trait-for-tuples", + "parity-scale-codec", + "sp-std", + "wasmi", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "substrate-bip39" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bed6646a0159b9935b5d045611560eeef842b78d7adc3ba36f5ca325a13a0236" +dependencies = [ + "hmac 0.7.1", + "pbkdf2 0.3.0", + "schnorrkel", + "sha2 0.8.2", + "zeroize", +] + +[[package]] +name = "subtle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" + +[[package]] +name = "subtle" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343f3f510c2915908f155e94f17220b19ccfacf2a64a2a5d8004f2c3e311e7fd" + +[[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.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b4f34193997d92804d359ed09953e25d5138df6bcc055a71bf68ee89fdf9223" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "unicode-xid 0.2.1", +] + +[[package]] +name = "synstructure" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", + "unicode-xid 0.2.1", +] + +[[package]] +name = "theban_interval_tree" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7b42a5385db9a651628091edcd1d58ac9cb1c92327d8cd2a29bf8e35bdfe4ea" +dependencies = [ + "memrange", + "rand 0.3.23", + "time", +] + +[[package]] +name = "thiserror" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "tiny-bip39" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e44c4759bae7f1032e286a7ef990bd9ed23fe831b7eeba0beb97484c2e59b8" +dependencies = [ + "anyhow", + "hmac 0.8.1", + "once_cell", + "pbkdf2 0.4.0", + "rand 0.7.3", + "rustc-hash", + "sha2 0.9.2", + "thiserror", + "unicode-normalization", + "zeroize", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinyvec" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf8dbc19eb42fba10e8feaaec282fb50e2c14b2726d6301dbfeed0f73306a6f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "toml" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75cf45bb0bef80604d001caaec0d09da99611b3c0fd39d3080468875cdb65645" +dependencies = [ + "serde", +] + +[[package]] +name = "tracing" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f47026cdc4080c07e49b37087de021820269d996f581aac150ef9e5583eefe3" +dependencies = [ + "cfg-if 1.0.0", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", +] + +[[package]] +name = "tracing-core" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tracing-log" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1fa8f0c8f4c594e4fc9debc1990deab13238077271ba84dd853d54902ee3401" +dependencies = [ + "ansi_term", + "chrono", + "lazy_static", + "matchers", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "trie-db" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e55f7ace33d6237e14137e386f4e1672e2a5c6bbc97fef9f438581a143971f0" +dependencies = [ + "hash-db", + "hashbrown", + "log", + "rustc-hex", + "smallvec", +] + +[[package]] +name = "trie-root" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "652931506d2c1244d7217a70b99f56718a7b4161b37f04e7cd868072a99f68cd" +dependencies = [ + "hash-db", +] + +[[package]] +name = "twox-hash" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59" +dependencies = [ + "cfg-if 0.1.10", + "rand 0.7.3", + "static_assertions", +] + +[[package]] +name = "typenum" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" + +[[package]] +name = "uint" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9db035e67dfaf7edd9aebfe8676afcd63eed53c8a4044fed514c8cccf1835177" +dependencies = [ + "byteorder", + "crunchy", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606" +dependencies = [ + "tinyvec", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasmi" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf617d864d25af3587aa745529f7aaa541066c876d57e050c0d0c85c61c92aff" +dependencies = [ + "libc", + "memory_units", + "num-rational", + "num-traits 0.2.14", + "parity-wasm", + "wasmi-validation", +] + +[[package]] +name = "wasmi-validation" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea78c597064ba73596099281e2f4cfc019075122a65cdda3205af94f0b264d93" +dependencies = [ + "parity-wasm", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "zeroize" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f33972566adbd2d3588b0491eb94b98b43695c4ef897903470ede4f3f5a28a" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f369ddb18862aba61aa49bf31e74d29f0f162dec753063200e1dc084345d16" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.51", + "synstructure", +] diff --git a/erasure-coding/fuzzer/Cargo.toml b/erasure-coding/fuzzer/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..e844e9ad94c8872eee327410d4871dae98131a9f --- /dev/null +++ b/erasure-coding/fuzzer/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "erasure_coding_fuzzer" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +polkadot-erasure-coding = { path = ".." } +honggfuzz = "0.5" +primitives = { package = "polkadot-primitives", path = "../../primitives/" } + +[[bin]] +name = "reconstruct_fuzzer" +path = "src/reconstruct.rs" + +[[bin]] +name = "round_trip" +path = "src/round_trip.rs" + +[workspace] diff --git a/erasure-coding/fuzzer/src/reconstruct.rs b/erasure-coding/fuzzer/src/reconstruct.rs new file mode 100644 index 0000000000000000000000000000000000000000..694953e58d1fa81ca1785aeb2bead76c9a2157e1 --- /dev/null +++ b/erasure-coding/fuzzer/src/reconstruct.rs @@ -0,0 +1,16 @@ +use polkadot_erasure_coding::*; +use primitives::v1::AvailableData; +use honggfuzz::fuzz; + +fn main() { + loop { + fuzz!(|data: (usize, Vec<(Vec, usize)>)| { + let (num_validators, chunk_input) = data; + let reconstructed: Result = reconstruct_v1( + num_validators, + chunk_input.iter().map(|t| (&*t.0, t.1)).collect::>() + ); + println!("reconstructed {:?}", reconstructed); + }); + } +} diff --git a/erasure-coding/fuzzer/src/round_trip.rs b/erasure-coding/fuzzer/src/round_trip.rs new file mode 100644 index 0000000000000000000000000000000000000000..141e86073b06d04a337ab566c9d7c71f630beb4f --- /dev/null +++ b/erasure-coding/fuzzer/src/round_trip.rs @@ -0,0 +1,40 @@ +use polkadot_erasure_coding::*; +use primitives::v1::{AvailableData, BlockData, PoV}; +use std::sync::Arc; +use honggfuzz::fuzz; + + +fn main() { + loop { + fuzz!(|data: &[u8]| { + let pov_block = PoV { + block_data: BlockData(data.iter().cloned().collect()), + }; + + let available_data = AvailableData { + pov: Arc::new(pov_block), + validation_data: Default::default(), + }; + let chunks = obtain_chunks_v1( + 10, + &available_data, + ).unwrap(); + + assert_eq!(chunks.len(), 10); + + // any 4 chunks should work. + let reconstructed: AvailableData = reconstruct_v1( + 10, + [ + (&*chunks[1], 1), + (&*chunks[4], 4), + (&*chunks[6], 6), + (&*chunks[9], 9), + ].iter().cloned(), + ).unwrap(); + + assert_eq!(reconstructed, available_data); + println!("{:?}", reconstructed); + }); + } +} diff --git a/erasure-coding/src/lib.rs b/erasure-coding/src/lib.rs index 708a167d627675abaf3ec13befed01400bce219c..2b335a816888dba72cb453c0c1ee4db5e6d2a14a 100644 --- a/erasure-coding/src/lib.rs +++ b/erasure-coding/src/lib.rs @@ -24,12 +24,13 @@ //! f is the maximum number of faulty validators in the system. //! The data is coded so any f+1 chunks can be used to reconstruct the full data. -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; use reed_solomon::galois_16::{self, ReedSolomon}; use primitives::v0::{self, Hash as H256, BlakeTwo256, HashT}; use primitives::v1; use sp_core::Blake2Hasher; use trie::{EMPTY_PREFIX, MemoryDB, Trie, TrieMut, trie_types::{TrieDBMut, TrieDB}}; +use thiserror::Error; use self::wrapped_shard::WrappedShard; @@ -39,35 +40,43 @@ mod wrapped_shard; const MAX_VALIDATORS: usize = ::ORDER; /// Errors in erasure coding. -#[derive(Debug, Clone, PartialEq, derive_more::Display)] +#[derive(Debug, Clone, PartialEq, Error)] pub enum Error { /// Returned when there are too many validators. + #[error("There are too many validators")] TooManyValidators, - /// Cannot encode something for no validators - EmptyValidators, + /// Cannot encode something for zero or one validator + #[error("Expected at least 2 validators")] + NotEnoughValidators, /// Cannot reconstruct: wrong number of validators. + #[error("Validator count mismatches between encoding and decoding")] WrongValidatorCount, /// Not enough chunks present. + #[error("Not enough chunks to reconstruct message")] NotEnoughChunks, /// Too many chunks present. + #[error("Too many chunks present")] TooManyChunks, /// Chunks not of uniform length or the chunks are empty. + #[error("Chunks are not unform, mismatch in length or are zero sized")] NonUniformChunks, /// An uneven byte-length of a shard is not valid for GF(2^16) encoding. + #[error("Uneven length is not valid for field GF(2^16)")] UnevenLength, /// Chunk index out of bounds. - #[display(fmt = "Chunk is out of bounds: {} {}", _0, _1)] - ChunkIndexOutOfBounds(usize, usize), + #[error("Chunk is out of bounds: {chunk_index} not included in 0..{n_validators}")] + ChunkIndexOutOfBounds{ chunk_index: usize, n_validators: usize }, /// Bad payload in reconstructed bytes. + #[error("Reconstructed payload invalid")] BadPayload, /// Invalid branch proof. + #[error("Invalid branch proof")] InvalidBranchProof, /// Branch out of bounds. + #[error("Branch is out of bounds")] BranchOutOfBounds, } -impl std::error::Error for Error { } - #[derive(Debug, PartialEq)] struct CodeParams { data_shards: usize, @@ -110,12 +119,18 @@ impl CodeParams { .expect("this struct is not created with invalid shard number; qed") } } - -fn code_params(n_validators: usize) -> Result { +/// Returns the maximum number of allowed, faulty chunks +/// which does not prevent recovery given all other pieces +/// are correct. +const fn n_faulty(n_validators: usize) -> Result { if n_validators > MAX_VALIDATORS { return Err(Error::TooManyValidators) } - if n_validators == 0 { return Err(Error::EmptyValidators) } + if n_validators <= 1 { return Err(Error::NotEnoughValidators) } + + Ok(n_validators.saturating_sub(1) / 3) +} - let n_faulty = n_validators.saturating_sub(1) / 3; +fn code_params(n_validators: usize) -> Result { + let n_faulty = n_faulty(n_validators)?; let n_good = n_validators - n_faulty; Ok(CodeParams { @@ -124,6 +139,13 @@ fn code_params(n_validators: usize) -> Result { }) } +/// Obtain a threshold of chunks that should be enough to recover the data. +pub fn recovery_threshold(n_validators: usize) -> Result { + let n_faulty = n_faulty(n_validators)?; + + Ok(n_faulty + 1) +} + /// Obtain erasure-coded chunks for v0 `AvailableData`, one for each validator. /// /// Works only up to 65536 validators, and `n_validators` must be non-zero. @@ -206,7 +228,7 @@ fn reconstruct<'a, I: 'a, T: Decode>(n_validators: usize, chunks: I) -> Result= n_validators { - return Err(Error::ChunkIndexOutOfBounds(chunk_idx, n_validators)); + return Err(Error::ChunkIndexOutOfBounds{ chunk_index: chunk_idx, n_validators }); } let shard_len = shard_len.get_or_insert_with(|| chunk_data.len()); @@ -343,12 +365,12 @@ struct ShardInput<'a, I> { cur_shard: Option<(&'a [u8], usize)>, } -impl<'a, I: Iterator> codec::Input for ShardInput<'a, I> { - fn remaining_len(&mut self) -> Result, codec::Error> { +impl<'a, I: Iterator> parity_scale_codec::Input for ShardInput<'a, I> { + fn remaining_len(&mut self) -> Result, parity_scale_codec::Error> { Ok(Some(self.remaining_len)) } - fn read(&mut self, into: &mut [u8]) -> Result<(), codec::Error> { + fn read(&mut self, into: &mut [u8]) -> Result<(), parity_scale_codec::Error> { let mut read_bytes = 0; loop { @@ -397,12 +419,9 @@ mod tests { #[test] fn test_code_params() { - assert_eq!(code_params(0), Err(Error::EmptyValidators)); + assert_eq!(code_params(0), Err(Error::NotEnoughValidators)); - assert_eq!(code_params(1), Ok(CodeParams { - data_shards: 1, - parity_shards: 0, - })); + assert_eq!(code_params(1), Err(Error::NotEnoughValidators)); assert_eq!(code_params(2), Ok(CodeParams { data_shards: 1, @@ -478,6 +497,15 @@ mod tests { assert_eq!(reconstructed, available_data); } + #[test] + fn reconstruct_does_not_panic_on_low_validator_count() { + let reconstructed = reconstruct_v1( + 1, + [].iter().cloned(), + ); + assert_eq!(reconstructed, Err(Error::NotEnoughValidators)); + } + #[test] fn construct_valid_branches() { let pov_block = PoVBlock { diff --git a/node/collation-generation/Cargo.toml b/node/collation-generation/Cargo.toml index f7d5e7f162efc0c8230cd8d6714035a97b2fc33c..f87884b65fd8e775702cce61e0e092c4c6663b4f 100644 --- a/node/collation-generation/Cargo.toml +++ b/node/collation-generation/Cargo.toml @@ -5,15 +5,16 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -derive_more = "0.99.9" -futures = "0.3.5" -log = "0.4.8" +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" polkadot-erasure-coding = { path = "../../erasure-coding" } polkadot-node-primitives = { path = "../primitives" } polkadot-node-subsystem = { path = "../subsystem" } polkadot-node-subsystem-util = { path = "../subsystem-util" } polkadot-primitives = { path = "../../primitives" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +thiserror = "1.0.23" [dev-dependencies] polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } diff --git a/runtime/common/src/dummy.rs b/node/collation-generation/src/error.rs similarity index 54% rename from runtime/common/src/dummy.rs rename to node/collation-generation/src/error.rs index 21908b0cb1361f359d144158edd64112b0bb8088..44b08c473f83102119c3ad4e3b5fcdfe346c68d5 100644 --- a/runtime/common/src/dummy.rs +++ b/node/collation-generation/src/error.rs @@ -14,27 +14,20 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! A dummy module for holding place of modules in a runtime. - -use frame_support::{decl_module, decl_storage, decl_event}; - -pub trait Trait: frame_system::Trait { - type Event: Into<::Event>; -} - -decl_module! { - pub struct Module, I: Instance = DefaultInstance> for enum Call where origin: T::Origin { - } +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum Error { + #[error(transparent)] + Subsystem(#[from] polkadot_node_subsystem::SubsystemError), + #[error(transparent)] + OneshotRecv(#[from] futures::channel::oneshot::Canceled), + #[error(transparent)] + Runtime(#[from] polkadot_node_subsystem::errors::RuntimeApiError), + #[error(transparent)] + Util(#[from] polkadot_node_subsystem_util::Error), + #[error(transparent)] + Erasure(#[from] polkadot_erasure_coding::Error), } -decl_storage! { - trait Store for Module, I: Instance = DefaultInstance> as Dummy { } -} - -decl_event!{ - pub enum Event where - ::AccountId - { - Dummy(AccountId), - } -} +pub type Result = std::result::Result; diff --git a/node/collation-generation/src/lib.rs b/node/collation-generation/src/lib.rs index c2f6f9bc2ceb74ce21de9648be0ebf2768f63992..79c08eed2749283f5dd773c12881cff3a1549efe 100644 --- a/node/collation-generation/src/lib.rs +++ b/node/collation-generation/src/lib.rs @@ -19,7 +19,7 @@ #![deny(missing_docs)] use futures::{ - channel::{mpsc, oneshot}, + channel::mpsc, future::FutureExt, join, select, @@ -28,14 +28,13 @@ use futures::{ }; use polkadot_node_primitives::CollationGenerationConfig; use polkadot_node_subsystem::{ - errors::RuntimeApiError, messages::{AllMessages, CollationGenerationMessage, CollatorProtocolMessage}, - FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, SubsystemResult, - metrics::{self, prometheus}, + FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemResult, }; use polkadot_node_subsystem_util::{ - self as util, request_availability_cores_ctx, request_full_validation_data_ctx, + request_availability_cores_ctx, request_full_validation_data_ctx, request_validators_ctx, + metrics::{self, prometheus}, }; use polkadot_primitives::v1::{ collator_signature_payload, AvailableData, CandidateCommitments, @@ -45,6 +44,10 @@ use polkadot_primitives::v1::{ use sp_core::crypto::Pair; use std::sync::Arc; +mod error; + +const LOG_TARGET: &'static str = "collation_generation"; + /// Collation Generation Subsystem pub struct CollationGenerationSubsystem { config: Option>, @@ -71,6 +74,7 @@ impl CollationGenerationSubsystem { /// /// If `err_tx` is not `None`, errors are forwarded onto that channel as they occur. /// Otherwise, most are logged and then discarded. + #[tracing::instrument(skip(self, ctx), fields(subsystem = LOG_TARGET))] async fn run(mut self, mut ctx: Context) where Context: SubsystemContext, @@ -80,8 +84,9 @@ impl CollationGenerationSubsystem { // at any point waiting for them all, so instead, we create a channel on which they can // send those messages. We can then just monitor the channel and forward messages on it // to the overseer here, via the context. - let (sender, mut receiver) = mpsc::channel(0); + let (sender, receiver) = mpsc::channel(0); + let mut receiver = receiver.fuse(); loop { select! { incoming = ctx.recv().fuse() => { @@ -89,12 +94,9 @@ impl CollationGenerationSubsystem { break; } }, - msg = receiver.next().fuse() => { + msg = receiver.next() => { if let Some(msg) = msg { - if let Err(err) = ctx.send_message(msg).await { - log::warn!(target: "collation_generation", "failed to forward message to overseer: {:?}", err); - break; - } + ctx.send_message(msg).await; } }, } @@ -105,6 +107,7 @@ impl CollationGenerationSubsystem { // note: this doesn't strictly need to be a separate function; it's more an administrative function // so that we don't clutter the run loop. It could in principle be inlined directly into there. // it should hopefully therefore be ok that it's an async function mutably borrowing self. + #[tracing::instrument(level = "trace", skip(self, ctx, sender), fields(subsystem = LOG_TARGET))] async fn handle_incoming( &mut self, incoming: SubsystemResult>, @@ -123,13 +126,17 @@ impl CollationGenerationSubsystem { // follow the procedure from the guide if let Some(config) = &self.config { let metrics = self.metrics.clone(); - if let Err(err) = - handle_new_activations(config.clone(), &activated, ctx, metrics, sender).await - { - log::warn!(target: "collation_generation", "failed to handle new activations: {:?}", err); - return true; - }; + if let Err(err) = handle_new_activations( + config.clone(), + activated.into_iter().map(|v| v.0), + ctx, + metrics, + sender, + ).await { + tracing::warn!(target: LOG_TARGET, err = ?err, "failed to handle new activations"); + } } + false } Ok(Signal(Conclude)) => true, @@ -137,16 +144,20 @@ impl CollationGenerationSubsystem { msg: CollationGenerationMessage::Initialize(config), }) => { if self.config.is_some() { - log::warn!(target: "collation_generation", "double initialization"); - true + tracing::error!(target: LOG_TARGET, "double initialization"); } else { self.config = Some(Arc::new(config)); - false } + false } - Ok(Signal(BlockFinalized(_))) => false, + Ok(Signal(BlockFinalized(..))) => false, Err(err) => { - log::error!(target: "collation_generation", "error receiving message from subsystem context: {:?}", err); + tracing::error!( + target: LOG_TARGET, + err = ?err, + "error receiving message from subsystem context: {:?}", + err + ); true } } @@ -157,10 +168,11 @@ impl Subsystem for CollationGenerationSubsystem where Context: SubsystemContext, { - type Metrics = Metrics; - fn start(self, ctx: Context) -> SpawnedSubsystem { - let future = Box::pin(self.run(ctx)); + let future = async move { + self.run(ctx).await; + Ok(()) + }.boxed(); SpawnedSubsystem { name: "collation-generation-subsystem", @@ -169,35 +181,22 @@ where } } -#[derive(Debug, derive_more::From)] -enum Error { - #[from] - Subsystem(SubsystemError), - #[from] - OneshotRecv(oneshot::Canceled), - #[from] - Runtime(RuntimeApiError), - #[from] - Util(util::Error), - #[from] - Erasure(polkadot_erasure_coding::Error), -} - -type Result = std::result::Result; - +#[tracing::instrument(level = "trace", skip(ctx, metrics, sender, activated), fields(subsystem = LOG_TARGET))] async fn handle_new_activations( config: Arc, - activated: &[Hash], + activated: impl IntoIterator, ctx: &mut Context, metrics: Metrics, sender: &mpsc::Sender, -) -> Result<()> { +) -> crate::error::Result<()> { // follow the procedure from the guide: // https://w3f.github.io/parachain-implementers-guide/node/collators/collation-generation.html - for relay_parent in activated.iter().copied() { - // double-future magic happens here: the first layer of requests takes a mutable borrow of the context, and - // returns a receiver. The second layer of requests actually polls those receivers to completion. + let _overall_timer = metrics.time_new_activations(); + + for relay_parent in activated { + let _relay_parent_timer = metrics.time_new_activations_relay_parent(); + let (availability_cores, validators) = join!( request_availability_cores_ctx(relay_parent, ctx).await?, request_validators_ctx(relay_parent, ctx).await?, @@ -206,19 +205,42 @@ async fn handle_new_activations( let availability_cores = availability_cores??; let n_validators = validators??.len(); - for core in availability_cores { + for (core_idx, core) in availability_cores.into_iter().enumerate() { + let _availability_core_timer = metrics.time_new_activations_availability_core(); + let (scheduled_core, assumption) = match core { CoreState::Scheduled(scheduled_core) => { (scheduled_core, OccupiedCoreAssumption::Free) } CoreState::Occupied(_occupied_core) => { // TODO: https://github.com/paritytech/polkadot/issues/1573 + tracing::trace!( + target: LOG_TARGET, + core_idx = %core_idx, + relay_parent = ?relay_parent, + "core is occupied. Keep going.", + ); continue; } - _ => continue, + CoreState::Free => { + tracing::trace!( + target: LOG_TARGET, + core_idx = %core_idx, + "core is free. Keep going.", + ); + continue + } }; if scheduled_core.para_id != config.para_id { + tracing::trace!( + target: LOG_TARGET, + core_idx = %core_idx, + relay_parent = ?relay_parent, + our_para = %config.para_id, + their_para = %scheduled_core.para_id, + "core is not assigned to our para. Keep going.", + ); continue; } @@ -235,7 +257,17 @@ async fn handle_new_activations( .await?? { Some(v) => v, - None => continue, + None => { + tracing::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 + } }; let task_config = config.clone(); @@ -244,7 +276,17 @@ async fn handle_new_activations( ctx.spawn("collation generation collation builder", Box::pin(async move { let persisted_validation_data_hash = validation_data.persisted.hash(); - let collation = (task_config.collator)(&validation_data).await; + let collation = match (task_config.collator)(relay_parent, &validation_data).await { + Some(collation) => collation, + None => { + tracing::debug!( + target: LOG_TARGET, + para_id = %scheduled_core.para_id, + "collator returned no collation on collate", + ); + return + } + }; let pov_hash = collation.proof_of_validity.hash(); @@ -262,17 +304,23 @@ async fn handle_new_activations( ) { Ok(erasure_root) => erasure_root, Err(err) => { - log::error!(target: "collation_generation", "failed to calculate erasure root for para_id {}: {:?}", scheduled_core.para_id, err); + tracing::error!( + target: LOG_TARGET, + para_id = %scheduled_core.para_id, + err = ?err, + "failed to calculate erasure root", + ); return } }; let commitments = CandidateCommitments { - fees: collation.fees, upward_messages: collation.upward_messages, + horizontal_messages: collation.horizontal_messages, new_validation_code: collation.new_validation_code, head_data: collation.head_data, - erasure_root, + processed_downward_messages: collation.processed_downward_messages, + hrmp_watermark: collation.hrmp_watermark, }; let ccr = CandidateReceipt { @@ -284,6 +332,7 @@ async fn handle_new_activations( collator: task_config.key.public(), persisted_validation_data_hash, pov_hash, + erasure_root, }, }; @@ -292,7 +341,12 @@ async fn handle_new_activations( if let Err(err) = task_sender.send(AllMessages::CollatorProtocol( CollatorProtocolMessage::DistributeCollation(ccr, collation.proof_of_validity) )).await { - log::warn!(target: "collation_generation", "failed to send collation result for para_id {}: {:?}", scheduled_core.para_id, err); + tracing::warn!( + target: LOG_TARGET, + para_id = %scheduled_core.para_id, + err = ?err, + "failed to send collation result", + ); } })).await?; } @@ -301,14 +355,15 @@ async fn handle_new_activations( Ok(()) } +#[tracing::instrument(level = "trace", fields(subsystem = LOG_TARGET))] fn erasure_root( n_validators: usize, persisted_validation: PersistedValidationData, pov: PoV, -) -> Result { +) -> crate::error::Result { let available_data = AvailableData { validation_data: persisted_validation, - pov, + pov: Arc::new(pov), }; let chunks = polkadot_erasure_coding::obtain_chunks_v1(n_validators, &available_data)?; @@ -318,6 +373,9 @@ fn erasure_root( #[derive(Clone)] struct MetricsInner { collations_generated_total: prometheus::Counter, + new_activations_overall: prometheus::Histogram, + new_activations_per_relay_parent: prometheus::Histogram, + new_activations_per_availability_core: prometheus::Histogram, } /// CollationGenerationSubsystem metrics. @@ -330,10 +388,25 @@ impl Metrics { metrics.collations_generated_total.inc(); } } + + /// Provide a timer for new activations which updates on drop. + fn time_new_activations(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.new_activations_overall.start_timer()) + } + + /// Provide a timer per relay parents which updates on drop. + fn time_new_activations_relay_parent(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.new_activations_per_relay_parent.start_timer()) + } + + /// Provide a timer per availability core which updates on drop. + fn time_new_activations_availability_core(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.new_activations_per_availability_core.start_timer()) + } } impl metrics::Metrics for Metrics { - fn try_register(registry: &prometheus::Registry) -> std::result::Result { + fn try_register(registry: &prometheus::Registry) -> Result { let metrics = MetricsInner { collations_generated_total: prometheus::register( prometheus::Counter::new( @@ -342,6 +415,33 @@ impl metrics::Metrics for Metrics { )?, registry, )?, + new_activations_overall: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_collation_generation_new_activations", + "Time spent within fn handle_new_activations", + ) + )?, + registry, + )?, + new_activations_per_relay_parent: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_collation_generation_per_relay_parent", + "Time spent handling a particular relay parent within fn handle_new_activations" + ) + )?, + registry, + )?, + new_activations_per_availability_core: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_collation_generation_per_availability_core", + "Time spent handling a particular availability core for a relay parent in fn handle_new_activations", + ) + )?, + registry, + )?, }; Ok(Metrics(Some(metrics))) } @@ -371,13 +471,15 @@ mod tests { fn test_collation() -> Collation { Collation { - fees: Default::default(), upward_messages: Default::default(), + horizontal_messages: Default::default(), new_validation_code: Default::default(), head_data: Default::default(), proof_of_validity: PoV { block_data: BlockData(Vec::new()), }, + processed_downward_messages: Default::default(), + hrmp_watermark: Default::default(), } } @@ -385,10 +487,10 @@ mod tests { struct TestCollator; impl Future for TestCollator { - type Output = Collation; + type Output = Option; fn poll(self: Pin<&mut Self>, _cx: &mut FuturesContext) -> Poll { - Poll::Ready(test_collation()) + Poll::Ready(Some(test_collation())) } } @@ -397,8 +499,8 @@ mod tests { fn test_config>(para_id: Id) -> Arc { Arc::new(CollationGenerationConfig { key: CollatorPair::generate().0, - collator: Box::new(|_vd: &ValidationData| { - Box::new(TestCollator) + collator: Box::new(|_: Hash, _vd: &ValidationData| { + TestCollator.boxed() }), para_id: para_id.into(), }) @@ -445,7 +547,7 @@ mod tests { subsystem_test_harness(overseer, |mut ctx| async move { handle_new_activations( test_config(123u32), - &subsystem_activated_hashes, + subsystem_activated_hashes, &mut ctx, Metrics(None), &tx, @@ -524,7 +626,7 @@ mod tests { let (tx, _rx) = mpsc::channel(0); subsystem_test_harness(overseer, |mut ctx| async move { - handle_new_activations(test_config(16), &activated_hashes, &mut ctx, Metrics(None), &tx) + handle_new_activations(test_config(16), activated_hashes, &mut ctx, Metrics(None), &tx) .await .unwrap(); }); @@ -601,7 +703,7 @@ mod tests { let sent_messages = Arc::new(Mutex::new(Vec::new())); let subsystem_sent_messages = sent_messages.clone(); subsystem_test_harness(overseer, |mut ctx| async move { - handle_new_activations(subsystem_config, &activated_hashes, &mut ctx, Metrics(None), &tx) + handle_new_activations(subsystem_config, activated_hashes, &mut ctx, Metrics(None), &tx) .await .unwrap(); @@ -635,6 +737,7 @@ mod tests { collator: config.key.public(), persisted_validation_data_hash: expect_validation_data_hash, pov_hash: expect_pov_hash, + erasure_root: Default::default(), // this isn't something we're checking right now }; assert_eq!(sent_messages.len(), 1); @@ -661,6 +764,7 @@ mod tests { let expect_descriptor = { let mut expect_descriptor = expect_descriptor; expect_descriptor.signature = descriptor.signature.clone(); + expect_descriptor.erasure_root = descriptor.erasure_root.clone(); expect_descriptor }; assert_eq!(descriptor, &expect_descriptor); diff --git a/node/core/av-store/Cargo.toml b/node/core/av-store/Cargo.toml index f457b7edaaa81ccaa6f8b4012b6902a9caacae43..4dee43dc6270c78f45fbf7a0e11a9274c8b8695c 100644 --- a/node/core/av-store/Cargo.toml +++ b/node/core/av-store/Cargo.toml @@ -5,20 +5,29 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.5" +futures = "0.3.8" +futures-timer = "3.0.2" +kvdb = "0.8.0" +kvdb-rocksdb = "0.10.0" +thiserror = "1.0.23" +tracing = "0.1.22" +tracing-futures = "0.2.4" + +parity-scale-codec = { version = "1.3.5", features = ["derive"] } +erasure = { package = "polkadot-erasure-coding", path = "../../../erasure-coding" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-overseer = { path = "../../overseer" } polkadot-primitives = { path = "../../../primitives" } -erasure = { package = "polkadot-erasure-coding", path = "../../../erasure-coding" } -kvdb = "0.7.0" -kvdb-rocksdb = "0.9.1" -codec = { package = "parity-scale-codec", version = "1.3.1", features = ["derive"] } -log = "0.4.8" -derive_more = "0.99.9" + +sc-service = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } [dev-dependencies] +log = "0.4.11" +env_logger = "0.8.2" +assert_matches = "1.4.0" +kvdb-memorydb = "0.8.0" + sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -futures = { version = "0.3.5", features = ["thread-pool"] } +polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } -kvdb-memorydb = "0.7.0" -assert_matches = "1.3.0" diff --git a/node/core/av-store/src/lib.rs b/node/core/av-store/src/lib.rs index 5837377dd5f975bb8e6e75fec1115fe78c1dbd68..ca95d777a11a9de00337b7f5b8478a0e0d26a5ad 100644 --- a/node/core/av-store/src/lib.rs +++ b/node/core/av-store/src/lib.rs @@ -19,55 +19,401 @@ #![recursion_limit="256"] #![warn(missing_docs)] -use std::collections::HashMap; +use std::cmp::Ordering; +use std::collections::{HashMap, HashSet}; use std::io; use std::path::PathBuf; use std::sync::Arc; +use std::time::{Duration, SystemTime, SystemTimeError, UNIX_EPOCH}; -use codec::{Encode, Decode}; -use futures::{select, channel::oneshot, FutureExt}; +use parity_scale_codec::{Encode, Decode}; +use futures::{select, channel::oneshot, future::{self, Either}, Future, FutureExt}; +use futures_timer::Delay; use kvdb_rocksdb::{Database, DatabaseConfig}; use kvdb::{KeyValueDB, DBTransaction}; use polkadot_primitives::v1::{ - Hash, AvailableData, ErasureChunk, ValidatorIndex, + Hash, AvailableData, BlockNumber, CandidateEvent, ErasureChunk, ValidatorIndex, CandidateHash, }; use polkadot_subsystem::{ - FromOverseer, SubsystemError, Subsystem, SubsystemContext, SpawnedSubsystem, - metrics::{self, prometheus}, + FromOverseer, OverseerSignal, SubsystemError, Subsystem, SubsystemContext, SpawnedSubsystem, + ActiveLeavesUpdate, + errors::{ChainApiError, RuntimeApiError}, +}; +use polkadot_node_subsystem_util::metrics::{self, prometheus}; +use polkadot_subsystem::messages::{ + AllMessages, AvailabilityStoreMessage, ChainApiMessage, RuntimeApiMessage, RuntimeApiRequest, }; -use polkadot_subsystem::messages::AvailabilityStoreMessage; const LOG_TARGET: &str = "availability"; mod columns { pub const DATA: u32 = 0; - pub const NUM_COLUMNS: u32 = 1; + pub const META: u32 = 1; + pub const NUM_COLUMNS: u32 = 2; +} + +#[derive(Debug, thiserror::Error)] +#[allow(missing_docs)] +pub enum Error { + #[error(transparent)] + RuntimeApi(#[from] RuntimeApiError), + + #[error(transparent)] + ChainApi(#[from] ChainApiError), + + #[error(transparent)] + Erasure(#[from] erasure::Error), + + #[error(transparent)] + Io(#[from] io::Error), + + #[error(transparent)] + Oneshot(#[from] oneshot::Canceled), + + #[error(transparent)] + Subsystem(#[from] SubsystemError), + + #[error(transparent)] + Time(#[from] SystemTimeError), + + #[error("Custom databases are not supported")] + CustomDatabase, +} + +impl Error { + fn trace(&self) { + match self { + // don't spam the log with spurious errors + Self::RuntimeApi(_) | + Self::Oneshot(_) => tracing::debug!(target: LOG_TARGET, err = ?self), + // it's worth reporting otherwise + _ => tracing::warn!(target: LOG_TARGET, err = ?self), + } + } +} + +/// A wrapper type for delays. +#[derive(Clone, Debug, Decode, Encode, Eq)] +enum PruningDelay { + /// This pruning should be triggered after this `Duration` from UNIX_EPOCH. + In(Duration), + + /// Data is in the state where it has no expiration. + Indefinite, +} + +impl PruningDelay { + fn now() -> Result { + Ok(SystemTime::now().duration_since(UNIX_EPOCH)?.into()) + } + + fn into_the_future(duration: Duration) -> Result { + Ok(Self::In(SystemTime::now().duration_since(UNIX_EPOCH)? + duration)) + } + + fn as_duration(&self) -> Option { + match self { + PruningDelay::In(d) => Some(*d), + PruningDelay::Indefinite => None, + } + } +} + +impl From for PruningDelay { + fn from(d: Duration) -> Self { + Self::In(d) + } +} + +impl PartialEq for PruningDelay { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (PruningDelay::In(this), PruningDelay::In(that)) => {this == that}, + (PruningDelay::Indefinite, PruningDelay::Indefinite) => true, + _ => false, + } + } +} + +impl PartialOrd for PruningDelay { + fn partial_cmp(&self, other: &Self) -> Option { + match (self, other) { + (PruningDelay::In(this), PruningDelay::In(that)) => this.partial_cmp(that), + (PruningDelay::In(_), PruningDelay::Indefinite) => Some(Ordering::Less), + (PruningDelay::Indefinite, PruningDelay::In(_)) => Some(Ordering::Greater), + (PruningDelay::Indefinite, PruningDelay::Indefinite) => Some(Ordering::Equal), + } + } +} + +impl Ord for PruningDelay { + fn cmp(&self, other: &Self) -> Ordering { + match (self, other) { + (PruningDelay::In(this), PruningDelay::In(that)) => this.cmp(that), + (PruningDelay::In(_), PruningDelay::Indefinite) => Ordering::Less, + (PruningDelay::Indefinite, PruningDelay::In(_)) => Ordering::Greater, + (PruningDelay::Indefinite, PruningDelay::Indefinite) => Ordering::Equal, + } + } +} + +/// A key for chunk pruning records. +const CHUNK_PRUNING_KEY: [u8; 14] = *b"chunks_pruning"; + +/// A key for PoV pruning records. +const POV_PRUNING_KEY: [u8; 11] = *b"pov_pruning"; + +/// A key for a cached value of next scheduled PoV pruning. +const NEXT_POV_PRUNING: [u8; 16] = *b"next_pov_pruning"; + +/// A key for a cached value of next scheduled chunk pruning. +const NEXT_CHUNK_PRUNING: [u8; 18] = *b"next_chunk_pruning"; + +/// The following constants are used under normal conditions: + +/// Stored block is kept available for 1 hour. +const KEEP_STORED_BLOCK_FOR: Duration = Duration::from_secs(60 * 60); + +/// Finalized block is kept for 1 day. +const KEEP_FINALIZED_BLOCK_FOR: Duration = Duration::from_secs(24 * 60 * 60); + +/// Keep chunk of the finalized block for 1 day + 1 hour. +const KEEP_FINALIZED_CHUNK_FOR: Duration = Duration::from_secs(25 * 60 * 60); + +/// At which point in time since UNIX_EPOCH we need to wakeup and do next pruning of blocks. +/// Essenially this is the first element in the sorted array of pruning data, +/// we just want to cache it here to avoid lifting the whole array just to look at the head. +/// +/// This record exists under `NEXT_POV_PRUNING` key, if it does not either: +/// a) There are no records and nothing has to be pruned. +/// b) There are records but all of them are in `Included` state and do not have exact time to +/// be pruned. +#[derive(Decode, Encode)] +struct NextPoVPruning(Duration); + +impl NextPoVPruning { + // After which duration from `now` this should fire. + fn should_fire_in(&self) -> Result { + Ok(self.0.checked_sub(SystemTime::now().duration_since(UNIX_EPOCH)?).unwrap_or_default()) + } } -#[derive(Debug, derive_more::From)] -enum Error { - #[from] - Erasure(erasure::Error), - #[from] - Io(io::Error), - #[from] - Oneshot(oneshot::Canceled), - #[from] - Subsystem(SubsystemError), +/// At which point in time since UNIX_EPOCH we need to wakeup and do next pruning of chunks. +/// Essentially this is the first element in the sorted array of pruning data, +/// we just want to cache it here to avoid lifting the whole array just to look at the head. +/// +/// This record exists under `NEXT_CHUNK_PRUNING` key, if it does not either: +/// a) There are no records and nothing has to be pruned. +/// b) There are records but all of them are in `Included` state and do not have exact time to +/// be pruned. +#[derive(Decode, Encode)] +struct NextChunkPruning(Duration); + +impl NextChunkPruning { + // After which amount of seconds into the future from `now` this should fire. + fn should_fire_in(&self) -> Result { + Ok(self.0.checked_sub(SystemTime::now().duration_since(UNIX_EPOCH)?).unwrap_or_default()) + } +} + +/// Struct holding pruning timing configuration. +/// The only purpose of this structure is to use different timing +/// configurations in production and in testing. +#[derive(Clone)] +struct PruningConfig { + /// How long should a stored block stay available. + keep_stored_block_for: Duration, + + /// How long should a finalized block stay available. + keep_finalized_block_for: Duration, + + /// How long should a chunk of a finalized block stay available. + keep_finalized_chunk_for: Duration, +} + +impl Default for PruningConfig { + fn default() -> Self { + Self { + keep_stored_block_for: KEEP_STORED_BLOCK_FOR, + keep_finalized_block_for: KEEP_FINALIZED_BLOCK_FOR, + keep_finalized_chunk_for: KEEP_FINALIZED_CHUNK_FOR, + } + } +} + +#[derive(Debug, Decode, Encode, Eq, PartialEq)] +enum CandidateState { + Stored, + Included, + Finalized, +} + +#[derive(Debug, Decode, Encode, Eq)] +struct PoVPruningRecord { + candidate_hash: CandidateHash, + block_number: BlockNumber, + candidate_state: CandidateState, + prune_at: PruningDelay, +} + +impl PartialEq for PoVPruningRecord { + fn eq(&self, other: &Self) -> bool { + self.candidate_hash == other.candidate_hash + } +} + +impl Ord for PoVPruningRecord { + fn cmp(&self, other: &Self) -> Ordering { + if self.candidate_hash == other.candidate_hash { + return Ordering::Equal; + } + + self.prune_at.cmp(&other.prune_at) + } +} + +impl PartialOrd for PoVPruningRecord { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +#[derive(Debug, Decode, Encode, Eq)] +struct ChunkPruningRecord { + candidate_hash: CandidateHash, + block_number: BlockNumber, + candidate_state: CandidateState, + chunk_index: u32, + prune_at: PruningDelay, +} + +impl PartialEq for ChunkPruningRecord { + fn eq(&self, other: &Self) -> bool { + self.candidate_hash == other.candidate_hash && + self.chunk_index == other.chunk_index + } +} + +impl Ord for ChunkPruningRecord { + fn cmp(&self, other: &Self) -> Ordering { + if self.candidate_hash == other.candidate_hash { + return Ordering::Equal; + } + + self.prune_at.cmp(&other.prune_at) + } +} + +impl PartialOrd for ChunkPruningRecord { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } } /// An implementation of the Availability Store subsystem. pub struct AvailabilityStoreSubsystem { + pruning_config: PruningConfig, inner: Arc, + chunks_cache: HashMap>, metrics: Metrics, } -fn available_data_key(candidate_hash: &Hash) -> Vec { +impl AvailabilityStoreSubsystem { + // Perform pruning of PoVs + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + fn prune_povs(&mut self) -> Result<(), Error> { + let _timer = self.metrics.time_prune_povs(); + + let mut tx = DBTransaction::new(); + let mut pov_pruning = pov_pruning(&self.inner).unwrap_or_default(); + let now = PruningDelay::now()?; + + tracing::trace!(target: LOG_TARGET, "Pruning PoVs"); + let outdated_records_count = pov_pruning.iter() + .take_while(|r| r.prune_at <= now) + .count(); + + for record in pov_pruning.drain(..outdated_records_count) { + tracing::trace!(target: LOG_TARGET, record = ?record, "Removing record"); + + self.chunks_cache.remove(&record.candidate_hash); + tx.delete( + columns::DATA, + available_data_key(&record.candidate_hash).as_slice(), + ); + } + + put_pov_pruning(&self.inner, Some(tx), pov_pruning, &self.metrics)?; + + Ok(()) + } + + // Perform pruning of chunks. + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + fn prune_chunks(&mut self) -> Result<(), Error> { + let _timer = self.metrics.time_prune_chunks(); + + let mut tx = DBTransaction::new(); + let mut chunk_pruning = chunk_pruning(&self.inner).unwrap_or_default(); + let now = PruningDelay::now()?; + + tracing::trace!(target: LOG_TARGET, "Pruning Chunks"); + let outdated_records_count = chunk_pruning.iter() + .take_while(|r| r.prune_at <= now) + .count(); + + for record in chunk_pruning.drain(..outdated_records_count) { + tracing::trace!(target: LOG_TARGET, record = ?record, "Removing record"); + + self.chunks_cache.remove(&record.candidate_hash); + tx.delete( + columns::DATA, + erasure_chunk_key(&record.candidate_hash, record.chunk_index).as_slice(), + ); + } + + put_chunk_pruning(&self.inner, Some(tx), chunk_pruning, &self.metrics)?; + + Ok(()) + } + + // Return a `Future` that either resolves when another PoV pruning has to happen + // or is indefinitely `pending` in case no pruning has to be done. + // Just a helper to `select` over multiple things at once. + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + fn maybe_prune_povs(&self) -> Result, Error> { + let future = match get_next_pov_pruning_time(&self.inner) { + Some(pruning) => { + Either::Left(Delay::new(pruning.should_fire_in()?)) + } + None => Either::Right(future::pending::<()>()), + }; + + Ok(future) + } + + // Return a `Future` that either resolves when another chunk pruning has to happen + // or is indefinitely `pending` in case no pruning has to be done. + // Just a helper to `select` over multiple things at once. + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + fn maybe_prune_chunks(&self) -> Result, Error> { + let future = match get_next_chunk_pruning_time(&self.inner) { + Some(pruning) => { + Either::Left(Delay::new(pruning.should_fire_in()?)) + } + None => Either::Right(future::pending::<()>()), + }; + + Ok(future) + } +} + +fn available_data_key(candidate_hash: &CandidateHash) -> Vec { (candidate_hash, 0i8).encode() } -fn erasure_chunk_key(candidate_hash: &Hash, index: u32) -> Vec { +fn erasure_chunk_key(candidate_hash: &CandidateHash, index: u32) -> Vec { (candidate_hash, index, 0i8).encode() } @@ -85,6 +431,23 @@ pub struct Config { pub path: PathBuf, } +impl std::convert::TryFrom for Config { + type Error = Error; + + fn try_from(config: sc_service::config::DatabaseConfig) -> Result { + let path = config.path().ok_or(Error::CustomDatabase)?; + + Ok(Self { + // substrate cache size is improper here; just use the default + cache_size: None, + // DB path is a sub-directory of substrate db path to give two properties: + // 1: column numbers don't conflict with substrate + // 2: commands like purge-chain work without further changes + path: path.join("parachains").join("av-store"), + }) + } +} + impl AvailabilityStoreSubsystem { /// Create a new `AvailabilityStoreSubsystem` with a given config on disk. pub fn new_on_disk(config: Config, metrics: Metrics) -> io::Result { @@ -104,65 +467,312 @@ impl AvailabilityStoreSubsystem { format!("Bad database path: {:?}", config.path), ))?; + std::fs::create_dir_all(&path)?; let db = Database::open(&db_config, &path)?; Ok(Self { + pruning_config: PruningConfig::default(), inner: Arc::new(db), + chunks_cache: HashMap::new(), metrics, }) } #[cfg(test)] - fn new_in_memory(inner: Arc) -> Self { + fn new_in_memory(inner: Arc, pruning_config: PruningConfig) -> Self { Self { + pruning_config, inner, + chunks_cache: HashMap::new(), metrics: Metrics(None), } } } -async fn run(subsystem: AvailabilityStoreSubsystem, mut ctx: Context) - -> Result<(), Error> +fn get_next_pov_pruning_time(db: &Arc) -> Option { + query_inner(db, columns::META, &NEXT_POV_PRUNING) +} + +fn get_next_chunk_pruning_time(db: &Arc) -> Option { + query_inner(db, columns::META, &NEXT_CHUNK_PRUNING) +} + +#[tracing::instrument(skip(subsystem, ctx), fields(subsystem = LOG_TARGET))] +async fn run(mut subsystem: AvailabilityStoreSubsystem, mut ctx: Context) where Context: SubsystemContext, { - let ctx = &mut ctx; loop { - select! { - incoming = ctx.recv().fuse() => { - match incoming { - Ok(FromOverseer::Signal(Conclude)) => break, - Ok(FromOverseer::Signal(_)) => (), - Ok(FromOverseer::Communication { msg }) => { - process_message(&subsystem.inner, &subsystem.metrics, msg)?; + let res = run_iteration(&mut subsystem, &mut ctx).await; + match res { + Err(e) => { + e.trace(); + + if let Error::Subsystem(SubsystemError::Context(_)) = e { + break; + } + } + Ok(true) => { + tracing::info!(target: LOG_TARGET, "received `Conclude` signal, exiting"); + break; + }, + Ok(false) => continue, + } + } +} + +#[tracing::instrument(level = "trace", skip(subsystem, ctx), fields(subsystem = LOG_TARGET))] +async fn run_iteration(subsystem: &mut AvailabilityStoreSubsystem, ctx: &mut Context) + -> Result +where + Context: SubsystemContext, +{ + // Every time the following two methods are called a read from DB is performed. + // But given that these are very small values which are essentially a newtype + // wrappers around `Duration` (`NextChunkPruning` and `NextPoVPruning`) and also the + // fact of the frequent reads itself we assume these to end up cached in the memory + // anyway and thus these db reads to be reasonably fast. + let pov_pruning_time = subsystem.maybe_prune_povs()?; + let chunk_pruning_time = subsystem.maybe_prune_chunks()?; + + let mut pov_pruning_time = pov_pruning_time.fuse(); + let mut chunk_pruning_time = chunk_pruning_time.fuse(); + + select! { + incoming = ctx.recv().fuse() => { + match incoming? { + FromOverseer::Signal(OverseerSignal::Conclude) => return Ok(true), + FromOverseer::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate { activated, .. }) + ) => { + for (activated, _span) in activated.into_iter() { + process_block_activated(ctx, subsystem, activated).await?; } - Err(_) => break, } + FromOverseer::Signal(OverseerSignal::BlockFinalized(_hash, number)) => { + process_block_finalized(subsystem, &subsystem.inner, number).await?; + } + FromOverseer::Communication { msg } => { + process_message(subsystem, ctx, msg).await?; + } + } + } + _ = pov_pruning_time => { + subsystem.prune_povs()?; + } + _ = chunk_pruning_time => { + subsystem.prune_chunks()?; + } + complete => return Ok(true), + } + + Ok(false) +} + +/// As soon as certain block is finalized its pruning records and records of all +/// blocks that we keep that are `older` than the block in question have to be updated. +/// +/// The state of data has to be changed from +/// `CandidateState::Included` to `CandidateState::Finalized` and their pruning times have +/// to be updated to `now` + keep_finalized_{block, chunk}_for`. +#[tracing::instrument(level = "trace", skip(subsystem, db), fields(subsystem = LOG_TARGET))] +async fn process_block_finalized( + subsystem: &AvailabilityStoreSubsystem, + db: &Arc, + block_number: BlockNumber, +) -> Result<(), Error> { + let _timer = subsystem.metrics.time_process_block_finalized(); + + if let Some(mut pov_pruning) = pov_pruning(db) { + // Since the records are sorted by time in which they need to be pruned and not by block + // numbers we have to iterate through the whole collection here. + for record in pov_pruning.iter_mut() { + if record.block_number <= block_number { + tracing::trace!( + target: LOG_TARGET, + block_number = %record.block_number, + "Updating pruning record for finalized block", + ); + + record.prune_at = PruningDelay::into_the_future( + subsystem.pruning_config.keep_finalized_block_for + )?; + record.candidate_state = CandidateState::Finalized; } - complete => break, } + + put_pov_pruning(db, None, pov_pruning, &subsystem.metrics)?; + } + + if let Some(mut chunk_pruning) = chunk_pruning(db) { + for record in chunk_pruning.iter_mut() { + if record.block_number <= block_number { + tracing::trace!( + target: LOG_TARGET, + block_number = %record.block_number, + "Updating chunk pruning record for finalized block", + ); + + record.prune_at = PruningDelay::into_the_future( + subsystem.pruning_config.keep_finalized_chunk_for + )?; + record.candidate_state = CandidateState::Finalized; + } + } + + put_chunk_pruning(db, None, chunk_pruning, &subsystem.metrics)?; } Ok(()) } -fn process_message(db: &Arc, metrics: &Metrics, msg: AvailabilityStoreMessage) -> Result<(), Error> { +#[tracing::instrument(level = "trace", skip(ctx, subsystem), fields(subsystem = LOG_TARGET))] +async fn process_block_activated( + ctx: &mut Context, + subsystem: &mut AvailabilityStoreSubsystem, + hash: Hash, +) -> Result<(), Error> +where + Context: SubsystemContext +{ + let _timer = subsystem.metrics.time_block_activated(); + let db = &subsystem.inner; + + let events = match request_candidate_events(ctx, hash).await { + Ok(events) => events, + Err(err) => { + tracing::debug!(target: LOG_TARGET, err = ?err, "requesting candidate events failed"); + return Ok(()); + } + }; + + tracing::trace!(target: LOG_TARGET, hash = %hash, "block activated"); + let mut included = HashSet::new(); + + for event in events.into_iter() { + if let CandidateEvent::CandidateIncluded(receipt, _) = event { + tracing::trace!( + target: LOG_TARGET, + hash = %receipt.hash(), + "Candidate {:?} was included", receipt.hash(), + ); + included.insert(receipt.hash()); + } + } + + for included in &included { + subsystem.chunks_cache.remove(&included); + } + + if let Some(mut pov_pruning) = pov_pruning(db) { + for record in pov_pruning.iter_mut() { + if included.contains(&record.candidate_hash) { + record.prune_at = PruningDelay::Indefinite; + record.candidate_state = CandidateState::Included; + } + } + + pov_pruning.sort(); + + put_pov_pruning(db, None, pov_pruning, &subsystem.metrics)?; + } + + if let Some(mut chunk_pruning) = chunk_pruning(db) { + for record in chunk_pruning.iter_mut() { + if included.contains(&record.candidate_hash) { + record.prune_at = PruningDelay::Indefinite; + record.candidate_state = CandidateState::Included; + } + } + + chunk_pruning.sort(); + + put_chunk_pruning(db, None, chunk_pruning, &subsystem.metrics)?; + } + + Ok(()) +} + +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] +async fn request_candidate_events( + ctx: &mut Context, + hash: Hash, +) -> Result, Error> +where + Context: SubsystemContext +{ + let (tx, rx) = oneshot::channel(); + + let msg = AllMessages::RuntimeApi(RuntimeApiMessage::Request( + hash, + RuntimeApiRequest::CandidateEvents(tx), + )); + + ctx.send_message(msg.into()).await; + + Ok(rx.await??) +} + +#[tracing::instrument(level = "trace", skip(subsystem, ctx), fields(subsystem = LOG_TARGET))] +async fn process_message( + subsystem: &mut AvailabilityStoreSubsystem, + ctx: &mut Context, + msg: AvailabilityStoreMessage, +) -> Result<(), Error> +where + Context: SubsystemContext +{ use AvailabilityStoreMessage::*; + + let _timer = subsystem.metrics.time_process_message(); + match msg { QueryAvailableData(hash, tx) => { - tx.send(available_data(db, &hash).map(|d| d.data)).map_err(|_| oneshot::Canceled)?; + tx.send(available_data(&subsystem.inner, &hash).map(|d| d.data)).map_err(|_| oneshot::Canceled)?; } QueryDataAvailability(hash, tx) => { - tx.send(available_data(db, &hash).is_some()).map_err(|_| oneshot::Canceled)?; + let result = available_data(&subsystem.inner, &hash).is_some(); + + tracing::trace!( + target: LOG_TARGET, + candidate_hash = ?hash, + availability = ?result, + "Queried data availability", + ); + + tx.send(result).map_err(|_| oneshot::Canceled)?; } QueryChunk(hash, id, tx) => { - tx.send(get_chunk(db, &hash, id, metrics)?).map_err(|_| oneshot::Canceled)?; + tx.send(get_chunk(subsystem, &hash, id)?).map_err(|_| oneshot::Canceled)?; } QueryChunkAvailability(hash, id, tx) => { - tx.send(get_chunk(db, &hash, id, metrics)?.is_some()).map_err(|_| oneshot::Canceled)?; + let result = get_chunk(subsystem, &hash, id).map(|r| r.is_some()); + + tracing::trace!( + target: LOG_TARGET, + candidate_hash = ?hash, + availability = ?result, + "Queried chunk availability", + ); + + tx.send(result?).map_err(|_| oneshot::Canceled)?; } - StoreChunk(hash, id, chunk, tx) => { - match store_chunk(db, &hash, id, chunk) { + StoreChunk { candidate_hash, relay_parent, chunk, tx } => { + let chunk_index = chunk.index; + // Current block number is relay_parent block number + 1. + let block_number = get_block_number(ctx, relay_parent).await? + 1; + let result = store_chunks(subsystem, &candidate_hash, vec![chunk], block_number); + + tracing::trace!( + target: LOG_TARGET, + %chunk_index, + ?candidate_hash, + %block_number, + ?result, + "Stored chunk", + ); + + match result { Err(e) => { tx.send(Err(())).map_err(|_| oneshot::Canceled)?; return Err(e); @@ -173,7 +783,11 @@ fn process_message(db: &Arc, metrics: &Metrics, msg: Availabilit } } StoreAvailableData(hash, id, n_validators, av_data, tx) => { - match store_available_data(db, &hash, id, n_validators, av_data, metrics) { + let result = store_available_data(subsystem, &hash, id, n_validators, av_data); + + tracing::trace!(target: LOG_TARGET, candidate_hash = ?hash, ?result, "Stored available data"); + + match result { Err(e) => { tx.send(Err(())).map_err(|_| oneshot::Canceled)?; return Err(e); @@ -188,77 +802,285 @@ fn process_message(db: &Arc, metrics: &Metrics, msg: Availabilit Ok(()) } -fn available_data(db: &Arc, candidate_hash: &Hash) -> Option { +fn available_data( + db: &Arc, + candidate_hash: &CandidateHash, +) -> Option { query_inner(db, columns::DATA, &available_data_key(candidate_hash)) } -fn store_available_data( +fn pov_pruning(db: &Arc) -> Option> { + query_inner(db, columns::META, &POV_PRUNING_KEY) +} + +fn chunk_pruning(db: &Arc) -> Option> { + query_inner(db, columns::META, &CHUNK_PRUNING_KEY) +} + +#[tracing::instrument(level = "trace", skip(db, tx, metrics), fields(subsystem = LOG_TARGET))] +fn put_pov_pruning( + db: &Arc, + tx: Option, + mut pov_pruning: Vec, + metrics: &Metrics, +) -> Result<(), Error> { + let mut tx = tx.unwrap_or_default(); + + metrics.block_pruning_records_size(pov_pruning.len()); + + pov_pruning.sort(); + + tx.put_vec( + columns::META, + &POV_PRUNING_KEY, + pov_pruning.encode(), + ); + + match pov_pruning.get(0) { + // We want to wake up in case we have some records that are not scheduled to be kept + // indefinitely (data is included and waiting to move to the finalized state) and so + // the is at least one value that is not `PruningDelay::Indefinite`. + Some(PoVPruningRecord { prune_at: PruningDelay::In(prune_at), .. }) => { + tx.put_vec( + columns::META, + &NEXT_POV_PRUNING, + NextPoVPruning(*prune_at).encode(), + ); + } + _ => { + // If there is no longer any records, delete the cached pruning time record. + tx.delete( + columns::META, + &NEXT_POV_PRUNING, + ); + } + } + + db.write(tx)?; + + Ok(()) +} + +#[tracing::instrument(level = "trace", skip(db, tx, metrics), fields(subsystem = LOG_TARGET))] +fn put_chunk_pruning( db: &Arc, - candidate_hash: &Hash, + tx: Option, + mut chunk_pruning: Vec, + metrics: &Metrics, +) -> Result<(), Error> { + let mut tx = tx.unwrap_or_default(); + + metrics.chunk_pruning_records_size(chunk_pruning.len()); + + chunk_pruning.sort(); + + tx.put_vec( + columns::META, + &CHUNK_PRUNING_KEY, + chunk_pruning.encode(), + ); + + match chunk_pruning.get(0) { + Some(ChunkPruningRecord { prune_at: PruningDelay::In(prune_at), .. }) => { + tx.put_vec( + columns::META, + &NEXT_CHUNK_PRUNING, + NextChunkPruning(*prune_at).encode(), + ); + } + _ => { + tx.delete( + columns::META, + &NEXT_CHUNK_PRUNING, + ); + } + } + + db.write(tx)?; + + Ok(()) +} + +// produces a block number by block's hash. +// in the the event of an invalid `block_hash`, returns `Ok(0)` +async fn get_block_number( + ctx: &mut Context, + block_hash: Hash, +) -> Result +where + Context: SubsystemContext, +{ + let (tx, rx) = oneshot::channel(); + + ctx.send_message(AllMessages::ChainApi(ChainApiMessage::BlockNumber(block_hash, tx))).await; + + Ok(rx.await??.map(|number| number).unwrap_or_default()) +} + +#[tracing::instrument(level = "trace", skip(subsystem, available_data), fields(subsystem = LOG_TARGET))] +fn store_available_data( + subsystem: &mut AvailabilityStoreSubsystem, + candidate_hash: &CandidateHash, id: Option, n_validators: u32, available_data: AvailableData, - metrics: &Metrics, ) -> Result<(), Error> { + let _timer = subsystem.metrics.time_store_available_data(); + let mut tx = DBTransaction::new(); - if let Some(index) = id { - let chunks = get_chunks(&available_data, n_validators as usize, metrics)?; - store_chunk(db, candidate_hash, n_validators, chunks[index as usize].clone())?; - } + let block_number = available_data.validation_data.block_number; + + let chunks = get_chunks(&available_data, n_validators as usize, &subsystem.metrics)?; + store_chunks( + subsystem, + candidate_hash, + chunks, + block_number, + )?; let stored_data = StoredAvailableData { data: available_data, n_validators, }; + let mut pov_pruning = pov_pruning(&subsystem.inner).unwrap_or_default(); + let prune_at = PruningDelay::into_the_future(subsystem.pruning_config.keep_stored_block_for)?; + + if let Some(next_pruning) = prune_at.as_duration() { + tx.put_vec( + columns::META, + &NEXT_POV_PRUNING, + NextPoVPruning(next_pruning).encode(), + ); + } + + let pruning_record = PoVPruningRecord { + candidate_hash: *candidate_hash, + block_number, + candidate_state: CandidateState::Stored, + prune_at, + }; + + let idx = pov_pruning.binary_search(&pruning_record).unwrap_or_else(|insert_idx| insert_idx); + + pov_pruning.insert(idx, pruning_record); + tx.put_vec( columns::DATA, available_data_key(&candidate_hash).as_slice(), stored_data.encode(), ); - db.write(tx)?; + tx.put_vec( + columns::META, + &POV_PRUNING_KEY, + pov_pruning.encode(), + ); + + subsystem.inner.write(tx)?; Ok(()) } -fn store_chunk(db: &Arc, candidate_hash: &Hash, _n_validators: u32, chunk: ErasureChunk) - -> Result<(), Error> -{ +#[tracing::instrument(level = "trace", skip(subsystem), fields(subsystem = LOG_TARGET))] +fn store_chunks( + subsystem: &mut AvailabilityStoreSubsystem, + candidate_hash: &CandidateHash, + chunks: Vec, + block_number: BlockNumber, +) -> Result<(), Error> { + let _timer = subsystem.metrics.time_store_chunks(); + let mut tx = DBTransaction::new(); + let mut chunk_pruning = chunk_pruning(&subsystem.inner).unwrap_or_default(); + + let prune_at = PruningDelay::into_the_future(subsystem.pruning_config.keep_stored_block_for)?; + if let Some(delay) = prune_at.clone().as_duration() { + tx.put_vec( + columns::META, + &NEXT_CHUNK_PRUNING, + NextChunkPruning(delay).encode(), + ); + } - let dbkey = erasure_chunk_key(candidate_hash, chunk.index); + for chunk in &chunks { + let pruning_record = ChunkPruningRecord { + candidate_hash: candidate_hash.clone(), + block_number, + candidate_state: CandidateState::Stored, + chunk_index: chunk.index, + prune_at: prune_at.clone(), + }; - tx.put_vec(columns::DATA, &dbkey, chunk.encode()); - db.write(tx)?; + let idx = chunk_pruning.binary_search(&pruning_record).unwrap_or_else(|insert_idx| insert_idx); + + chunk_pruning.insert(idx, pruning_record); + + let dbkey = erasure_chunk_key(candidate_hash, chunk.index); + + tx.put_vec( + columns::DATA, + &dbkey, + chunk.encode(), + ); + } + + subsystem.chunks_cache.entry(*candidate_hash).or_default().extend(chunks.into_iter().map(|c| (c.index, c))); + + tx.put_vec( + columns::META, + &CHUNK_PRUNING_KEY, + chunk_pruning.encode(), + ); + + subsystem.inner.write(tx)?; Ok(()) } -fn get_chunk(db: &Arc, candidate_hash: &Hash, index: u32, metrics: &Metrics) - -> Result, Error> -{ +#[tracing::instrument(level = "trace", skip(subsystem), fields(subsystem = LOG_TARGET))] +fn get_chunk( + subsystem: &mut AvailabilityStoreSubsystem, + candidate_hash: &CandidateHash, + index: u32, +) -> Result, Error> { + let _timer = subsystem.metrics.time_get_chunk(); + + if let Some(entry) = subsystem.chunks_cache.get(candidate_hash) { + if let Some(chunk) = entry.get(&index) { + return Ok(Some(chunk.clone())); + } + } + if let Some(chunk) = query_inner( - db, + &subsystem.inner, columns::DATA, - &erasure_chunk_key(candidate_hash, index)) { + &erasure_chunk_key(candidate_hash, index) + ) { return Ok(Some(chunk)); } - if let Some(data) = available_data(db, candidate_hash) { - let mut chunks = get_chunks(&data.data, data.n_validators as usize, metrics)?; + if let Some(data) = available_data(&subsystem.inner, candidate_hash) { + let chunks = get_chunks(&data.data, data.n_validators as usize, &subsystem.metrics)?; let desired_chunk = chunks.get(index as usize).cloned(); - for chunk in chunks.drain(..) { - store_chunk(db, candidate_hash, data.n_validators, chunk)?; - } + store_chunks( + subsystem, + candidate_hash, + chunks, + data.data.validation_data.block_number, + )?; return Ok(desired_chunk); } Ok(None) } -fn query_inner(db: &Arc, column: u32, key: &[u8]) -> Option { +fn query_inner( + db: &Arc, + column: u32, + key: &[u8], +) -> Option { match db.get(column, key) { Ok(Some(raw)) => { let res = D::decode(&mut &raw[..]).expect("all stored data serialized correctly; qed"); @@ -266,24 +1088,20 @@ fn query_inner(db: &Arc, column: u32, key: &[u8]) -> } Ok(None) => None, Err(e) => { - log::warn!(target: LOG_TARGET, "Error reading from the availability store: {:?}", e); + tracing::warn!(target: LOG_TARGET, err = ?e, "Error reading from the availability store"); None } } } impl Subsystem for AvailabilityStoreSubsystem - where - Context: SubsystemContext, +where + Context: SubsystemContext, { - type Metrics = Metrics; - fn start(self, ctx: Context) -> SpawnedSubsystem { - let future = Box::pin(async move { - if let Err(e) = run(self, ctx).await { - log::error!(target: "availabilitystore", "Subsystem exited with an error {:?}", e); - } - }); + let future = run(self, ctx) + .map(|_| Ok(())) + .boxed(); SpawnedSubsystem { name: "availability-store-subsystem", @@ -292,6 +1110,7 @@ impl Subsystem for AvailabilityStoreSubsystem } } +#[tracing::instrument(level = "trace", skip(metrics), fields(subsystem = LOG_TARGET))] fn get_chunks(data: &AvailableData, n_validators: usize, metrics: &Metrics) -> Result, Error> { let chunks = erasure::obtain_chunks_v1(n_validators, data)?; metrics.on_chunks_received(chunks.len()); @@ -313,6 +1132,16 @@ fn get_chunks(data: &AvailableData, n_validators: usize, metrics: &Metrics) -> R #[derive(Clone)] struct MetricsInner { received_availability_chunks_total: prometheus::Counter, + chunk_pruning_records_total: prometheus::Gauge, + block_pruning_records_total: prometheus::Gauge, + prune_povs: prometheus::Histogram, + prune_chunks: prometheus::Histogram, + process_block_finalized: prometheus::Histogram, + block_activated: prometheus::Histogram, + process_message: prometheus::Histogram, + store_available_data: prometheus::Histogram, + store_chunks: prometheus::Histogram, + get_chunk: prometheus::Histogram, } /// Availability metrics. @@ -328,241 +1157,164 @@ impl Metrics { metrics.received_availability_chunks_total.inc_by(by); } } -} -impl metrics::Metrics for Metrics { - fn try_register(registry: &prometheus::Registry) -> Result { - let metrics = MetricsInner { - received_availability_chunks_total: prometheus::register( - prometheus::Counter::new( - "parachain_received_availability_chunks_total", - "Number of availability chunks received.", - )?, - registry, - )?, - }; - Ok(Metrics(Some(metrics))) + fn chunk_pruning_records_size(&self, count: usize) { + if let Some(metrics) = &self.0 { + use core::convert::TryFrom as _; + let total = u64::try_from(count).unwrap_or_default(); + metrics.chunk_pruning_records_total.set(total); + } } -} -#[cfg(test)] -mod tests { - use super::*; - use futures::{ - future, - channel::oneshot, - executor, - Future, - }; - use std::cell::RefCell; - use polkadot_primitives::v1::{ - AvailableData, BlockData, HeadData, PersistedValidationData, PoV, - }; - use polkadot_node_subsystem_test_helpers as test_helpers; - - struct TestHarness { - virtual_overseer: test_helpers::TestSubsystemContextHandle, + fn block_pruning_records_size(&self, count: usize) { + if let Some(metrics) = &self.0 { + use core::convert::TryFrom as _; + let total = u64::try_from(count).unwrap_or_default(); + metrics.block_pruning_records_total.set(total); + } } - thread_local! { - static TIME_NOW: RefCell> = RefCell::new(None); + /// Provide a timer for `prune_povs` which observes on drop. + fn time_prune_povs(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.prune_povs.start_timer()) } - struct TestState { - persisted_validation_data: PersistedValidationData, + /// Provide a timer for `prune_chunks` which observes on drop. + fn time_prune_chunks(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.prune_chunks.start_timer()) } - impl Default for TestState { - fn default() -> Self { - - let persisted_validation_data = PersistedValidationData { - parent_head: HeadData(vec![7, 8, 9]), - block_number: Default::default(), - hrmp_mqc_heads: Vec::new(), - }; - Self { - persisted_validation_data, - } - } + /// Provide a timer for `process_block_finalized` which observes on drop. + fn time_process_block_finalized(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.process_block_finalized.start_timer()) } - fn test_harness>( - store: Arc, - test: impl FnOnce(TestHarness) -> T, - ) { - let pool = sp_core::testing::TaskExecutor::new(); - let (context, virtual_overseer) = test_helpers::make_subsystem_context(pool.clone()); - - let subsystem = AvailabilityStoreSubsystem::new_in_memory(store); - let subsystem = run(subsystem, context); - - let test_fut = test(TestHarness { - virtual_overseer, - }); - - futures::pin_mut!(test_fut); - futures::pin_mut!(subsystem); - - executor::block_on(future::select(test_fut, subsystem)); + /// Provide a timer for `block_activated` which observes on drop. + fn time_block_activated(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.block_activated.start_timer()) } - #[test] - fn store_chunk_works() { - let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); - test_harness(store.clone(), |test_harness| async move { - let TestHarness { mut virtual_overseer } = test_harness; - let relay_parent = Hash::from([1; 32]); - let validator_index = 5; - - let chunk = ErasureChunk { - chunk: vec![1, 2, 3], - index: validator_index, - proof: vec![vec![3, 4, 5]], - }; - - let (tx, rx) = oneshot::channel(); - - let chunk_msg = AvailabilityStoreMessage::StoreChunk( - relay_parent, - validator_index, - chunk.clone(), - tx, - ); - - virtual_overseer.send(FromOverseer::Communication{ msg: chunk_msg }).await; - assert_eq!(rx.await.unwrap(), Ok(())); - - let (tx, rx) = oneshot::channel(); - let query_chunk = AvailabilityStoreMessage::QueryChunk( - relay_parent, - validator_index, - tx, - ); - - virtual_overseer.send(FromOverseer::Communication{ msg: query_chunk }).await; - - assert_eq!(rx.await.unwrap().unwrap(), chunk); - }); + /// Provide a timer for `process_message` which observes on drop. + fn time_process_message(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.process_message.start_timer()) } - #[test] - fn store_block_works() { - let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); - let test_state = TestState::default(); - test_harness(store.clone(), |test_harness| async move { - let TestHarness { mut virtual_overseer } = test_harness; - let candidate_hash = Hash::from([1; 32]); - let validator_index = 5; - let n_validators = 10; - - let pov = PoV { - block_data: BlockData(vec![4, 5, 6]), - }; - - let available_data = AvailableData { - pov, - validation_data: test_state.persisted_validation_data, - }; - - - let (tx, rx) = oneshot::channel(); - let block_msg = AvailabilityStoreMessage::StoreAvailableData( - candidate_hash, - Some(validator_index), - n_validators, - available_data.clone(), - tx, - ); - - virtual_overseer.send(FromOverseer::Communication{ msg: block_msg }).await; - assert_eq!(rx.await.unwrap(), Ok(())); - - let pov = query_available_data(&mut virtual_overseer, candidate_hash).await.unwrap(); - assert_eq!(pov, available_data); - - let chunk = query_chunk(&mut virtual_overseer, candidate_hash, validator_index).await.unwrap(); - - let chunks = erasure::obtain_chunks_v1(10, &available_data).unwrap(); - - let mut branches = erasure::branches(chunks.as_ref()); - - let branch = branches.nth(5).unwrap(); - let expected_chunk = ErasureChunk { - chunk: branch.1.to_vec(), - index: 5, - proof: branch.0, - }; - - assert_eq!(chunk, expected_chunk); - }); + /// Provide a timer for `store_available_data` which observes on drop. + fn time_store_available_data(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.store_available_data.start_timer()) } - - #[test] - fn store_pov_and_query_chunk_works() { - let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); - let test_state = TestState::default(); - - test_harness(store.clone(), |test_harness| async move { - let TestHarness { mut virtual_overseer } = test_harness; - let candidate_hash = Hash::from([1; 32]); - let n_validators = 10; - - let pov = PoV { - block_data: BlockData(vec![4, 5, 6]), - }; - - let available_data = AvailableData { - pov, - validation_data: test_state.persisted_validation_data, - }; - - let no_metrics = Metrics(None); - let chunks_expected = get_chunks(&available_data, n_validators as usize, &no_metrics).unwrap(); - - let (tx, rx) = oneshot::channel(); - let block_msg = AvailabilityStoreMessage::StoreAvailableData( - candidate_hash, - None, - n_validators, - available_data, - tx, - ); - - virtual_overseer.send(FromOverseer::Communication{ msg: block_msg }).await; - - assert_eq!(rx.await.unwrap(), Ok(())); - - for validator_index in 0..n_validators { - let chunk = query_chunk(&mut virtual_overseer, candidate_hash, validator_index).await.unwrap(); - - assert_eq!(chunk, chunks_expected[validator_index as usize]); - } - }); + /// Provide a timer for `store_chunk` which observes on drop. + fn time_store_chunks(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.store_chunks.start_timer()) } - async fn query_available_data( - virtual_overseer: &mut test_helpers::TestSubsystemContextHandle, - candidate_hash: Hash, - ) -> Option { - let (tx, rx) = oneshot::channel(); - - let query = AvailabilityStoreMessage::QueryAvailableData(candidate_hash, tx); - virtual_overseer.send(FromOverseer::Communication{ msg: query }).await; - - rx.await.unwrap() + /// Provide a timer for `get_chunk` which observes on drop. + fn time_get_chunk(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.get_chunk.start_timer()) } +} - async fn query_chunk( - virtual_overseer: &mut test_helpers::TestSubsystemContextHandle, - candidate_hash: Hash, - index: u32, - ) -> Option { - let (tx, rx) = oneshot::channel(); - - let query = AvailabilityStoreMessage::QueryChunk(candidate_hash, index, tx); - virtual_overseer.send(FromOverseer::Communication{ msg: query }).await; - - rx.await.unwrap() +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + received_availability_chunks_total: prometheus::register( + prometheus::Counter::new( + "parachain_received_availability_chunks_total", + "Number of availability chunks received.", + )?, + registry, + )?, + chunk_pruning_records_total: prometheus::register( + prometheus::Gauge::new( + "parachain_chunk_pruning_records_total", + "Number of chunk pruning records kept by the storage.", + )?, + registry, + )?, + block_pruning_records_total: prometheus::register( + prometheus::Gauge::new( + "parachain_block_pruning_records_total", + "Number of block pruning records kept by the storage.", + )?, + registry, + )?, + prune_povs: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_av_store_prune_povs", + "Time spent within `av_store::prune_povs`", + ) + )?, + registry, + )?, + prune_chunks: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_av_store_prune_chunks", + "Time spent within `av_store::prune_chunks`", + ) + )?, + registry, + )?, + process_block_finalized: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_av_store_process_block_finalized", + "Time spent within `av_store::block_finalized`", + ) + )?, + registry, + )?, + block_activated: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_av_store_block_activated", + "Time spent within `av_store::block_activated`", + ) + )?, + registry, + )?, + process_message: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_av_store_process_message", + "Time spent within `av_store::process_message`", + ) + )?, + registry, + )?, + store_available_data: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_av_store_store_available_data", + "Time spent within `av_store::store_available_data`", + ) + )?, + registry, + )?, + store_chunks: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_av_store_store_chunks", + "Time spent within `av_store::store_chunks`", + ) + )?, + registry, + )?, + get_chunk: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_av_store_get_chunk", + "Time spent within `av_store::get_chunk`", + ) + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) } } + +#[cfg(test)] +mod tests; diff --git a/node/core/av-store/src/tests.rs b/node/core/av-store/src/tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..1a719811604d6cf9ee7c9b9a11d3ad74994e47d5 --- /dev/null +++ b/node/core/av-store/src/tests.rs @@ -0,0 +1,840 @@ +// Copyright 2020 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 assert_matches::assert_matches; +use futures::{ + future, + channel::oneshot, + executor, + Future, +}; + +use polkadot_primitives::v1::{ + AvailableData, BlockData, CandidateDescriptor, CandidateReceipt, HeadData, + PersistedValidationData, PoV, Id as ParaId, CandidateHash, +}; +use polkadot_node_subsystem_util::TimeoutExt; +use polkadot_subsystem::{ + ActiveLeavesUpdate, errors::RuntimeApiError, JaegerSpan, +}; +use polkadot_node_subsystem_test_helpers as test_helpers; + +struct TestHarness { + virtual_overseer: test_helpers::TestSubsystemContextHandle, +} + +#[derive(Default)] +struct TestCandidateBuilder { + para_id: ParaId, + pov_hash: Hash, + relay_parent: Hash, + commitments_hash: Hash, +} + +impl TestCandidateBuilder { + fn build(self) -> CandidateReceipt { + CandidateReceipt { + descriptor: CandidateDescriptor { + para_id: self.para_id, + pov_hash: self.pov_hash, + relay_parent: self.relay_parent, + ..Default::default() + }, + commitments_hash: self.commitments_hash, + } + } +} + +struct TestState { + persisted_validation_data: PersistedValidationData, + pruning_config: PruningConfig, +} + +impl Default for TestState { + fn default() -> Self { + let persisted_validation_data = PersistedValidationData { + parent_head: HeadData(vec![7, 8, 9]), + block_number: 5, + hrmp_mqc_heads: Vec::new(), + dmq_mqc_head: Default::default(), + max_pov_size: 1024, + relay_storage_root: Default::default(), + }; + + let pruning_config = PruningConfig { + keep_stored_block_for: Duration::from_secs(1), + keep_finalized_block_for: Duration::from_secs(2), + keep_finalized_chunk_for: Duration::from_secs(2), + }; + + Self { + persisted_validation_data, + pruning_config, + } + } +} + +fn test_harness>( + pruning_config: PruningConfig, + store: Arc, + test: impl FnOnce(TestHarness) -> T, +) { + let _ = env_logger::builder() + .is_test(true) + .filter( + Some("polkadot_node_core_av_store"), + log::LevelFilter::Trace, + ) + .filter( + Some(LOG_TARGET), + log::LevelFilter::Trace, + ) + .try_init(); + + let pool = sp_core::testing::TaskExecutor::new(); + let (context, virtual_overseer) = test_helpers::make_subsystem_context(pool.clone()); + + let subsystem = AvailabilityStoreSubsystem::new_in_memory(store, pruning_config); + let subsystem = run(subsystem, context); + + let test_fut = test(TestHarness { + virtual_overseer, + }); + + futures::pin_mut!(test_fut); + futures::pin_mut!(subsystem); + + executor::block_on(future::select(test_fut, subsystem)); +} + +const TIMEOUT: Duration = Duration::from_millis(100); + +async fn overseer_send( + overseer: &mut test_helpers::TestSubsystemContextHandle, + msg: AvailabilityStoreMessage, +) { + tracing::trace!(meg = ?msg, "sending message"); + overseer + .send(FromOverseer::Communication { msg }) + .timeout(TIMEOUT) + .await + .expect(&format!("{:?} is more than enough for sending messages.", TIMEOUT)); +} + +async fn overseer_recv( + overseer: &mut test_helpers::TestSubsystemContextHandle, +) -> AllMessages { + let msg = overseer_recv_with_timeout(overseer, TIMEOUT) + .await + .expect(&format!("{:?} is more than enough to receive messages", TIMEOUT)); + + tracing::trace!(msg = ?msg, "received message"); + + msg +} + +async fn overseer_recv_with_timeout( + overseer: &mut test_helpers::TestSubsystemContextHandle, + timeout: Duration, +) -> Option { + tracing::trace!("waiting for message..."); + overseer + .recv() + .timeout(timeout) + .await +} + +async fn overseer_signal( + overseer: &mut test_helpers::TestSubsystemContextHandle, + signal: OverseerSignal, +) { + overseer + .send(FromOverseer::Signal(signal)) + .timeout(TIMEOUT) + .await + .expect(&format!("{:?} is more than enough for sending signals.", TIMEOUT)); +} + +#[test] +fn runtime_api_error_does_not_stop_the_subsystem() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + + test_harness(PruningConfig::default(), store, |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let new_leaf = Hash::repeat_byte(0x01); + + overseer_signal( + &mut virtual_overseer, + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: vec![(new_leaf, Arc::new(JaegerSpan::Disabled))].into(), + deactivated: vec![].into(), + }), + ).await; + + // runtime api call fails + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::CandidateEvents(tx), + )) => { + assert_eq!(relay_parent, new_leaf); + tx.send(Err(RuntimeApiError::from("oh no".to_string()))).unwrap(); + } + ); + + // but that's fine, we're still alive + let (tx, rx) = oneshot::channel(); + let candidate_hash = CandidateHash(Hash::repeat_byte(33)); + let validator_index = 5; + let query_chunk = AvailabilityStoreMessage::QueryChunk( + candidate_hash, + validator_index, + tx, + ); + + overseer_send(&mut virtual_overseer, query_chunk.into()).await; + + assert!(rx.await.unwrap().is_none()); + + }); +} + +#[test] +fn store_chunk_works() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + test_harness(PruningConfig::default(), store.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let relay_parent = Hash::repeat_byte(32); + let candidate_hash = CandidateHash(Hash::repeat_byte(33)); + let validator_index = 5; + + let chunk = ErasureChunk { + chunk: vec![1, 2, 3], + index: validator_index, + proof: vec![vec![3, 4, 5]], + }; + + let (tx, rx) = oneshot::channel(); + + let chunk_msg = AvailabilityStoreMessage::StoreChunk { + candidate_hash, + relay_parent, + chunk: chunk.clone(), + tx, + }; + + overseer_send(&mut virtual_overseer, chunk_msg.into()).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::BlockNumber( + hash, + tx, + )) => { + assert_eq!(hash, relay_parent); + tx.send(Ok(Some(4))).unwrap(); + } + ); + + assert_eq!(rx.await.unwrap(), Ok(())); + + let (tx, rx) = oneshot::channel(); + let query_chunk = AvailabilityStoreMessage::QueryChunk( + candidate_hash, + validator_index, + tx, + ); + + overseer_send(&mut virtual_overseer, query_chunk.into()).await; + + assert_eq!(rx.await.unwrap().unwrap(), chunk); + }); +} + +#[test] +fn store_block_works() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + let test_state = TestState::default(); + test_harness(test_state.pruning_config.clone(), store.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let candidate_hash = CandidateHash(Hash::repeat_byte(1)); + let validator_index = 5; + let n_validators = 10; + + let pov = PoV { + block_data: BlockData(vec![4, 5, 6]), + }; + + let available_data = AvailableData { + pov: Arc::new(pov), + validation_data: test_state.persisted_validation_data, + }; + + + let (tx, rx) = oneshot::channel(); + let block_msg = AvailabilityStoreMessage::StoreAvailableData( + candidate_hash, + Some(validator_index), + n_validators, + available_data.clone(), + tx, + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: block_msg }).await; + assert_eq!(rx.await.unwrap(), Ok(())); + + let pov = query_available_data(&mut virtual_overseer, candidate_hash).await.unwrap(); + assert_eq!(pov, available_data); + + let chunk = query_chunk(&mut virtual_overseer, candidate_hash, validator_index).await.unwrap(); + + let chunks = erasure::obtain_chunks_v1(10, &available_data).unwrap(); + + let mut branches = erasure::branches(chunks.as_ref()); + + let branch = branches.nth(5).unwrap(); + let expected_chunk = ErasureChunk { + chunk: branch.1.to_vec(), + index: 5, + proof: branch.0, + }; + + assert_eq!(chunk, expected_chunk); + }); +} + + +#[test] +fn store_pov_and_query_chunk_works() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + let test_state = TestState::default(); + + test_harness(test_state.pruning_config.clone(), store.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let candidate_hash = CandidateHash(Hash::repeat_byte(1)); + let n_validators = 10; + + let pov = PoV { + block_data: BlockData(vec![4, 5, 6]), + }; + + let available_data = AvailableData { + pov: Arc::new(pov), + validation_data: test_state.persisted_validation_data, + }; + + let no_metrics = Metrics(None); + let chunks_expected = get_chunks(&available_data, n_validators as usize, &no_metrics).unwrap(); + + let (tx, rx) = oneshot::channel(); + let block_msg = AvailabilityStoreMessage::StoreAvailableData( + candidate_hash, + None, + n_validators, + available_data, + tx, + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: block_msg }).await; + + assert_eq!(rx.await.unwrap(), Ok(())); + + for validator_index in 0..n_validators { + let chunk = query_chunk(&mut virtual_overseer, candidate_hash, validator_index).await.unwrap(); + + assert_eq!(chunk, chunks_expected[validator_index as usize]); + } + }); +} + +#[test] +fn stored_but_not_included_chunk_is_pruned() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + let test_state = TestState::default(); + + test_harness(test_state.pruning_config.clone(), store.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let candidate_hash = CandidateHash(Hash::repeat_byte(1)); + let relay_parent = Hash::repeat_byte(2); + let validator_index = 5; + + let chunk = ErasureChunk { + chunk: vec![1, 2, 3], + index: validator_index, + proof: vec![vec![3, 4, 5]], + }; + + let (tx, rx) = oneshot::channel(); + let chunk_msg = AvailabilityStoreMessage::StoreChunk { + candidate_hash, + relay_parent, + chunk: chunk.clone(), + tx, + }; + + overseer_send(&mut virtual_overseer, chunk_msg.into()).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::BlockNumber( + hash, + tx, + )) => { + assert_eq!(hash, relay_parent); + tx.send(Ok(Some(4))).unwrap(); + } + ); + + rx.await.unwrap().unwrap(); + + // At this point data should be in the store. + assert_eq!( + query_chunk(&mut virtual_overseer, candidate_hash, validator_index).await.unwrap(), + chunk, + ); + + // Wait for twice as long as the stored block kept for. + Delay::new(test_state.pruning_config.keep_stored_block_for * 2).await; + + // The block was not included by this point so it should be pruned now. + assert!(query_chunk(&mut virtual_overseer, candidate_hash, validator_index).await.is_none()); + }); +} + +#[test] +fn stored_but_not_included_data_is_pruned() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + let test_state = TestState::default(); + + test_harness(test_state.pruning_config.clone(), store.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let candidate_hash = CandidateHash(Hash::repeat_byte(1)); + let n_validators = 10; + + let pov = PoV { + block_data: BlockData(vec![4, 5, 6]), + }; + + let available_data = AvailableData { + pov: Arc::new(pov), + validation_data: test_state.persisted_validation_data, + }; + + let (tx, rx) = oneshot::channel(); + let block_msg = AvailabilityStoreMessage::StoreAvailableData( + candidate_hash, + None, + n_validators, + available_data.clone(), + tx, + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: block_msg }).await; + + rx.await.unwrap().unwrap(); + + // At this point data should be in the store. + assert_eq!( + query_available_data(&mut virtual_overseer, candidate_hash).await.unwrap(), + available_data, + ); + + // Wait for twice as long as the stored block kept for. + Delay::new(test_state.pruning_config.keep_stored_block_for * 2).await; + + // The block was not included by this point so it should be pruned now. + assert!(query_available_data(&mut virtual_overseer, candidate_hash).await.is_none()); + }); +} + +#[test] +fn stored_data_kept_until_finalized() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + let test_state = TestState::default(); + + test_harness(test_state.pruning_config.clone(), store.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let n_validators = 10; + + let pov = PoV { + block_data: BlockData(vec![4, 5, 6]), + }; + + let pov_hash = pov.hash(); + + let candidate = TestCandidateBuilder { + pov_hash, + ..Default::default() + }.build(); + + let candidate_hash = candidate.hash(); + + let available_data = AvailableData { + pov: Arc::new(pov), + validation_data: test_state.persisted_validation_data, + }; + + let (tx, rx) = oneshot::channel(); + let block_msg = AvailabilityStoreMessage::StoreAvailableData( + candidate_hash, + None, + n_validators, + available_data.clone(), + tx, + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: block_msg }).await; + + rx.await.unwrap().unwrap(); + + // At this point data should be in the store. + assert_eq!( + query_available_data(&mut virtual_overseer, candidate_hash).await.unwrap(), + available_data, + ); + + let new_leaf = Hash::repeat_byte(2); + overseer_signal( + &mut virtual_overseer, + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: vec![(new_leaf, Arc::new(JaegerSpan::Disabled))].into(), + deactivated: vec![].into(), + }), + ).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::CandidateEvents(tx), + )) => { + assert_eq!(relay_parent, new_leaf); + tx.send(Ok(vec![ + CandidateEvent::CandidateIncluded(candidate, HeadData::default()), + ])).unwrap(); + } + ); + + Delay::new(test_state.pruning_config.keep_stored_block_for * 10).await; + + // At this point data should _still_ be in the store. + assert_eq!( + query_available_data(&mut virtual_overseer, candidate_hash).await.unwrap(), + available_data, + ); + + overseer_signal( + &mut virtual_overseer, + OverseerSignal::BlockFinalized(new_leaf, 10) + ).await; + + // Wait for a half of the time finalized data should be available for + Delay::new(test_state.pruning_config.keep_finalized_block_for / 2).await; + + // At this point data should _still_ be in the store. + assert_eq!( + query_available_data(&mut virtual_overseer, candidate_hash).await.unwrap(), + available_data, + ); + + // Wait until it is should be gone. + Delay::new(test_state.pruning_config.keep_finalized_block_for).await; + + // At this point data should be gone from the store. + assert!( + query_available_data(&mut virtual_overseer, candidate_hash).await.is_none(), + ); + }); +} + +#[test] +fn stored_chunk_kept_until_finalized() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + let test_state = TestState::default(); + + test_harness(test_state.pruning_config.clone(), store.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let relay_parent = Hash::repeat_byte(2); + let validator_index = 5; + let candidate = TestCandidateBuilder { + ..Default::default() + }.build(); + let candidate_hash = candidate.hash(); + + let chunk = ErasureChunk { + chunk: vec![1, 2, 3], + index: validator_index, + proof: vec![vec![3, 4, 5]], + }; + + let (tx, rx) = oneshot::channel(); + let chunk_msg = AvailabilityStoreMessage::StoreChunk { + candidate_hash, + relay_parent, + chunk: chunk.clone(), + tx, + }; + + overseer_send(&mut virtual_overseer, chunk_msg.into()).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::BlockNumber( + hash, + tx, + )) => { + assert_eq!(hash, relay_parent); + tx.send(Ok(Some(4))).unwrap(); + } + ); + + rx.await.unwrap().unwrap(); + + // At this point data should be in the store. + assert_eq!( + query_chunk(&mut virtual_overseer, candidate_hash, validator_index).await.unwrap(), + chunk, + ); + + let new_leaf = Hash::repeat_byte(2); + overseer_signal( + &mut virtual_overseer, + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: vec![(new_leaf, Arc::new(JaegerSpan::Disabled))].into(), + deactivated: vec![].into(), + }), + ).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::CandidateEvents(tx), + )) => { + assert_eq!(relay_parent, new_leaf); + tx.send(Ok(vec![ + CandidateEvent::CandidateIncluded(candidate, HeadData::default()), + ])).unwrap(); + } + ); + + Delay::new(test_state.pruning_config.keep_stored_block_for * 10).await; + + // At this point data should _still_ be in the store. + assert_eq!( + query_chunk(&mut virtual_overseer, candidate_hash, validator_index).await.unwrap(), + chunk, + ); + + overseer_signal( + &mut virtual_overseer, + OverseerSignal::BlockFinalized(new_leaf, 10) + ).await; + + // Wait for a half of the time finalized data should be available for + Delay::new(test_state.pruning_config.keep_finalized_block_for / 2).await; + + // At this point data should _still_ be in the store. + assert_eq!( + query_chunk(&mut virtual_overseer, candidate_hash, validator_index).await.unwrap(), + chunk, + ); + + // Wait until it is should be gone. + Delay::new(test_state.pruning_config.keep_finalized_chunk_for).await; + + // At this point data should be gone from the store. + assert!( + query_available_data(&mut virtual_overseer, candidate_hash).await.is_none(), + ); + }); +} + +#[test] +fn forkfullness_works() { + let store = Arc::new(kvdb_memorydb::create(columns::NUM_COLUMNS)); + let test_state = TestState::default(); + + test_harness(test_state.pruning_config.clone(), store.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + let n_validators = 10; + + let pov_1 = PoV { + block_data: BlockData(vec![1, 2, 3]), + }; + + let pov_1_hash = pov_1.hash(); + + let pov_2 = PoV { + block_data: BlockData(vec![4, 5, 6]), + }; + + let pov_2_hash = pov_2.hash(); + + let candidate_1 = TestCandidateBuilder { + pov_hash: pov_1_hash, + ..Default::default() + }.build(); + + let candidate_1_hash = candidate_1.hash(); + + let candidate_2 = TestCandidateBuilder { + pov_hash: pov_2_hash, + ..Default::default() + }.build(); + + let candidate_2_hash = candidate_2.hash(); + + let available_data_1 = AvailableData { + pov: Arc::new(pov_1), + validation_data: test_state.persisted_validation_data.clone(), + }; + + let available_data_2 = AvailableData { + pov: Arc::new(pov_2), + validation_data: test_state.persisted_validation_data, + }; + + let (tx, rx) = oneshot::channel(); + let msg = AvailabilityStoreMessage::StoreAvailableData( + candidate_1_hash, + None, + n_validators, + available_data_1.clone(), + tx, + ); + + virtual_overseer.send(FromOverseer::Communication{ msg }).await; + + rx.await.unwrap().unwrap(); + + let (tx, rx) = oneshot::channel(); + let msg = AvailabilityStoreMessage::StoreAvailableData( + candidate_2_hash, + None, + n_validators, + available_data_2.clone(), + tx, + ); + + virtual_overseer.send(FromOverseer::Communication{ msg }).await; + + rx.await.unwrap().unwrap(); + + assert_eq!( + query_available_data(&mut virtual_overseer, candidate_1_hash).await.unwrap(), + available_data_1, + ); + + assert_eq!( + query_available_data(&mut virtual_overseer, candidate_2_hash).await.unwrap(), + available_data_2, + ); + + + let new_leaf_1 = Hash::repeat_byte(2); + let new_leaf_2 = Hash::repeat_byte(3); + + overseer_signal( + &mut virtual_overseer, + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: vec![(new_leaf_1, Arc::new(JaegerSpan::Disabled)), (new_leaf_2, Arc::new(JaegerSpan::Disabled))].into(), + deactivated: vec![].into(), + }), + ).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + leaf, + RuntimeApiRequest::CandidateEvents(tx), + )) => { + assert_eq!(leaf, new_leaf_1); + tx.send(Ok(vec![ + CandidateEvent::CandidateIncluded(candidate_1, HeadData::default()), + ])).unwrap(); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + leaf, + RuntimeApiRequest::CandidateEvents(tx), + )) => { + assert_eq!(leaf, new_leaf_2); + tx.send(Ok(vec![ + CandidateEvent::CandidateIncluded(candidate_2, HeadData::default()), + ])).unwrap(); + } + ); + + overseer_signal( + &mut virtual_overseer, + OverseerSignal::BlockFinalized(new_leaf_1, 5) + ).await; + + // Data of both candidates should be still present in the DB. + assert_eq!( + query_available_data(&mut virtual_overseer, candidate_1_hash).await.unwrap(), + available_data_1, + ); + + assert_eq!( + query_available_data(&mut virtual_overseer, candidate_2_hash).await.unwrap(), + available_data_2, + ); + // Wait for longer than finalized blocks should be kept for + Delay::new(test_state.pruning_config.keep_finalized_block_for + Duration::from_secs(1)).await; + + // Data of both candidates should be gone now. + assert!( + query_available_data(&mut virtual_overseer, candidate_1_hash).await.is_none(), + ); + + assert!( + query_available_data(&mut virtual_overseer, candidate_2_hash).await.is_none(), + ); + }); +} + +async fn query_available_data( + virtual_overseer: &mut test_helpers::TestSubsystemContextHandle, + candidate_hash: CandidateHash, +) -> Option { + let (tx, rx) = oneshot::channel(); + + let query = AvailabilityStoreMessage::QueryAvailableData(candidate_hash, tx); + virtual_overseer.send(FromOverseer::Communication{ msg: query }).await; + + rx.await.unwrap() +} + +async fn query_chunk( + virtual_overseer: &mut test_helpers::TestSubsystemContextHandle, + candidate_hash: CandidateHash, + index: u32, +) -> Option { + let (tx, rx) = oneshot::channel(); + + let query = AvailabilityStoreMessage::QueryChunk(candidate_hash, index, tx); + virtual_overseer.send(FromOverseer::Communication{ msg: query }).await; + + rx.await.unwrap() +} diff --git a/node/core/backing/Cargo.toml b/node/core/backing/Cargo.toml index 9401290f2b5b59b045fd98fe21c5c0dd377ee42c..3c8cdebc67ac63500897d3f86e5e9d02df498875 100644 --- a/node/core/backing/Cargo.toml +++ b/node/core/backing/Cargo.toml @@ -5,24 +5,24 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.5" -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } +futures = "0.3.8" +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } erasure-coding = { package = "polkadot-erasure-coding", path = "../../../erasure-coding" } statement-table = { package = "polkadot-statement-table", path = "../../../statement-table" } -derive_more = "0.99.9" bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -log = "0.4.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" +thiserror = "1.0.23" [dev-dependencies] sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } -futures = { version = "0.3.5", features = ["thread-pool"] } -assert_matches = "1.3.0" +sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } +futures = { version = "0.3.8", features = ["thread-pool"] } +assert_matches = "1.4.0" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } diff --git a/node/core/backing/src/lib.rs b/node/core/backing/src/lib.rs index 7e6e64ee47d42ee3fd7a06c7e5a0e60798c366a6..e915d75e0e6ba900a33a059dd11393fee89be927 100644 --- a/node/core/backing/src/lib.rs +++ b/node/core/backing/src/lib.rs @@ -16,36 +16,33 @@ //! Implements a `CandidateBackingSubsystem`. +#![deny(unused_crate_dependencies)] + use std::collections::{HashMap, HashSet}; use std::convert::TryFrom; use std::pin::Pin; use std::sync::Arc; use bitvec::vec::BitVec; -use futures::{ - channel::{mpsc, oneshot}, - Future, FutureExt, SinkExt, StreamExt, -}; +use futures::{channel::{mpsc, oneshot}, Future, FutureExt, SinkExt, StreamExt}; -use keystore::KeyStorePtr; +use sp_keystore::SyncCryptoStorePtr; use polkadot_primitives::v1::{ CommittedCandidateReceipt, BackedCandidate, Id as ParaId, ValidatorId, - ValidatorIndex, SigningContext, PoV, + ValidatorIndex, SigningContext, PoV, CandidateHash, CandidateDescriptor, AvailableData, ValidatorSignature, Hash, CandidateReceipt, - CandidateCommitments, CoreState, CoreIndex, CollatorId, + CoreState, CoreIndex, CollatorId, ValidityAttestation, CandidateCommitments, }; use polkadot_node_primitives::{ - FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport, - ValidationOutputs, ValidationResult, + FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport, ValidationResult, }; use polkadot_subsystem::{ + JaegerSpan, PerLeafSpan, messages::{ AllMessages, AvailabilityStoreMessage, CandidateBackingMessage, CandidateSelectionMessage, - CandidateValidationMessage, NewBackedCandidate, PoVDistributionMessage, ProvisionableData, - ProvisionerMessage, RuntimeApiMessage, StatementDistributionMessage, ValidationFailed, - RuntimeApiRequest, + CandidateValidationMessage, PoVDistributionMessage, ProvisionableData, + ProvisionerMessage, StatementDistributionMessage, ValidationFailed, RuntimeApiRequest, }, - metrics::{self, prometheus}, }; use polkadot_node_subsystem_util::{ self as util, @@ -55,6 +52,8 @@ use polkadot_node_subsystem_util::{ request_from_runtime, Validator, delegated_subsystem, + FromJobCommand, + metrics::{self, prometheus}, }; use statement_table::{ generic::AttestedCandidate as TableAttestedCandidate, @@ -65,44 +64,94 @@ use statement_table::{ SignedStatement as TableSignedStatement, Summary as TableSummary, }, }; +use thiserror::Error; -#[derive(Debug, derive_more::From)] +const LOG_TARGET: &str = "candidate_backing"; + +#[derive(Debug, Error)] enum Error { + #[error("Candidate is not found")] CandidateNotFound, + #[error("Signature is invalid")] InvalidSignature, - StoreFailed, - #[from] - Erasure(erasure_coding::Error), - #[from] - ValidationFailed(ValidationFailed), - #[from] - Oneshot(oneshot::Canceled), - #[from] - Mpsc(mpsc::SendError), - #[from] - UtilError(util::Error), + #[error("Failed to send candidates {0:?}")] + Send(Vec), + #[error("FetchPoV channel closed before receipt")] + FetchPoV(#[source] oneshot::Canceled), + #[error("ValidateFromChainState channel closed before receipt")] + ValidateFromChainState(#[source] oneshot::Canceled), + #[error("StoreAvailableData channel closed before receipt")] + StoreAvailableData(#[source] oneshot::Canceled), + #[error("a channel was closed before receipt in try_join!")] + JoinMultiple(#[source] oneshot::Canceled), + #[error("Obtaining erasure chunks failed")] + ObtainErasureChunks(#[from] erasure_coding::Error), + #[error(transparent)] + ValidationFailed(#[from] ValidationFailed), + #[error(transparent)] + Mpsc(#[from] mpsc::SendError), + #[error(transparent)] + UtilError(#[from] util::Error), +} + +enum ValidatedCandidateCommand { + // We were instructed to second the candidate. + Second(BackgroundValidationResult), + // We were instructed to validate the candidate. + Attest(BackgroundValidationResult), +} + +impl std::fmt::Debug for ValidatedCandidateCommand { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + let candidate_hash = self.candidate_hash(); + match *self { + ValidatedCandidateCommand::Second(_) => + write!(f, "Second({})", candidate_hash), + ValidatedCandidateCommand::Attest(_) => + write!(f, "Attest({})", candidate_hash), + } + } +} + +impl ValidatedCandidateCommand { + fn candidate_hash(&self) -> CandidateHash { + match *self { + ValidatedCandidateCommand::Second(Ok((ref candidate, _, _))) => candidate.hash(), + ValidatedCandidateCommand::Second(Err(ref candidate)) => candidate.hash(), + ValidatedCandidateCommand::Attest(Ok((ref candidate, _, _))) => candidate.hash(), + ValidatedCandidateCommand::Attest(Err(ref candidate)) => candidate.hash(), + } + } } /// Holds all data needed for candidate backing job operation. struct CandidateBackingJob { /// The hash of the relay parent on top of which this job is doing it's work. parent: Hash, - /// Inbound message channel receiving part. - rx_to: mpsc::Receiver, /// Outbound message channel sending part. - tx_from: mpsc::Sender, + tx_from: mpsc::Sender, /// The `ParaId` assigned to this validator - assignment: ParaId, + assignment: Option, /// The collator required to author the candidate, if any. required_collator: Option, - /// We issued `Valid` or `Invalid` statements on about these candidates. - issued_statements: HashSet, - /// `Some(h)` if this job has already issues `Seconded` statemt for some candidate with `h` hash. - seconded: Option, + /// Spans for all candidates that are not yet backable. + unbacked_candidates: HashMap, + /// We issued `Seconded`, `Valid` or `Invalid` statements on about these candidates. + issued_statements: HashSet, + /// These candidates are undergoing validation in the background. + awaiting_validation: HashSet, + /// `Some(h)` if this job has already issued `Seconded` statement for some candidate with `h` hash. + seconded: Option, + /// The candidates that are includable, by hash. Each entry here indicates + /// that we've sent the provisioner the backed candidate. + backed: HashSet, /// We have already reported misbehaviors for these validators. reported_misbehavior_for: HashSet, + keystore: SyncCryptoStorePtr, table: Table, table_context: TableContext, + background_validation: mpsc::Receiver, + background_validation_tx: mpsc::Sender, metrics: Metrics, } @@ -120,12 +169,12 @@ struct TableContext { impl TableContextTrait for TableContext { type AuthorityId = ValidatorIndex; - type Digest = Hash; + type Digest = CandidateHash; type GroupId = ParaId; type Signature = ValidatorSignature; type Candidate = CommittedCandidateReceipt; - fn candidate_digest(candidate: &CommittedCandidateReceipt) -> Hash { + fn candidate_digest(candidate: &CommittedCandidateReceipt) -> CandidateHash { candidate.hash() } @@ -142,110 +191,386 @@ impl TableContextTrait for TableContext { } } -/// A message type that is sent from `CandidateBackingSubsystem` to `CandidateBackingJob`. -pub enum ToJob { - /// A `CandidateBackingMessage`. - CandidateBacking(CandidateBackingMessage), - /// Stop working. - Stop, +struct InvalidErasureRoot; + +// It looks like it's not possible to do an `impl From` given the current state of +// the code. So this does the necessary conversion. +fn primitive_statement_to_table(s: &SignedFullStatement) -> TableSignedStatement { + let statement = match s.payload() { + Statement::Seconded(c) => TableStatement::Candidate(c.clone()), + Statement::Valid(h) => TableStatement::Valid(h.clone()), + Statement::Invalid(h) => TableStatement::Invalid(h.clone()), + }; + + TableSignedStatement { + statement, + signature: s.signature().clone(), + sender: s.validator_index(), + } } -impl TryFrom for ToJob { - type Error = (); +#[tracing::instrument(level = "trace", skip(attested, table_context), fields(subsystem = LOG_TARGET))] +fn table_attested_to_backed( + attested: TableAttestedCandidate< + ParaId, + CommittedCandidateReceipt, + ValidatorIndex, + ValidatorSignature, + >, + table_context: &TableContext, +) -> Option { + let TableAttestedCandidate { candidate, validity_votes, group_id: para_id } = 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 mut validator_indices = BitVec::with_capacity(group.len()); + + validator_indices.resize(group.len(), false); + + // The order of the validity votes in the backed candidate must match + // the order of bits set in the bitfield, which is not necessarily + // the order of the `validity_votes` we got from the table. + let mut vote_positions = Vec::with_capacity(validity_votes.len()); + for (orig_idx, id) in ids.iter().enumerate() { + if let Some(position) = group.iter().position(|x| x == id) { + validator_indices.set(position, true); + vote_positions.push((orig_idx, position)); + } else { + tracing::warn!( + target: LOG_TARGET, + "Logic error: Validity vote from table does not correspond to group", + ); - fn try_from(msg: AllMessages) -> Result { - match msg { - AllMessages::CandidateBacking(msg) => Ok(ToJob::CandidateBacking(msg)), - _ => Err(()), + return None; } } + vote_positions.sort_by_key(|(_orig, pos_in_group)| *pos_in_group); + + Some(BackedCandidate { + candidate, + validity_votes: vote_positions.into_iter() + .map(|(pos_in_votes, _pos_in_group)| validity_votes[pos_in_votes].clone()) + .collect(), + validator_indices, + }) } -impl From for ToJob { - fn from(msg: CandidateBackingMessage) -> Self { - Self::CandidateBacking(msg) - } +async fn store_available_data( + tx_from: &mut mpsc::Sender, + id: Option, + n_validators: u32, + candidate_hash: CandidateHash, + available_data: AvailableData, +) -> Result<(), Error> { + let (tx, rx) = oneshot::channel(); + tx_from.send(AllMessages::AvailabilityStore( + AvailabilityStoreMessage::StoreAvailableData( + candidate_hash, + id, + n_validators, + available_data, + tx, + ) + ).into() + ).await?; + + let _ = rx.await.map_err(Error::StoreAvailableData)?; + + Ok(()) } -impl util::ToJobTrait for ToJob { - const STOP: Self = ToJob::Stop; +// Make a `PoV` available. +// +// This will compute the erasure root internally and compare it to the expected erasure root. +// This returns `Err()` iff there is an internal error. Otherwise, it returns either `Ok(Ok(()))` or `Ok(Err(_))`. +#[tracing::instrument(level = "trace", skip(tx_from, pov, span), fields(subsystem = LOG_TARGET))] +async fn make_pov_available( + tx_from: &mut mpsc::Sender, + validator_index: Option, + n_validators: usize, + pov: Arc, + candidate_hash: CandidateHash, + validation_data: polkadot_primitives::v1::PersistedValidationData, + expected_erasure_root: Hash, + span: Option<&JaegerSpan>, +) -> Result, Error> { + let available_data = AvailableData { + pov, + validation_data, + }; + + { + let _span = span.as_ref().map(|s| s.child("erasure-coding")); + + let chunks = erasure_coding::obtain_chunks_v1( + n_validators, + &available_data, + )?; + + let branches = erasure_coding::branches(chunks.as_ref()); + let erasure_root = branches.root(); - fn relay_parent(&self) -> Option { - match self { - Self::CandidateBacking(cb) => cb.relay_parent(), - Self::Stop => None, + if erasure_root != expected_erasure_root { + return Ok(Err(InvalidErasureRoot)); } } + + { + let _span = span.as_ref().map(|s| s.child("store-data")); + store_available_data( + tx_from, + validator_index, + n_validators as u32, + candidate_hash, + available_data, + ).await?; + } + + Ok(Ok(())) } -/// A message type that is sent from `CandidateBackingJob` to `CandidateBackingSubsystem`. -enum FromJob { - AvailabilityStore(AvailabilityStoreMessage), - RuntimeApiMessage(RuntimeApiMessage), - CandidateValidation(CandidateValidationMessage), - CandidateSelection(CandidateSelectionMessage), - Provisioner(ProvisionerMessage), - PoVDistribution(PoVDistributionMessage), - StatementDistribution(StatementDistributionMessage), +async fn request_pov_from_distribution( + tx_from: &mut mpsc::Sender, + parent: Hash, + descriptor: CandidateDescriptor, +) -> Result, Error> { + let (tx, rx) = oneshot::channel(); + + tx_from.send(AllMessages::PoVDistribution( + PoVDistributionMessage::FetchPoV(parent, descriptor, tx) + ).into()).await?; + + rx.await.map_err(Error::FetchPoV) } -impl From for AllMessages { - fn from(f: FromJob) -> Self { - match f { - FromJob::AvailabilityStore(msg) => AllMessages::AvailabilityStore(msg), - FromJob::RuntimeApiMessage(msg) => AllMessages::RuntimeApi(msg), - FromJob::CandidateValidation(msg) => AllMessages::CandidateValidation(msg), - FromJob::CandidateSelection(msg) => AllMessages::CandidateSelection(msg), - FromJob::StatementDistribution(msg) => AllMessages::StatementDistribution(msg), - FromJob::PoVDistribution(msg) => AllMessages::PoVDistribution(msg), - FromJob::Provisioner(msg) => AllMessages::Provisioner(msg), - } +async fn request_candidate_validation( + tx_from: &mut mpsc::Sender, + candidate: CandidateDescriptor, + pov: Arc, +) -> Result { + let (tx, rx) = oneshot::channel(); + + tx_from.send(AllMessages::CandidateValidation( + CandidateValidationMessage::ValidateFromChainState( + candidate, + pov, + tx, + ) + ).into() + ).await?; + + match rx.await { + Ok(Ok(validation_result)) => Ok(validation_result), + Ok(Err(err)) => Err(Error::ValidationFailed(err)), + Err(err) => Err(Error::ValidateFromChainState(err)), } } -impl TryFrom for FromJob { - type Error = &'static str; - - fn try_from(f: AllMessages) -> Result { - match f { - AllMessages::AvailabilityStore(msg) => Ok(FromJob::AvailabilityStore(msg)), - AllMessages::RuntimeApi(msg) => Ok(FromJob::RuntimeApiMessage(msg)), - AllMessages::CandidateValidation(msg) => Ok(FromJob::CandidateValidation(msg)), - AllMessages::CandidateSelection(msg) => Ok(FromJob::CandidateSelection(msg)), - AllMessages::StatementDistribution(msg) => Ok(FromJob::StatementDistribution(msg)), - AllMessages::PoVDistribution(msg) => Ok(FromJob::PoVDistribution(msg)), - AllMessages::Provisioner(msg) => Ok(FromJob::Provisioner(msg)), - _ => Err("can't convert this AllMessages variant to FromJob"), - } - } +type BackgroundValidationResult = Result<(CandidateReceipt, CandidateCommitments, Arc), CandidateReceipt>; + +struct BackgroundValidationParams { + tx_from: mpsc::Sender, + tx_command: mpsc::Sender, + candidate: CandidateReceipt, + relay_parent: Hash, + pov: Option>, + validator_index: Option, + n_validators: usize, + span: Option, + make_command: F, } -// It looks like it's not possible to do an `impl From` given the current state of -// the code. So this does the necessary conversion. -fn primitive_statement_to_table(s: &SignedFullStatement) -> TableSignedStatement { - let statement = match s.payload() { - Statement::Seconded(c) => TableStatement::Candidate(c.clone()), - Statement::Valid(h) => TableStatement::Valid(h.clone()), - Statement::Invalid(h) => TableStatement::Invalid(h.clone()), +async fn validate_and_make_available( + params: BackgroundValidationParams ValidatedCandidateCommand>, +) -> Result<(), Error> { + let BackgroundValidationParams { + mut tx_from, + mut tx_command, + candidate, + relay_parent, + pov, + validator_index, + n_validators, + span, + make_command, + } = params; + + let pov = match pov { + Some(pov) => pov, + None => { + let _span = span.as_ref().map(|s| s.child("request-pov")); + request_pov_from_distribution( + &mut tx_from, + relay_parent, + candidate.descriptor.clone(), + ).await? + } }; - TableSignedStatement { - statement, - signature: s.signature().clone(), - sender: s.validator_index(), - } + let v = { + let _span = span.as_ref().map(|s| s.child("request-validation")); + request_candidate_validation(&mut tx_from, candidate.descriptor.clone(), pov.clone()).await? + }; + + let expected_commitments_hash = candidate.commitments_hash; + + let res = match v { + ValidationResult::Valid(commitments, validation_data) => { + // If validation produces a new set of commitments, we vote the candidate as invalid. + if commitments.hash() != expected_commitments_hash { + tracing::trace!( + target: LOG_TARGET, + candidate_receipt = ?candidate, + actual_commitments = ?commitments, + "Commitments obtained with validation don't match the announced by the candidate receipt", + ); + Err(candidate) + } else { + let erasure_valid = make_pov_available( + &mut tx_from, + validator_index, + n_validators, + pov.clone(), + candidate.hash(), + validation_data, + candidate.descriptor.erasure_root, + span.as_ref(), + ).await?; + + match erasure_valid { + Ok(()) => Ok((candidate, commitments, pov.clone())), + Err(InvalidErasureRoot) => { + tracing::trace!( + target: LOG_TARGET, + candidate_receipt = ?candidate, + actual_commitments = ?commitments, + "Erasure root doesn't match the announced by the candidate receipt", + ); + Err(candidate) + }, + } + } + } + ValidationResult::Invalid(reason) => { + tracing::trace!( + target: LOG_TARGET, + candidate_receipt = ?candidate, + reason = ?reason, + "Validation yielded an invalid candidate", + ); + Err(candidate) + } + }; + + let command = make_command(res); + tx_command.send(command).await?; + Ok(()) } impl CandidateBackingJob { /// Run asynchronously. - async fn run_loop(mut self) -> Result<(), Error> { - while let Some(msg) = self.rx_to.next().await { - match msg { - ToJob::CandidateBacking(msg) => { - self.process_msg(msg).await?; + async fn run_loop( + mut self, + mut rx_to: mpsc::Receiver, + span: PerLeafSpan, + ) -> Result<(), Error> { + loop { + futures::select! { + validated_command = self.background_validation.next() => { + let _span = span.child("process-validation-result"); + if let Some(c) = validated_command { + self.handle_validated_candidate_command(&span, c).await?; + } else { + panic!("`self` hasn't dropped and `self` holds a reference to this sender; qed"); + } + } + to_job = rx_to.next() => match to_job { + None => break, + Some(msg) => { + // we intentionally want spans created in `process_msg` to descend from the + // `span ` which is longer-lived than this ephemeral timing span. + let _timing_span = span.child("process-message"); + self.process_msg(&span, msg).await?; + } + } + } + } + + Ok(()) + } + + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + async fn handle_validated_candidate_command( + &mut self, + parent_span: &JaegerSpan, + command: ValidatedCandidateCommand, + ) -> Result<(), Error> { + let candidate_hash = command.candidate_hash(); + self.awaiting_validation.remove(&candidate_hash); + + match command { + ValidatedCandidateCommand::Second(res) => { + match res { + Ok((candidate, commitments, pov)) => { + // sanity check. + if self.seconded.is_none() && !self.issued_statements.contains(&candidate_hash) { + self.seconded = Some(candidate_hash); + self.issued_statements.insert(candidate_hash); + self.metrics.on_candidate_seconded(); + + let statement = Statement::Seconded(CommittedCandidateReceipt { + descriptor: candidate.descriptor.clone(), + commitments, + }); + self.sign_import_and_distribute_statement(statement, parent_span).await?; + self.distribute_pov(candidate.descriptor, pov).await?; + } + } + Err(candidate) => { + self.issue_candidate_invalid_message(candidate).await?; + } } - _ => break, } + ValidatedCandidateCommand::Attest(res) => { + // sanity check. + if !self.issued_statements.contains(&candidate_hash) { + let statement = if res.is_ok() { + Statement::Valid(candidate_hash) + } else { + Statement::Invalid(candidate_hash) + }; + + self.issued_statements.insert(candidate_hash); + self.sign_import_and_distribute_statement(statement, &parent_span).await?; + } + } + } + + Ok(()) + } + + #[tracing::instrument(level = "trace", skip(self, params), fields(subsystem = LOG_TARGET))] + async fn background_validate_and_make_available( + &mut self, + params: BackgroundValidationParams< + impl Fn(BackgroundValidationResult) -> ValidatedCandidateCommand + Send + 'static + >, + ) -> Result<(), Error> { + let candidate_hash = params.candidate.hash(); + + if self.awaiting_validation.insert(candidate_hash) { + // spawn background task. + let bg = async move { + if let Err(e) = validate_and_make_available(params).await { + tracing::error!("Failed to validate and make available: {:?}", e); + } + }; + self.tx_from.send(FromJobCommand::Spawn("Backing Validation", bg.boxed())).await?; } Ok(()) @@ -255,129 +580,62 @@ impl CandidateBackingJob { &mut self, candidate: CandidateReceipt, ) -> Result<(), Error> { - self.tx_from.send(FromJob::CandidateSelection( - CandidateSelectionMessage::Invalid(self.parent, candidate) - )).await?; + self.tx_from.send(AllMessages::from(CandidateSelectionMessage::Invalid(self.parent, candidate)).into()).await?; Ok(()) } - /// Validate the candidate that is requested to be `Second`ed and distribute validation result. - /// - /// Returns `Ok(true)` if we issued a `Seconded` statement about this candidate. + /// Kick off background validation with intent to second. + #[tracing::instrument(level = "trace", skip(self, parent_span, pov), fields(subsystem = LOG_TARGET))] async fn validate_and_second( &mut self, + parent_span: &JaegerSpan, candidate: &CandidateReceipt, - pov: PoV, - ) -> Result { + pov: Arc, + ) -> Result<(), Error> { // Check that candidate is collated by the right collator. if self.required_collator.as_ref() .map_or(false, |c| c != &candidate.descriptor().collator) { self.issue_candidate_invalid_message(candidate.clone()).await?; - return Ok(false); + return Ok(()); } - let valid = self.request_candidate_validation( - candidate.descriptor().clone(), - Arc::new(pov.clone()), - ).await?; - let candidate_hash = candidate.hash(); + let span = self.get_unbacked_validation_child(parent_span, candidate_hash); + + self.background_validate_and_make_available(BackgroundValidationParams { + tx_from: self.tx_from.clone(), + tx_command: self.background_validation_tx.clone(), + candidate: candidate.clone(), + relay_parent: self.parent, + pov: Some(pov), + validator_index: self.table_context.validator.as_ref().map(|v| v.index()), + n_validators: self.table_context.validators.len(), + span, + make_command: ValidatedCandidateCommand::Second, + }).await?; - let statement = match valid { - ValidationResult::Valid(outputs) => { - // make PoV available for later distribution. Send data to the availability - // store to keep. Sign and dispatch `valid` statement to network if we - // have not seconded the given candidate. - // - // If the commitments hash produced by validation is not the same as given by - // the collator, do not make available and report the collator. - let commitments_check = self.make_pov_available( - pov, - outputs, - |commitments| if commitments.hash() == candidate.commitments_hash { - Ok(CommittedCandidateReceipt { - descriptor: candidate.descriptor().clone(), - commitments, - }) - } else { - Err(()) - }, - ).await?; - - match commitments_check { - Ok(candidate) => { - self.issued_statements.insert(candidate_hash); - Some(Statement::Seconded(candidate)) - } - Err(()) => { - self.issue_candidate_invalid_message(candidate.clone()).await?; - None - } - } - } - ValidationResult::Invalid(_reason) => { - // no need to issue a statement about this if we aren't seconding it. - // - // there's an infinite amount of garbage out there. no need to acknowledge - // all of it. - self.issue_candidate_invalid_message(candidate.clone()).await?; - None - } - }; - - let issued_statement = statement.is_some(); - if let Some(signed_statement) = statement.and_then(|s| self.sign_statement(s)) { - self.import_statement(&signed_statement).await?; - self.distribute_signed_statement(signed_statement).await?; - } - - Ok(issued_statement) + Ok(()) } - fn get_backed(&self) -> Vec { - let proposed = self.table.proposed_candidates(&self.table_context); - let mut res = Vec::with_capacity(proposed.len()); - - for p in proposed.into_iter() { - let TableAttestedCandidate { candidate, validity_votes, .. } = p; - - let (ids, validity_votes): (Vec<_>, Vec<_>) = validity_votes - .into_iter() - .map(|(id, vote)| (id, vote.into())) - .unzip(); - - let group = match self.table_context.groups.get(&self.assignment) { - Some(group) => group, - None => continue, - }; - - let mut validator_indices = BitVec::with_capacity(group.len()); - - validator_indices.resize(group.len(), false); - - for id in ids.iter() { - if let Some(position) = group.iter().position(|x| x == id) { - validator_indices.set(position, true); - } - } - - let backed = BackedCandidate { - candidate, - validity_votes, - validator_indices, - }; - - res.push(NewBackedCandidate(backed.clone())); + async fn sign_import_and_distribute_statement( + &mut self, + statement: Statement, + parent_span: &JaegerSpan, + ) -> Result<(), Error> { + if let Some(signed_statement) = self.sign_statement(statement).await { + self.import_statement(&signed_statement, parent_span).await?; + self.distribute_signed_statement(signed_statement).await?; } - res + Ok(()) } /// Check if there have happened any new misbehaviors and issue necessary messages. /// /// TODO: Report multiple misbehaviors (https://github.com/paritytech/polkadot/issues/1387) + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] async fn issue_new_misbehaviors(&mut self) -> Result<(), Error> { let mut reports = Vec::new(); @@ -394,6 +652,7 @@ impl CandidateBackingJob { if let Ok(report) = MisbehaviorReport::try_from(f) { let message = ProvisionerMessage::ProvisionableData( + self.parent, ProvisionableData::MisbehaviorReport(self.parent, report), ); @@ -410,61 +669,106 @@ impl CandidateBackingJob { } /// Import a statement into the statement table and return the summary of the import. + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] async fn import_statement( &mut self, statement: &SignedFullStatement, + parent_span: &JaegerSpan, ) -> Result, Error> { + let import_statement_span = { + // create a span only for candidates we're already aware of. + let candidate_hash = statement.payload().candidate_hash(); + self.get_unbacked_statement_child(parent_span, candidate_hash, statement.validator_index()) + }; + let stmt = primitive_statement_to_table(statement); let summary = self.table.import_statement(&self.table_context, stmt); + let unbacked_span = if let Some(attested) = summary.as_ref() + .and_then(|s| self.table.attested_candidate(&s.candidate, &self.table_context)) + { + let candidate_hash = attested.candidate.hash(); + // `HashSet::insert` returns true if the thing wasn't in there already. + if self.backed.insert(candidate_hash) { + let span = self.remove_unbacked_span(&candidate_hash); + + if let Some(backed) = + table_attested_to_backed(attested, &self.table_context) + { + let message = ProvisionerMessage::ProvisionableData( + self.parent, + ProvisionableData::BackedCandidate(backed.receipt()), + ); + self.send_to_provisioner(message).await?; + + span.as_ref().map(|s| s.child("backed")); + span + } else { + None + } + } else { + None + } + } else { + None + }; + self.issue_new_misbehaviors().await?; - return Ok(summary); + // It is important that the child span is dropped before its parent span (`unbacked_span`) + drop(import_statement_span); + drop(unbacked_span); + + Ok(summary) } - async fn process_msg(&mut self, msg: CandidateBackingMessage) -> Result<(), Error> { + #[tracing::instrument(level = "trace", skip(self, span), fields(subsystem = LOG_TARGET))] + async fn process_msg(&mut self, span: &JaegerSpan, msg: CandidateBackingMessage) -> Result<(), Error> { match msg { CandidateBackingMessage::Second(_, candidate, pov) => { + let _timer = self.metrics.time_process_second(); + // Sanity check that candidate is from our assignment. - if candidate.descriptor().para_id != self.assignment { + if Some(candidate.descriptor().para_id) != self.assignment { return Ok(()); } // If the message is a `CandidateBackingMessage::Second`, sign and dispatch a // Seconded statement only if we have not seconded any other candidate and // have not signed a Valid statement for the requested candidate. - match self.seconded { + if self.seconded.is_none() { // This job has not seconded a candidate yet. - None => { - let candidate_hash = candidate.hash(); - - if !self.issued_statements.contains(&candidate_hash) { - if let Ok(true) = self.validate_and_second( - &candidate, - pov, - ).await { - self.metrics.on_candidate_seconded(); - self.seconded = Some(candidate_hash); - } - } + let candidate_hash = candidate.hash(); + let pov = Arc::new(pov); + + if !self.issued_statements.contains(&candidate_hash) { + self.validate_and_second(&span, &candidate, pov.clone()).await?; } - // This job has already seconded a candidate. - Some(_) => {} } } CandidateBackingMessage::Statement(_, statement) => { + let _timer = self.metrics.time_process_statement(); + self.check_statement_signature(&statement)?; - match self.maybe_validate_and_import(statement).await { + match self.maybe_validate_and_import(&span, statement).await { Err(Error::ValidationFailed(_)) => return Ok(()), Err(e) => return Err(e), Ok(()) => (), } } - CandidateBackingMessage::GetBackedCandidates(_, tx) => { - let backed = self.get_backed(); - - tx.send(backed).map_err(|_| oneshot::Canceled)?; + CandidateBackingMessage::GetBackedCandidates(_, requested_candidates, tx) => { + let _timer = self.metrics.time_get_backed_candidates(); + + let backed = requested_candidates + .into_iter() + .filter_map(|hash| { + self.table.attested_candidate(&hash, &self.table_context) + .and_then(|attested| table_attested_to_backed(attested, &self.table_context)) + }) + .collect(); + + tx.send(backed).map_err(|data| Error::Send(data))?; } } @@ -472,11 +776,13 @@ impl CandidateBackingJob { } /// Kick off validation work and distribute the result as a signed statement. + #[tracing::instrument(level = "trace", skip(self, span), fields(subsystem = LOG_TARGET))] async fn kick_off_validation_work( &mut self, summary: TableSummary, + span: Option, ) -> Result<(), Error> { - let candidate_hash = summary.candidate.clone(); + let candidate_hash = summary.candidate; if self.issued_statements.contains(&candidate_hash) { return Ok(()) @@ -485,9 +791,7 @@ impl CandidateBackingJob { // We clone the commitments here because there are borrowck // errors relating to this being a struct and methods borrowing the entirety of self // and not just those things that the function uses. - let candidate = self.table.get_candidate(&candidate_hash).ok_or(Error::CandidateNotFound)?; - let expected_commitments = candidate.commitments.clone(); - + let candidate = self.table.get_candidate(&candidate_hash).ok_or(Error::CandidateNotFound)?.to_plain(); let descriptor = candidate.descriptor().clone(); // Check that candidate is collated by the right collator. @@ -502,50 +806,32 @@ impl CandidateBackingJob { return Ok(()); } - let pov = self.request_pov_from_distribution(descriptor.clone()).await?; - let v = self.request_candidate_validation(descriptor, pov.clone()).await?; - - let statement = match v { - ValidationResult::Valid(outputs) => { - // If validation produces a new set of commitments, we vote the candidate as invalid. - let commitments_check = self.make_pov_available( - (&*pov).clone(), - outputs, - |commitments| if commitments == expected_commitments { - Ok(()) - } else { - Err(()) - } - ).await?; - - match commitments_check { - Ok(()) => Statement::Valid(candidate_hash), - Err(()) => Statement::Invalid(candidate_hash), - } - } - ValidationResult::Invalid(_reason) => { - Statement::Invalid(candidate_hash) - } - }; - - self.issued_statements.insert(candidate_hash); - - if let Some(signed_statement) = self.sign_statement(statement) { - self.distribute_signed_statement(signed_statement).await?; - } - - Ok(()) + self.background_validate_and_make_available(BackgroundValidationParams { + tx_from: self.tx_from.clone(), + tx_command: self.background_validation_tx.clone(), + candidate, + relay_parent: self.parent, + pov: None, + validator_index: self.table_context.validator.as_ref().map(|v| v.index()), + n_validators: self.table_context.validators.len(), + span, + make_command: ValidatedCandidateCommand::Attest, + }).await } /// Import the statement and kick off validation work if it is a part of our assignment. + #[tracing::instrument(level = "trace", skip(self, parent_span), fields(subsystem = LOG_TARGET))] async fn maybe_validate_and_import( &mut self, + parent_span: &JaegerSpan, statement: SignedFullStatement, ) -> Result<(), Error> { - if let Some(summary) = self.import_statement(&statement).await? { + if let Some(summary) = self.import_statement(&statement, parent_span).await? { if let Statement::Seconded(_) = statement.payload() { - if summary.group_id == self.assignment { - self.kick_off_validation_work(summary).await?; + if Some(summary.group_id) == self.assignment { + let span = self.get_unbacked_validation_child(parent_span, summary.candidate); + + self.kick_off_validation_work(summary, span).await?; } } } @@ -553,12 +839,19 @@ impl CandidateBackingJob { Ok(()) } - fn sign_statement(&self, statement: Statement) -> Option { - let signed = self.table_context.validator.as_ref()?.sign(statement); + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + async fn sign_statement(&self, statement: Statement) -> Option { + let signed = self.table_context + .validator + .as_ref()? + .sign(self.keystore.clone(), statement) + .await + .ok()?; self.metrics.on_statement_signed(); Some(signed) } + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] fn check_statement_signature(&self, statement: &SignedFullStatement) -> Result<(), Error> { let idx = statement.validator_index() as usize; @@ -574,137 +867,83 @@ impl CandidateBackingJob { Ok(()) } - async fn send_to_provisioner(&mut self, msg: ProvisionerMessage) -> Result<(), Error> { - self.tx_from.send(FromJob::Provisioner(msg)).await?; - - Ok(()) + /// Insert or get the unbacked-span for the given candidate hash. + fn insert_or_get_unbacked_span(&mut self, parent_span: &JaegerSpan, hash: CandidateHash) -> Option<&JaegerSpan> { + if !self.backed.contains(&hash) { + // only add if we don't consider this backed. + let span = self.unbacked_candidates.entry(hash).or_insert_with(|| { + let mut span = parent_span.child("unbacked-candidate"); + span.add_string_tag("candidate-hash", &format!("{:?}", hash.0)); + span + }); + Some(span) + } else { + None + } } - async fn request_pov_from_distribution( - &mut self, - descriptor: CandidateDescriptor, - ) -> Result, Error> { - let (tx, rx) = oneshot::channel(); - - self.tx_from.send(FromJob::PoVDistribution( - PoVDistributionMessage::FetchPoV(self.parent, descriptor, tx) - )).await?; - - Ok(rx.await?) + fn get_unbacked_validation_child(&mut self, parent_span: &JaegerSpan, hash: CandidateHash) -> Option { + self.insert_or_get_unbacked_span(parent_span, hash).map(|span| span.child("validation")) } - async fn request_candidate_validation( + fn get_unbacked_statement_child( &mut self, - candidate: CandidateDescriptor, - pov: Arc, - ) -> Result { - let (tx, rx) = oneshot::channel(); - - self.tx_from.send(FromJob::CandidateValidation( - CandidateValidationMessage::ValidateFromChainState( - candidate, - pov, - tx, - ) - ) - ).await?; - - Ok(rx.await??) + parent_span: &JaegerSpan, + hash: CandidateHash, + validator: ValidatorIndex, + ) -> Option { + self.insert_or_get_unbacked_span(parent_span, hash).map(|span| { + let mut span = span.child("import-statement"); + span.add_string_tag("validator-index", &format!("{}", validator)); + span + }) } - async fn store_available_data( - &mut self, - id: Option, - n_validators: u32, - available_data: AvailableData, - ) -> Result<(), Error> { - let (tx, rx) = oneshot::channel(); - self.tx_from.send(FromJob::AvailabilityStore( - AvailabilityStoreMessage::StoreAvailableData( - self.parent, - id, - n_validators, - available_data, - tx, - ) - ) - ).await?; + fn remove_unbacked_span(&mut self, hash: &CandidateHash) -> Option { + self.unbacked_candidates.remove(hash) + } - rx.await?.map_err(|_| Error::StoreFailed)?; + async fn send_to_provisioner(&mut self, msg: ProvisionerMessage) -> Result<(), Error> { + self.tx_from.send(AllMessages::from(msg).into()).await?; Ok(()) } - // Make a `PoV` available. - // - // This calls an inspection function before making the PoV available for any last checks - // that need to be done. If the inspection function returns an error, this function returns - // early without making the PoV available. - async fn make_pov_available( + async fn distribute_pov( &mut self, - pov: PoV, - outputs: ValidationOutputs, - with_commitments: impl FnOnce(CandidateCommitments) -> Result, - ) -> Result, Error> { - let available_data = AvailableData { - pov, - validation_data: outputs.validation_data, - }; - - let chunks = erasure_coding::obtain_chunks_v1( - self.table_context.validators.len(), - &available_data, - )?; - - let branches = erasure_coding::branches(chunks.as_ref()); - let erasure_root = branches.root(); - - let commitments = CandidateCommitments { - fees: outputs.fees, - upward_messages: outputs.upward_messages, - erasure_root, - new_validation_code: outputs.new_validation_code, - head_data: outputs.head_data, - }; - - let res = match with_commitments(commitments) { - Ok(x) => x, - Err(e) => return Ok(Err(e)), - }; - - self.store_available_data( - self.table_context.validator.as_ref().map(|v| v.index()), - self.table_context.validators.len() as u32, - available_data, - ).await?; - - Ok(Ok(res)) + descriptor: CandidateDescriptor, + pov: Arc, + ) -> Result<(), Error> { + self.tx_from.send(AllMessages::from( + PoVDistributionMessage::DistributePoV(self.parent, descriptor, pov), + ).into()).await.map_err(Into::into) } async fn distribute_signed_statement(&mut self, s: SignedFullStatement) -> Result<(), Error> { let smsg = StatementDistributionMessage::Share(self.parent, s); - self.tx_from.send(FromJob::StatementDistribution(smsg)).await?; + self.tx_from.send(AllMessages::from(smsg).into()).await?; Ok(()) } } impl util::JobTrait for CandidateBackingJob { - type ToJob = ToJob; - type FromJob = FromJob; + type ToJob = CandidateBackingMessage; type Error = Error; - type RunArgs = KeyStorePtr; + type RunArgs = SyncCryptoStorePtr; type Metrics = Metrics; const NAME: &'static str = "CandidateBackingJob"; + #[tracing::instrument(skip(span, keystore, metrics, rx_to, tx_from), fields(subsystem = LOG_TARGET))] fn run( parent: Hash, - keystore: KeyStorePtr, + span: Arc, + keystore: SyncCryptoStorePtr, metrics: Metrics, rx_to: mpsc::Receiver, - mut tx_from: mpsc::Sender, + mut tx_from: mpsc::Sender, ) -> Pin> + Send>> { async move { macro_rules! try_runtime_api { @@ -712,10 +951,10 @@ impl util::JobTrait for CandidateBackingJob { match $x { Ok(x) => x, Err(e) => { - log::warn!( - target: "candidate_backing", - "Failed to fetch runtime API data for job: {:?}", - e, + tracing::warn!( + target: LOG_TARGET, + err = ?e, + "Failed to fetch runtime API data for job", ); // We can't do candidate validation work if we don't have the @@ -727,41 +966,51 @@ impl util::JobTrait for CandidateBackingJob { } } + let span = PerLeafSpan::new(span, "backing"); + let _span = span.child("runtime-apis"); + let (validators, groups, session_index, cores) = futures::try_join!( - request_validators(parent, &mut tx_from).await?, - request_validator_groups(parent, &mut tx_from).await?, - request_session_index_for_child(parent, &mut tx_from).await?, - request_from_runtime( + try_runtime_api!(request_validators(parent, &mut tx_from).await), + try_runtime_api!(request_validator_groups(parent, &mut tx_from).await), + try_runtime_api!(request_session_index_for_child(parent, &mut tx_from).await), + try_runtime_api!(request_from_runtime( parent, &mut tx_from, |tx| RuntimeApiRequest::AvailabilityCores(tx), - ).await?, - )?; + ).await), + ).map_err(Error::JoinMultiple)?; let validators = try_runtime_api!(validators); let (validator_groups, group_rotation_info) = try_runtime_api!(groups); let session_index = try_runtime_api!(session_index); let cores = try_runtime_api!(cores); + drop(_span); + let _span = span.child("validator-construction"); + let signing_context = SigningContext { parent_hash: parent, session_index }; let validator = match Validator::construct( &validators, signing_context, keystore.clone(), - ) { + ).await { Ok(v) => v, Err(util::Error::NotAValidator) => { return Ok(()) }, Err(e) => { - log::warn!( - target: "candidate_backing", - "Cannot participate in candidate backing: {:?}", - e + tracing::warn!( + target: LOG_TARGET, + err = ?e, + "Cannot participate in candidate backing", ); return Ok(()) } }; + drop(_span); + let _span = span.child("calc-validator-groups"); + + let mut groups = HashMap::new(); let n_cores = cores.len(); @@ -789,34 +1038,46 @@ impl util::JobTrait for CandidateBackingJob { }; let (assignment, required_collator) = match assignment { - None => return Ok(()), // no need to work. - Some((a, r)) => (a, r), + None => (None, None), + Some((assignment, required_collator)) => (Some(assignment), required_collator), }; + drop(_span); + let _span = span.child("wait-for-job"); + + let (background_tx, background_rx) = mpsc::channel(16); let job = CandidateBackingJob { parent, - rx_to, tx_from, assignment, required_collator, issued_statements: HashSet::new(), + awaiting_validation: HashSet::new(), seconded: None, + unbacked_candidates: HashMap::new(), + backed: HashSet::new(), reported_misbehavior_for: HashSet::new(), + keystore, table: Table::default(), table_context, + background_validation: background_rx, + background_validation_tx: background_tx, metrics, }; + drop(_span); - job.run_loop().await - } - .boxed() + job.run_loop(rx_to, span).await + }.boxed() } } #[derive(Clone)] struct MetricsInner { signed_statements_total: prometheus::Counter, - candidates_seconded_total: prometheus::Counter + candidates_seconded_total: prometheus::Counter, + process_second: prometheus::Histogram, + process_statement: prometheus::Histogram, + get_backed_candidates: prometheus::Histogram, } /// Candidate backing metrics. @@ -835,6 +1096,21 @@ impl Metrics { metrics.candidates_seconded_total.inc(); } } + + /// Provide a timer for handling `CandidateBackingMessage:Second` which observes on drop. + fn time_process_second(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.process_second.start_timer()) + } + + /// Provide a timer for handling `CandidateBackingMessage::Statement` which observes on drop. + fn time_process_statement(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.process_statement.start_timer()) + } + + /// Provide a timer for handling `CandidateBackingMessage::GetBackedCandidates` which observes on drop. + fn time_get_backed_candidates(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.get_backed_candidates.start_timer()) + } } impl metrics::Metrics for Metrics { @@ -842,41 +1118,69 @@ impl metrics::Metrics for Metrics { let metrics = MetricsInner { signed_statements_total: prometheus::register( prometheus::Counter::new( - "parachain_signed_statements_total", + "parachain_candidate_backing_signed_statements_total", "Number of statements signed.", )?, registry, )?, candidates_seconded_total: prometheus::register( prometheus::Counter::new( - "parachain_candidates_seconded_total", + "parachain_candidate_backing_candidates_seconded_total", "Number of candidates seconded.", )?, registry, )?, + process_second: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_candidate_backing_process_second", + "Time spent within `candidate_backing::process_second`", + ) + )?, + registry, + )?, + process_statement: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_candidate_backing_process_statement", + "Time spent within `candidate_backing::process_statement`", + ) + )?, + registry, + )?, + get_backed_candidates: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_candidate_backing_get_backed_candidates", + "Time spent within `candidate_backing::get_backed_candidates`", + ) + )?, + registry, + )?, }; Ok(Metrics(Some(metrics))) } } -delegated_subsystem!(CandidateBackingJob(KeyStorePtr, Metrics) <- ToJob as CandidateBackingSubsystem); +delegated_subsystem!(CandidateBackingJob(SyncCryptoStorePtr, Metrics) <- CandidateBackingMessage as CandidateBackingSubsystem); #[cfg(test)] mod tests { use super::*; use assert_matches::assert_matches; - use futures::{executor, future, Future}; + use futures::{future, Future}; use polkadot_primitives::v1::{ - ScheduledCore, BlockData, CandidateCommitments, - PersistedValidationData, ValidationData, TransientValidationData, HeadData, - ValidatorPair, ValidityAttestation, GroupRotationInfo, + ScheduledCore, BlockData, PersistedValidationData, ValidationData, + TransientValidationData, HeadData, GroupRotationInfo, }; use polkadot_subsystem::{ - messages::RuntimeApiRequest, + messages::{RuntimeApiRequest, RuntimeApiMessage}, ActiveLeavesUpdate, FromOverseer, OverseerSignal, }; use polkadot_node_primitives::InvalidCandidate; use sp_keyring::Sr25519Keyring; + use sp_application_crypto::AppKey; + use sp_keystore::{CryptoStore, SyncCryptoStore}; use std::collections::HashMap; fn validator_pubkeys(val_ids: &[Sr25519Keyring]) -> Vec { @@ -885,7 +1189,7 @@ mod tests { struct TestState { chain_ids: Vec, - keystore: KeyStorePtr, + keystore: SyncCryptoStorePtr, validators: Vec, validator_public: Vec, validation_data: ValidationData, @@ -910,16 +1214,17 @@ mod tests { Sr25519Keyring::Charlie, Sr25519Keyring::Dave, Sr25519Keyring::Ferdie, + Sr25519Keyring::One, ]; - let keystore = keystore::Store::new_in_memory(); + let keystore = Arc::new(sc_keystore::LocalKeystore::in_memory()); // Make sure `Alice` key is in the keystore, so this mocked node will be a parachain validator. - keystore.write().insert_ephemeral_from_seed::(&validators[0].to_seed()) + SyncCryptoStore::sr25519_generate_new(&*keystore, ValidatorId::ID, Some(&validators[0].to_seed())) .expect("Insert key into keystore"); let validator_public = validator_pubkeys(&validators); - let validator_groups = vec![vec![2, 0, 3], vec![1], vec![4]]; + let validator_groups = vec![vec![2, 0, 3, 5], vec![1], vec![4]]; let group_rotation_info = GroupRotationInfo { session_start_block: 0, group_rotation_frequency: 100, @@ -945,7 +1250,7 @@ mod tests { let mut head_data = HashMap::new(); head_data.insert(chain_a, HeadData(vec![4, 5, 6])); - let relay_parent = Hash::from([5; 32]); + let relay_parent = Hash::repeat_byte(5); let signing_context = SigningContext { session_index: 1, @@ -957,12 +1262,16 @@ mod tests { parent_head: HeadData(vec![7, 8, 9]), block_number: Default::default(), hrmp_mqc_heads: Vec::new(), + dmq_mqc_head: Default::default(), + max_pov_size: 1024, + relay_storage_root: Default::default(), }, transient: TransientValidationData { max_code_size: 1000, max_head_data_size: 1000, balance: Default::default(), code_upgrade_allowed: None, + dmq_length: 0, }, }; @@ -985,7 +1294,7 @@ mod tests { virtual_overseer: polkadot_node_subsystem_test_helpers::TestSubsystemContextHandle, } - fn test_harness>(keystore: KeyStorePtr, test: impl FnOnce(TestHarness) -> T) { + fn test_harness>(keystore: SyncCryptoStorePtr, test: impl FnOnce(TestHarness) -> T) { let pool = sp_core::testing::TaskExecutor::new(); let (context, virtual_overseer) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool.clone()); @@ -998,14 +1307,13 @@ mod tests { futures::pin_mut!(test_fut); futures::pin_mut!(subsystem); - - executor::block_on(future::select(test_fut, subsystem)); + futures::executor::block_on(future::select(test_fut, subsystem)); } fn make_erasure_root(test: &TestState, pov: PoV) -> Hash { let available_data = AvailableData { validation_data: test.validation_data.persisted.clone(), - pov, + pov: Arc::new(pov), }; let chunks = erasure_coding::obtain_chunks_v1(test.validators.len(), &available_data).unwrap(); @@ -1028,11 +1336,11 @@ mod tests { para_id: self.para_id, pov_hash: self.pov_hash, relay_parent: self.relay_parent, + erasure_root: self.erasure_root, ..Default::default() }, commitments: CandidateCommitments { head_data: self.head_data, - erasure_root: self.erasure_root, ..Default::default() }, } @@ -1046,7 +1354,10 @@ mod tests { ) { // Start work on some new parent. virtual_overseer.send(FromOverseer::Signal( - OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(test_state.relay_parent))) + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work( + test_state.relay_parent, + Arc::new(JaegerSpan::Disabled), + ))) ).await; // Check that subsystem job issues a request for a validator set. @@ -1135,13 +1446,14 @@ mod tests { ) ) if pov == pov && &c == candidate.descriptor() => { tx.send(Ok( - ValidationResult::Valid(ValidationOutputs { - validation_data: test_state.validation_data.persisted, + ValidationResult::Valid(CandidateCommitments { head_data: expected_head_data.clone(), + horizontal_messages: Vec::new(), upward_messages: Vec::new(), - fees: Default::default(), new_validation_code: None, - }), + processed_downward_messages: 0, + hrmp_watermark: 0, + }, test_state.validation_data.persisted), )).unwrap(); } ); @@ -1149,8 +1461,8 @@ mod tests { assert_matches!( virtual_overseer.recv().await, AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreAvailableData(parent_hash, _, _, _, tx) - ) if parent_hash == test_state.relay_parent => { + AvailabilityStoreMessage::StoreAvailableData(candidate_hash, _, _, _, tx) + ) if candidate_hash == candidate.hash() => { tx.send(Ok(())).unwrap(); } ); @@ -1170,6 +1482,15 @@ mod tests { } ); + assert_matches!( + virtual_overseer.recv().await, + AllMessages::PoVDistribution(PoVDistributionMessage::DistributePoV(hash, descriptor, pov_received)) => { + assert_eq!(test_state.relay_parent, hash); + assert_eq!(candidate.descriptor, descriptor); + assert_eq!(pov, *pov_received); + } + ); + virtual_overseer.send(FromOverseer::Signal( OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(test_state.relay_parent))) ).await; @@ -1203,20 +1524,37 @@ mod tests { }.build(); let candidate_a_hash = candidate_a.hash(); + let public0 = CryptoStore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[0].to_seed()), + ).await.expect("Insert key into keystore"); + let public1 = CryptoStore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[5].to_seed()), + ).await.expect("Insert key into keystore"); + let public2 = CryptoStore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[2].to_seed()), + ).await.expect("Insert key into keystore"); let signed_a = SignedFullStatement::sign( + &test_state.keystore, Statement::Seconded(candidate_a.clone()), &test_state.signing_context, 2, - &test_state.validators[2].pair().into(), - ); + &public2.into(), + ).await.expect("should be signed"); let signed_b = SignedFullStatement::sign( + &test_state.keystore, Statement::Valid(candidate_a_hash), &test_state.signing_context, - 0, - &test_state.validators[0].pair().into(), - ); + 5, + &public1.into(), + ).await.expect("should be signed"); let statement = CandidateBackingMessage::Statement(test_state.relay_parent, signed_a.clone()); @@ -1246,13 +1584,14 @@ mod tests { ) ) if pov == pov && &c == candidate_a.descriptor() => { tx.send(Ok( - ValidationResult::Valid(ValidationOutputs { - validation_data: test_state.validation_data.persisted, + ValidationResult::Valid(CandidateCommitments { head_data: expected_head_data.clone(), upward_messages: Vec::new(), - fees: Default::default(), + horizontal_messages: Vec::new(), new_validation_code: None, - }), + processed_downward_messages: 0, + hrmp_watermark: 0, + }, test_state.validation_data.persisted), )).unwrap(); } ); @@ -1260,12 +1599,22 @@ mod tests { assert_matches!( virtual_overseer.recv().await, AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreAvailableData(parent_hash, _, _, _, tx) - ) if parent_hash == test_state.relay_parent => { + AvailabilityStoreMessage::StoreAvailableData(candidate_hash, _, _, _, tx) + ) if candidate_hash == candidate_a.hash() => { tx.send(Ok(())).unwrap(); } ); + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::Share(hash, stmt) + ) => { + assert_eq!(test_state.relay_parent, hash); + stmt.check_signature(&test_state.signing_context, &public0.into()).expect("Is signed correctly"); + } + ); + let statement = CandidateBackingMessage::Statement( test_state.relay_parent, signed_b.clone(), @@ -1273,28 +1622,173 @@ mod tests { virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + assert_matches!( + virtual_overseer.recv().await, + AllMessages::Provisioner( + ProvisionerMessage::ProvisionableData( + _, + ProvisionableData::BackedCandidate(candidate_receipt) + ) + ) => { + assert_eq!(candidate_receipt, candidate_a.to_plain()); + } + ); + + virtual_overseer.send(FromOverseer::Signal( + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(test_state.relay_parent))) + ).await; + }); + } + + #[test] + fn backing_works_while_validation_ongoing() { + let test_state = TestState::default(); + test_harness(test_state.keystore.clone(), |test_harness| async move { + let TestHarness { mut virtual_overseer } = test_harness; + + test_startup(&mut virtual_overseer, &test_state).await; + + let pov = PoV { + block_data: BlockData(vec![1, 2, 3]), + }; + + let pov_hash = pov.hash(); + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + let candidate_a = TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash, + head_data: expected_head_data.clone(), + erasure_root: make_erasure_root(&test_state, pov.clone()), + ..Default::default() + }.build(); + + let candidate_a_hash = candidate_a.hash(); + let public1 = CryptoStore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[5].to_seed()), + ).await.expect("Insert key into keystore"); + let public2 = CryptoStore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[2].to_seed()), + ).await.expect("Insert key into keystore"); + let public3 = CryptoStore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[3].to_seed()), + ).await.expect("Insert key into keystore"); + + let signed_a = SignedFullStatement::sign( + &test_state.keystore, + Statement::Seconded(candidate_a.clone()), + &test_state.signing_context, + 2, + &public2.into(), + ).await.expect("should be signed"); + + let signed_b = SignedFullStatement::sign( + &test_state.keystore, + Statement::Valid(candidate_a_hash), + &test_state.signing_context, + 5, + &public1.into(), + ).await.expect("should be signed"); + + let signed_c = SignedFullStatement::sign( + &test_state.keystore, + Statement::Valid(candidate_a_hash), + &test_state.signing_context, + 3, + &public3.into(), + ).await.expect("should be signed"); + + let statement = CandidateBackingMessage::Statement(test_state.relay_parent, signed_a.clone()); + virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + + // Sending a `Statement::Seconded` for our assignment will start + // validation process. The first thing requested is PoV from the + // `PoVDistribution`. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::PoVDistribution( + PoVDistributionMessage::FetchPoV(relay_parent, _, tx) + ) if relay_parent == test_state.relay_parent => { + tx.send(Arc::new(pov.clone())).unwrap(); + } + ); + + // The next step is the actual request to Validation subsystem + // to validate the `Seconded` candidate. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateValidation( + CandidateValidationMessage::ValidateFromChainState( + c, + pov, + tx, + ) + ) if pov == pov && &c == candidate_a.descriptor() => { + // we never validate the candidate. our local node + // shouldn't issue any statements. + std::mem::forget(tx); + } + ); + + let statement = CandidateBackingMessage::Statement( + test_state.relay_parent, + signed_b.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + + let statement = CandidateBackingMessage::Statement( + test_state.relay_parent, + signed_c.clone(), + ); + + virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + + // Candidate gets backed entirely by other votes. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::Provisioner( + ProvisionerMessage::ProvisionableData( + _, + ProvisionableData::BackedCandidate(CandidateReceipt { + descriptor, + .. + }) + ) + ) if descriptor == candidate_a.descriptor + ); + let (tx, rx) = oneshot::channel(); + let msg = CandidateBackingMessage::GetBackedCandidates( + test_state.relay_parent, + vec![candidate_a.hash()], + tx, + ); - // The backed candidats set should be not empty at this point. - virtual_overseer.send(FromOverseer::Communication{ - msg: CandidateBackingMessage::GetBackedCandidates( - test_state.relay_parent, - tx, - ) - }).await; + virtual_overseer.send(FromOverseer::Communication{ msg }).await; - let backed = rx.await.unwrap(); + let candidates = rx.await.unwrap(); + assert_eq!(1, candidates.len()); + assert_eq!(candidates[0].validity_votes.len(), 3); - // `validity_votes` may be in any order so we can't do this in a single assert. - assert_eq!(backed[0].0.candidate, candidate_a); - assert_eq!(backed[0].0.validity_votes.len(), 2); - assert!(backed[0].0.validity_votes.contains( + assert!(candidates[0].validity_votes.contains( + &ValidityAttestation::Implicit(signed_a.signature().clone()) + )); + assert!(candidates[0].validity_votes.contains( &ValidityAttestation::Explicit(signed_b.signature().clone()) )); - assert!(backed[0].0.validity_votes.contains( - &ValidityAttestation::Implicit(signed_a.signature().clone()) + assert!(candidates[0].validity_votes.contains( + &ValidityAttestation::Explicit(signed_c.signature().clone()) )); - assert_eq!(backed[0].0.validator_indices, bitvec::bitvec![Lsb0, u8; 1, 1, 0]); + assert_eq!(candidates[0].validator_indices, bitvec::bitvec![Lsb0, u8; 1, 0, 1, 1]); virtual_overseer.send(FromOverseer::Signal( OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::stop_work(test_state.relay_parent))) @@ -1330,27 +1824,37 @@ mod tests { }.build(); let candidate_a_hash = candidate_a.hash(); - + let public0 = CryptoStore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, Some(&test_state.validators[0].to_seed()) + ).await.expect("Insert key into keystore"); + let public2 = CryptoStore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, Some(&test_state.validators[2].to_seed()) + ).await.expect("Insert key into keystore"); let signed_a = SignedFullStatement::sign( + &test_state.keystore, Statement::Seconded(candidate_a.clone()), &test_state.signing_context, 2, - &test_state.validators[2].pair().into(), - ); + &public2.into(), + ).await.expect("should be signed"); let signed_b = SignedFullStatement::sign( - Statement::Valid(candidate_a_hash), + &test_state.keystore, + Statement::Invalid(candidate_a_hash), &test_state.signing_context, - 0, - &test_state.validators[0].pair().into(), - ); + 2, + &public2.into(), + ).await.expect("should be signed"); let signed_c = SignedFullStatement::sign( + &test_state.keystore, Statement::Invalid(candidate_a_hash), &test_state.signing_context, 0, - &test_state.validators[0].pair().into(), - ); + &public0.into(), + ).await.expect("should be signed"); let statement = CandidateBackingMessage::Statement(test_state.relay_parent, signed_a.clone()); @@ -1375,13 +1879,14 @@ mod tests { ) ) if pov == pov && &c == candidate_a.descriptor() => { tx.send(Ok( - ValidationResult::Valid(ValidationOutputs { - validation_data: test_state.validation_data.persisted, + ValidationResult::Valid(CandidateCommitments { head_data: expected_head_data.clone(), upward_messages: Vec::new(), - fees: Default::default(), + horizontal_messages: Vec::new(), new_validation_code: None, - }), + processed_downward_messages: 0, + hrmp_watermark: 0, + }, test_state.validation_data.persisted), )).unwrap(); } ); @@ -1389,8 +1894,8 @@ mod tests { assert_matches!( virtual_overseer.recv().await, AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreAvailableData(parent_hash, _, _, _, tx) - ) if parent_hash == test_state.relay_parent => { + AvailabilityStoreMessage::StoreAvailableData(candidate_hash, _, _, _, tx) + ) if candidate_hash == candidate_a.hash() => { tx.send(Ok(())).unwrap(); } ); @@ -1412,10 +1917,37 @@ mod tests { } ); + // This `Invalid` statement contradicts the `Candidate` statement + // sent at first. let statement = CandidateBackingMessage::Statement(test_state.relay_parent, signed_b.clone()); virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; + assert_matches!( + virtual_overseer.recv().await, + AllMessages::Provisioner( + ProvisionerMessage::ProvisionableData( + _, + ProvisionableData::MisbehaviorReport( + relay_parent, + MisbehaviorReport::SelfContradiction(_, s1, s2), + ) + ) + ) if relay_parent == test_state.relay_parent => { + s1.check_signature( + &test_state.signing_context, + &test_state.validator_public[s1.validator_index() as usize], + ).unwrap(); + + s2.check_signature( + &test_state.signing_context, + &test_state.validator_public[s2.validator_index() as usize], + ).unwrap(); + } + ); + + // This `Invalid` statement contradicts the `Valid` statement the subsystem + // should have issued behind the scenes. let statement = CandidateBackingMessage::Statement(test_state.relay_parent, signed_c.clone()); virtual_overseer.send(FromOverseer::Communication{ msg: statement }).await; @@ -1424,6 +1956,7 @@ mod tests { virtual_overseer.recv().await, AllMessages::Provisioner( ProvisionerMessage::ProvisionableData( + _, ProvisionableData::MisbehaviorReport( relay_parent, MisbehaviorReport::SelfContradiction(_, s1, s2), @@ -1531,13 +2064,14 @@ mod tests { ) ) if pov == pov && &c == candidate_b.descriptor() => { tx.send(Ok( - ValidationResult::Valid(ValidationOutputs { - validation_data: test_state.validation_data.persisted, + ValidationResult::Valid(CandidateCommitments { head_data: expected_head_data.clone(), upward_messages: Vec::new(), - fees: Default::default(), + horizontal_messages: Vec::new(), new_validation_code: None, - }), + processed_downward_messages: 0, + hrmp_watermark: 0, + }, test_state.validation_data.persisted), )).unwrap(); } ); @@ -1545,8 +2079,8 @@ mod tests { assert_matches!( virtual_overseer.recv().await, AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreAvailableData(parent_hash, _, _, _, tx) - ) if parent_hash == test_state.relay_parent => { + AvailabilityStoreMessage::StoreAvailableData(candidate_hash, _, _, _, tx) + ) if candidate_hash == candidate_b.hash() => { tx.send(Ok(())).unwrap(); } ); @@ -1600,12 +2134,18 @@ mod tests { let candidate_hash = candidate.hash(); + let validator2 = CryptoStore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, Some(&test_state.validators[2].to_seed()) + ).await.expect("Insert key into keystore"); + let signed_a = SignedFullStatement::sign( + &test_state.keystore, Statement::Seconded(candidate.clone()), &test_state.signing_context, 2, - &test_state.validators[2].pair().into(), - ); + &validator2.into(), + ).await.expect("should be signed"); // Send in a `Statement` with a candidate. let statement = CandidateBackingMessage::Statement( @@ -1733,12 +2273,17 @@ mod tests { ..Default::default() }.build(); + let public2 = CryptoStore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, Some(&test_state.validators[2].to_seed()) + ).await.expect("Insert key into keystore"); let signed_a = SignedFullStatement::sign( + &test_state.keystore, Statement::Seconded(candidate.clone()), &test_state.signing_context, 2, - &test_state.validators[2].pair().into(), - ); + &public2.into(), + ).await.expect("should be signed"); // Send in a `Statement` with a candidate. let statement = CandidateBackingMessage::Statement( @@ -1778,6 +2323,7 @@ mod tests { let (tx, rx) = oneshot::channel(); let msg = CandidateBackingMessage::GetBackedCandidates( test_state.relay_parent, + vec![candidate.hash()], tx, ); @@ -1869,12 +2415,17 @@ mod tests { ..Default::default() }.build(); + let public2 = CryptoStore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, Some(&test_state.validators[2].to_seed()) + ).await.expect("Insert key into keystore"); let seconding = SignedFullStatement::sign( + &test_state.keystore, Statement::Seconded(candidate_a.clone()), &test_state.signing_context, 2, - &test_state.validators[2].pair().into(), - ); + &public2.into(), + ).await.expect("should be signed"); let statement = CandidateBackingMessage::Statement( test_state.relay_parent, @@ -1889,4 +2440,80 @@ mod tests { ).await; }); } + + #[test] + fn candidate_backing_reorders_votes() { + use sp_core::Encode; + + let relay_parent = [1; 32].into(); + let para_id = ParaId::from(10); + let session_index = 5; + let signing_context = SigningContext { parent_hash: relay_parent, session_index }; + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Ferdie, + Sr25519Keyring::One, + ]; + + let validator_public = validator_pubkeys(&validators); + let validator_groups = { + let mut validator_groups = HashMap::new(); + validator_groups.insert(para_id, vec![0, 1, 2, 3, 4, 5]); + validator_groups + }; + + let table_context = TableContext { + signing_context, + validator: None, + groups: validator_groups, + validators: validator_public.clone(), + }; + + let fake_attestation = |idx: u32| { + let candidate: CommittedCandidateReceipt = Default::default(); + let hash = candidate.hash(); + let mut data = vec![0; 64]; + data[0..32].copy_from_slice(hash.0.as_bytes()); + data[32..36].copy_from_slice(idx.encode().as_slice()); + + let sig = ValidatorSignature::try_from(data).unwrap(); + statement_table::generic::ValidityAttestation::Implicit(sig) + }; + + let attested = TableAttestedCandidate { + candidate: Default::default(), + validity_votes: vec![ + (5, fake_attestation(5)), + (3, fake_attestation(3)), + (1, fake_attestation(1)), + ], + group_id: para_id, + }; + + let backed = table_attested_to_backed(attested, &table_context).unwrap(); + + let expected_bitvec = { + let mut validator_indices = BitVec::::with_capacity(6); + validator_indices.resize(6, false); + + validator_indices.set(1, true); + validator_indices.set(3, true); + validator_indices.set(5, true); + + validator_indices + }; + + // Should be in bitfield order, which is opposite to the order provided to the function. + 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); + } } diff --git a/node/core/bitfield-signing/Cargo.toml b/node/core/bitfield-signing/Cargo.toml index 11bfef713c7b60ba059f3baf501a4d21854464f5..a4af8eeed58cd0d8d425a9bf3cce0399342aad2c 100644 --- a/node/core/bitfield-signing/Cargo.toml +++ b/node/core/bitfield-signing/Cargo.toml @@ -5,12 +5,12 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -bitvec = "0.17.4" -derive_more = "0.99.9" -futures = "0.3.5" -log = "0.4.8" +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" polkadot-primitives = { path = "../../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } -keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } -wasm-timer = "0.2.4" +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } +wasm-timer = "0.2.5" +thiserror = "1.0.23" diff --git a/node/core/bitfield-signing/src/lib.rs b/node/core/bitfield-signing/src/lib.rs index 66badf3d18c5f1049c6c08ce6ac8a2c029fe61c6..1c5721a42dabaec47797c1e45b860a6e83a1b82c 100644 --- a/node/core/bitfield-signing/src/lib.rs +++ b/node/core/bitfield-signing/src/lib.rs @@ -16,183 +16,108 @@ //! The bitfield signing subsystem produces `SignedAvailabilityBitfield`s once per block. -use bitvec::bitvec; -use futures::{ - channel::{mpsc, oneshot}, - prelude::*, - stream, Future, -}; -use keystore::KeyStorePtr; +#![deny(unused_crate_dependencies)] +#![warn(missing_docs)] +#![recursion_limit="256"] + +use futures::{channel::{mpsc, oneshot}, lock::Mutex, prelude::*, future, Future}; +use sp_keystore::{Error as KeystoreError, SyncCryptoStorePtr}; use polkadot_node_subsystem::{ + jaeger, PerLeafSpan, JaegerSpan, messages::{ - self, AllMessages, AvailabilityStoreMessage, BitfieldDistributionMessage, - BitfieldSigningMessage, CandidateBackingMessage, RuntimeApiMessage, + AllMessages, AvailabilityStoreMessage, BitfieldDistributionMessage, + BitfieldSigningMessage, RuntimeApiMessage, RuntimeApiRequest, }, errors::RuntimeApiError, - metrics::{self, prometheus}, }; use polkadot_node_subsystem_util::{ - self as util, JobManager, JobTrait, ToJobTrait, Validator + self as util, JobManager, JobTrait, Validator, FromJobCommand, metrics::{self, prometheus}, }; use polkadot_primitives::v1::{AvailabilityBitfield, CoreState, Hash, ValidatorIndex}; -use std::{convert::TryFrom, pin::Pin, time::Duration}; +use std::{pin::Pin, time::Duration, iter::FromIterator, sync::Arc}; use wasm_timer::{Delay, Instant}; /// Delay between starting a bitfield signing job and its attempting to create a bitfield. const JOB_DELAY: Duration = Duration::from_millis(1500); +const LOG_TARGET: &str = "bitfield_signing"; /// Each `BitfieldSigningJob` prepares a signed bitfield for a single relay parent. pub struct BitfieldSigningJob; -/// Messages which a `BitfieldSigningJob` is prepared to receive. -pub enum ToJob { - BitfieldSigning(BitfieldSigningMessage), - Stop, -} - -impl ToJobTrait for ToJob { - const STOP: Self = ToJob::Stop; - - fn relay_parent(&self) -> Option { - match self { - Self::BitfieldSigning(bsm) => bsm.relay_parent(), - Self::Stop => None, - } - } -} - -impl TryFrom for ToJob { - type Error = (); - - fn try_from(msg: AllMessages) -> Result { - match msg { - AllMessages::BitfieldSigning(bsm) => Ok(ToJob::BitfieldSigning(bsm)), - _ => Err(()), - } - } -} - -impl From for ToJob { - fn from(bsm: BitfieldSigningMessage) -> ToJob { - ToJob::BitfieldSigning(bsm) - } -} +/// Errors we may encounter in the course of executing the `BitfieldSigningSubsystem`. +#[derive(Debug, thiserror::Error)] +#[allow(missing_docs)] +pub enum Error { + #[error(transparent)] + Util(#[from] util::Error), -/// Messages which may be sent from a `BitfieldSigningJob`. -pub enum FromJob { - AvailabilityStore(AvailabilityStoreMessage), - BitfieldDistribution(BitfieldDistributionMessage), - CandidateBacking(CandidateBackingMessage), - RuntimeApi(RuntimeApiMessage), -} + #[error(transparent)] + Io(#[from] std::io::Error), -impl From for AllMessages { - fn from(from_job: FromJob) -> AllMessages { - match from_job { - FromJob::AvailabilityStore(asm) => AllMessages::AvailabilityStore(asm), - FromJob::BitfieldDistribution(bdm) => AllMessages::BitfieldDistribution(bdm), - FromJob::CandidateBacking(cbm) => AllMessages::CandidateBacking(cbm), - FromJob::RuntimeApi(ram) => AllMessages::RuntimeApi(ram), - } - } -} + #[error(transparent)] + Oneshot(#[from] oneshot::Canceled), -impl TryFrom for FromJob { - type Error = (); + #[error(transparent)] + MpscSend(#[from] mpsc::SendError), - fn try_from(msg: AllMessages) -> Result { - match msg { - AllMessages::AvailabilityStore(asm) => Ok(Self::AvailabilityStore(asm)), - AllMessages::BitfieldDistribution(bdm) => Ok(Self::BitfieldDistribution(bdm)), - AllMessages::CandidateBacking(cbm) => Ok(Self::CandidateBacking(cbm)), - AllMessages::RuntimeApi(ram) => Ok(Self::RuntimeApi(ram)), - _ => Err(()), - } - } -} + #[error(transparent)] + Runtime(#[from] RuntimeApiError), -/// Errors we may encounter in the course of executing the `BitfieldSigningSubsystem`. -#[derive(Debug, derive_more::From)] -pub enum Error { - /// error propagated from the utility subsystem - #[from] - Util(util::Error), - /// io error - #[from] - Io(std::io::Error), - /// a one shot channel was canceled - #[from] - Oneshot(oneshot::Canceled), - /// a mspc channel failed to send - #[from] - MpscSend(mpsc::SendError), - /// several errors collected into one - #[from] - Multiple(Vec), - /// the runtime API failed to return what we wanted - #[from] - Runtime(RuntimeApiError), + #[error("Keystore failed: {0:?}")] + Keystore(KeystoreError), } -// if there is a candidate pending availability, query the Availability Store -// for whether we have the availability chunk for our validator index. +/// If there is a candidate pending availability, query the Availability Store +/// for whether we have the availability chunk for our validator index. +#[tracing::instrument(level = "trace", skip(sender, span), fields(subsystem = LOG_TARGET))] async fn get_core_availability( relay_parent: Hash, core: CoreState, validator_idx: ValidatorIndex, - sender: &mpsc::Sender, + sender: &Mutex<&mut mpsc::Sender>, + span: &jaeger::JaegerSpan, ) -> Result { - use messages::{ - AvailabilityStoreMessage::QueryChunkAvailability, - RuntimeApiRequest::CandidatePendingAvailability, - }; - use FromJob::{AvailabilityStore, RuntimeApi}; - use RuntimeApiMessage::Request; - - // we have to (cheaply) clone this sender so we can mutate it to actually send anything - let mut sender = sender.clone(); - if let CoreState::Occupied(core) = core { - let (tx, rx) = oneshot::channel(); - sender - .send(RuntimeApi(Request( - relay_parent, - CandidatePendingAvailability(core.para_id, tx), - ))) - .await?; + let _span = span.child("query-chunk-availability"); - let committed_candidate_receipt = match rx.await? { - Ok(Some(ccr)) => ccr, - Ok(None) => return Ok(false), - Err(e) => { - // Don't take down the node on runtime API errors. - log::warn!(target: "bitfield_signing", "Encountered a runtime API error: {:?}", e); - return Ok(false); - } - }; let (tx, rx) = oneshot::channel(); sender - .send(AvailabilityStore(QueryChunkAvailability( - committed_candidate_receipt.descriptor.pov_hash, - validator_idx, - tx, - ))) + .lock() + .await + .send( + AllMessages::from(AvailabilityStoreMessage::QueryChunkAvailability( + core.candidate_hash, + validator_idx, + tx, + )).into(), + ) .await?; - return rx.await.map_err(Into::into); + + let res = rx.await.map_err(Into::into); + + tracing::trace!( + target: LOG_TARGET, + para_id = %core.para_id(), + availability = ?res, + ?core.candidate_hash, + "Candidate availability", + ); + + res + } else { + Ok(false) } - Ok(false) } -// delegates to the v1 runtime API -async fn get_availability_cores(relay_parent: Hash, sender: &mut mpsc::Sender) -> Result, Error> { - use FromJob::RuntimeApi; - use messages::{ - RuntimeApiMessage::Request, - RuntimeApiRequest::AvailabilityCores, - }; - +/// delegates to the v1 runtime API +async fn get_availability_cores( + relay_parent: Hash, + sender: &mut mpsc::Sender, +) -> Result, Error> { let (tx, rx) = oneshot::channel(); - sender.send(RuntimeApi(Request(relay_parent, AvailabilityCores(tx)))).await?; + sender + .send(AllMessages::from(RuntimeApiMessage::Request(relay_parent, RuntimeApiRequest::AvailabilityCores(tx))).into()) + .await?; match rx.await { Ok(Ok(out)) => Ok(out), Ok(Err(runtime_err)) => Err(runtime_err.into()), @@ -200,62 +125,44 @@ async fn get_availability_cores(relay_parent: Hash, sender: &mut mpsc::Sender, + sender: &mut mpsc::Sender, ) -> Result { - use futures::lock::Mutex; - // get the set of availability cores from the runtime - let availability_cores = get_availability_cores(relay_parent, sender).await?; - - // we now need sender to be immutable so we can copy the reference to multiple concurrent closures - let sender = &*sender; - - // prepare outputs - let out = Mutex::new(bitvec!(bitvec::order::Lsb0, u8; 0; availability_cores.len())); - // in principle, we know that we never want concurrent access to the _same_ bit within the vec; - // we could `let out_ref = out.as_mut_ptr();` here instead, and manually assign bits, avoiding - // any need to ever wait to lock this mutex. - // in practice, it's safer to just use the mutex, and speed optimizations should wait until - // benchmarking proves that they are necessary. - let out_ref = &out; - let errs = Mutex::new(Vec::new()); - let errs_ref = &errs; - - // Handle each (idx, core) pair concurrently - // - // In principle, this work is all concurrent, not parallel. In practice, we can't guarantee it, which is why - // we need the mutexes and explicit references above. - stream::iter(availability_cores.into_iter().enumerate()) - .for_each_concurrent(None, |(idx, core)| async move { - let availability = match get_core_availability(relay_parent, core, validator_idx, sender).await { - Ok(availability) => availability, - Err(err) => { - errs_ref.lock().await.push(err); - return; - } - }; - out_ref.lock().await.set(idx, availability); - }) - .await; + let availability_cores = { + let _span = span.child("get-availability-cores"); + get_availability_cores(relay_parent, sender).await? + }; - let errs = errs.into_inner(); - if errs.is_empty() { - Ok(out.into_inner().into()) - } else { - Err(errs.into()) - } + // Wrap the sender in a Mutex to share it between the futures. + // + // We use a `Mutex` here to not `clone` the sender inside the future, because + // cloning the sender will always increase the capacity of the channel by one. + // (for the lifetime of the sender) + let sender = Mutex::new(sender); + + // Handle all cores concurrently + // `try_join_all` returns all results in the same order as the input futures. + let results = future::try_join_all( + availability_cores.into_iter() + .map(|core| get_core_availability(relay_parent, core, validator_idx, &sender, span)), + ).await?; + + Ok(AvailabilityBitfield(FromIterator::from_iter(results))) } #[derive(Clone)] struct MetricsInner { bitfields_signed_total: prometheus::Counter, + run: prometheus::Histogram, } /// Bitfield signing metrics. @@ -268,6 +175,11 @@ impl Metrics { metrics.bitfields_signed_total.inc(); } } + + /// Provide a timer for `prune_povs` which observes on drop. + fn time_run(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.run.start_timer()) + } } impl metrics::Metrics for Metrics { @@ -280,35 +192,47 @@ impl metrics::Metrics for Metrics { )?, registry, )?, + run: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_bitfield_signing_run", + "Time spent within `bitfield_signing::run`", + ) + )?, + registry, + )?, }; Ok(Metrics(Some(metrics))) } } impl JobTrait for BitfieldSigningJob { - type ToJob = ToJob; - type FromJob = FromJob; + type ToJob = BitfieldSigningMessage; type Error = Error; - type RunArgs = KeyStorePtr; + type RunArgs = SyncCryptoStorePtr; type Metrics = Metrics; const NAME: &'static str = "BitfieldSigningJob"; /// Run a job for the parent block indicated + #[tracing::instrument(skip(span, keystore, metrics, _receiver, sender), fields(subsystem = LOG_TARGET))] fn run( relay_parent: Hash, + span: Arc, keystore: Self::RunArgs, metrics: Self::Metrics, - _receiver: mpsc::Receiver, - mut sender: mpsc::Sender, + _receiver: mpsc::Receiver, + mut sender: mpsc::Sender, ) -> Pin> + Send>> { + let metrics = metrics.clone(); async move { - // figure out when to wait to + let span = PerLeafSpan::new(span, "bitfield-signing"); + let _span = span.child("delay"); let wait_until = Instant::now() + JOB_DELAY; // now do all the work we can before we need to wait for the availability store // if we're not a validator, we can just succeed effortlessly - let validator = match Validator::new(relay_parent, keystore, sender.clone()).await { + let validator = match Validator::new(relay_parent, keystore.clone(), sender.clone()).await { Ok(validator) => validator, Err(util::Error::NotAValidator) => return Ok(()), Err(err) => return Err(Error::Util(err)), @@ -317,39 +241,128 @@ impl JobTrait for BitfieldSigningJob { // wait a bit before doing anything else Delay::new_at(wait_until).await?; + // this timer does not appear at the head of the function because we don't want to include + // JOB_DELAY each time. + let _timer = metrics.time_run(); + + drop(_span); + let span_availability = span.child("availability"); + let bitfield = - match construct_availability_bitfield(relay_parent, validator.index(), &mut sender).await + match construct_availability_bitfield( + relay_parent, + &span_availability, + validator.index(), + &mut sender, + ).await { Err(Error::Runtime(runtime_err)) => { // Don't take down the node on runtime API errors. - log::warn!(target: "bitfield_signing", "Encountered a runtime API error: {:?}", runtime_err); + tracing::warn!(target: LOG_TARGET, err = ?runtime_err, "Encountered a runtime API error"); return Ok(()); } Err(err) => return Err(err), Ok(bitfield) => bitfield, }; - let signed_bitfield = validator.sign(bitfield); + drop(span_availability); + let _span = span.child("signing"); + + let signed_bitfield = validator + .sign(keystore.clone(), bitfield) + .await + .map_err(|e| Error::Keystore(e))?; metrics.on_bitfield_signed(); - // make an anonymous scope to contain some use statements to simplify creating the outbound message - { - use BitfieldDistributionMessage::DistributeBitfield; - use FromJob::BitfieldDistribution; - - sender - .send(BitfieldDistribution(DistributeBitfield( - relay_parent, - signed_bitfield, - ))) - .await - .map_err(Into::into) - } + drop(_span); + let _span = span.child("gossip"); + + sender + .send( + AllMessages::from( + BitfieldDistributionMessage::DistributeBitfield(relay_parent, signed_bitfield), + ).into(), + ) + .await + .map_err(Into::into) } .boxed() } } /// BitfieldSigningSubsystem manages a number of bitfield signing jobs. -pub type BitfieldSigningSubsystem = - JobManager; +pub type BitfieldSigningSubsystem = JobManager; + +#[cfg(test)] +mod tests { + use super::*; + use futures::{pin_mut, executor::block_on}; + use polkadot_primitives::v1::{CandidateHash, OccupiedCore}; + + fn occupied_core(para_id: u32, candidate_hash: CandidateHash) -> CoreState { + CoreState::Occupied(OccupiedCore { + group_responsible: para_id.into(), + next_up_on_available: None, + occupied_since: 100_u32, + time_out_at: 200_u32, + next_up_on_time_out: None, + availability: Default::default(), + candidate_hash, + candidate_descriptor: Default::default(), + }) + } + + #[test] + fn construct_availability_bitfield_works() { + block_on(async move { + let (mut sender, mut receiver) = mpsc::channel(10); + let relay_parent = Hash::default(); + let validator_index = 1u32; + + let future = construct_availability_bitfield( + relay_parent, + &jaeger::JaegerSpan::Disabled, + validator_index, + &mut sender, + ).fuse(); + pin_mut!(future); + + let hash_a = CandidateHash(Hash::repeat_byte(1)); + let hash_b = CandidateHash(Hash::repeat_byte(2)); + + loop { + futures::select! { + m = receiver.next() => match m.unwrap() { + FromJobCommand::SendMessage( + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(rp, RuntimeApiRequest::AvailabilityCores(tx)), + ), + ) => { + assert_eq!(relay_parent, rp); + tx.send(Ok(vec![CoreState::Free, occupied_core(1, hash_a), occupied_core(2, hash_b)])).unwrap(); + }, + FromJobCommand::SendMessage( + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::QueryChunkAvailability(c_hash, vidx, tx), + ), + ) => { + assert_eq!(validator_index, vidx); + + tx.send(c_hash == hash_a).unwrap(); + }, + o => panic!("Unknown message: {:?}", o), + }, + r = future => match r { + Ok(r) => { + assert!(!r.0.get(0).unwrap()); + assert!(r.0.get(1).unwrap()); + assert!(!r.0.get(2).unwrap()); + break + }, + Err(e) => panic!("Failed: {:?}", e), + }, + } + } + }); + } +} diff --git a/node/core/candidate-selection/Cargo.toml b/node/core/candidate-selection/Cargo.toml index 171e84723eb1091dc945d9d2430526068550e224..200eb0ed4e91d2c402254f2fa343843fae9fe860 100644 --- a/node/core/candidate-selection/Cargo.toml +++ b/node/core/candidate-selection/Cargo.toml @@ -5,11 +5,14 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -derive_more = "0.99.9" -futures = "0.3.5" -log = "0.4.8" +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" +thiserror = "1.0.23" + +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } + polkadot-primitives = { path = "../../../primitives" } -polkadot-node-primitives = { path = "../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } diff --git a/node/core/candidate-selection/src/lib.rs b/node/core/candidate-selection/src/lib.rs index 7d31c0318e225edfb87b1ea06301089229a32aca..51eaa80a47182e1fad33f0f7688f91b5d2327ce6 100644 --- a/node/core/candidate-selection/src/lib.rs +++ b/node/core/candidate-selection/src/lib.rs @@ -17,184 +17,180 @@ //! The provisioner is responsible for assembling a relay chain block //! from a set of available parachain candidates of its choice. -#![deny(missing_docs)] +#![deny(missing_docs, unused_crate_dependencies, unused_results)] use futures::{ channel::{mpsc, oneshot}, prelude::*, }; -use polkadot_node_primitives::ValidationResult; +use sp_keystore::SyncCryptoStorePtr; use polkadot_node_subsystem::{ - errors::{ChainApiError, RuntimeApiError}, + jaeger, JaegerSpan, PerLeafSpan, + errors::ChainApiError, messages::{ - AllMessages, CandidateBackingMessage, CandidateSelectionMessage, - CandidateValidationMessage, CollatorProtocolMessage, + AllMessages, CandidateBackingMessage, CandidateSelectionMessage, CollatorProtocolMessage, + RuntimeApiRequest, }, - metrics::{self, prometheus}, }; -use polkadot_node_subsystem_util::{self as util, delegated_subsystem, JobTrait, ToJobTrait}; +use polkadot_node_subsystem_util::{ + self as util, request_from_runtime, request_validator_groups, delegated_subsystem, + JobTrait, FromJobCommand, Validator, metrics::{self, prometheus}, +}; use polkadot_primitives::v1::{ - CandidateDescriptor, CandidateReceipt, CollatorId, Hash, Id as ParaId, PoV, + CandidateReceipt, CollatorId, CoreState, CoreIndex, Hash, Id as ParaId, PoV, }; -use std::{convert::TryFrom, pin::Pin, sync::Arc}; +use std::{pin::Pin, sync::Arc}; +use thiserror::Error; -const TARGET: &'static str = "candidate_selection"; +const LOG_TARGET: &'static str = "candidate_selection"; struct CandidateSelectionJob { - sender: mpsc::Sender, - receiver: mpsc::Receiver, + assignment: ParaId, + sender: mpsc::Sender, + receiver: mpsc::Receiver, metrics: Metrics, seconded_candidate: Option, } -/// This enum defines the messages that the provisioner is prepared to receive. -#[derive(Debug)] -pub enum ToJob { - /// The provisioner message is the main input to the provisioner. - CandidateSelection(CandidateSelectionMessage), - /// This message indicates that the provisioner should shut itself down. - Stop, -} - -impl ToJobTrait for ToJob { - const STOP: Self = Self::Stop; - - fn relay_parent(&self) -> Option { - match self { - Self::CandidateSelection(csm) => csm.relay_parent(), - Self::Stop => None, - } - } -} - -impl TryFrom for ToJob { - type Error = (); - - fn try_from(msg: AllMessages) -> Result { - match msg { - AllMessages::CandidateSelection(csm) => Ok(Self::CandidateSelection(csm)), - _ => Err(()), - } - } -} - -impl From for ToJob { - fn from(csm: CandidateSelectionMessage) -> Self { - Self::CandidateSelection(csm) - } -} - -#[derive(Debug)] -enum FromJob { - Validation(CandidateValidationMessage), - Backing(CandidateBackingMessage), - Collator(CollatorProtocolMessage), -} - -impl From for AllMessages { - fn from(from_job: FromJob) -> AllMessages { - match from_job { - FromJob::Validation(msg) => AllMessages::CandidateValidation(msg), - FromJob::Backing(msg) => AllMessages::CandidateBacking(msg), - FromJob::Collator(msg) => AllMessages::CollatorProtocol(msg), - } - } +#[derive(Debug, Error)] +enum Error { + #[error(transparent)] + Sending(#[from] mpsc::SendError), + #[error(transparent)] + Util(#[from] util::Error), + #[error(transparent)] + OneshotRecv(#[from] oneshot::Canceled), + #[error(transparent)] + ChainApi(#[from] ChainApiError), } -impl TryFrom for FromJob { - type Error = (); +macro_rules! try_runtime_api { + ($x: expr) => { + match $x { + Ok(x) => x, + Err(e) => { + tracing::warn!( + target: LOG_TARGET, + err = ?e, + "Failed to fetch runtime API data for job", + ); - fn try_from(msg: AllMessages) -> Result { - match msg { - AllMessages::CandidateValidation(msg) => Ok(FromJob::Validation(msg)), - AllMessages::CandidateBacking(msg) => Ok(FromJob::Backing(msg)), - AllMessages::CollatorProtocol(msg) => Ok(FromJob::Collator(msg)), - _ => Err(()), + // We can't do candidate selection work if we don't have the + // requisite runtime API data. But these errors should not take + // down the node. + return Ok(()); + } } } } -#[derive(Debug, derive_more::From)] -enum Error { - #[from] - Sending(mpsc::SendError), - #[from] - Util(util::Error), - #[from] - OneshotRecv(oneshot::Canceled), - #[from] - ChainApi(ChainApiError), - #[from] - Runtime(RuntimeApiError), -} - impl JobTrait for CandidateSelectionJob { - type ToJob = ToJob; - type FromJob = FromJob; + type ToJob = CandidateSelectionMessage; type Error = Error; - type RunArgs = (); + type RunArgs = SyncCryptoStorePtr; type Metrics = Metrics; const NAME: &'static str = "CandidateSelectionJob"; - /// Run a job for the parent block indicated - // - // this function is in charge of creating and executing the job's main loop + #[tracing::instrument(skip(keystore, metrics, receiver, sender), fields(subsystem = LOG_TARGET))] fn run( - _relay_parent: Hash, - _run_args: Self::RunArgs, + relay_parent: Hash, + span: Arc, + keystore: Self::RunArgs, metrics: Self::Metrics, - receiver: mpsc::Receiver, - sender: mpsc::Sender, + receiver: mpsc::Receiver, + mut sender: mpsc::Sender, ) -> Pin> + Send>> { + let span = PerLeafSpan::new(span, "candidate-selection"); async move { - let job = CandidateSelectionJob::new(metrics, sender, receiver); + let _span = span.child("query-runtime"); + let (groups, cores) = futures::try_join!( + try_runtime_api!(request_validator_groups(relay_parent, &mut sender).await), + try_runtime_api!(request_from_runtime( + relay_parent, + &mut sender, + |tx| RuntimeApiRequest::AvailabilityCores(tx), + ).await), + )?; - // it isn't necessary to break run_loop into its own function, - // but it's convenient to separate the concerns in this way - job.run_loop().await - } - .boxed() + let (validator_groups, group_rotation_info) = try_runtime_api!(groups); + let cores = try_runtime_api!(cores); + + drop(_span); + let _span = span.child("find-assignment"); + + let n_cores = cores.len(); + + let validator = match Validator::new(relay_parent, keystore.clone(), sender.clone()).await { + Ok(validator) => validator, + Err(util::Error::NotAValidator) => return Ok(()), + Err(err) => return Err(Error::Util(err)), + }; + + let mut assignment = None; + + for (idx, core) in cores.into_iter().enumerate() { + // Ignore prospective assignments on occupied cores for the time being. + if let CoreState::Scheduled(scheduled) = core { + let core_index = CoreIndex(idx as _); + 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 g.contains(&validator.index()) { + assignment = Some(scheduled.para_id); + break; + } + } + } + } + + let assignment = match assignment { + Some(assignment) => assignment, + None => return Ok(()), + }; + + drop(_span); + + CandidateSelectionJob::new(assignment, metrics, sender, receiver).run_loop(&span).await + }.boxed() } } impl CandidateSelectionJob { pub fn new( + assignment: ParaId, metrics: Metrics, - sender: mpsc::Sender, - receiver: mpsc::Receiver, + sender: mpsc::Sender, + receiver: mpsc::Receiver, ) -> Self { Self { sender, receiver, metrics, + assignment, seconded_candidate: None, } } - async fn run_loop(mut self) -> Result<(), Error> { - self.run_loop_borrowed().await - } - - /// this function exists for testing and should not generally be used; use `run_loop` instead. - async fn run_loop_borrowed(&mut self) -> Result<(), Error> { - while let Some(msg) = self.receiver.next().await { - match msg { - ToJob::CandidateSelection(CandidateSelectionMessage::Collation( + async fn run_loop(&mut self, span: &jaeger::JaegerSpan) -> Result<(), Error> { + let span = span.child("run-loop"); + loop { + match self.receiver.next().await { + Some(CandidateSelectionMessage::Collation( relay_parent, para_id, collator_id, )) => { - self.handle_collation(relay_parent, para_id, collator_id) - .await; + let _span = span.child("handle-collation"); + self.handle_collation(relay_parent, para_id, collator_id).await; } - ToJob::CandidateSelection(CandidateSelectionMessage::Invalid( + Some(CandidateSelectionMessage::Invalid( _, candidate_receipt, )) => { + let _span = span.child("handle-invalid"); self.handle_invalid(candidate_receipt).await; } - ToJob::Stop => break, + None => break, } } @@ -204,12 +200,32 @@ impl CandidateSelectionJob { Ok(()) } + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] async fn handle_collation( &mut self, relay_parent: Hash, para_id: ParaId, collator_id: CollatorId, ) { + let _timer = self.metrics.time_handle_collation(); + + if self.assignment != para_id { + tracing::info!( + target: LOG_TARGET, + "Collator {:?} sent a collation outside of our assignment {:?}", + collator_id, + para_id, + ); + if let Err(err) = forward_invalidity_note(&collator_id, &mut self.sender).await { + tracing::warn!( + target: LOG_TARGET, + err = ?err, + "failed to forward invalidity note", + ); + } + return; + } + if self.seconded_candidate.is_none() { let (candidate_receipt, pov) = match get_collation( @@ -220,34 +236,15 @@ impl CandidateSelectionJob { ).await { Ok(response) => response, Err(err) => { - log::warn!( - target: TARGET, - "failed to get collation from collator protocol subsystem: {:?}", - err + tracing::warn!( + target: LOG_TARGET, + err = ?err, + "failed to get collation from collator protocol subsystem", ); return; } }; - let pov = Arc::new(pov); - - if !candidate_is_valid( - candidate_receipt.descriptor.clone(), - pov.clone(), - self.sender.clone(), - ) - .await - { - return; - } - - let pov = if let Ok(pov) = Arc::try_unwrap(pov) { - pov - } else { - log::warn!(target: TARGET, "Arc unwrapping is expected to succeed, the other fns should have already run to completion by now."); - return; - }; - match second_candidate( relay_parent, candidate_receipt, @@ -257,115 +254,91 @@ impl CandidateSelectionJob { ) .await { - Err(err) => log::warn!(target: TARGET, "failed to second a candidate: {:?}", err), + Err(err) => tracing::warn!(target: LOG_TARGET, err = ?err, "failed to second a candidate"), Ok(()) => self.seconded_candidate = Some(collator_id), } } } + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] async fn handle_invalid(&mut self, candidate_receipt: CandidateReceipt) { + let _timer = self.metrics.time_handle_invalid(); + let received_from = match &self.seconded_candidate { Some(peer) => peer, None => { - log::warn!( - target: TARGET, + tracing::warn!( + target: LOG_TARGET, "received invalidity notice for a candidate we don't remember seconding" ); return; } }; - log::info!( - target: TARGET, - "received invalidity note for candidate {:?}", - candidate_receipt + tracing::info!( + target: LOG_TARGET, + candidate_receipt = ?candidate_receipt, + "received invalidity note for candidate", ); - let succeeded = + let result = if let Err(err) = forward_invalidity_note(received_from, &mut self.sender).await { - log::warn!( - target: TARGET, - "failed to forward invalidity note: {:?}", - err + tracing::warn!( + target: LOG_TARGET, + err = ?err, + "failed to forward invalidity note", ); - false + Err(()) } else { - true + Ok(()) }; - self.metrics.on_invalid_selection(succeeded); + self.metrics.on_invalid_selection(result); } } // get a collation from the Collator Protocol subsystem // // note that this gets an owned clone of the sender; that's becuase unlike `forward_invalidity_note`, it's expected to take a while longer +#[tracing::instrument(level = "trace", skip(sender), fields(subsystem = LOG_TARGET))] async fn get_collation( relay_parent: Hash, para_id: ParaId, collator_id: CollatorId, - mut sender: mpsc::Sender, + mut sender: mpsc::Sender, ) -> Result<(CandidateReceipt, PoV), Error> { let (tx, rx) = oneshot::channel(); sender - .send(FromJob::Collator(CollatorProtocolMessage::FetchCollation( + .send(AllMessages::from(CollatorProtocolMessage::FetchCollation( relay_parent, collator_id, para_id, tx, - ))) + )).into()) .await?; rx.await.map_err(Into::into) } -// find out whether a candidate is valid or not -async fn candidate_is_valid( - candidate_descriptor: CandidateDescriptor, - pov: Arc, - sender: mpsc::Sender, -) -> bool { - std::matches!( - candidate_is_valid_inner(candidate_descriptor, pov, sender).await, - Ok(true) - ) -} - -// find out whether a candidate is valid or not, with a worse interface -// the external interface is worse, but the internal implementation is easier -async fn candidate_is_valid_inner( - candidate_descriptor: CandidateDescriptor, - pov: Arc, - mut sender: mpsc::Sender, -) -> Result { - let (tx, rx) = oneshot::channel(); - sender - .send(FromJob::Validation( - CandidateValidationMessage::ValidateFromChainState(candidate_descriptor, pov, tx), - )) - .await?; - Ok(std::matches!(rx.await, Ok(Ok(ValidationResult::Valid(_))))) -} - async fn second_candidate( relay_parent: Hash, candidate_receipt: CandidateReceipt, pov: PoV, - sender: &mut mpsc::Sender, + sender: &mut mpsc::Sender, metrics: &Metrics, ) -> Result<(), Error> { match sender - .send(FromJob::Backing(CandidateBackingMessage::Second( + .send(AllMessages::from(CandidateBackingMessage::Second( relay_parent, candidate_receipt, pov, - ))) + )).into()) .await { Err(err) => { - log::warn!(target: TARGET, "failed to send a seconding message"); - metrics.on_second(false); + tracing::warn!(target: LOG_TARGET, err = ?err, "failed to send a seconding message"); + metrics.on_second(Err(())); Err(err.into()) } Ok(_) => { - metrics.on_second(true); + metrics.on_second(Ok(())); Ok(()) } } @@ -373,12 +346,12 @@ async fn second_candidate( async fn forward_invalidity_note( received_from: &CollatorId, - sender: &mut mpsc::Sender, + sender: &mut mpsc::Sender, ) -> Result<(), Error> { sender - .send(FromJob::Collator(CollatorProtocolMessage::ReportCollator( + .send(AllMessages::from(CollatorProtocolMessage::ReportCollator( received_from.clone(), - ))) + )).into()) .await .map_err(Into::into) } @@ -387,26 +360,38 @@ async fn forward_invalidity_note( struct MetricsInner { seconds: prometheus::CounterVec, invalid_selections: prometheus::CounterVec, + handle_collation: prometheus::Histogram, + handle_invalid: prometheus::Histogram, } -/// Candidate backing metrics. +/// Candidate selection metrics. #[derive(Default, Clone)] pub struct Metrics(Option); impl Metrics { - fn on_second(&self, succeeded: bool) { + fn on_second(&self, result: Result<(), ()>) { if let Some(metrics) = &self.0 { - let label = if succeeded { "succeeded" } else { "failed" }; + let label = if result.is_ok() { "succeeded" } else { "failed" }; metrics.seconds.with_label_values(&[label]).inc(); } } - fn on_invalid_selection(&self, succeeded: bool) { + fn on_invalid_selection(&self, result: Result<(), ()>) { if let Some(metrics) = &self.0 { - let label = if succeeded { "succeeded" } else { "failed" }; + let label = if result.is_ok() { "succeeded" } else { "failed" }; metrics.invalid_selections.with_label_values(&[label]).inc(); } } + + /// Provide a timer for `handle_collation` which observes on drop. + fn time_handle_collation(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.handle_collation.start_timer()) + } + + /// Provide a timer for `handle_invalid` which observes on drop. + fn time_handle_invalid(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.handle_invalid.start_timer()) + } } impl metrics::Metrics for Metrics { @@ -415,10 +400,10 @@ impl metrics::Metrics for Metrics { seconds: prometheus::register( prometheus::CounterVec::new( prometheus::Opts::new( - "candidate_selection_invalid_selections_total", - "Number of Candidate Selection subsystem seconding selections which proved to be invalid.", + "candidate_selection_seconds_total", + "Number of Candidate Selection subsystem seconding events.", ), - &["succeeded", "failed"], + &["success"], )?, registry, )?, @@ -428,7 +413,25 @@ impl metrics::Metrics for Metrics { "candidate_selection_invalid_selections_total", "Number of Candidate Selection subsystem seconding selections which proved to be invalid.", ), - &["succeeded", "failed"], + &["success"], + )?, + registry, + )?, + handle_collation: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_candidate_selection_handle_collation", + "Time spent within `candidate_selection::handle_collation`", + ) + )?, + registry, + )?, + handle_invalid: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_candidate_selection:handle_invalid", + "Time spent within `candidate_selection::handle_invalid`", + ) )?, registry, )?, @@ -437,15 +440,15 @@ impl metrics::Metrics for Metrics { } } -delegated_subsystem!(CandidateSelectionJob((), Metrics) <- ToJob as CandidateSelectionSubsystem); +delegated_subsystem!(CandidateSelectionJob(SyncCryptoStorePtr, Metrics) <- CandidateSelectionMessage as CandidateSelectionSubsystem); #[cfg(test)] mod tests { use super::*; use futures::lock::Mutex; - use polkadot_node_primitives::ValidationOutputs; - use polkadot_primitives::v1::{BlockData, HeadData, PersistedValidationData}; + use polkadot_primitives::v1::BlockData; use sp_core::crypto::Public; + use std::sync::Arc; fn test_harness( preconditions: Preconditions, @@ -453,13 +456,14 @@ mod tests { postconditions: Postconditions, ) where Preconditions: FnOnce(&mut CandidateSelectionJob), - TestBuilder: FnOnce(mpsc::Sender, mpsc::Receiver) -> Test, + TestBuilder: FnOnce(mpsc::Sender, mpsc::Receiver) -> Test, Test: Future, Postconditions: FnOnce(CandidateSelectionJob, Result<(), Error>), { let (to_job_tx, to_job_rx) = mpsc::channel(0); let (from_job_tx, from_job_rx) = mpsc::channel(0); let mut job = CandidateSelectionJob { + assignment: 123.into(), sender: from_job_tx, receiver: to_job_rx, metrics: Default::default(), @@ -467,36 +471,15 @@ mod tests { }; preconditions(&mut job); - + let span = jaeger::JaegerSpan::Disabled; let (_, job_result) = futures::executor::block_on(future::join( test(to_job_tx, from_job_rx), - job.run_loop_borrowed(), + job.run_loop(&span), )); postconditions(job, job_result); } - fn default_validation_outputs() -> ValidationOutputs { - let head_data: Vec = (0..32).rev().cycle().take(256).collect(); - let parent_head_data = head_data - .iter() - .copied() - .map(|x| x.saturating_sub(1)) - .collect(); - - ValidationOutputs { - head_data: HeadData(head_data), - validation_data: PersistedValidationData { - parent_head: HeadData(parent_head_data), - block_number: 123, - hrmp_mqc_heads: Vec::new(), - }, - upward_messages: Vec::new(), - fees: 0, - new_validation_code: None, - } - } - /// when nothing is seconded so far, the collation is fetched and seconded #[test] fn fetches_and_seconds_a_collation() { @@ -517,12 +500,10 @@ mod tests { |_job| {}, |mut to_job, mut from_job| async move { to_job - .send(ToJob::CandidateSelection( - CandidateSelectionMessage::Collation( - relay_parent, - para_id, - collator_id_clone.clone(), - ), + .send(CandidateSelectionMessage::Collation( + relay_parent, + para_id, + collator_id_clone.clone(), )) .await .unwrap(); @@ -530,12 +511,12 @@ mod tests { while let Some(msg) = from_job.next().await { match msg { - FromJob::Collator(CollatorProtocolMessage::FetchCollation( + FromJobCommand::SendMessage(AllMessages::CollatorProtocol(CollatorProtocolMessage::FetchCollation( got_relay_parent, collator_id, got_para_id, return_sender, - )) => { + ))) => { assert_eq!(got_relay_parent, relay_parent); assert_eq!(got_para_id, para_id); assert_eq!(collator_id, collator_id_clone); @@ -544,25 +525,11 @@ mod tests { .send((candidate_receipt.clone(), pov.clone())) .unwrap(); } - FromJob::Validation( - CandidateValidationMessage::ValidateFromChainState( - got_candidate_descriptor, - got_pov, - return_sender, - ), - ) => { - assert_eq!(got_candidate_descriptor, candidate_receipt.descriptor); - assert_eq!(got_pov.as_ref(), &pov); - - return_sender - .send(Ok(ValidationResult::Valid(default_validation_outputs()))) - .unwrap(); - } - FromJob::Backing(CandidateBackingMessage::Second( + FromJobCommand::SendMessage(AllMessages::CandidateBacking(CandidateBackingMessage::Second( got_relay_parent, got_candidate_receipt, got_pov, - )) => { + ))) => { assert_eq!(got_relay_parent, relay_parent); assert_eq!(got_candidate_receipt, candidate_receipt); assert_eq!(got_pov, pov); @@ -598,12 +565,10 @@ mod tests { |job| job.seconded_candidate = Some(prev_collator_id.clone()), |mut to_job, mut from_job| async move { to_job - .send(ToJob::CandidateSelection( - CandidateSelectionMessage::Collation( - relay_parent, - para_id, - collator_id_clone, - ), + .send(CandidateSelectionMessage::Collation( + relay_parent, + para_id, + collator_id_clone, )) .await .unwrap(); @@ -611,11 +576,11 @@ mod tests { while let Some(msg) = from_job.next().await { match msg { - FromJob::Backing(CandidateBackingMessage::Second( + FromJobCommand::SendMessage(AllMessages::CandidateBacking(CandidateBackingMessage::Second( _got_relay_parent, _got_candidate_receipt, _got_pov, - )) => { + ))) => { *was_seconded_clone.lock().await = true; } other => panic!("unexpected message from job: {:?}", other), @@ -647,18 +612,16 @@ mod tests { |job| job.seconded_candidate = Some(collator_id.clone()), |mut to_job, mut from_job| async move { to_job - .send(ToJob::CandidateSelection( - CandidateSelectionMessage::Invalid(relay_parent, candidate_receipt), - )) + .send(CandidateSelectionMessage::Invalid(relay_parent, candidate_receipt)) .await .unwrap(); std::mem::drop(to_job); while let Some(msg) = from_job.next().await { match msg { - FromJob::Collator(CollatorProtocolMessage::ReportCollator( + FromJobCommand::SendMessage(AllMessages::CollatorProtocol(CollatorProtocolMessage::ReportCollator( got_collator_id, - )) => { + ))) => { assert_eq!(got_collator_id, collator_id_clone); *sent_report_clone.lock().await = true; diff --git a/node/core/candidate-validation/Cargo.toml b/node/core/candidate-validation/Cargo.toml index 8f1b7a0fa0fd2ea7a8e4ca7869c7fcc832296de6..456a8d7f961983c57a763c9d97c9fbe7b0391bd7 100644 --- a/node/core/candidate-validation/Cargo.toml +++ b/node/core/candidate-validation/Cargo.toml @@ -5,20 +5,21 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.5" -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" + sp-core = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master" } -parity-scale-codec = { version = "1.3.0", default-features = false, features = ["bit-vec", "derive"] } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["bit-vec", "derive"] } polkadot-primitives = { path = "../../../primitives" } polkadot-parachain = { path = "../../../parachain" } polkadot-node-primitives = { path = "../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } -derive_more = "0.99.9" -log = "0.4.8" +polkadot-node-subsystem-util = { path = "../../subsystem-util" } [dev-dependencies] sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } -futures = { version = "0.3.5", features = ["thread-pool"] } -assert_matches = "1.3.0" +futures = { version = "0.3.8", features = ["thread-pool"] } +assert_matches = "1.4.0" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } diff --git a/node/core/candidate-validation/src/lib.rs b/node/core/candidate-validation/src/lib.rs index fa61325b9c495e10d661b93a095e6431157f86e9..cf47b9d62ec13478aee2b2f00d674734ef753dec 100644 --- a/node/core/candidate-validation/src/lib.rs +++ b/node/core/candidate-validation/src/lib.rs @@ -20,24 +20,26 @@ //! according to a validation function. This delegates validation to an underlying //! pool of processes used for execution of the Wasm. +#![deny(unused_crate_dependencies, unused_results)] +#![warn(missing_docs)] + use polkadot_subsystem::{ - Subsystem, SubsystemContext, SpawnedSubsystem, SubsystemResult, + Subsystem, SubsystemContext, SpawnedSubsystem, SubsystemResult, SubsystemError, FromOverseer, OverseerSignal, messages::{ AllMessages, CandidateValidationMessage, RuntimeApiMessage, ValidationFailed, RuntimeApiRequest, }, - metrics::{self, prometheus}, }; +use polkadot_node_subsystem_util::metrics::{self, prometheus}; use polkadot_subsystem::errors::RuntimeApiError; -use polkadot_node_primitives::{ValidationResult, ValidationOutputs, InvalidCandidate}; +use polkadot_node_primitives::{ValidationResult, InvalidCandidate}; use polkadot_primitives::v1::{ - ValidationCode, PoV, CandidateDescriptor, ValidationData, PersistedValidationData, - TransientValidationData, OccupiedCoreAssumption, Hash, + ValidationCode, PoV, CandidateDescriptor, PersistedValidationData, + OccupiedCoreAssumption, Hash, CandidateCommitments, }; use polkadot_parachain::wasm_executor::{ - self, ValidationPool, ExecutionMode, ValidationError, - InvalidCandidate as WasmInvalidCandidate, + self, IsolationStrategy, ValidationError, InvalidCandidate as WasmInvalidCandidate }; use polkadot_parachain::primitives::{ValidationResult as WasmValidationResult, ValidationParams}; @@ -55,57 +57,16 @@ const LOG_TARGET: &'static str = "candidate_validation"; pub struct CandidateValidationSubsystem { spawn: S, metrics: Metrics, -} - -#[derive(Clone)] -struct MetricsInner { - validation_requests: prometheus::CounterVec, -} - -/// Candidate validation metrics. -#[derive(Default, Clone)] -pub struct Metrics(Option); - -impl Metrics { - fn on_validation_event(&self, event: &Result) { - if let Some(metrics) = &self.0 { - match event { - Ok(ValidationResult::Valid(_)) => { - metrics.validation_requests.with_label_values(&["valid"]).inc(); - }, - Ok(ValidationResult::Invalid(_)) => { - metrics.validation_requests.with_label_values(&["invalid"]).inc(); - }, - Err(_) => { - metrics.validation_requests.with_label_values(&["failed"]).inc(); - }, - } - } - } -} - -impl metrics::Metrics for Metrics { - fn try_register(registry: &prometheus::Registry) -> Result { - let metrics = MetricsInner { - validation_requests: prometheus::register( - prometheus::CounterVec::new( - prometheus::Opts::new( - "parachain_validation_requests_total", - "Number of validation requests served.", - ), - &["valid", "invalid", "failed"], - )?, - registry, - )?, - }; - Ok(Metrics(Some(metrics))) - } + isolation_strategy: IsolationStrategy, } impl CandidateValidationSubsystem { - /// Create a new `CandidateValidationSubsystem` with the given task spawner. - pub fn new(spawn: S, metrics: Metrics) -> Self { - CandidateValidationSubsystem { spawn, metrics } + /// Create a new `CandidateValidationSubsystem` with the given task spawner and isolation + /// strategy. + /// + /// Check out [`IsolationStrategy`] to get more details. + pub fn new(spawn: S, metrics: Metrics, isolation_strategy: IsolationStrategy) -> Self { + CandidateValidationSubsystem { spawn, metrics, isolation_strategy } } } @@ -113,29 +74,28 @@ impl Subsystem for CandidateValidationSubsystem where C: SubsystemContext, S: SpawnNamed + Clone + 'static, { - type Metrics = Metrics; - fn start(self, ctx: C) -> SpawnedSubsystem { + let future = run(ctx, self.spawn, self.metrics, self.isolation_strategy) + .map_err(|e| SubsystemError::with_origin("candidate-validation", e)) + .boxed(); SpawnedSubsystem { name: "candidate-validation-subsystem", - future: run(ctx, self.spawn, self.metrics).map(|_| ()).boxed(), + future, } } } +#[tracing::instrument(skip(ctx, spawn, metrics), fields(subsystem = LOG_TARGET))] async fn run( mut ctx: impl SubsystemContext, spawn: impl SpawnNamed + Clone + 'static, metrics: Metrics, -) - -> SubsystemResult<()> -{ - let execution_mode = ExecutionMode::ExternalProcessSelfHost(ValidationPool::new()); - + isolation_strategy: IsolationStrategy, +) -> SubsystemResult<()> { loop { match ctx.recv().await? { FromOverseer::Signal(OverseerSignal::ActiveLeaves(_)) => {} - FromOverseer::Signal(OverseerSignal::BlockFinalized(_)) => {} + FromOverseer::Signal(OverseerSignal::BlockFinalized(..)) => {} FromOverseer::Signal(OverseerSignal::Conclude) => return Ok(()), FromOverseer::Communication { msg } => match msg { CandidateValidationMessage::ValidateFromChainState( @@ -143,12 +103,15 @@ async fn run( pov, response_sender, ) => { + let _timer = metrics.time_validate_from_chain_state(); + let res = spawn_validate_from_chain_state( &mut ctx, - execution_mode.clone(), + isolation_strategy.clone(), descriptor, pov, spawn.clone(), + &metrics, ).await; match res { @@ -161,28 +124,29 @@ async fn run( } CandidateValidationMessage::ValidateFromExhaustive( persisted_validation_data, - transient_validation_data, validation_code, descriptor, pov, response_sender, ) => { + let _timer = metrics.time_validate_from_exhaustive(); + let res = spawn_validate_exhaustive( &mut ctx, - execution_mode.clone(), + isolation_strategy.clone(), persisted_validation_data, - transient_validation_data, validation_code, descriptor, pov, spawn.clone(), + &metrics, ).await; match res { Ok(x) => { metrics.on_validation_event(&x); if let Err(_e) = response_sender.send(x) { - log::warn!( + tracing::warn!( target: LOG_TARGET, "Requester of candidate validation dropped", ) @@ -207,18 +171,19 @@ async fn runtime_api_request( relay_parent, request, )) - ).await?; + ).await; receiver.await.map_err(Into::into) } #[derive(Debug)] enum AssumptionCheckOutcome { - Matches(ValidationData, ValidationCode), + Matches(PersistedValidationData, ValidationCode), DoesNotMatch, BadRequest, } +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn check_assumption_validation_data( ctx: &mut impl SubsystemContext, descriptor: &CandidateDescriptor, @@ -229,7 +194,7 @@ async fn check_assumption_validation_data( let d = runtime_api_request( ctx, descriptor.relay_parent, - RuntimeApiRequest::FullValidationData( + RuntimeApiRequest::PersistedValidationData( descriptor.para_id, assumption, tx, @@ -245,7 +210,7 @@ async fn check_assumption_validation_data( } }; - let persisted_validation_data_hash = validation_data.persisted.hash(); + let persisted_validation_data_hash = validation_data.hash(); SubsystemResult::Ok(if descriptor.persisted_validation_data_hash == persisted_validation_data_hash { let (code_tx, code_rx) = oneshot::channel(); @@ -254,7 +219,7 @@ async fn check_assumption_validation_data( descriptor.relay_parent, RuntimeApiRequest::ValidationCode( descriptor.para_id, - OccupiedCoreAssumption::Included, + assumption, code_tx, ), code_rx, @@ -269,85 +234,122 @@ async fn check_assumption_validation_data( }) } -async fn spawn_validate_from_chain_state( +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] +async fn find_assumed_validation_data( ctx: &mut impl SubsystemContext, - execution_mode: ExecutionMode, - descriptor: CandidateDescriptor, - pov: Arc, - spawn: impl SpawnNamed + 'static, -) -> SubsystemResult> { + descriptor: &CandidateDescriptor, +) -> SubsystemResult { // The candidate descriptor has a `persisted_validation_data_hash` which corresponds to // one of up to two possible values that we can derive from the state of the // relay-parent. We can fetch these values by getting the persisted validation data // based on the different `OccupiedCoreAssumption`s. - match check_assumption_validation_data( - ctx, - &descriptor, + + const ASSUMPTIONS: &[OccupiedCoreAssumption] = &[ OccupiedCoreAssumption::Included, - ).await? { - AssumptionCheckOutcome::Matches(validation_data, validation_code) => { - return spawn_validate_exhaustive( - ctx, - execution_mode, - validation_data.persisted, - Some(validation_data.transient), - validation_code, - descriptor, - pov, - spawn, - ).await; + OccupiedCoreAssumption::TimedOut, + // `TimedOut` and `Free` both don't perform any speculation and therefore should be the same + // for our purposes here. In other words, if `TimedOut` matched then the `Free` must be + // matched as well. + ]; + + // Consider running these checks in parallel to reduce validation latency. + for assumption in ASSUMPTIONS { + let outcome = check_assumption_validation_data(ctx, descriptor, *assumption).await?; + + match outcome { + AssumptionCheckOutcome::Matches(_, _) => return Ok(outcome), + AssumptionCheckOutcome::BadRequest => return Ok(outcome), + AssumptionCheckOutcome::DoesNotMatch => continue, } - AssumptionCheckOutcome::DoesNotMatch => {}, - AssumptionCheckOutcome::BadRequest => return Ok(Err(ValidationFailed("Bad request".into()))), } - match check_assumption_validation_data( + Ok(AssumptionCheckOutcome::DoesNotMatch) +} + +#[tracing::instrument(level = "trace", skip(ctx, pov, spawn, metrics), fields(subsystem = LOG_TARGET))] +async fn spawn_validate_from_chain_state( + ctx: &mut impl SubsystemContext, + isolation_strategy: IsolationStrategy, + descriptor: CandidateDescriptor, + pov: Arc, + spawn: impl SpawnNamed + 'static, + metrics: &Metrics, +) -> SubsystemResult> { + let (validation_data, validation_code) = + match find_assumed_validation_data(ctx, &descriptor).await? { + AssumptionCheckOutcome::Matches(validation_data, validation_code) => { + (validation_data, validation_code) + } + AssumptionCheckOutcome::DoesNotMatch => { + // If neither the assumption of the occupied core having the para included or the assumption + // of the occupied core timing out are valid, then the persisted_validation_data_hash in the descriptor + // is not based on the relay parent and is thus invalid. + return Ok(Ok(ValidationResult::Invalid(InvalidCandidate::BadParent))); + } + AssumptionCheckOutcome::BadRequest => { + return Ok(Err(ValidationFailed("Assumption Check: Bad request".into()))); + } + }; + + let validation_result = spawn_validate_exhaustive( ctx, - &descriptor, - OccupiedCoreAssumption::TimedOut, - ).await? { - AssumptionCheckOutcome::Matches(validation_data, validation_code) => { - return spawn_validate_exhaustive( - ctx, - execution_mode, - validation_data.persisted, - Some(validation_data.transient), - validation_code, - descriptor, - pov, - spawn, - ).await; + isolation_strategy, + validation_data, + validation_code, + descriptor.clone(), + pov, + spawn, + metrics, + ) + .await; + + if let Ok(Ok(ValidationResult::Valid(ref outputs, _))) = validation_result { + let (tx, rx) = oneshot::channel(); + match runtime_api_request( + ctx, + descriptor.relay_parent, + RuntimeApiRequest::CheckValidationOutputs(descriptor.para_id, outputs.clone(), tx), + rx, + ) + .await? + { + Ok(true) => {} + Ok(false) => { + return Ok(Ok(ValidationResult::Invalid( + InvalidCandidate::InvalidOutputs, + ))); + } + Err(_) => { + return Ok(Err(ValidationFailed("Check Validation Outputs: Bad request".into()))); + } } - AssumptionCheckOutcome::DoesNotMatch => {}, - AssumptionCheckOutcome::BadRequest => return Ok(Err(ValidationFailed("Bad request".into()))), } - // If neither the assumption of the occupied core having the para included or the assumption - // of the occupied core timing out are valid, then the persisted_validation_data_hash in the descriptor - // is not based on the relay parent and is thus invalid. - Ok(Ok(ValidationResult::Invalid(InvalidCandidate::BadParent))) + validation_result } +#[tracing::instrument(level = "trace", skip(ctx, validation_code, pov, spawn, metrics), fields(subsystem = LOG_TARGET))] async fn spawn_validate_exhaustive( ctx: &mut impl SubsystemContext, - execution_mode: ExecutionMode, + isolation_strategy: IsolationStrategy, persisted_validation_data: PersistedValidationData, - transient_validation_data: Option, validation_code: ValidationCode, descriptor: CandidateDescriptor, pov: Arc, spawn: impl SpawnNamed + 'static, + metrics: &Metrics, ) -> SubsystemResult> { let (tx, rx) = oneshot::channel(); + let metrics = metrics.clone(); let fut = async move { let res = validate_candidate_exhaustive::( - execution_mode, + isolation_strategy, persisted_validation_data, - transient_validation_data, validation_code, descriptor, pov, spawn, + &metrics, ); let _ = tx.send(res); @@ -359,18 +361,17 @@ async fn spawn_validate_exhaustive( /// Does basic checks of a candidate. Provide the encoded PoV-block. Returns `Ok` if basic checks /// are passed, `Err` otherwise. +#[tracing::instrument(level = "trace", skip(pov), fields(subsystem = LOG_TARGET))] fn perform_basic_checks( candidate: &CandidateDescriptor, - max_block_data_size: Option, + max_pov_size: u32, pov: &PoV, ) -> Result<(), InvalidCandidate> { let encoded_pov = pov.encode(); let hash = pov.hash(); - if let Some(max_size) = max_block_data_size { - if encoded_pov.len() as u64 > max_size { - return Err(InvalidCandidate::ParamsTooLarge(encoded_pov.len() as u64)); - } + if encoded_pov.len() > max_pov_size as usize { + return Err(InvalidCandidate::ParamsTooLarge(encoded_pov.len() as u64)); } if hash != candidate.pov_hash { @@ -384,30 +385,6 @@ fn perform_basic_checks( Ok(()) } -/// Check the result of Wasm execution against the constraints given by the relay-chain. -/// -/// Returns `Ok(())` if checks pass, error otherwise. -fn check_wasm_result_against_constraints( - transient_params: &TransientValidationData, - result: &WasmValidationResult, -) -> Result<(), InvalidCandidate> { - if result.head_data.0.len() > transient_params.max_head_data_size as _ { - return Err(InvalidCandidate::HeadDataTooLarge(result.head_data.0.len() as u64)) - } - - if let Some(ref code) = result.new_validation_code { - if transient_params.code_upgrade_allowed.is_none() { - return Err(InvalidCandidate::CodeUpgradeNotAllowed) - } - - if code.0.len() > transient_params.max_code_size as _ { - return Err(InvalidCandidate::NewCodeTooLarge(code.0.len() as u64)) - } - } - - Ok(()) -} - trait ValidationBackend { type Arg; @@ -422,10 +399,10 @@ trait ValidationBackend { struct RealValidationBackend; impl ValidationBackend for RealValidationBackend { - type Arg = ExecutionMode; + type Arg = IsolationStrategy; fn validate( - execution_mode: ExecutionMode, + isolation_strategy: IsolationStrategy, validation_code: &ValidationCode, params: ValidationParams, spawn: S, @@ -433,7 +410,7 @@ impl ValidationBackend for RealValidationBackend { wasm_executor::validate_candidate( &validation_code.0, params, - &execution_mode, + &isolation_strategy, spawn, ) } @@ -442,16 +419,19 @@ impl ValidationBackend for RealValidationBackend { /// Validates the candidate from exhaustive parameters. /// /// Sends the result of validation on the channel once complete. +#[tracing::instrument(level = "trace", skip(backend_arg, validation_code, pov, spawn, metrics), fields(subsystem = LOG_TARGET))] fn validate_candidate_exhaustive( backend_arg: B::Arg, persisted_validation_data: PersistedValidationData, - transient_validation_data: Option, validation_code: ValidationCode, descriptor: CandidateDescriptor, pov: Arc, spawn: S, + metrics: &Metrics, ) -> Result { - if let Err(e) = perform_basic_checks(&descriptor, None, &*pov) { + let _timer = metrics.time_validate_candidate_exhaustive(); + + if let Err(e) = perform_basic_checks(&descriptor, persisted_validation_data.max_pov_size, &*pov) { return Ok(ValidationResult::Invalid(e)) } @@ -459,6 +439,7 @@ fn validate_candidate_exhaustive( parent_head: persisted_validation_data.parent_head.clone(), block_data: pov.block_data.clone(), relay_chain_height: persisted_validation_data.block_number, + dmq_mqc_head: persisted_validation_data.dmq_mqc_head, hrmp_mqc_heads: persisted_validation_data.hrmp_mqc_heads.clone(), }; @@ -477,34 +458,114 @@ fn validate_candidate_exhaustive( Ok(ValidationResult::Invalid(InvalidCandidate::ExecutionError(e.to_string()))), Err(ValidationError::Internal(e)) => Err(ValidationFailed(e.to_string())), Ok(res) => { - let post_check_result = if let Some(transient) = transient_validation_data { - check_wasm_result_against_constraints( - &transient, - &res, - ) - } else { - Ok(()) + let outputs = CandidateCommitments { + head_data: res.head_data, + upward_messages: res.upward_messages, + horizontal_messages: res.horizontal_messages, + new_validation_code: res.new_validation_code, + processed_downward_messages: res.processed_downward_messages, + hrmp_watermark: res.hrmp_watermark, }; + Ok(ValidationResult::Valid(outputs, persisted_validation_data)) + } + } +} - Ok(match post_check_result { - Ok(()) => ValidationResult::Valid(ValidationOutputs { - head_data: res.head_data, - validation_data: persisted_validation_data, - upward_messages: res.upward_messages, - fees: 0, - new_validation_code: res.new_validation_code, - }), - Err(e) => ValidationResult::Invalid(e), - }) +#[derive(Clone)] +struct MetricsInner { + validation_requests: prometheus::CounterVec, + validate_from_chain_state: prometheus::Histogram, + validate_from_exhaustive: prometheus::Histogram, + validate_candidate_exhaustive: prometheus::Histogram, +} + +/// Candidate validation metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_validation_event(&self, event: &Result) { + if let Some(metrics) = &self.0 { + match event { + Ok(ValidationResult::Valid(_, _)) => { + metrics.validation_requests.with_label_values(&["valid"]).inc(); + }, + Ok(ValidationResult::Invalid(_)) => { + metrics.validation_requests.with_label_values(&["invalid"]).inc(); + }, + Err(_) => { + metrics.validation_requests.with_label_values(&["validation failure"]).inc(); + }, + } } } + + /// Provide a timer for `validate_from_chain_state` which observes on drop. + fn time_validate_from_chain_state(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.validate_from_chain_state.start_timer()) + } + + /// Provide a timer for `validate_from_exhaustive` which observes on drop. + fn time_validate_from_exhaustive(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.validate_from_exhaustive.start_timer()) + } + + /// Provide a timer for `validate_candidate_exhaustive` which observes on drop. + fn time_validate_candidate_exhaustive(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.validate_candidate_exhaustive.start_timer()) + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + validation_requests: prometheus::register( + prometheus::CounterVec::new( + prometheus::Opts::new( + "parachain_validation_requests_total", + "Number of validation requests served.", + ), + &["validity"], + )?, + registry, + )?, + validate_from_chain_state: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_candidate_validation_validate_from_chain_state", + "Time spent within `candidate_validation::validate_from_chain_state`", + ) + )?, + registry, + )?, + validate_from_exhaustive: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_candidate_validation_validate_from_exhaustive", + "Time spent within `candidate_validation::validate_from_exhaustive`", + ) + )?, + registry, + )?, + validate_candidate_exhaustive: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_candidate_validation_validate_candidate_exhaustive", + "Time spent within `candidate_validation::validate_candidate_exhaustive`", + ) + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } } #[cfg(test)] mod tests { use super::*; use polkadot_node_subsystem_test_helpers as test_helpers; - use polkadot_primitives::v1::{HeadData, BlockData}; + use polkadot_primitives::v1::{HeadData, BlockData, UpwardMessage}; use sp_core::testing::TaskExecutor; use futures::executor; use assert_matches::assert_matches; @@ -544,10 +605,10 @@ mod tests { #[test] fn correctly_checks_included_assumption() { - let validation_data: ValidationData = Default::default(); + let validation_data: PersistedValidationData = Default::default(); let validation_code: ValidationCode = vec![1, 2, 3].into(); - let persisted_validation_data_hash = validation_data.persisted.hash(); + let persisted_validation_data_hash = validation_data.hash(); let relay_parent = [2; 32].into(); let para_id = 5.into(); @@ -570,7 +631,11 @@ mod tests { ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::FullValidationData(p, OccupiedCoreAssumption::Included, tx) + RuntimeApiRequest::PersistedValidationData( + p, + OccupiedCoreAssumption::Included, + tx + ), )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); @@ -604,10 +669,10 @@ mod tests { #[test] fn correctly_checks_timed_out_assumption() { - let validation_data: ValidationData = Default::default(); + let validation_data: PersistedValidationData = Default::default(); let validation_code: ValidationCode = vec![1, 2, 3].into(); - let persisted_validation_data_hash = validation_data.persisted.hash(); + let persisted_validation_data_hash = validation_data.hash(); let relay_parent = [2; 32].into(); let para_id = 5.into(); @@ -630,7 +695,11 @@ mod tests { ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::FullValidationData(p, OccupiedCoreAssumption::TimedOut, tx) + RuntimeApiRequest::PersistedValidationData( + p, + OccupiedCoreAssumption::TimedOut, + tx + ), )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); @@ -643,7 +712,7 @@ mod tests { ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::ValidationCode(p, OccupiedCoreAssumption::Included, tx) + RuntimeApiRequest::ValidationCode(p, OccupiedCoreAssumption::TimedOut, tx) )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); @@ -664,8 +733,8 @@ mod tests { #[test] fn check_is_bad_request_if_no_validation_data() { - let validation_data: ValidationData = Default::default(); - let persisted_validation_data_hash = validation_data.persisted.hash(); + let validation_data: PersistedValidationData = Default::default(); + let persisted_validation_data_hash = validation_data.hash(); let relay_parent = [2; 32].into(); let para_id = 5.into(); @@ -688,7 +757,11 @@ mod tests { ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::FullValidationData(p, OccupiedCoreAssumption::Included, tx) + RuntimeApiRequest::PersistedValidationData( + p, + OccupiedCoreAssumption::Included, + tx + ), )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); @@ -706,8 +779,8 @@ mod tests { #[test] fn check_is_bad_request_if_no_validation_code() { - let validation_data: ValidationData = Default::default(); - let persisted_validation_data_hash = validation_data.persisted.hash(); + let validation_data: PersistedValidationData = Default::default(); + let persisted_validation_data_hash = validation_data.hash(); let relay_parent = [2; 32].into(); let para_id = 5.into(); @@ -730,7 +803,11 @@ mod tests { ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::FullValidationData(p, OccupiedCoreAssumption::TimedOut, tx) + RuntimeApiRequest::PersistedValidationData( + p, + OccupiedCoreAssumption::TimedOut, + tx + ), )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); @@ -743,7 +820,7 @@ mod tests { ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::ValidationCode(p, OccupiedCoreAssumption::Included, tx) + RuntimeApiRequest::ValidationCode(p, OccupiedCoreAssumption::TimedOut, tx) )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); @@ -761,7 +838,7 @@ mod tests { #[test] fn check_does_not_match() { - let validation_data: ValidationData = Default::default(); + let validation_data: PersistedValidationData = Default::default(); let relay_parent = [2; 32].into(); let para_id = 5.into(); @@ -784,7 +861,11 @@ mod tests { ctx_handle.recv().await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( rp, - RuntimeApiRequest::FullValidationData(p, OccupiedCoreAssumption::Included, tx) + RuntimeApiRequest::PersistedValidationData( + p, + OccupiedCoreAssumption::Included, + tx + ), )) => { assert_eq!(rp, relay_parent); assert_eq!(p, para_id); @@ -802,10 +883,7 @@ mod tests { #[test] fn candidate_validation_ok_is_ok() { - let mut validation_data: ValidationData = Default::default(); - validation_data.transient.max_head_data_size = 1024; - validation_data.transient.max_code_size = 1024; - validation_data.transient.code_upgrade_allowed = Some(20); + let validation_data = PersistedValidationData { max_pov_size: 1024, ..Default::default() }; let pov = PoV { block_data: BlockData(vec![1; 32]) }; @@ -813,46 +891,40 @@ mod tests { descriptor.pov_hash = pov.hash(); collator_sign(&mut descriptor, Sr25519Keyring::Alice); - assert!(perform_basic_checks(&descriptor, Some(1024), &pov).is_ok()); + assert!(perform_basic_checks(&descriptor, validation_data.max_pov_size, &pov).is_ok()); let validation_result = WasmValidationResult { head_data: HeadData(vec![1, 1, 1]), new_validation_code: Some(vec![2, 2, 2].into()), upward_messages: Vec::new(), + horizontal_messages: Vec::new(), processed_downward_messages: 0, + hrmp_watermark: 0, }; - assert!(check_wasm_result_against_constraints( - &validation_data.transient, - &validation_result, - ).is_ok()); - let v = validate_candidate_exhaustive::( MockValidationArg { result: Ok(validation_result) }, - validation_data.persisted.clone(), - Some(validation_data.transient), + validation_data.clone(), vec![1, 2, 3].into(), descriptor, Arc::new(pov), TaskExecutor::new(), + &Default::default(), ).unwrap(); - assert_matches!(v, ValidationResult::Valid(outputs) => { + assert_matches!(v, ValidationResult::Valid(outputs, used_validation_data) => { assert_eq!(outputs.head_data, HeadData(vec![1, 1, 1])); - assert_eq!(outputs.validation_data, validation_data.persisted); - assert_eq!(outputs.upward_messages, Vec::new()); - assert_eq!(outputs.fees, 0); + assert_eq!(outputs.upward_messages, Vec::::new()); + assert_eq!(outputs.horizontal_messages, Vec::new()); assert_eq!(outputs.new_validation_code, Some(vec![2, 2, 2].into())); + assert_eq!(outputs.hrmp_watermark, 0); + assert_eq!(used_validation_data, validation_data); }); } #[test] fn candidate_validation_bad_return_is_invalid() { - let mut validation_data: ValidationData = Default::default(); - - validation_data.transient.max_head_data_size = 1024; - validation_data.transient.max_code_size = 1024; - validation_data.transient.code_upgrade_allowed = Some(20); + let validation_data = PersistedValidationData { max_pov_size: 1024, ..Default::default() }; let pov = PoV { block_data: BlockData(vec![1; 32]) }; @@ -860,19 +932,7 @@ mod tests { descriptor.pov_hash = pov.hash(); collator_sign(&mut descriptor, Sr25519Keyring::Alice); - assert!(perform_basic_checks(&descriptor, Some(1024), &pov).is_ok()); - - let validation_result = WasmValidationResult { - head_data: HeadData(vec![1, 1, 1]), - new_validation_code: Some(vec![2, 2, 2].into()), - upward_messages: Vec::new(), - processed_downward_messages: 0, - }; - - assert!(check_wasm_result_against_constraints( - &validation_data.transient, - &validation_result, - ).is_ok()); + assert!(perform_basic_checks(&descriptor, validation_data.max_pov_size, &pov).is_ok()); let v = validate_candidate_exhaustive::( MockValidationArg { @@ -880,25 +940,20 @@ mod tests { WasmInvalidCandidate::BadReturn )) }, - validation_data.persisted, - Some(validation_data.transient), + validation_data, vec![1, 2, 3].into(), descriptor, Arc::new(pov), TaskExecutor::new(), + &Default::default(), ).unwrap(); assert_matches!(v, ValidationResult::Invalid(InvalidCandidate::BadReturn)); } - #[test] fn candidate_validation_timeout_is_internal_error() { - let mut validation_data: ValidationData = Default::default(); - - validation_data.transient.max_head_data_size = 1024; - validation_data.transient.max_code_size = 1024; - validation_data.transient.code_upgrade_allowed = Some(20); + let validation_data = PersistedValidationData { max_pov_size: 1024, ..Default::default() }; let pov = PoV { block_data: BlockData(vec![1; 32]) }; @@ -906,19 +961,7 @@ mod tests { descriptor.pov_hash = pov.hash(); collator_sign(&mut descriptor, Sr25519Keyring::Alice); - assert!(perform_basic_checks(&descriptor, Some(1024), &pov).is_ok()); - - let validation_result = WasmValidationResult { - head_data: HeadData(vec![1, 1, 1]), - new_validation_code: Some(vec![2, 2, 2].into()), - upward_messages: Vec::new(), - processed_downward_messages: 0, - }; - - assert!(check_wasm_result_against_constraints( - &validation_data.transient, - &validation_result, - ).is_ok()); + assert!(perform_basic_checks(&descriptor, validation_data.max_pov_size, &pov).is_ok()); let v = validate_candidate_exhaustive::( MockValidationArg { @@ -926,59 +969,14 @@ mod tests { WasmInvalidCandidate::Timeout )) }, - validation_data.persisted, - Some(validation_data.transient), + validation_data, vec![1, 2, 3].into(), descriptor, Arc::new(pov), TaskExecutor::new(), + &Default::default(), ); assert_matches!(v, Ok(ValidationResult::Invalid(InvalidCandidate::Timeout))); } - - #[test] - fn candidate_validation_ok_does_not_validate_outputs_if_no_transient() { - let mut validation_data: ValidationData = Default::default(); - validation_data.transient.max_head_data_size = 1; - validation_data.transient.max_code_size = 1; - - let pov = PoV { block_data: BlockData(vec![1; 32]) }; - - let mut descriptor = CandidateDescriptor::default(); - descriptor.pov_hash = pov.hash(); - collator_sign(&mut descriptor, Sr25519Keyring::Alice); - - assert!(perform_basic_checks(&descriptor, Some(1024), &pov).is_ok()); - - let validation_result = WasmValidationResult { - head_data: HeadData(vec![1, 1, 1]), - new_validation_code: Some(vec![2, 2, 2].into()), - upward_messages: Vec::new(), - processed_downward_messages: 0, - }; - - assert!(check_wasm_result_against_constraints( - &validation_data.transient, - &validation_result, - ).is_err()); - - let v = validate_candidate_exhaustive::( - MockValidationArg { result: Ok(validation_result) }, - validation_data.persisted.clone(), - None, - vec![1, 2, 3].into(), - descriptor, - Arc::new(pov), - TaskExecutor::new(), - ).unwrap(); - - assert_matches!(v, ValidationResult::Valid(outputs) => { - assert_eq!(outputs.head_data, HeadData(vec![1, 1, 1])); - assert_eq!(outputs.validation_data, validation_data.persisted); - assert_eq!(outputs.upward_messages, Vec::new()); - assert_eq!(outputs.fees, 0); - assert_eq!(outputs.new_validation_code, Some(vec![2, 2, 2].into())); - }); - } } diff --git a/node/core/chain-api/Cargo.toml b/node/core/chain-api/Cargo.toml index d626a0d9329d0949f0d5ba76947bfe9eb3ce075b..43256704c2bff027b2ee9b2e73afdbb1d36b97e4 100644 --- a/node/core/chain-api/Cargo.toml +++ b/node/core/chain-api/Cargo.toml @@ -5,13 +5,16 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = { version = "0.3.5" } +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-primitives = { path = "../../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-node-subsystem-util = { path = "../../subsystem-util" } [dev-dependencies] -futures = { version = "0.3.5", features = ["thread-pool"] } +futures = { version = "0.3.8", features = ["thread-pool"] } maplit = "1.0.2" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/core/chain-api/src/lib.rs b/node/core/chain-api/src/lib.rs index d3be1c4bf484fb293de2c9e55bf60193314334a4..534c41e3ef85b1dc4aed3a342f851eef1de5631f 100644 --- a/node/core/chain-api/src/lib.rs +++ b/node/core/chain-api/src/lib.rs @@ -22,30 +22,39 @@ //! //! Supported requests: //! * Block hash to number +//! * Block hash to header //! * Finalized block number to hash //! * Last finalized block number //! * Ancestors +#![deny(unused_crate_dependencies, unused_results)] +#![warn(missing_docs)] + use polkadot_subsystem::{ FromOverseer, OverseerSignal, - SpawnedSubsystem, Subsystem, SubsystemResult, SubsystemContext, + SpawnedSubsystem, Subsystem, SubsystemResult, SubsystemError, SubsystemContext, messages::ChainApiMessage, +}; +use polkadot_node_subsystem_util::{ metrics::{self, prometheus}, }; use polkadot_primitives::v1::{Block, BlockId}; use sp_blockchain::HeaderBackend; +use std::sync::Arc; use futures::prelude::*; +const LOG_TARGET: &str = "chain_api"; + /// The Chain API Subsystem implementation. pub struct ChainApiSubsystem { - client: Client, + client: Arc, metrics: Metrics, } impl ChainApiSubsystem { /// Create a new Chain API subsystem with the given client. - pub fn new(client: Client, metrics: Metrics) -> Self { + pub fn new(client: Arc, metrics: Metrics) -> Self { ChainApiSubsystem { client, metrics, @@ -57,16 +66,18 @@ impl Subsystem for ChainApiSubsystem where Client: HeaderBackend + 'static, Context: SubsystemContext { - type Metrics = Metrics; - fn start(self, ctx: Context) -> SpawnedSubsystem { + let future = run(ctx, self) + .map_err(|e| SubsystemError::with_origin("chain-api", e)) + .boxed(); SpawnedSubsystem { - future: run(ctx, self).map(|_| ()).boxed(), + future, name: "chain-api-subsystem", } } } +#[tracing::instrument(skip(ctx, subsystem), fields(subsystem = LOG_TARGET))] async fn run( mut ctx: impl SubsystemContext, subsystem: ChainApiSubsystem, @@ -78,38 +89,60 @@ where match ctx.recv().await? { FromOverseer::Signal(OverseerSignal::Conclude) => return Ok(()), FromOverseer::Signal(OverseerSignal::ActiveLeaves(_)) => {}, - FromOverseer::Signal(OverseerSignal::BlockFinalized(_)) => {}, + FromOverseer::Signal(OverseerSignal::BlockFinalized(..)) => {}, FromOverseer::Communication { msg } => match msg { ChainApiMessage::BlockNumber(hash, response_channel) => { + let _timer = subsystem.metrics.time_block_number(); let result = subsystem.client.number(hash).map_err(|e| e.to_string().into()); subsystem.metrics.on_request(result.is_ok()); let _ = response_channel.send(result); }, + ChainApiMessage::BlockHeader(hash, response_channel) => { + let _timer = subsystem.metrics.time_block_header(); + let result = subsystem.client + .header(BlockId::Hash(hash)) + .map_err(|e| e.to_string().into()); + subsystem.metrics.on_request(result.is_ok()); + let _ = response_channel.send(result); + }, ChainApiMessage::FinalizedBlockHash(number, response_channel) => { + let _timer = subsystem.metrics.time_finalized_block_hash(); // Note: we don't verify it's finalized let result = subsystem.client.hash(number).map_err(|e| e.to_string().into()); subsystem.metrics.on_request(result.is_ok()); let _ = response_channel.send(result); }, ChainApiMessage::FinalizedBlockNumber(response_channel) => { + let _timer = subsystem.metrics.time_finalized_block_number(); let result = subsystem.client.info().finalized_number; // always succeeds subsystem.metrics.on_request(true); let _ = response_channel.send(Ok(result)); }, ChainApiMessage::Ancestors { hash, k, response_channel } => { + let _timer = subsystem.metrics.time_ancestors(); + tracing::span!(tracing::Level::TRACE, "ChainApiMessage::Ancestors", subsystem=LOG_TARGET, hash=%hash, k=k); + let mut hash = hash; let next_parent = core::iter::from_fn(|| { let maybe_header = subsystem.client.header(BlockId::Hash(hash)); match maybe_header { // propagate the error - Err(e) => Some(Err(e.to_string().into())), + Err(e) => { + let e = e.to_string().into(); + Some(Err(e)) + }, // fewer than `k` ancestors are available Ok(None) => None, Ok(Some(header)) => { - hash = header.parent_hash; - Some(Ok(hash)) + // stop at the genesis header. + if header.number == 1 { + None + } else { + hash = header.parent_hash; + Some(Ok(hash)) + } } } }); @@ -126,6 +159,11 @@ where #[derive(Clone)] struct MetricsInner { chain_api_requests: prometheus::CounterVec, + block_number: prometheus::Histogram, + block_header: prometheus::Histogram, + finalized_block_hash: prometheus::Histogram, + finalized_block_number: prometheus::Histogram, + ancestors: prometheus::Histogram, } /// Chain API metrics. @@ -142,6 +180,31 @@ impl Metrics { } } } + + /// Provide a timer for `block_number` which observes on drop. + fn time_block_number(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.block_number.start_timer()) + } + + /// Provide a timer for `block_header` which observes on drop. + fn time_block_header(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.block_header.start_timer()) + } + + /// Provide a timer for `finalized_block_hash` which observes on drop. + fn time_finalized_block_hash(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.finalized_block_hash.start_timer()) + } + + /// Provide a timer for `finalized_block_number` which observes on drop. + fn time_finalized_block_number(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.finalized_block_number.start_timer()) + } + + /// Provide a timer for `ancestors` which observes on drop. + fn time_ancestors(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.ancestors.start_timer()) + } } impl metrics::Metrics for Metrics { @@ -153,7 +216,52 @@ impl metrics::Metrics for Metrics { "parachain_chain_api_requests_total", "Number of Chain API requests served.", ), - &["succeeded", "failed"], + &["success"], + )?, + registry, + )?, + block_number: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_chain_api_block_number", + "Time spent within `chain_api::block_number`", + ) + )?, + registry, + )?, + block_header: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_chain_api_block_headers", + "Time spent within `chain_api::block_headers`", + ) + )?, + registry, + )?, + finalized_block_hash: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_chain_api_finalized_block_hash", + "Time spent within `chain_api::finalized_block_hash`", + ) + )?, + registry, + )?, + finalized_block_number: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_chain_api_finalized_block_number", + "Time spent within `chain_api::finalized_block_number`", + ) + )?, + registry, + )?, + ancestors: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_chain_api_ancestors", + "Time spent within `chain_api::ancestors`", + ) )?, registry, )?, @@ -282,11 +390,11 @@ mod tests { } fn test_harness( - test: impl FnOnce(TestClient, TestSubsystemContextHandle) + test: impl FnOnce(Arc, TestSubsystemContextHandle) -> BoxFuture<'static, ()>, ) { let (ctx, ctx_handle) = make_subsystem_context(TaskExecutor::new()); - let client = TestClient::default(); + let client = Arc::new(TestClient::default()); let subsystem = ChainApiSubsystem::new(client.clone(), Metrics(None)); let chain_api_task = run(ctx, subsystem).map(|x| x.unwrap()); @@ -319,6 +427,30 @@ mod tests { }) } + #[test] + fn request_block_header() { + test_harness(|client, mut sender| { + async move { + const NOT_HERE: Hash = Hash::repeat_byte(0x5); + let test_cases = [ + (TWO, client.header(BlockId::Hash(TWO)).unwrap()), + (NOT_HERE, client.header(BlockId::Hash(NOT_HERE)).unwrap()), + ]; + for (hash, expected) in &test_cases { + let (tx, rx) = oneshot::channel(); + + sender.send(FromOverseer::Communication { + msg: ChainApiMessage::BlockHeader(*hash, tx), + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), *expected); + } + + sender.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }.boxed() + }) + } + #[test] fn request_finalized_hash() { test_harness(|client, mut sender| { diff --git a/node/core/proposer/Cargo.toml b/node/core/proposer/Cargo.toml index 7cf7fc28af22253a5d6a5e789a3f266749526710..a846238c57c889a24e192f5bb22610082a5e8d0e 100644 --- a/node/core/proposer/Cargo.toml +++ b/node/core/proposer/Cargo.toml @@ -5,17 +5,15 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.4" -futures-timer = "3.0.1" -log = "0.4.8" -parity-scale-codec = "1.3.4" +futures = "0.3.8" +futures-timer = "3.0.2" +tracing = "0.1.22" polkadot-node-subsystem = { path = "../../subsystem" } polkadot-overseer = { path = "../../overseer" } polkadot-primitives = { path = "../../../primitives" } sc-basic-authorship = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -23,5 +21,4 @@ sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } -tokio-executor = { version = "0.2.0-alpha.6", features = ["blocking"] } -wasm-timer = "0.2.4" +prometheus-endpoint = { package = "substrate-prometheus-endpoint", git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/core/proposer/src/lib.rs b/node/core/proposer/src/lib.rs index 8fd432a1be90e51c94b269d09d3a1ced037454f3..3e1e2919f7af459abf0d213be4b49bc54cf6a0c0 100644 --- a/node/core/proposer/src/lib.rs +++ b/node/core/proposer/src/lib.rs @@ -1,21 +1,46 @@ +// Copyright 2020 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 . + +//! The proposer proposes new blocks to include + +#![deny(unused_crate_dependencies, unused_results)] + use futures::prelude::*; use futures::select; -use polkadot_node_subsystem::{messages::{AllMessages, ProvisionerInherentData, ProvisionerMessage}, SubsystemError}; +use polkadot_node_subsystem::{ + jaeger, + messages::{AllMessages, ProvisionerInherentData, ProvisionerMessage}, SubsystemError, +}; use polkadot_overseer::OverseerHandler; use polkadot_primitives::v1::{ Block, Hash, Header, }; use sc_block_builder::{BlockBuilderApi, BlockBuilderProvider}; +use sp_core::traits::SpawnNamed; use sp_api::{ApiExt, ProvideRuntimeApi}; use sp_blockchain::HeaderBackend; use sp_consensus::{Proposal, RecordProof}; use sp_inherents::InherentData; use sp_runtime::traits::{DigestFor, HashFor}; use sp_transaction_pool::TransactionPool; +use prometheus_endpoint::Registry as PrometheusRegistry; use std::{fmt, pin::Pin, sync::Arc, time}; /// How long proposal can take before we give up and err out -const PROPOSE_TIMEOUT: core::time::Duration = core::time::Duration::from_secs(2); +const PROPOSE_TIMEOUT: core::time::Duration = core::time::Duration::from_millis(2500); /// Custom Proposer factory for Polkadot pub struct ProposerFactory { @@ -25,15 +50,18 @@ pub struct ProposerFactory { impl ProposerFactory { pub fn new( + spawn_handle: impl SpawnNamed + 'static, client: Arc, transaction_pool: Arc, overseer: OverseerHandler, + prometheus: Option<&PrometheusRegistry>, ) -> Self { ProposerFactory { inner: sc_basic_authorship::ProposerFactory::new( + spawn_handle, client, transaction_pool, - None, + prometheus, ), overseer, } @@ -70,11 +98,13 @@ where // data to be moved into the future let overseer = self.overseer.clone(); let parent_header_hash = parent_header.hash(); + let parent_header = parent_header.clone(); async move { Ok(Proposer { inner: proposer?, overseer, + parent_header, parent_header_hash, }) }.boxed() @@ -88,6 +118,7 @@ where pub struct Proposer, Backend, Client> { inner: sc_basic_authorship::Proposer, overseer: OverseerHandler, + parent_header: Header, parent_header_hash: Hash, } @@ -111,38 +142,29 @@ where /// Get provisioner inherent data /// /// This function has a constant timeout: `PROPOSE_TIMEOUT`. - fn get_provisioner_data(&self) -> impl Future> { + async fn get_provisioner_data(&self) -> Result { // clone this (lightweight) data because we're going to move it into the future let mut overseer = self.overseer.clone(); let parent_header_hash = self.parent_header_hash.clone(); - let mut provisioner_inherent_data = async move { + let pid = async { let (sender, receiver) = futures::channel::oneshot::channel(); - - overseer.wait_for_activation(parent_header_hash, sender).await?; - receiver.await.map_err(Error::ClosedChannelFromProvisioner)?; + overseer.wait_for_activation(parent_header_hash, sender).await; + receiver.await.map_err(|_| Error::ClosedChannelAwaitingActivation)??; let (sender, receiver) = futures::channel::oneshot::channel(); - // strictly speaking, we don't _have_ to .await this send_msg before opening the - // receiver; it's possible that the response there would be ready slightly before - // this call completes. IMO it's not worth the hassle or overhead of spawning a - // distinct task for that kind of miniscule efficiency improvement. overseer.send_msg(AllMessages::Provisioner( ProvisionerMessage::RequestInherentData(parent_header_hash, sender), - )).await?; + )).await; - receiver.await.map_err(Error::ClosedChannelFromProvisioner) - } - .boxed() - .fuse(); + receiver.await.map_err(|_| Error::ClosedChannelAwaitingInherentData) + }; - let mut timeout = wasm_timer::Delay::new(PROPOSE_TIMEOUT).fuse(); + let mut timeout = futures_timer::Delay::new(PROPOSE_TIMEOUT).fuse(); - async move { - select! { - pid = provisioner_inherent_data => pid, - _ = timeout => Err(Error::Timeout), - } + select! { + pid = pid.fuse() => pid, + _ = timeout => Err(Error::Timeout), } } } @@ -176,22 +198,31 @@ where max_duration: time::Duration, record_proof: RecordProof, ) -> Self::Proposal { - let provisioner_data = self.get_provisioner_data(); - async move { - let provisioner_data = match provisioner_data.await { + let span = jaeger::hash_span(&self.parent_header_hash, "propose"); + let _span = span.child("get-provisioner"); + + let provisioner_data = match self.get_provisioner_data().await { Ok(pd) => pd, Err(err) => { - log::warn!("could not get provisioner inherent data; injecting default data: {}", err); + tracing::warn!(err = ?err, "could not get provisioner inherent data; injecting default data"); Default::default() } }; + drop(_span); + + let inclusion_inherent_data = ( + provisioner_data.0, + provisioner_data.1, + self.parent_header, + ); inherent_data.put_data( polkadot_primitives::v1::INCLUSION_INHERENT_IDENTIFIER, - &provisioner_data, + &inclusion_inherent_data, )?; + let _span = span.child("authorship-propose"); self.inner .propose(inherent_data, inherent_digests, max_duration, record_proof) .await @@ -203,7 +234,7 @@ where // It would have been more ergonomic to use thiserror to derive the // From implementations, Display, and std::error::Error, but unfortunately -// two of the wrapped errors (sp_inherents::Error, SubsystemError) also +// one of the wrapped errors (sp_inherents::Error) also // don't impl std::error::Error, which breaks the thiserror derive. #[derive(Debug)] pub enum Error { @@ -211,7 +242,8 @@ pub enum Error { Blockchain(sp_blockchain::Error), Inherent(sp_inherents::Error), Timeout, - ClosedChannelFromProvisioner(futures::channel::oneshot::Canceled), + ClosedChannelAwaitingActivation, + ClosedChannelAwaitingInherentData, Subsystem(SubsystemError) } @@ -246,7 +278,8 @@ impl fmt::Display for Error { Self::Blockchain(err) => write!(f, "blockchain error: {}", err), Self::Inherent(err) => write!(f, "inherent error: {:?}", err), Self::Timeout => write!(f, "timeout: provisioner did not return inherent data after {:?}", PROPOSE_TIMEOUT), - Self::ClosedChannelFromProvisioner(err) => write!(f, "provisioner closed inherent data channel before sending: {}", err), + Self::ClosedChannelAwaitingActivation => write!(f, "closed channel from overseer when awaiting activation"), + Self::ClosedChannelAwaitingInherentData => write!(f, "closed channel from provisioner when awaiting inherent data"), Self::Subsystem(err) => write!(f, "subsystem error: {:?}", err), } } @@ -257,7 +290,7 @@ impl std::error::Error for Error { match self { Self::Consensus(err) => Some(err), Self::Blockchain(err) => Some(err), - Self::ClosedChannelFromProvisioner(err) => Some(err), + Self::Subsystem(err) => Some(err), _ => None } } diff --git a/node/core/provisioner/Cargo.toml b/node/core/provisioner/Cargo.toml index c391f8e45a77ddd1a67c305c3afc69b83f92b47d..65d3b445a9746f82588e985a83b711d07d628bf9 100644 --- a/node/core/provisioner/Cargo.toml +++ b/node/core/provisioner/Cargo.toml @@ -6,14 +6,15 @@ edition = "2018" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -derive_more = "0.99.9" -futures = "0.3.5" -log = "0.4.8" +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" +thiserror = "1.0.23" polkadot-primitives = { path = "../../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } +futures-timer = "3.0.2" [dev-dependencies] -lazy_static = "1.4" -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -tokio = "0.2" +sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/core/provisioner/src/lib.rs b/node/core/provisioner/src/lib.rs index 24254734289bd9c6f00f6d44158bb56298f5d8c1..4cb3475fdd52269be3aa62d0f53c1804d7b6862b 100644 --- a/node/core/provisioner/src/lib.rs +++ b/node/core/provisioner/src/lib.rs @@ -17,7 +17,7 @@ //! The provisioner is responsible for assembling a relay chain block //! from a set of available parachain candidates of its choice. -#![deny(missing_docs)] +#![deny(missing_docs, unused_crate_dependencies)] use bitvec::vec::BitVec; use futures::{ @@ -25,114 +25,111 @@ use futures::{ prelude::*, }; use polkadot_node_subsystem::{ - errors::{ChainApiError, RuntimeApiError}, + errors::{ChainApiError, RuntimeApiError}, PerLeafSpan, JaegerSpan, messages::{ - AllMessages, ChainApiMessage, ProvisionableData, ProvisionerInherentData, - ProvisionerMessage, RuntimeApiMessage, + AllMessages, CandidateBackingMessage, ChainApiMessage, ProvisionableData, ProvisionerInherentData, + ProvisionerMessage, }, - metrics::{self, prometheus}, }; use polkadot_node_subsystem_util::{ - self as util, - delegated_subsystem, - request_availability_cores, request_persisted_validation_data, JobTrait, ToJobTrait, + self as util, delegated_subsystem, FromJobCommand, + request_availability_cores, request_persisted_validation_data, JobTrait, metrics::{self, prometheus}, }; use polkadot_primitives::v1::{ - BackedCandidate, BlockNumber, CoreState, Hash, OccupiedCoreAssumption, - SignedAvailabilityBitfield, + BackedCandidate, BlockNumber, CandidateReceipt, CoreState, Hash, OccupiedCoreAssumption, + SignedAvailabilityBitfield, ValidatorIndex, }; -use std::{collections::HashMap, convert::TryFrom, pin::Pin}; +use std::{pin::Pin, collections::BTreeMap, sync::Arc}; +use thiserror::Error; +use futures_timer::Delay; -struct ProvisioningJob { - relay_parent: Hash, - sender: mpsc::Sender, - receiver: mpsc::Receiver, - provisionable_data_channels: Vec>, - backed_candidates: Vec, - signed_bitfields: Vec, - metrics: Metrics, -} +/// How long to wait before proposing. +const PRE_PROPOSE_TIMEOUT: std::time::Duration = core::time::Duration::from_millis(2000); + +const LOG_TARGET: &str = "provisioner"; -/// This enum defines the messages that the provisioner is prepared to receive. -pub enum ToJob { - /// The provisioner message is the main input to the provisioner. - Provisioner(ProvisionerMessage), - /// This message indicates that the provisioner should shut itself down. - Stop, +enum InherentAfter { + Ready, + Wait(Delay), } -impl ToJobTrait for ToJob { - const STOP: Self = Self::Stop; +impl InherentAfter { + fn new_from_now() -> Self { + InherentAfter::Wait(Delay::new(PRE_PROPOSE_TIMEOUT)) + } - fn relay_parent(&self) -> Option { - match self { - Self::Provisioner(pm) => pm.relay_parent(), - Self::Stop => None, + fn is_ready(&self) -> bool { + match *self { + InherentAfter::Ready => true, + InherentAfter::Wait(_) => false, } } -} -impl TryFrom for ToJob { - type Error = (); - - fn try_from(msg: AllMessages) -> Result { - match msg { - AllMessages::Provisioner(pm) => Ok(Self::Provisioner(pm)), - _ => Err(()), + async fn ready(&mut self) { + match *self { + InherentAfter::Ready => { + // Make sure we never end the returned future. + // This is required because the `select!` that calls this future will end in a busy loop. + futures::pending!() + }, + InherentAfter::Wait(ref mut d) => { + d.await; + *self = InherentAfter::Ready; + }, } } } -impl From for ToJob { - fn from(pm: ProvisionerMessage) -> Self { - Self::Provisioner(pm) - } +struct ProvisioningJob { + relay_parent: Hash, + sender: mpsc::Sender, + receiver: mpsc::Receiver, + provisionable_data_channels: Vec>, + backed_candidates: Vec, + signed_bitfields: Vec, + metrics: Metrics, + inherent_after: InherentAfter, + awaiting_inherent: Vec> } -enum FromJob { - ChainApi(ChainApiMessage), - Runtime(RuntimeApiMessage), -} +#[derive(Debug, Error)] +enum Error { + #[error(transparent)] + Util(#[from] util::Error), -impl From for AllMessages { - fn from(from_job: FromJob) -> AllMessages { - match from_job { - FromJob::ChainApi(cam) => AllMessages::ChainApi(cam), - FromJob::Runtime(ram) => AllMessages::RuntimeApi(ram), - } - } -} + #[error("failed to get availability cores")] + CanceledAvailabilityCores(#[source] oneshot::Canceled), -impl TryFrom for FromJob { - type Error = (); + #[error("failed to get persisted validation data")] + CanceledPersistedValidationData(#[source] oneshot::Canceled), - fn try_from(msg: AllMessages) -> Result { - match msg { - AllMessages::ChainApi(chain) => Ok(FromJob::ChainApi(chain)), - AllMessages::RuntimeApi(runtime) => Ok(FromJob::Runtime(runtime)), - _ => Err(()), - } - } -} + #[error("failed to get block number")] + CanceledBlockNumber(#[source] oneshot::Canceled), -#[derive(Debug, derive_more::From)] -enum Error { - #[from] - Sending(mpsc::SendError), - #[from] - Util(util::Error), - #[from] - OneshotRecv(oneshot::Canceled), - #[from] - ChainApi(ChainApiError), - #[from] - Runtime(RuntimeApiError), - OneshotSend, + #[error("failed to get backed candidates")] + CanceledBackedCandidates(#[source] oneshot::Canceled), + + #[error(transparent)] + ChainApi(#[from] ChainApiError), + + #[error(transparent)] + Runtime(#[from] RuntimeApiError), + + #[error("failed to send message to ChainAPI")] + ChainApiMessageSend(#[source] mpsc::SendError), + + #[error("failed to send message to CandidateBacking to get backed candidates")] + GetBackedCandidatesSend(#[source] mpsc::SendError), + + #[error("failed to send return message with Inherents")] + InherentDataReturnChannel, + + #[error("backed candidate does not correspond to selected candidate; check logic in provisioner")] + BackedCandidateOrderingProblem, } impl JobTrait for ProvisioningJob { - type ToJob = ToJob; - type FromJob = FromJob; + type ToJob = ProvisionerMessage; type Error = Error; type RunArgs = (); type Metrics = Metrics; @@ -142,19 +139,24 @@ impl JobTrait for ProvisioningJob { /// Run a job for the parent block indicated // // this function is in charge of creating and executing the job's main loop + #[tracing::instrument(skip(span, _run_args, metrics, receiver, sender), fields(subsystem = LOG_TARGET))] fn run( relay_parent: Hash, + span: Arc, _run_args: Self::RunArgs, metrics: Self::Metrics, - receiver: mpsc::Receiver, - sender: mpsc::Sender, + receiver: mpsc::Receiver, + sender: mpsc::Sender, ) -> Pin> + Send>> { async move { - let job = ProvisioningJob::new(relay_parent, metrics, sender, receiver); - - // it isn't necessary to break run_loop into its own function, - // but it's convenient to separate the concerns in this way - job.run_loop().await + let job = ProvisioningJob::new( + relay_parent, + metrics, + sender, + receiver, + ); + + job.run_loop(PerLeafSpan::new(span, "provisioner")).await } .boxed() } @@ -164,8 +166,8 @@ impl ProvisioningJob { pub fn new( relay_parent: Hash, metrics: Metrics, - sender: mpsc::Sender, - receiver: mpsc::Receiver, + sender: mpsc::Sender, + receiver: mpsc::Receiver, ) -> Self { Self { relay_parent, @@ -175,75 +177,104 @@ impl ProvisioningJob { backed_candidates: Vec::new(), signed_bitfields: Vec::new(), metrics, + inherent_after: InherentAfter::new_from_now(), + awaiting_inherent: Vec::new(), } } - async fn run_loop(mut self) -> Result<(), Error> { - while let Some(msg) = self.receiver.next().await { - use ProvisionerMessage::{ - ProvisionableData, RequestBlockAuthorshipData, RequestInherentData, - }; - - match msg { - ToJob::Provisioner(RequestInherentData(_, return_sender)) => { - if let Err(err) = send_inherent_data( - self.relay_parent, - &self.signed_bitfields, - &self.backed_candidates, - return_sender, - self.sender.clone(), - ) - .await - { - log::warn!(target: "provisioner", "failed to assemble or send inherent data: {:?}", err); - self.metrics.on_inherent_data_request(false); - } else { - self.metrics.on_inherent_data_request(true); - } - } - ToJob::Provisioner(RequestBlockAuthorshipData(_, sender)) => { - self.provisionable_data_channels.push(sender) - } - ToJob::Provisioner(ProvisionableData(data)) => { - let mut bad_indices = Vec::new(); - for (idx, channel) in self.provisionable_data_channels.iter_mut().enumerate() { - match channel.send(data.clone()).await { - Ok(_) => {} - Err(_) => bad_indices.push(idx), + async fn run_loop(mut self, span: PerLeafSpan) -> Result<(), Error> { + use ProvisionerMessage::{ + ProvisionableData, RequestBlockAuthorshipData, RequestInherentData, + }; + loop { + futures::select! { + msg = self.receiver.next().fuse() => match msg { + Some(RequestInherentData(_, return_sender)) => { + let _span = span.child("req-inherent-data"); + let _timer = self.metrics.time_request_inherent_data(); + + if self.inherent_after.is_ready() { + self.send_inherent_data(vec![return_sender]).await; + } else { + self.awaiting_inherent.push(return_sender); } } - self.note_provisionable_data(data); - - // clean up our list of channels by removing the bad indices - // start by reversing it for efficient pop - bad_indices.reverse(); - // Vec::retain would be nicer here, but it doesn't provide - // an easy API for retaining by index, so we re-collect instead. - self.provisionable_data_channels = self - .provisionable_data_channels - .into_iter() - .enumerate() - .filter(|(idx, _)| { - if bad_indices.is_empty() { - return true; - } - let tail = bad_indices[bad_indices.len() - 1]; - let retain = *idx != tail; - if *idx >= tail { - bad_indices.pop(); + Some(RequestBlockAuthorshipData(_, sender)) => { + let _span = span.child("req-block-authorship"); + self.provisionable_data_channels.push(sender) + } + Some(ProvisionableData(_, data)) => { + let _span = span.child("provisionable-data"); + let _timer = self.metrics.time_provisionable_data(); + + let mut bad_indices = Vec::new(); + for (idx, channel) in self.provisionable_data_channels.iter_mut().enumerate() { + match channel.send(data.clone()).await { + Ok(_) => {} + Err(_) => bad_indices.push(idx), } - retain - }) - .map(|(_, item)| item) - .collect(); + } + self.note_provisionable_data(data); + + // clean up our list of channels by removing the bad indices + // start by reversing it for efficient pop + bad_indices.reverse(); + // Vec::retain would be nicer here, but it doesn't provide + // an easy API for retaining by index, so we re-collect instead. + self.provisionable_data_channels = self + .provisionable_data_channels + .into_iter() + .enumerate() + .filter(|(idx, _)| { + if bad_indices.is_empty() { + return true; + } + let tail = bad_indices[bad_indices.len() - 1]; + let retain = *idx != tail; + if *idx >= tail { + let _ = bad_indices.pop(); + } + retain + }) + .map(|(_, item)| item) + .collect(); + } + None => break, + }, + _ = self.inherent_after.ready().fuse() => { + let _span = span.child("send-inherent-data"); + let return_senders = std::mem::take(&mut self.awaiting_inherent); + if !return_senders.is_empty() { + self.send_inherent_data(return_senders).await; + } } - ToJob::Stop => break, } } Ok(()) } + async fn send_inherent_data( + &mut self, + return_senders: Vec>, + ) { + if let Err(err) = send_inherent_data( + self.relay_parent, + &self.signed_bitfields, + &self.backed_candidates, + return_senders, + &mut self.sender, + ) + .await + { + tracing::warn!(target: LOG_TARGET, err = ?err, "failed to assemble or send inherent data"); + self.metrics.on_inherent_data_request(Err(())); + } else { + self.metrics.on_inherent_data_request(Ok(())); + } + } + + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] fn note_provisionable_data(&mut self, provisionable_data: ProvisionableData) { match provisionable_data { ProvisionableData::Bitfield(_, signed_bitfield) => { @@ -259,33 +290,34 @@ impl ProvisioningJob { type CoreAvailability = BitVec; -// The provisioner is the subsystem best suited to choosing which specific -// backed candidates and availability bitfields should be assembled into the -// block. To engage this functionality, a -// `ProvisionerMessage::RequestInherentData` is sent; the response is a set of -// non-conflicting candidates and the appropriate bitfields. Non-conflicting -// means that there are never two distinct parachain candidates included for -// the same parachain and that new parachain candidates cannot be included -// until the previous one either gets declared available or expired. -// -// The main complication here is going to be around handling -// occupied-core-assumptions. We might have candidates that are only -// includable when some bitfields are included. And we might have candidates -// that are not includable when certain bitfields are included. -// -// When we're choosing bitfields to include, the rule should be simple: -// maximize availability. So basically, include all bitfields. And then -// choose a coherent set of candidates along with that. +/// The provisioner is the subsystem best suited to choosing which specific +/// backed candidates and availability bitfields should be assembled into the +/// block. To engage this functionality, a +/// `ProvisionerMessage::RequestInherentData` is sent; the response is a set of +/// non-conflicting candidates and the appropriate bitfields. Non-conflicting +/// means that there are never two distinct parachain candidates included for +/// the same parachain and that new parachain candidates cannot be included +/// until the previous one either gets declared available or expired. +/// +/// The main complication here is going to be around handling +/// occupied-core-assumptions. We might have candidates that are only +/// includable when some bitfields are included. And we might have candidates +/// that are not includable when certain bitfields are included. +/// +/// When we're choosing bitfields to include, the rule should be simple: +/// maximize availability. So basically, include all bitfields. And then +/// choose a coherent set of candidates along with that. +#[tracing::instrument(level = "trace", skip(return_senders, from_job), fields(subsystem = LOG_TARGET))] async fn send_inherent_data( relay_parent: Hash, bitfields: &[SignedAvailabilityBitfield], - candidates: &[BackedCandidate], - return_sender: oneshot::Sender, - mut from_job: mpsc::Sender, + candidates: &[CandidateReceipt], + return_senders: Vec>, + from_job: &mut mpsc::Sender, ) -> Result<(), Error> { - let availability_cores = request_availability_cores(relay_parent, &mut from_job) + let availability_cores = request_availability_cores(relay_parent, from_job) .await? - .await??; + .await.map_err(|err| Error::CanceledAvailabilityCores(err))??; let bitfields = select_availability_bitfields(&availability_cores, bitfields); let candidates = select_candidates( @@ -293,64 +325,67 @@ async fn send_inherent_data( &bitfields, candidates, relay_parent, - &mut from_job, + from_job, ) .await?; - return_sender - .send((bitfields, candidates)) - .map_err(|_| Error::OneshotSend)?; + let res = (bitfields, candidates); + for return_sender in return_senders { + return_sender.send(res.clone()).map_err(|_data| Error::InherentDataReturnChannel)?; + } + Ok(()) } -// in general, we want to pick all the bitfields. However, we have the following constraints: -// -// - not more than one per validator -// - each must correspond to an occupied core -// -// If we have too many, an arbitrary selection policy is fine. For purposes of maximizing availability, -// we pick the one with the greatest number of 1 bits. -// -// note: this does not enforce any sorting precondition on the output; the ordering there will be unrelated -// to the sorting of the input. +/// In general, we want to pick all the bitfields. However, we have the following constraints: +/// +/// - not more than one per validator +/// - each 1 bit must correspond to an occupied core +/// +/// If we have too many, an arbitrary selection policy is fine. For purposes of maximizing availability, +/// we pick the one with the greatest number of 1 bits. +/// +/// Note: This does not enforce any sorting precondition on the output; the ordering there will be unrelated +/// to the sorting of the input. +#[tracing::instrument(level = "trace", fields(subsystem = LOG_TARGET))] fn select_availability_bitfields( cores: &[CoreState], bitfields: &[SignedAvailabilityBitfield], ) -> Vec { - let mut fields_by_core: HashMap<_, Vec<_>> = HashMap::new(); - for bitfield in bitfields.iter() { - let core_idx = bitfield.validator_index() as usize; - if let CoreState::Occupied(_) = cores[core_idx] { - fields_by_core - .entry(core_idx) - // there cannot be a value list in field_by_core with len < 1 - .or_default() - .push(bitfield.clone()); + let mut selected: BTreeMap = BTreeMap::new(); + + 'a: + for bitfield in bitfields.iter().cloned() { + if bitfield.payload().0.len() != cores.len() { + continue } - } - let mut out = Vec::with_capacity(fields_by_core.len()); - for (_, core_bitfields) in fields_by_core.iter_mut() { - core_bitfields.sort_by_key(|bitfield| bitfield.payload().0.count_ones()); - out.push( - core_bitfields - .pop() - .expect("every core bitfield has at least 1 member; qed"), - ); + let is_better = selected.get(&bitfield.validator_index()) + .map_or(true, |b| b.payload().0.count_ones() < bitfield.payload().0.count_ones()); + + if !is_better { continue } + + for (idx, _) in cores.iter().enumerate().filter(|v| !v.1.is_occupied()) { + // Bit is set for an unoccupied core - invalid + if *bitfield.payload().0.get(idx).unwrap_or(&false) { + continue 'a + } + } + + let _ = selected.insert(bitfield.validator_index(), bitfield); } - out + selected.into_iter().map(|(_, b)| b).collect() } -// determine which cores are free, and then to the degree possible, pick a candidate appropriate to each free core. -// -// follow the candidate selection algorithm from the guide +/// Determine which cores are free, and then to the degree possible, pick a candidate appropriate to each free core. +#[tracing::instrument(level = "trace", skip(sender), fields(subsystem = LOG_TARGET))] async fn select_candidates( availability_cores: &[CoreState], bitfields: &[SignedAvailabilityBitfield], - candidates: &[BackedCandidate], + candidates: &[CandidateReceipt], relay_parent: Hash, - sender: &mut mpsc::Sender, + sender: &mut mpsc::Sender, ) -> Result, Error> { let block_number = get_block_number_under_construction(relay_parent, sender).await?; @@ -361,8 +396,7 @@ async fn select_candidates( let (scheduled_core, assumption) = match core { CoreState::Scheduled(scheduled_core) => (scheduled_core, OccupiedCoreAssumption::Free), CoreState::Occupied(occupied_core) => { - if bitfields_indicate_availability(core_idx, bitfields, &occupied_core.availability) - { + if bitfields_indicate_availability(core_idx, bitfields, &occupied_core.availability) { if let Some(ref scheduled_core) = occupied_core.next_up_on_available { (scheduled_core, OccupiedCoreAssumption::Included) } else { @@ -389,7 +423,7 @@ async fn select_candidates( sender, ) .await? - .await?? + .await.map_err(|err| Error::CanceledPersistedValidationData(err))?? { Some(v) => v, None => continue, @@ -399,51 +433,77 @@ async fn select_candidates( // we arbitrarily pick the first of the backed candidates which match the appropriate selection criteria if let Some(candidate) = candidates.iter().find(|backed_candidate| { - let descriptor = &backed_candidate.candidate.descriptor; + let descriptor = &backed_candidate.descriptor; descriptor.para_id == scheduled_core.para_id && descriptor.persisted_validation_data_hash == computed_validation_data_hash }) { - selected_candidates.push(candidate.clone()); + selected_candidates.push(candidate.hash()); } } - Ok(selected_candidates) + // now get the backed candidates corresponding to these candidate receipts + let (tx, rx) = oneshot::channel(); + sender.send(AllMessages::CandidateBacking(CandidateBackingMessage::GetBackedCandidates( + relay_parent, + selected_candidates.clone(), + tx, + )).into()).await.map_err(|err| Error::GetBackedCandidatesSend(err))?; + let candidates = rx.await.map_err(|err| Error::CanceledBackedCandidates(err))?; + + // `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 == candidates.get(backed_idx).ok_or(Error::BackedCandidateOrderingProblem)?.hash() { + backed_idx += 1; + } + } + if candidates.len() != backed_idx { + Err(Error::BackedCandidateOrderingProblem)?; + } + + Ok(candidates) } -// produces a block number 1 higher than that of the relay parent -// in the event of an invalid `relay_parent`, returns `Ok(0)` +/// Produces a block number 1 higher than that of the relay parent +/// in the event of an invalid `relay_parent`, returns `Ok(0)` +#[tracing::instrument(level = "trace", skip(sender), fields(subsystem = LOG_TARGET))] async fn get_block_number_under_construction( relay_parent: Hash, - sender: &mut mpsc::Sender, + sender: &mut mpsc::Sender, ) -> Result { let (tx, rx) = oneshot::channel(); sender - .send(FromJob::ChainApi(ChainApiMessage::BlockNumber( + .send(AllMessages::from(ChainApiMessage::BlockNumber( relay_parent, tx, - ))) + )).into()) .await - .map_err(|_| Error::OneshotSend)?; - match rx.await? { + .map_err(|e| Error::ChainApiMessageSend(e))?; + match rx.await.map_err(|err| Error::CanceledBlockNumber(err))? { Ok(Some(n)) => Ok(n + 1), Ok(None) => Ok(0), Err(err) => Err(err.into()), } } -// the availability bitfield for a given core is the transpose -// of a set of signed availability bitfields. It goes like this: -// -// - construct a transverse slice along `core_idx` -// - bitwise-or it with the availability slice -// - count the 1 bits, compare to the total length; true on 2/3+ +/// The availability bitfield for a given core is the transpose +/// of a set of signed availability bitfields. It goes like this: +/// +/// - construct a transverse slice along `core_idx` +/// - bitwise-or it with the availability slice +/// - count the 1 bits, compare to the total length; true on 2/3+ +#[tracing::instrument(level = "trace", fields(subsystem = LOG_TARGET))] fn bitfields_indicate_availability( core_idx: usize, bitfields: &[SignedAvailabilityBitfield], availability: &CoreAvailability, ) -> bool { let mut availability = availability.clone(); - // we need to pre-compute this to avoid a borrow-immutable-while-borrowing-mutable error in the error message let availability_len = availability.len(); for bitfield in bitfields { @@ -453,34 +513,54 @@ fn bitfields_indicate_availability( // in principle, this function might return a `Result` so that we can more clearly express this error condition // however, in practice, that would just push off an error-handling routine which would look a whole lot like this one. // simpler to just handle the error internally here. - log::warn!(target: "provisioner", "attempted to set a transverse bit at idx {} which is greater than bitfield size {}", validator_idx, availability_len); + tracing::warn!( + target: LOG_TARGET, + validator_idx = %validator_idx, + availability_len = %availability_len, + "attempted to set a transverse bit at idx {} which is greater than bitfield size {}", + validator_idx, + availability_len, + ); + return false; } Some(mut bit_mut) => *bit_mut |= bitfield.payload().0[core_idx], } } + 3 * availability.count_ones() >= 2 * availability.len() } #[derive(Clone)] struct MetricsInner { inherent_data_requests: prometheus::CounterVec, + request_inherent_data: prometheus::Histogram, + provisionable_data: prometheus::Histogram, } -/// Candidate backing metrics. +/// Provisioner metrics. #[derive(Default, Clone)] pub struct Metrics(Option); impl Metrics { - fn on_inherent_data_request(&self, succeeded: bool) { + fn on_inherent_data_request(&self, response: Result<(), ()>) { if let Some(metrics) = &self.0 { - if succeeded { - metrics.inherent_data_requests.with_label_values(&["succeded"]).inc(); - } else { - metrics.inherent_data_requests.with_label_values(&["failed"]).inc(); + match response { + Ok(()) => metrics.inherent_data_requests.with_label_values(&["succeeded"]).inc(), + Err(()) => metrics.inherent_data_requests.with_label_values(&["failed"]).inc(), } } } + + /// Provide a timer for `request_inherent_data` which observes on drop. + fn time_request_inherent_data(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.request_inherent_data.start_timer()) + } + + /// Provide a timer for `provisionable_data` which observes on drop. + fn time_provisionable_data(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.provisionable_data.start_timer()) + } } impl metrics::Metrics for Metrics { @@ -492,7 +572,25 @@ impl metrics::Metrics for Metrics { "parachain_inherent_data_requests_total", "Number of InherentData requests served by provisioner.", ), - &["succeeded", "failed"], + &["success"], + )?, + registry, + )?, + request_inherent_data: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_provisioner_request_inherent_data", + "Time spent within `provisioner::request_inherent_data`", + ) + )?, + registry, + )?, + provisionable_data: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_provisioner_provisionable_data", + "Time spent within `provisioner::provisionable_data`", + ) )?, registry, )?, @@ -502,375 +600,7 @@ impl metrics::Metrics for Metrics { } -delegated_subsystem!(ProvisioningJob((), Metrics) <- ToJob as ProvisioningSubsystem); +delegated_subsystem!(ProvisioningJob((), Metrics) <- ProvisionerMessage as ProvisioningSubsystem); #[cfg(test)] -mod tests { - use super::*; - use bitvec::bitvec; - use polkadot_primitives::v1::{OccupiedCore, ScheduledCore}; - - pub fn occupied_core(para_id: u32) -> CoreState { - CoreState::Occupied(OccupiedCore { - para_id: para_id.into(), - group_responsible: para_id.into(), - next_up_on_available: None, - occupied_since: 100_u32, - time_out_at: 200_u32, - next_up_on_time_out: None, - availability: default_bitvec(), - }) - } - - pub fn build_occupied_core(para_id: u32, builder: Builder) -> CoreState - where - Builder: FnOnce(&mut OccupiedCore), - { - let mut core = match occupied_core(para_id) { - CoreState::Occupied(core) => core, - _ => unreachable!(), - }; - - builder(&mut core); - - CoreState::Occupied(core) - } - - pub fn default_bitvec() -> CoreAvailability { - bitvec![bitvec::order::Lsb0, u8; 0; 32] - } - - pub fn scheduled_core(id: u32) -> ScheduledCore { - ScheduledCore { - para_id: id.into(), - ..Default::default() - } - } - - mod select_availability_bitfields { - use super::super::*; - use super::{default_bitvec, occupied_core}; - use lazy_static::lazy_static; - use polkadot_primitives::v1::{SigningContext, ValidatorIndex, ValidatorPair}; - use sp_core::crypto::Pair; - use std::sync::Mutex; - - lazy_static! { - // we can use a normal mutex here, not a futures-aware one, because we don't use any futures-based - // concurrency when accessing this. The risk of contention is that multiple tests are run in parallel, - // in independent threads, in which case a standard mutex suffices. - static ref VALIDATORS: Mutex> = Mutex::new(HashMap::new()); - } - - fn signed_bitfield( - field: CoreAvailability, - validator_idx: ValidatorIndex, - ) -> SignedAvailabilityBitfield { - let mut lock = VALIDATORS.lock().unwrap(); - let validator = lock - .entry(validator_idx) - .or_insert_with(|| ValidatorPair::generate().0); - SignedAvailabilityBitfield::sign( - field.into(), - &>::default(), - validator_idx, - validator, - ) - } - - #[test] - fn not_more_than_one_per_validator() { - let bitvec = default_bitvec(); - - let cores = vec![occupied_core(0), occupied_core(1)]; - - // we pass in three bitfields with two validators - // this helps us check the postcondition that we get two bitfields back, for which the validators differ - let bitfields = vec![ - signed_bitfield(bitvec.clone(), 0), - signed_bitfield(bitvec.clone(), 1), - signed_bitfield(bitvec, 1), - ]; - - let mut selected_bitfields = select_availability_bitfields(&cores, &bitfields); - selected_bitfields.sort_by_key(|bitfield| bitfield.validator_index()); - - assert_eq!(selected_bitfields.len(), 2); - assert_eq!(selected_bitfields[0], bitfields[0]); - // we don't know which of the (otherwise equal) bitfields will be selected - assert!(selected_bitfields[1] == bitfields[1] || selected_bitfields[1] == bitfields[2]); - } - - #[test] - fn each_corresponds_to_an_occupied_core() { - let bitvec = default_bitvec(); - - let cores = vec![CoreState::Free, CoreState::Scheduled(Default::default())]; - - let bitfields = vec![ - signed_bitfield(bitvec.clone(), 0), - signed_bitfield(bitvec.clone(), 1), - signed_bitfield(bitvec, 1), - ]; - - let mut selected_bitfields = select_availability_bitfields(&cores, &bitfields); - selected_bitfields.sort_by_key(|bitfield| bitfield.validator_index()); - - // bitfields not corresponding to occupied cores are not selected - assert!(selected_bitfields.is_empty()); - } - - #[test] - fn more_set_bits_win_conflicts() { - let bitvec_zero = default_bitvec(); - let bitvec_one = { - let mut bitvec = bitvec_zero.clone(); - bitvec.set(0, true); - bitvec - }; - - let cores = vec![occupied_core(0)]; - - let bitfields = vec![ - signed_bitfield(bitvec_zero, 0), - signed_bitfield(bitvec_one.clone(), 0), - ]; - - // this test is probablistic: chances are excellent that it does what it claims to. - // it cannot fail unless things are broken. - // however, there is a (very small) chance that it passes when things are broken. - for _ in 0..64 { - let selected_bitfields = select_availability_bitfields(&cores, &bitfields); - assert_eq!(selected_bitfields.len(), 1); - assert_eq!(selected_bitfields[0].payload().0, bitvec_one); - } - } - } - - mod select_candidates { - use super::super::*; - use super::{build_occupied_core, default_bitvec, occupied_core, scheduled_core}; - use polkadot_node_subsystem::messages::RuntimeApiRequest::{ - AvailabilityCores, PersistedValidationData as PersistedValidationDataReq, - }; - use polkadot_primitives::v1::{ - BlockNumber, CandidateDescriptor, CommittedCandidateReceipt, PersistedValidationData, - }; - use FromJob::{ChainApi, Runtime}; - - const BLOCK_UNDER_PRODUCTION: BlockNumber = 128; - - fn test_harness( - overseer_factory: OverseerFactory, - test_factory: TestFactory, - ) where - OverseerFactory: FnOnce(mpsc::Receiver) -> Overseer, - Overseer: Future, - TestFactory: FnOnce(mpsc::Sender) -> Test, - Test: Future, - { - let (tx, rx) = mpsc::channel(64); - let overseer = overseer_factory(rx); - let test = test_factory(tx); - - futures::pin_mut!(overseer, test); - - tokio::runtime::Runtime::new() - .unwrap() - .block_on(future::select(overseer, test)); - } - - // For test purposes, we always return this set of availability cores: - // - // [ - // 0: Free, - // 1: Scheduled(default), - // 2: Occupied(no next_up set), - // 3: Occupied(next_up_on_available set but not available), - // 4: Occupied(next_up_on_available set and available), - // 5: Occupied(next_up_on_time_out set but not timeout), - // 6: Occupied(next_up_on_time_out set and timeout but available), - // 7: Occupied(next_up_on_time_out set and timeout and not available), - // 8: Occupied(both next_up set, available), - // 9: Occupied(both next_up set, not available, no timeout), - // 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}; - - 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(); - }), - // 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; - }), - // 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(); - }), - // 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; - }), - // 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(); - }), - ] - } - - async fn mock_overseer(mut receiver: mpsc::Receiver) { - use ChainApiMessage::BlockNumber; - use RuntimeApiMessage::Request; - - while let Some(from_job) = receiver.next().await { - match from_job { - ChainApi(BlockNumber(_relay_parent, tx)) => { - tx.send(Ok(Some(BLOCK_UNDER_PRODUCTION - 1))).unwrap() - } - Runtime(Request( - _parent_hash, - PersistedValidationDataReq(_para_id, _assumption, tx), - )) => tx.send(Ok(Some(Default::default()))).unwrap(), - Runtime(Request(_parent_hash, AvailabilityCores(tx))) => { - tx.send(Ok(mock_availability_cores())).unwrap() - } - // non-exhaustive matches are fine for testing - _ => unimplemented!(), - } - } - } - - #[test] - fn handles_overseer_failure() { - let overseer = |rx: mpsc::Receiver| async move { - // drop the receiver so it closes and the sender can't send, then just sleep long enough that - // this is almost certainly not the first of the two futures to complete - std::mem::drop(rx); - tokio::time::delay_for(std::time::Duration::from_secs(1)).await; - }; - - let test = |mut tx: mpsc::Sender| async move { - // wait so that the overseer can drop the rx before we attempt to send - tokio::time::delay_for(std::time::Duration::from_millis(50)).await; - let result = select_candidates(&[], &[], &[], Default::default(), &mut tx).await; - println!("{:?}", result); - assert!(std::matches!(result, Err(Error::OneshotSend))); - }; - - test_harness(overseer, test); - } - - #[test] - fn can_succeed() { - test_harness(mock_overseer, |mut tx: mpsc::Sender| async move { - let result = select_candidates(&[], &[], &[], Default::default(), &mut tx).await; - println!("{:?}", result); - assert!(result.is_ok()); - }) - } - - // 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 candidate_template = BackedCandidate { - candidate: CommittedCandidateReceipt { - descriptor: CandidateDescriptor { - persisted_validation_data_hash: empty_hash, - ..Default::default() - }, - ..Default::default() - }, - validity_votes: Vec::new(), - validator_indices: default_bitvec(), - }; - - let candidates: Vec<_> = std::iter::repeat(candidate_template) - .take(mock_cores.len()) - .enumerate() - .map(|(idx, mut candidate)| { - candidate.candidate.descriptor.para_id = idx.into(); - candidate - }) - .cycle() - .take(mock_cores.len() * 3) - .enumerate() - .map(|(idx, mut candidate)| { - if idx < mock_cores.len() { - // first go-around: use candidates which should work - candidate - } else if idx < mock_cores.len() * 2 { - // for the second repetition of the candidates, give them the wrong hash - candidate.candidate.descriptor.persisted_validation_data_hash - = Default::default(); - candidate - } else { - // third go-around: right hash, wrong para_id - candidate.candidate.descriptor.para_id = idx.into(); - candidate - } - }) - .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(); - - test_harness(mock_overseer, |mut tx: mpsc::Sender| async move { - let result = - select_candidates(&mock_cores, &[], &candidates, Default::default(), &mut tx) - .await; - - if result.is_err() { - println!("{:?}", result); - } - assert_eq!(result.unwrap(), expected_candidates); - }) - } - } -} +mod tests; diff --git a/node/core/provisioner/src/tests.rs b/node/core/provisioner/src/tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..f6977d69ec92a68578bc3a40a579b57284c7e759 --- /dev/null +++ b/node/core/provisioner/src/tests.rs @@ -0,0 +1,429 @@ +use super::*; +use bitvec::bitvec; +use polkadot_primitives::v1::{OccupiedCore, ScheduledCore}; + +pub fn occupied_core(para_id: u32) -> CoreState { + CoreState::Occupied(OccupiedCore { + group_responsible: para_id.into(), + next_up_on_available: None, + occupied_since: 100_u32, + time_out_at: 200_u32, + next_up_on_time_out: None, + availability: bitvec![bitvec::order::Lsb0, u8; 0; 32], + candidate_descriptor: Default::default(), + candidate_hash: Default::default(), + }) +} + +pub fn build_occupied_core(para_id: u32, builder: Builder) -> CoreState +where + Builder: FnOnce(&mut OccupiedCore), +{ + let mut core = match occupied_core(para_id) { + CoreState::Occupied(core) => core, + _ => unreachable!(), + }; + + builder(&mut core); + + CoreState::Occupied(core) +} + +pub fn default_bitvec(n_cores: usize) -> CoreAvailability { + bitvec![bitvec::order::Lsb0, u8; 0; n_cores] +} + +pub fn scheduled_core(id: u32) -> ScheduledCore { + ScheduledCore { + para_id: id.into(), + ..Default::default() + } +} + +mod select_availability_bitfields { + use super::super::*; + use super::{default_bitvec, occupied_core}; + use futures::executor::block_on; + use std::sync::Arc; + use polkadot_primitives::v1::{SigningContext, ValidatorIndex, ValidatorId}; + use sp_application_crypto::AppKey; + use sp_keystore::{CryptoStore, SyncCryptoStorePtr, testing::KeyStore}; + + async fn signed_bitfield( + keystore: &SyncCryptoStorePtr, + field: CoreAvailability, + validator_idx: ValidatorIndex, + ) -> SignedAvailabilityBitfield { + let public = CryptoStore::sr25519_generate_new(&**keystore, ValidatorId::ID, None) + .await + .expect("generated sr25519 key"); + SignedAvailabilityBitfield::sign( + &keystore, + field.into(), + &>::default(), + validator_idx, + &public.into(), + ).await.expect("Should be signed") + } + + #[test] + fn not_more_than_one_per_validator() { + let keystore: SyncCryptoStorePtr = Arc::new(KeyStore::new()); + let mut bitvec = default_bitvec(2); + bitvec.set(0, true); + bitvec.set(1, true); + + let cores = vec![occupied_core(0), occupied_core(1)]; + + // we pass in three bitfields with two validators + // this helps us check the postcondition that we get two bitfields back, for which the validators differ + let bitfields = vec![ + block_on(signed_bitfield(&keystore, bitvec.clone(), 0)), + block_on(signed_bitfield(&keystore, bitvec.clone(), 1)), + block_on(signed_bitfield(&keystore, bitvec, 1)), + ]; + + let mut selected_bitfields = select_availability_bitfields(&cores, &bitfields); + selected_bitfields.sort_by_key(|bitfield| bitfield.validator_index()); + + assert_eq!(selected_bitfields.len(), 2); + assert_eq!(selected_bitfields[0], bitfields[0]); + // we don't know which of the (otherwise equal) bitfields will be selected + assert!(selected_bitfields[1] == bitfields[1] || selected_bitfields[1] == bitfields[2]); + } + + #[test] + fn each_corresponds_to_an_occupied_core() { + let keystore: SyncCryptoStorePtr = Arc::new(KeyStore::new()); + let bitvec = default_bitvec(3); + + // invalid: bit on free core + let mut bitvec0 = bitvec.clone(); + bitvec0.set(0, true); + + // invalid: bit on scheduled core + let mut bitvec1 = bitvec.clone(); + bitvec1.set(1, true); + + // valid: bit on occupied core. + let mut bitvec2 = bitvec.clone(); + bitvec2.set(2, true); + + let cores = vec![ + CoreState::Free, + CoreState::Scheduled(Default::default()), + occupied_core(2), + ]; + + let bitfields = vec![ + block_on(signed_bitfield(&keystore, bitvec0, 0)), + block_on(signed_bitfield(&keystore, bitvec1, 1)), + block_on(signed_bitfield(&keystore, bitvec2.clone(), 2)), + ]; + + let selected_bitfields = select_availability_bitfields(&cores, &bitfields); + + // selects only the valid bitfield + assert_eq!(selected_bitfields.len(), 1); + assert_eq!(selected_bitfields[0].payload().0, bitvec2); + } + + #[test] + fn more_set_bits_win_conflicts() { + let keystore: SyncCryptoStorePtr = Arc::new(KeyStore::new()); + let mut bitvec = default_bitvec(2); + bitvec.set(0, true); + + let mut bitvec1 = bitvec.clone(); + bitvec1.set(1, true); + + let cores = vec![occupied_core(0), occupied_core(1)]; + + let bitfields = vec![ + block_on(signed_bitfield(&keystore, bitvec, 1)), + block_on(signed_bitfield(&keystore, bitvec1.clone(), 1)), + ]; + + let selected_bitfields = select_availability_bitfields(&cores, &bitfields); + assert_eq!(selected_bitfields.len(), 1); + assert_eq!(selected_bitfields[0].payload().0, bitvec1.clone()); + } + + #[test] + fn more_complex_bitfields() { + let keystore: SyncCryptoStorePtr = Arc::new(KeyStore::new()); + + let cores = vec![occupied_core(0), occupied_core(1), occupied_core(2), occupied_core(3)]; + + let mut bitvec0 = default_bitvec(4); + bitvec0.set(0, true); + bitvec0.set(2, true); + + let mut bitvec1 = default_bitvec(4); + bitvec1.set(1, true); + + let mut bitvec2 = default_bitvec(4); + bitvec2.set(2, true); + + let mut bitvec3 = default_bitvec(4); + bitvec3.set(0, true); + bitvec3.set(1, true); + bitvec3.set(2, true); + bitvec3.set(3, true); + + // these are out of order but will be selected in order. The better + // bitfield for 3 will be selected. + let bitfields = vec![ + block_on(signed_bitfield(&keystore, bitvec2.clone(), 3)), + block_on(signed_bitfield(&keystore, bitvec3.clone(), 3)), + block_on(signed_bitfield(&keystore, bitvec0.clone(), 0)), + block_on(signed_bitfield(&keystore, bitvec2.clone(), 2)), + block_on(signed_bitfield(&keystore, bitvec1.clone(), 1)), + ]; + + let selected_bitfields = select_availability_bitfields(&cores, &bitfields); + assert_eq!(selected_bitfields.len(), 4); + assert_eq!(selected_bitfields[0].payload().0, bitvec0); + assert_eq!(selected_bitfields[1].payload().0, bitvec1); + assert_eq!(selected_bitfields[2].payload().0, bitvec2); + assert_eq!(selected_bitfields[3].payload().0, bitvec3); + } +} + +mod select_candidates { + use futures_timer::Delay; + use super::super::*; + use super::{build_occupied_core, occupied_core, scheduled_core, default_bitvec}; + use polkadot_node_subsystem::messages::{ + AllMessages, RuntimeApiMessage, + RuntimeApiRequest::{AvailabilityCores, PersistedValidationData as PersistedValidationDataReq}, + }; + use polkadot_primitives::v1::{ + BlockNumber, CandidateDescriptor, PersistedValidationData, CommittedCandidateReceipt, CandidateCommitments, + }; + + const BLOCK_UNDER_PRODUCTION: BlockNumber = 128; + + fn test_harness( + overseer_factory: OverseerFactory, + test_factory: TestFactory, + ) where + OverseerFactory: FnOnce(mpsc::Receiver) -> Overseer, + Overseer: Future, + TestFactory: FnOnce(mpsc::Sender) -> Test, + Test: Future, + { + let (tx, rx) = mpsc::channel(64); + let overseer = overseer_factory(rx); + let test = test_factory(tx); + + futures::pin_mut!(overseer, test); + + let _ = futures::executor::block_on(future::select(overseer, test)); + } + + // For test purposes, we always return this set of availability cores: + // + // [ + // 0: Free, + // 1: Scheduled(default), + // 2: Occupied(no next_up set), + // 3: Occupied(next_up_on_available set but not available), + // 4: Occupied(next_up_on_available set and available), + // 5: Occupied(next_up_on_time_out set but not timeout), + // 6: Occupied(next_up_on_time_out set and timeout but available), + // 7: Occupied(next_up_on_time_out set and timeout and not available), + // 8: Occupied(both next_up set, available), + // 9: Occupied(both next_up set, not available, no timeout), + // 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}; + + 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(); + }), + // 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; + }), + // 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(); + }), + // 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; + }), + // 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(); + }), + ] + } + + async fn mock_overseer(mut receiver: mpsc::Receiver, expected: Vec) { + use ChainApiMessage::BlockNumber; + use RuntimeApiMessage::Request; + + while let Some(from_job) = receiver.next().await { + match from_job { + FromJobCommand::SendMessage(AllMessages::ChainApi(BlockNumber(_relay_parent, tx))) => { + tx.send(Ok(Some(BLOCK_UNDER_PRODUCTION - 1))).unwrap() + } + FromJobCommand::SendMessage(AllMessages::RuntimeApi(Request( + _parent_hash, + PersistedValidationDataReq(_para_id, _assumption, tx), + ))) => tx.send(Ok(Some(Default::default()))).unwrap(), + FromJobCommand::SendMessage(AllMessages::RuntimeApi(Request(_parent_hash, AvailabilityCores(tx)))) => { + tx.send(Ok(mock_availability_cores())).unwrap() + } + FromJobCommand::SendMessage( + AllMessages::CandidateBacking(CandidateBackingMessage::GetBackedCandidates(_, _, sender)) + ) => { + let _ = sender.send(expected.clone()); + } + _ => panic!("Unexpected message: {:?}", from_job), + } + } + } + + #[test] + fn handles_overseer_failure() { + let overseer = |rx: mpsc::Receiver| async move { + // drop the receiver so it closes and the sender can't send, then just sleep long enough that + // this is almost certainly not the first of the two futures to complete + std::mem::drop(rx); + Delay::new(std::time::Duration::from_secs(1)).await; + }; + + let test = |mut tx: mpsc::Sender| async move { + // wait so that the overseer can drop the rx before we attempt to send + Delay::new(std::time::Duration::from_millis(50)).await; + let result = select_candidates(&[], &[], &[], Default::default(), &mut tx).await; + println!("{:?}", result); + assert!(std::matches!(result, Err(Error::ChainApiMessageSend(_)))); + }; + + test_harness(overseer, test); + } + + #[test] + fn can_succeed() { + test_harness(|r| mock_overseer(r, Vec::new()), |mut tx: mpsc::Sender| async move { + select_candidates(&[], &[], &[], Default::default(), &mut tx).await.unwrap(); + }) + } + + // 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 n_cores = mock_cores.len(); + + let empty_hash = PersistedValidationData::::default().hash(); + + let candidate_template = CandidateReceipt { + descriptor: CandidateDescriptor { + persisted_validation_data_hash: empty_hash, + ..Default::default() + }, + 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 + }) + .cycle() + .take(mock_cores.len() * 3) + .enumerate() + .map(|(idx, mut candidate)| { + if idx < mock_cores.len() { + // first go-around: use candidates which should work + candidate + } else if idx < mock_cores.len() * 2 { + // for the second repetition of the candidates, give them the wrong hash + candidate.descriptor.persisted_validation_data_hash + = Default::default(); + candidate + } else { + // third go-around: right hash, wrong para_id + candidate.descriptor.para_id = idx.into(); + candidate + } + }) + .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(); + + let expected_backed = expected_candidates + .iter() + .map(|c| BackedCandidate { + candidate: CommittedCandidateReceipt { descriptor: c.descriptor.clone(), ..Default::default() }, + validity_votes: Vec::new(), + validator_indices: default_bitvec(n_cores), + }) + .collect(); + + test_harness(|r| mock_overseer(r, expected_backed), |mut tx: mpsc::Sender| async move { + let result = + select_candidates(&mock_cores, &[], &candidates, Default::default(), &mut tx) + .await.unwrap(); + + result.into_iter() + .for_each(|c| + assert!( + expected_candidates.iter().any(|c2| c.candidate.corresponds_to(c2)), + "Failed to find candidate: {:?}", + c, + ) + ); + }) + } +} diff --git a/node/core/runtime-api/Cargo.toml b/node/core/runtime-api/Cargo.toml index 229366627a36e0c052eda056cda29ad2d248b057..3fd5a7be016b8e981979fa494636d1ecadaecb9d 100644 --- a/node/core/runtime-api/Cargo.toml +++ b/node/core/runtime-api/Cargo.toml @@ -5,15 +5,17 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.5" +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-primitives = { path = "../../../primitives" } -polkadot-node-primitives = { path = "../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-node-subsystem-util = { path = "../../subsystem-util" } [dev-dependencies] sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -futures = { version = "0.3.5", features = ["thread-pool"] } +futures = { version = "0.3.8", features = ["thread-pool"] } polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } diff --git a/node/core/runtime-api/src/lib.rs b/node/core/runtime-api/src/lib.rs index 3c05b71dd7000405b8e711c1879f90feed2f2bc3..97e645a428a28b72ef93d955d78451a901a163a4 100644 --- a/node/core/runtime-api/src/lib.rs +++ b/node/core/runtime-api/src/lib.rs @@ -19,82 +19,163 @@ //! This provides a clean, ownerless wrapper around the parachain-related runtime APIs. This crate //! can also be used to cache responses from heavy runtime APIs. +#![deny(unused_crate_dependencies)] +#![warn(missing_docs)] + use polkadot_subsystem::{ Subsystem, SpawnedSubsystem, SubsystemResult, SubsystemContext, FromOverseer, OverseerSignal, - metrics::{self, prometheus}, -}; -use polkadot_subsystem::messages::{ - RuntimeApiMessage, RuntimeApiRequest as Request, + messages::{ + RuntimeApiMessage, RuntimeApiRequest as Request, + }, + errors::RuntimeApiError, }; -use polkadot_subsystem::errors::RuntimeApiError; +use polkadot_node_subsystem_util::metrics::{self, prometheus}; use polkadot_primitives::v1::{Block, BlockId, Hash, ParachainHost}; -use sp_api::{ProvideRuntimeApi}; +use sp_api::ProvideRuntimeApi; +use sp_core::traits::SpawnNamed; + +use futures::{prelude::*, stream::FuturesUnordered, channel::oneshot, select}; +use std::{sync::Arc, collections::VecDeque, pin::Pin}; + +const LOG_TARGET: &str = "runtime_api"; -use futures::prelude::*; +/// The number of maximum runtime api requests can be executed in parallel. Further requests will be buffered. +const MAX_PARALLEL_REQUESTS: usize = 4; + +/// The name of the blocking task that executes a runtime api request. +const API_REQUEST_TASK_NAME: &str = "polkadot-runtime-api-request"; /// The `RuntimeApiSubsystem`. See module docs for more details. pub struct RuntimeApiSubsystem { - client: Client, + client: Arc, metrics: Metrics, + spawn_handle: Box, + /// If there are [`MAX_PARALLEL_REQUESTS`] requests being executed, we buffer them in here until they can be executed. + waiting_requests: VecDeque<(Pin + Send>>, oneshot::Receiver<()>)>, + /// All the active runtime api requests that are currently being executed. + active_requests: FuturesUnordered>, } impl RuntimeApiSubsystem { /// Create a new Runtime API subsystem wrapping the given client and metrics. - pub fn new(client: Client, metrics: Metrics) -> Self { - RuntimeApiSubsystem { client, metrics } + pub fn new(client: Arc, metrics: Metrics, spawn_handle: impl SpawnNamed + 'static) -> Self { + RuntimeApiSubsystem { + client, + metrics, + spawn_handle: Box::new(spawn_handle), + waiting_requests: Default::default(), + active_requests: Default::default(), + } } } impl Subsystem for RuntimeApiSubsystem where - Client: ProvideRuntimeApi + Send + 'static, + Client: ProvideRuntimeApi + Send + 'static + Sync, Client::Api: ParachainHost, Context: SubsystemContext { - type Metrics = Metrics; - fn start(self, ctx: Context) -> SpawnedSubsystem { SpawnedSubsystem { - future: run(ctx, self).map(|_| ()).boxed(), + future: run(ctx, self).boxed(), name: "runtime-api-subsystem", } } } +impl RuntimeApiSubsystem where + Client: ProvideRuntimeApi + Send + 'static + Sync, + Client::Api: ParachainHost, +{ + /// Spawn a runtime api request. + /// + /// If there are already [`MAX_PARALLEL_REQUESTS`] requests being executed, the request will be buffered. + fn spawn_request(&mut self, relay_parent: Hash, request: Request) { + let client = self.client.clone(); + let metrics = self.metrics.clone(); + let (sender, receiver) = oneshot::channel(); + + let request = async move { + make_runtime_api_request( + client, + metrics, + relay_parent, + request, + ); + let _ = sender.send(()); + }.boxed(); + + if self.active_requests.len() >= MAX_PARALLEL_REQUESTS { + self.waiting_requests.push_back((request, receiver)); + + if self.waiting_requests.len() > MAX_PARALLEL_REQUESTS * 10 { + tracing::warn!( + target: LOG_TARGET, + "{} runtime api requests waiting to be executed.", + self.waiting_requests.len(), + ) + } + } else { + self.spawn_handle.spawn_blocking(API_REQUEST_TASK_NAME, request); + self.active_requests.push(receiver); + } + } + + /// Poll the active runtime api requests. + async fn poll_requests(&mut self) { + // If there are no active requests, this future should be pending forever. + if self.active_requests.len() == 0 { + return futures::pending!() + } + + // If there are active requests, this will always resolve to `Some(_)` when a request is finished. + let _ = self.active_requests.next().await; + + if let Some((req, recv)) = self.waiting_requests.pop_front() { + self.spawn_handle.spawn_blocking(API_REQUEST_TASK_NAME, req); + self.active_requests.push(recv); + } + } +} + +#[tracing::instrument(skip(ctx, subsystem), fields(subsystem = LOG_TARGET))] async fn run( mut ctx: impl SubsystemContext, - subsystem: RuntimeApiSubsystem, + mut subsystem: RuntimeApiSubsystem, ) -> SubsystemResult<()> where - Client: ProvideRuntimeApi, + Client: ProvideRuntimeApi + Send + Sync + 'static, Client::Api: ParachainHost, { loop { - match ctx.recv().await? { - FromOverseer::Signal(OverseerSignal::Conclude) => return Ok(()), - FromOverseer::Signal(OverseerSignal::ActiveLeaves(_)) => {}, - FromOverseer::Signal(OverseerSignal::BlockFinalized(_)) => {}, - FromOverseer::Communication { msg } => match msg { - RuntimeApiMessage::Request(relay_parent, request) => make_runtime_api_request( - &subsystem.client, - &subsystem.metrics, - relay_parent, - request, - ), - } + select! { + req = ctx.recv().fuse() => match req? { + FromOverseer::Signal(OverseerSignal::Conclude) => return Ok(()), + FromOverseer::Signal(OverseerSignal::ActiveLeaves(_)) => {}, + FromOverseer::Signal(OverseerSignal::BlockFinalized(..)) => {}, + FromOverseer::Communication { msg } => match msg { + RuntimeApiMessage::Request(relay_parent, request) => { + subsystem.spawn_request(relay_parent, request); + }, + } + }, + _ = subsystem.poll_requests().fuse() => {}, } } } +#[tracing::instrument(level = "trace", skip(client, metrics), fields(subsystem = LOG_TARGET))] fn make_runtime_api_request( - client: &Client, - metrics: &Metrics, + client: Arc, + metrics: Metrics, relay_parent: Hash, request: Request, ) where Client: ProvideRuntimeApi, Client::Api: ParachainHost, { + let _timer = metrics.time_make_runtime_api_request(); + macro_rules! query { ($api_name:ident ($($param:expr),*), $sender:expr) => {{ let sender = $sender; @@ -114,18 +195,26 @@ fn make_runtime_api_request( query!(persisted_validation_data(para, assumption), sender), Request::FullValidationData(para, assumption, sender) => query!(full_validation_data(para, assumption), sender), + Request::CheckValidationOutputs(para, commitments, sender) => + query!(check_validation_outputs(para, commitments), sender), Request::SessionIndexForChild(sender) => query!(session_index_for_child(), sender), Request::ValidationCode(para, assumption, sender) => query!(validation_code(para, assumption), sender), + Request::HistoricalValidationCode(para, at, sender) => + query!(historical_validation_code(para, at), sender), Request::CandidatePendingAvailability(para, sender) => query!(candidate_pending_availability(para), sender), Request::CandidateEvents(sender) => query!(candidate_events(), sender), + Request::SessionInfo(index, sender) => query!(session_info(index), sender), + Request::DmqContents(id, sender) => query!(dmq_contents(id), sender), + Request::InboundHrmpChannelsContents(id, sender) => query!(inbound_hrmp_channels_contents(id), sender), } } #[derive(Clone)] struct MetricsInner { chain_api_requests: prometheus::CounterVec, + make_runtime_api_request: prometheus::Histogram, } /// Runtime API metrics. @@ -142,6 +231,11 @@ impl Metrics { } } } + + /// Provide a timer for `make_runtime_api_request` which observes on drop. + fn time_make_runtime_api_request(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.make_runtime_api_request.start_timer()) + } } impl metrics::Metrics for Metrics { @@ -153,7 +247,16 @@ impl metrics::Metrics for Metrics { "parachain_runtime_api_requests_total", "Number of Runtime API requests served.", ), - &["succeeded", "failed"], + &["success"], + )?, + registry, + )?, + make_runtime_api_request: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_runtime_api_make_runtime_api_request", + "Time spent within `runtime_api::make_runtime_api_request`", + ) )?, registry, )?, @@ -169,12 +272,12 @@ mod tests { use polkadot_primitives::v1::{ ValidatorId, ValidatorIndex, GroupRotationInfo, CoreState, PersistedValidationData, Id as ParaId, OccupiedCoreAssumption, ValidationData, SessionIndex, ValidationCode, - CommittedCandidateReceipt, CandidateEvent, + CommittedCandidateReceipt, CandidateEvent, InboundDownwardMessage, + BlockNumber, InboundHrmpMessage, SessionInfo, }; use polkadot_node_subsystem_test_helpers as test_helpers; use sp_core::testing::TaskExecutor; - - use std::collections::HashMap; + use std::{collections::{HashMap, BTreeMap}, sync::{Arc, Mutex}}; use futures::channel::oneshot; #[derive(Default, Clone)] @@ -182,11 +285,17 @@ mod tests { validators: Vec, validator_groups: Vec>, availability_cores: Vec, + availability_cores_wait: Arc>, validation_data: HashMap, session_index_for_child: SessionIndex, + session_info: HashMap, validation_code: HashMap, + historical_validation_code: HashMap>, + validation_outputs_results: HashMap, candidate_pending_availability: HashMap, candidate_events: Vec, + dmq_contents: HashMap>, + hrmp_channels: HashMap>>, } impl ProvideRuntimeApi for MockRuntimeApi { @@ -199,7 +308,7 @@ mod tests { sp_api::mock_impl_runtime_apis! { impl ParachainHost for MockRuntimeApi { - type Error = String; + type Error = sp_api::ApiError; fn validators(&self) -> Vec { self.validators.clone() @@ -217,6 +326,7 @@ mod tests { } fn availability_cores(&self) -> Vec { + let _ = self.availability_cores_wait.lock().unwrap(); self.availability_cores.clone() } @@ -236,10 +346,27 @@ mod tests { self.validation_data.get(¶).map(|l| l.clone()) } + fn check_validation_outputs( + &self, + para_id: ParaId, + _commitments: polkadot_primitives::v1::CandidateCommitments, + ) -> bool { + self.validation_outputs_results + .get(¶_id) + .cloned() + .expect( + "`check_validation_outputs` called but the expected result hasn't been supplied" + ) + } + fn session_index_for_child(&self) -> SessionIndex { self.session_index_for_child.clone() } + fn session_info(&self, index: SessionIndex) -> Option { + self.session_info.get(&index).cloned() + } + fn validation_code( &self, para: ParaId, @@ -248,6 +375,19 @@ mod tests { self.validation_code.get(¶).map(|c| c.clone()) } + fn historical_validation_code( + &self, + para: ParaId, + at: BlockNumber, + ) -> Option { + self.historical_validation_code.get(¶).and_then(|h_code| { + h_code.iter() + .take_while(|(changed_at, _)| changed_at <= &at) + .last() + .map(|(_, code)| code.clone()) + }) + } + fn candidate_pending_availability( &self, para: ParaId, @@ -258,16 +398,31 @@ mod tests { fn candidate_events(&self) -> Vec { self.candidate_events.clone() } + + fn dmq_contents( + &self, + recipient: ParaId, + ) -> Vec { + self.dmq_contents.get(&recipient).map(|q| q.clone()).unwrap_or_default() + } + + fn inbound_hrmp_channels_contents( + &self, + recipient: ParaId + ) -> BTreeMap> { + self.hrmp_channels.get(&recipient).map(|q| q.clone()).unwrap_or_default() + } } } #[test] fn requests_validators() { let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); - let runtime_api = MockRuntimeApi::default(); + let runtime_api = Arc::new(MockRuntimeApi::default()); let relay_parent = [1; 32].into(); + let spawner = sp_core::testing::TaskExecutor::new(); - let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -287,10 +442,11 @@ mod tests { #[test] fn requests_validator_groups() { let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); - let runtime_api = MockRuntimeApi::default(); + let runtime_api = Arc::new(MockRuntimeApi::default()); let relay_parent = [1; 32].into(); + let spawner = sp_core::testing::TaskExecutor::new(); - let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -310,10 +466,11 @@ mod tests { #[test] fn requests_availability_cores() { let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); - let runtime_api = MockRuntimeApi::default(); + let runtime_api = Arc::new(MockRuntimeApi::default()); let relay_parent = [1; 32].into(); + let spawner = sp_core::testing::TaskExecutor::new(); - let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -333,14 +490,16 @@ mod tests { #[test] fn requests_persisted_validation_data() { let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); - let mut runtime_api = MockRuntimeApi::default(); let relay_parent = [1; 32].into(); let para_a = 5.into(); let para_b = 6.into(); + let spawner = sp_core::testing::TaskExecutor::new(); + let mut runtime_api = MockRuntimeApi::default(); runtime_api.validation_data.insert(para_a, Default::default()); + let runtime_api = Arc::new(runtime_api); - let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -373,14 +532,16 @@ mod tests { #[test] fn requests_full_validation_data() { let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); - let mut runtime_api = MockRuntimeApi::default(); let relay_parent = [1; 32].into(); let para_a = 5.into(); let para_b = 6.into(); + let spawner = sp_core::testing::TaskExecutor::new(); + let mut runtime_api = MockRuntimeApi::default(); runtime_api.validation_data.insert(para_a, Default::default()); + let runtime_api = Arc::new(runtime_api); - let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -410,13 +571,71 @@ mod tests { futures::executor::block_on(future::join(subsystem_task, test_task)); } + #[test] + fn requests_check_validation_outputs() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let mut runtime_api = MockRuntimeApi::default(); + let relay_parent = [1; 32].into(); + let para_a = 5.into(); + let para_b = 6.into(); + let commitments = polkadot_primitives::v1::CandidateCommitments::default(); + let spawner = sp_core::testing::TaskExecutor::new(); + + runtime_api.validation_outputs_results.insert(para_a, false); + runtime_api.validation_outputs_results.insert(para_b, true); + + let runtime_api = Arc::new(runtime_api); + + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::CheckValidationOutputs( + para_a, + commitments.clone(), + tx, + ), + ) + }).await; + assert_eq!( + rx.await.unwrap().unwrap(), + runtime_api.validation_outputs_results[¶_a], + ); + + let (tx, rx) = oneshot::channel(); + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::CheckValidationOutputs( + para_b, + commitments, + tx, + ), + ) + }).await; + assert_eq!( + rx.await.unwrap().unwrap(), + runtime_api.validation_outputs_results[¶_b], + ); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + #[test] fn requests_session_index_for_child() { let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); - let runtime_api = MockRuntimeApi::default(); + let runtime_api = Arc::new(MockRuntimeApi::default()); let relay_parent = [1; 32].into(); + let spawner = sp_core::testing::TaskExecutor::new(); - let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -434,16 +653,47 @@ mod tests { } #[test] - fn requests_validation_code() { + fn requests_session_info() { let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); let mut runtime_api = MockRuntimeApi::default(); + let session_index = 1; + runtime_api.session_info.insert(session_index, Default::default()); + let runtime_api = Arc::new(runtime_api); + let spawner = sp_core::testing::TaskExecutor::new(); + + let relay_parent = [1; 32].into(); + + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request(relay_parent, Request::SessionInfo(session_index, tx)) + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), Some(Default::default())); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn requests_validation_code() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let relay_parent = [1; 32].into(); let para_a = 5.into(); let para_b = 6.into(); + let spawner = sp_core::testing::TaskExecutor::new(); + let mut runtime_api = MockRuntimeApi::default(); runtime_api.validation_code.insert(para_a, Default::default()); + let runtime_api = Arc::new(runtime_api); - let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -476,14 +726,16 @@ mod tests { #[test] fn requests_candidate_pending_availability() { let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); - let mut runtime_api = MockRuntimeApi::default(); let relay_parent = [1; 32].into(); let para_a = 5.into(); let para_b = 6.into(); + let spawner = sp_core::testing::TaskExecutor::new(); + let mut runtime_api = MockRuntimeApi::default(); runtime_api.candidate_pending_availability.insert(para_a, Default::default()); + let runtime_api = Arc::new(runtime_api); - let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -517,10 +769,11 @@ mod tests { #[test] fn requests_candidate_events() { let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); - let runtime_api = MockRuntimeApi::default(); + let runtime_api = Arc::new(MockRuntimeApi::default()); let relay_parent = [1; 32].into(); + let spawner = sp_core::testing::TaskExecutor::new(); - let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None)); + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -536,4 +789,237 @@ mod tests { futures::executor::block_on(future::join(subsystem_task, test_task)); } + + #[test] + fn requests_dmq_contents() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + + let relay_parent = [1; 32].into(); + let para_a = 5.into(); + let para_b = 6.into(); + let spawner = sp_core::testing::TaskExecutor::new(); + + let runtime_api = Arc::new({ + let mut runtime_api = MockRuntimeApi::default(); + + runtime_api.dmq_contents.insert(para_a, vec![]); + runtime_api.dmq_contents.insert( + para_b, + vec![InboundDownwardMessage { + sent_at: 228, + msg: b"Novus Ordo Seclorum".to_vec(), + }], + ); + + runtime_api + }); + + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + ctx_handle + .send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request(relay_parent, Request::DmqContents(para_a, tx)), + }) + .await; + assert_eq!(rx.await.unwrap().unwrap(), vec![]); + + let (tx, rx) = oneshot::channel(); + ctx_handle + .send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request(relay_parent, Request::DmqContents(para_b, tx)), + }) + .await; + assert_eq!( + rx.await.unwrap().unwrap(), + vec![InboundDownwardMessage { + sent_at: 228, + msg: b"Novus Ordo Seclorum".to_vec(), + }] + ); + + ctx_handle + .send(FromOverseer::Signal(OverseerSignal::Conclude)) + .await; + }; + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn requests_inbound_hrmp_channels_contents() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + + let relay_parent = [1; 32].into(); + let para_a = 99.into(); + let para_b = 66.into(); + let para_c = 33.into(); + let spawner = sp_core::testing::TaskExecutor::new(); + + let para_b_inbound_channels = [ + (para_a, vec![]), + ( + para_c, + vec![InboundHrmpMessage { + sent_at: 1, + data: "𝙀=𝙈𝘾²".as_bytes().to_owned(), + }], + ), + ] + .iter() + .cloned() + .collect::>(); + + let runtime_api = Arc::new({ + let mut runtime_api = MockRuntimeApi::default(); + + runtime_api.hrmp_channels.insert(para_a, BTreeMap::new()); + runtime_api + .hrmp_channels + .insert(para_b, para_b_inbound_channels.clone()); + + runtime_api + }); + + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); + let test_task = async move { + let (tx, rx) = oneshot::channel(); + ctx_handle + .send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::InboundHrmpChannelsContents(para_a, tx), + ), + }) + .await; + assert_eq!(rx.await.unwrap().unwrap(), BTreeMap::new()); + + let (tx, rx) = oneshot::channel(); + ctx_handle + .send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::InboundHrmpChannelsContents(para_b, tx), + ), + }) + .await; + assert_eq!(rx.await.unwrap().unwrap(), para_b_inbound_channels,); + + ctx_handle + .send(FromOverseer::Signal(OverseerSignal::Conclude)) + .await; + }; + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn requests_historical_code() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + + let para_a = 5.into(); + let para_b = 6.into(); + let spawner = sp_core::testing::TaskExecutor::new(); + + let runtime_api = Arc::new({ + let mut runtime_api = MockRuntimeApi::default(); + + runtime_api.historical_validation_code.insert( + para_a, + vec![(1, vec![1, 2, 3].into()), (10, vec![4, 5, 6].into())], + ); + + runtime_api.historical_validation_code.insert( + para_b, + vec![(5, vec![7, 8, 9].into())], + ); + + runtime_api + }); + let relay_parent = [1; 32].into(); + + let subsystem = RuntimeApiSubsystem::new(runtime_api, Metrics(None), spawner); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); + let test_task = async move { + { + let (tx, rx) = oneshot::channel(); + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::HistoricalValidationCode(para_a, 5, tx), + ) + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), Some(ValidationCode::from(vec![1, 2, 3]))); + } + + { + let (tx, rx) = oneshot::channel(); + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::HistoricalValidationCode(para_a, 10, tx), + ) + }).await; + + assert_eq!(rx.await.unwrap().unwrap(), Some(ValidationCode::from(vec![4, 5, 6]))); + } + + { + let (tx, rx) = oneshot::channel(); + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request( + relay_parent, + Request::HistoricalValidationCode(para_b, 1, tx), + ) + }).await; + + assert!(rx.await.unwrap().unwrap().is_none()); + } + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } + + #[test] + fn multiple_requests_in_parallel_are_working() { + let (ctx, mut ctx_handle) = test_helpers::make_subsystem_context(TaskExecutor::new()); + let runtime_api = Arc::new(MockRuntimeApi::default()); + let relay_parent = [1; 32].into(); + let spawner = sp_core::testing::TaskExecutor::new(); + let mutex = runtime_api.availability_cores_wait.clone(); + + let subsystem = RuntimeApiSubsystem::new(runtime_api.clone(), Metrics(None), spawner); + let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); + let test_task = async move { + // Make all requests block until we release this mutex. + let lock = mutex.lock().unwrap(); + + let mut receivers = Vec::new(); + + for _ in 0..MAX_PARALLEL_REQUESTS * 10 { + let (tx, rx) = oneshot::channel(); + + ctx_handle.send(FromOverseer::Communication { + msg: RuntimeApiMessage::Request(relay_parent, Request::AvailabilityCores(tx)) + }).await; + + receivers.push(rx); + } + + let join = future::join_all(receivers); + + drop(lock); + + join.await + .into_iter() + .for_each(|r| assert_eq!(r.unwrap().unwrap(), runtime_api.availability_cores)); + + ctx_handle.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; + }; + + futures::executor::block_on(future::join(subsystem_task, test_task)); + } } diff --git a/node/jaeger/Cargo.toml b/node/jaeger/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..e106888a14012957fc57093994743484b0324a4a --- /dev/null +++ b/node/jaeger/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "polkadot-node-jaeger" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" +description = "Polkadot Jaeger primitives" + +[dependencies] +async-std = "1.8.0" +mick-jaeger = "0.1.4" +lazy_static = "1.4" +parking_lot = "0.11.1" +polkadot-primitives = { path = "../../primitives" } +sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +thiserror = "1.0.23" +log = "0.4.11" diff --git a/node/jaeger/src/lib.rs b/node/jaeger/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..73e0fb8c17ef75a1b41c1ae5ce6b4d69428a8721 --- /dev/null +++ b/node/jaeger/src/lib.rs @@ -0,0 +1,324 @@ +// Copyright 2020 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 . + +//! Polkadot Jaeger related primitives +//! +//! Provides primitives used by Polkadot for interfacing with Jaeger. +//! +//! # Integration +//! +//! See for an introduction. +//! +//! The easiest way to try Jaeger is: +//! +//! - Start a docker container with the all-in-one docker image (see below). +//! - Open your browser and navigate to to acces the UI. +//! +//! The all-in-one image can be started with: +//! +//! ```not_rust +//! podman login docker.io +//! podman run -d --name jaeger \ +//! -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \ +//! -p 5775:5775/udp \ +//! -p 6831:6831/udp \ +//! -p 6832:6832/udp \ +//! -p 5778:5778 \ +//! -p 16686:16686 \ +//! -p 14268:14268 \ +//! -p 14250:14250 \ +//! -p 9411:9411 \ +//! docker.io/jaegertracing/all-in-one:1.21 +//! ``` + +use sp_core::traits::SpawnNamed; +use polkadot_primitives::v1::{Hash, PoV, CandidateHash}; +use parking_lot::RwLock; +use std::{sync::Arc, result}; + +/// A description of an error causing the chain API request to be unservable. +#[derive(Debug, thiserror::Error)] +#[allow(missing_docs)] +pub enum JaegerError { + #[error("Already launched the collector thread")] + AlreadyLaunched, + + #[error("Missing jaeger configuration")] + MissingConfiguration, +} + +lazy_static::lazy_static! { + static ref INSTANCE: RwLock = RwLock::new(Jaeger::None); +} + +/// Configuration for the jaeger tracing. +#[derive(Clone)] +pub struct JaegerConfig { + node_name: String, + agent_addr: std::net::SocketAddr, +} + +impl std::default::Default for JaegerConfig { + fn default() -> Self { + Self { + node_name: "unknown_".to_owned(), + agent_addr: "127.0.0.1:6831".parse().expect(r#"Static "127.0.0.1:6831" is a valid socket address string. qed"#), + } + } +} + +impl JaegerConfig { + /// Use the builder pattern to construct a configuration. + pub fn builder() -> JaegerConfigBuilder { + JaegerConfigBuilder::default() + } +} + + +/// Jaeger configuration builder. +#[derive(Default)] +pub struct JaegerConfigBuilder { + inner: JaegerConfig +} + +impl JaegerConfigBuilder { + /// Set the name for this node. + pub fn named(mut self, name: S) -> Self where S: AsRef { + self.inner.node_name = name.as_ref().to_owned(); + self + } + + /// Set the agent address to send the collected spans to. + pub fn agent(mut self, addr: U) -> Self where U: Into { + self.inner.agent_addr = addr.into(); + self + } + + /// Construct the configuration. + pub fn build(self) -> JaegerConfig { + self.inner + } +} + +/// A special "per leaf span". +/// +/// Essentially this span wraps two spans: +/// +/// 1. The span that is created per leaf in the overseer. +/// 2. Some child span of the per-leaf span. +/// +/// This just works as auxiliary structure to easily store both. +#[derive(Debug)] +pub struct PerLeafSpan { + leaf_span: Arc, + span: JaegerSpan, +} + +impl PerLeafSpan { + /// Creates a new instance. + /// + /// Takes the `leaf_span` that is created by the overseer per leaf and a name for a child span. + /// Both will be stored in this object, while the child span is implicitly accessible by using the + /// [`Deref`](std::ops::Deref) implementation. + pub fn new(leaf_span: Arc, name: impl Into) -> Self { + let span = leaf_span.child(name); + + Self { + span, + leaf_span, + } + } + + /// Returns the leaf span. + pub fn leaf_span(&self) -> &Arc { + &self.leaf_span + } +} + +/// Returns a reference to the child span. +impl std::ops::Deref for PerLeafSpan { + type Target = JaegerSpan; + + fn deref(&self) -> &JaegerSpan { + &self.span + } +} + +/// A wrapper type for a span. +/// +/// Handles running with and without jaeger. +pub enum JaegerSpan { + /// Running with jaeger being enabled. + Enabled(mick_jaeger::Span), + /// Running with jaeger disabled. + Disabled, +} + +impl JaegerSpan { + /// Derive a child span from `self`. + pub fn child(&self, name: impl Into) -> Self { + match self { + Self::Enabled(inner) => Self::Enabled(inner.child(name)), + Self::Disabled => Self::Disabled, + } + } + + /// Add an additional tag to the span. + pub fn add_string_tag(&mut self, tag: &str, value: &str) { + match self { + Self::Enabled(ref mut inner) => inner.add_string_tag(tag, value), + Self::Disabled => {}, + } + } + + /// Adds the `FollowsFrom` relationship to this span with respect to the given one. + pub fn add_follows_from(&mut self, other: &Self) { + match (self, other) { + (Self::Enabled(ref mut inner), Self::Enabled(ref other_inner)) => inner.add_follows_from(&other_inner), + _ => {}, + } + } +} + +impl std::fmt::Debug for JaegerSpan { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "") + } +} + +impl From> for JaegerSpan { + fn from(src: Option) -> Self { + if let Some(span) = src { + Self::Enabled(span) + } else { + Self::Disabled + } + } +} + +impl From for JaegerSpan { + fn from(src: mick_jaeger::Span) -> Self { + Self::Enabled(src) + } +} + +/// Shortcut for [`candidate_hash_span`] with the hash of the `Candidate` block. +pub fn candidate_hash_span(candidate_hash: &CandidateHash, span_name: impl Into) -> JaegerSpan { + let mut span: JaegerSpan = INSTANCE.read_recursive() + .span(|| { candidate_hash.0 }, span_name).into(); + + span.add_string_tag("candidate-hash", &format!("{:?}", candidate_hash.0)); + span +} + +/// Shortcut for [`hash_span`] with the hash of the `PoV`. +#[inline(always)] +pub fn pov_span(pov: &PoV, span_name: impl Into) -> JaegerSpan { + INSTANCE.read_recursive().span(|| { pov.hash() }, span_name).into() +} + +/// Creates a `Span` referring to the given hash. All spans created with [`hash_span`] with the +/// same hash (even from multiple different nodes) will be visible in the same view on Jaeger. +/// +/// This span automatically has the `relay-parent` tag set. +#[inline(always)] +pub fn hash_span(hash: &Hash, span_name: impl Into) -> JaegerSpan { + let mut span: JaegerSpan = INSTANCE.read_recursive().span(|| { *hash }, span_name).into(); + span.add_string_tag("relay-parent", &format!("{:?}", hash)); + span +} + +/// Stateful convenience wrapper around [`mick_jaeger`]. +pub enum Jaeger { + /// Launched and operational state. + Launched { + /// [`mick_jaeger`] provided API to record spans to. + traces_in: Arc, + }, + /// Preparation state with the necessary config to launch the collector. + Prep(JaegerConfig), + /// Uninitialized, suggests wrong API usage if encountered. + None, +} + +impl Jaeger { + /// Spawn the jaeger instance. + pub fn new(cfg: JaegerConfig) -> Self { + Jaeger::Prep(cfg) + } + + /// Spawn the background task in order to send the tracing information out via udp + #[cfg(target_os = "unknown")] + pub fn launch(self, _spawner: S) -> result::Result<(), JaegerError> { + Ok(()) + } + + /// Spawn the background task in order to send the tracing information out via udp + #[cfg(not(target_os = "unknown"))] + pub fn launch(self, spawner: S) -> result::Result<(), JaegerError> { + let cfg = match self { + Self::Prep(cfg) => Ok(cfg), + Self::Launched{ .. } => { + return Err(JaegerError::AlreadyLaunched) + } + Self::None => Err(JaegerError::MissingConfiguration), + }?; + + let jaeger_agent = cfg.agent_addr; + + log::info!("🐹 Collecting jaeger spans for {:?}", &jaeger_agent); + + let (traces_in, mut traces_out) = mick_jaeger::init(mick_jaeger::Config { + service_name: format!("polkadot-{}", cfg.node_name), + }); + + // Spawn a background task that pulls span information and sends them on the network. + spawner.spawn("jaeger-collector", Box::pin(async move { + match async_std::net::UdpSocket::bind("0.0.0.0:0").await { + Ok(udp_socket) => loop { + let buf = traces_out.next().await; + // UDP sending errors happen only either if the API is misused or in case of missing privilege. + if let Err(e) = udp_socket.send_to(&buf, jaeger_agent).await { + log::debug!(target: "jaeger", "UDP send error: {}", e); + } + } + Err(e) => { + log::warn!(target: "jaeger", "UDP socket open error: {}", e); + } + } + })); + + *INSTANCE.write() = Self::Launched { + traces_in, + }; + Ok(()) + } + + fn span(&self, lazy_hash: F, span_name: impl Into) -> Option + where + F: Fn() -> Hash, + { + if let Self::Launched { traces_in , .. } = self { + let hash = lazy_hash(); + let mut buf = [0u8; 16]; + buf.copy_from_slice(&hash.as_ref()[0..16]); + let trace_id = std::num::NonZeroU128::new(u128::from_be_bytes(buf))?; + Some(traces_in.span(trace_id, span_name)) + } else { + None + } + } +} diff --git a/node/network/availability-distribution/Cargo.toml b/node/network/availability-distribution/Cargo.toml index fd2028e538522dca1b02185a338a6a0cb5fe53f9..41d5aacefcaf0d57dd27d73b6cf6224c9d1dc7c6 100644 --- a/node/network/availability-distribution/Cargo.toml +++ b/node/network/availability-distribution/Cargo.toml @@ -5,27 +5,25 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.5" -log = "0.4.11" -streamunordered = "0.5.1" -codec = { package="parity-scale-codec", version = "1.3.4", features = ["std"] } +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" +parity-scale-codec = { version = "1.3.5", features = ["std"] } polkadot-primitives = { path = "../../../primitives" } polkadot-erasure-coding = { path = "../../../erasure-coding" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } -polkadot-network-bridge = { path = "../../network/bridge" } polkadot-node-network-protocol = { path = "../../network/protocol" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } -sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } -derive_more = "0.99.9" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["std"] } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } +thiserror = "1.0.23" [dev-dependencies] polkadot-subsystem-testhelpers = { package = "polkadot-node-subsystem-test-helpers", path = "../../subsystem-test-helpers" } -bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["std"] } +sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } -parking_lot = "0.11.0" -futures-timer = "3.0.2" -env_logger = "0.7.1" -assert_matches = "1.3.0" -smallvec = "1" +sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } +assert_matches = "1.4.0" +maplit = "1.0" diff --git a/node/network/availability-distribution/src/lib.rs b/node/network/availability-distribution/src/lib.rs index 32b61f5817f3a9f549d489fe7f5511c2694e1494..8e3ada4005588b22a8a97289b3b2dc6bf656ce56 100644 --- a/node/network/availability-distribution/src/lib.rs +++ b/node/network/availability-distribution/src/lib.rs @@ -22,57 +22,75 @@ //! peers. Verified in this context means, the erasure chunks contained merkle proof //! is checked. -use codec::{Decode, Encode}; -use futures::{channel::oneshot, FutureExt}; +#![deny(unused_crate_dependencies, unused_qualifications)] -use keystore::KeyStorePtr; -use sp_core::{ - crypto::Public, - traits::BareCryptoStore, -}; -use sc_keystore as keystore; +use parity_scale_codec::{Decode, Encode}; +use futures::{channel::oneshot, FutureExt, TryFutureExt}; + +use sp_core::crypto::Public; +use sp_keystore::{CryptoStore, SyncCryptoStorePtr}; -use log::{trace, warn}; use polkadot_erasure_coding::branch_hash; +use polkadot_node_network_protocol::{ + v1 as protocol_v1, NetworkBridgeEvent, PeerId, ReputationChange as Rep, View, OurView, +}; +use polkadot_node_subsystem_util::metrics::{self, prometheus}; use polkadot_primitives::v1::{ - PARACHAIN_KEY_TYPE_ID, - BlakeTwo256, CommittedCandidateReceipt, CoreState, ErasureChunk, - Hash as Hash, HashT, Id as ParaId, - ValidatorId, ValidatorIndex, SessionIndex, + BlakeTwo256, CoreState, ErasureChunk, Hash, HashT, + SessionIndex, ValidatorId, ValidatorIndex, PARACHAIN_KEY_TYPE_ID, CandidateHash, + CandidateDescriptor, }; use polkadot_subsystem::messages::{ - AllMessages, AvailabilityDistributionMessage, NetworkBridgeMessage, RuntimeApiMessage, - RuntimeApiRequest, AvailabilityStoreMessage, ChainApiMessage, + AllMessages, AvailabilityDistributionMessage, AvailabilityStoreMessage, ChainApiMessage, + NetworkBridgeMessage, RuntimeApiMessage, RuntimeApiRequest, }; use polkadot_subsystem::{ - errors::{ChainApiError, RuntimeApiError}, - ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, - SubsystemContext, SubsystemError, -}; -use polkadot_node_network_protocol::{ - v1 as protocol_v1, View, ReputationChange as Rep, PeerId, - NetworkBridgeEvent, + jaeger, errors::{ChainApiError, RuntimeApiError}, PerLeafSpan, + ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, }; use std::collections::{HashMap, HashSet}; -use std::io; +use std::collections::hash_map::Entry; use std::iter; +use thiserror::Error; + +#[cfg(test)] +mod tests; -const TARGET: &'static str = "avad"; +const LOG_TARGET: &'static str = "availability_distribution"; -#[derive(Debug, derive_more::From)] +#[derive(Debug, Error)] enum Error { - #[from] - Erasure(polkadot_erasure_coding::Error), - #[from] - Io(io::Error), - #[from] - Oneshot(oneshot::Canceled), - #[from] - Subsystem(SubsystemError), - #[from] - RuntimeApi(RuntimeApiError), - #[from] - ChainApi(ChainApiError), + #[error("Response channel to obtain StoreChunk failed")] + StoreChunkResponseChannel(#[source] oneshot::Canceled), + + #[error("Response channel to obtain QueryChunk failed")] + QueryChunkResponseChannel(#[source] oneshot::Canceled), + + #[error("Response channel to obtain QueryAncestors failed")] + QueryAncestorsResponseChannel(#[source] oneshot::Canceled), + #[error("RuntimeAPI to obtain QueryAncestors failed")] + QueryAncestors(#[source] ChainApiError), + + #[error("Response channel to obtain QuerySession failed")] + QuerySessionResponseChannel(#[source] oneshot::Canceled), + #[error("RuntimeAPI to obtain QuerySession failed")] + QuerySession(#[source] RuntimeApiError), + + #[error("Response channel to obtain QueryValidators failed")] + QueryValidatorsResponseChannel(#[source] oneshot::Canceled), + #[error("RuntimeAPI to obtain QueryValidators failed")] + QueryValidators(#[source] RuntimeApiError), + + #[error("Response channel to obtain AvailabilityCores failed")] + AvailabilityCoresResponseChannel(#[source] oneshot::Canceled), + #[error("RuntimeAPI to obtain AvailabilityCores failed")] + AvailabilityCores(#[source] RuntimeApiError), + + #[error("Response channel to obtain AvailabilityCores failed")] + QueryAvailabilityResponseChannel(#[source] oneshot::Canceled), + + #[error("Receive channel closed")] + IncomingMessageChannel(#[source] SubsystemError), } type Result = std::result::Result; @@ -88,210 +106,218 @@ const BENEFIT_VALID_MESSAGE: Rep = Rep::new(10, "Valid message"); #[derive(Encode, Decode, Debug, Clone, PartialEq, Eq, Hash)] pub struct AvailabilityGossipMessage { /// Anchor hash of the candidate the `ErasureChunk` is associated to. - pub candidate_hash: Hash, + pub candidate_hash: CandidateHash, /// The erasure chunk, a encoded information part of `AvailabilityData`. pub erasure_chunk: ErasureChunk, } +impl From for protocol_v1::AvailabilityDistributionMessage { + fn from(message: AvailabilityGossipMessage) -> Self { + Self::Chunk(message.candidate_hash, message.erasure_chunk) + } +} + /// Data used to track information of peers and relay parents the /// overseer ordered us to work on. -#[derive(Default, Clone, Debug)] +#[derive(Debug, Default)] struct ProtocolState { /// Track all active peers and their views /// to determine what is relevant to them. peer_views: HashMap, /// Our own view. - view: View, + view: OurView, - /// Caches a mapping of relay parents or ancestor to live candidate receipts. + /// Caches a mapping of relay parents or ancestor to live candidate hashes. /// Allows fast intersection of live candidates with views and consecutive unioning. - /// Maps relay parent / ancestor -> live candidate receipts + its hash. - receipts: HashMap>, - - /// Allow reverse caching of view checks. - /// Maps candidate hash -> relay parent for extracting meta information from `PerRelayParent`. - /// Note that the presence of this is not sufficient to determine if deletion is OK, i.e. - /// two histories could cover this. - reverse: HashMap, - - /// Keeps track of which candidate receipts are required due to ancestors of which relay parents - /// of our view. - /// Maps ancestor -> relay parents in view - ancestry: HashMap>, + /// Maps relay parent / ancestor -> candidate hashes. + live_under: HashMap>, /// Track things needed to start and stop work on a particular relay parent. per_relay_parent: HashMap, /// Track data that is specific to a candidate. - per_candidate: HashMap, + per_candidate: HashMap, } -#[derive(Debug, Clone, Default)] +#[derive(Debug)] struct PerCandidate { /// A Candidate and a set of known erasure chunks in form of messages to be gossiped / distributed if the peer view wants that. /// This is _across_ peers and not specific to a particular one. /// candidate hash + erasure chunk index -> gossip message message_vault: HashMap, - /// Track received candidate hashes and chunk indices from peers. - received_messages: HashMap>, + /// Track received erasure chunk indices per peer. + received_messages: HashMap>, - /// Track already sent candidate hashes and the erasure chunk index to the peers. - sent_messages: HashMap>, + /// Track sent erasure chunk indices per peer. + sent_messages: HashMap>, /// The set of validators. validators: Vec, /// If this node is a validator, note the index in the validator set. validator_index: Option, + + /// The descriptor of this candidate. + descriptor: CandidateDescriptor, + + /// The set of relay chain blocks this appears to be live in. + live_in: HashSet, + + /// A Jaeger span relating to this candidate. + span: jaeger::JaegerSpan, } -#[derive(Debug, Clone, Default)] +impl PerCandidate { + /// Returns `true` iff the given `validator_index` is required by the given `peer`. + fn message_required_by_peer(&self, peer: &PeerId, validator_index: ValidatorIndex) -> bool { + self.received_messages.get(peer).map(|v| !v.contains(&validator_index)).unwrap_or(true) + && self.sent_messages.get(peer).map(|v| !v.contains(&validator_index)).unwrap_or(true) + } + + /// Add a chunk to the message vault. Overwrites anything that was already present. + fn add_message(&mut self, chunk_index: u32, message: AvailabilityGossipMessage) { + let _ = self.message_vault.insert(chunk_index, message); + } + + /// Clean up the span if we've got our own chunk. + fn drop_span_after_own_availability(&mut self) { + if let Some(validator_index) = self.validator_index { + if self.message_vault.contains_key(&validator_index) { + self.span = jaeger::JaegerSpan::Disabled; + } + } + } +} + +#[derive(Debug)] struct PerRelayParent { /// Set of `K` ancestors for this relay parent. ancestors: Vec, + /// Live candidates, according to this relay parent. + live_candidates: HashSet, + /// The span that belongs to this relay parent. + span: PerLeafSpan, } impl ProtocolState { - /// Collects the relay_parents ancestors including the relay parents themselfes. - fn extend_with_ancestors<'a>( - &'a self, - relay_parents: impl IntoIterator + 'a, - ) -> HashSet { - relay_parents - .into_iter() - .map(|relay_parent| { - self.per_relay_parent - .get(relay_parent) - .into_iter() - .map(|per_relay_parent| per_relay_parent.ancestors.iter().cloned()) - .flatten() - .chain(iter::once(*relay_parent)) - }) - .flatten() - .collect::>() - } - - /// Unionize all cached entries for the given relay parents and its ancestors. + /// Unionize all live candidate hashes of the given relay parents and their recent + /// ancestors. + /// /// Ignores all non existent relay parents, so this can be used directly with a peers view. - /// Returns a map from candidate hash -> receipt + /// Returns a set of candidate hashes. + #[tracing::instrument(level = "trace", skip(relay_parents), fields(subsystem = LOG_TARGET))] fn cached_live_candidates_unioned<'a>( &'a self, relay_parents: impl IntoIterator + 'a, - ) -> HashMap { - let relay_parents_and_ancestors = self.extend_with_ancestors(relay_parents); - relay_parents_and_ancestors - .into_iter() - .filter_map(|relay_parent_or_ancestor| self.receipts.get(&relay_parent_or_ancestor)) - .map(|receipt_set| receipt_set.into_iter()) - .flatten() - .map(|(receipt_hash, receipt)| (receipt_hash.clone(), receipt.clone())) - .collect::>() + ) -> HashSet { + cached_live_candidates_unioned( + &self.per_relay_parent, + relay_parents + ) } - async fn add_relay_parent( + #[tracing::instrument(level = "trace", skip(candidates, span), fields(subsystem = LOG_TARGET))] + fn add_relay_parent( &mut self, - ctx: &mut Context, relay_parent: Hash, validators: Vec, validator_index: Option, - ) -> Result<()> - where - Context: SubsystemContext, - { - let candidates = - query_live_candidates(ctx, self, std::iter::once(relay_parent)).await?; + candidates: HashMap, + ancestors: Vec, + span: PerLeafSpan, + ) { + let per_relay_parent = self.per_relay_parent.entry(relay_parent).or_insert_with(|| PerRelayParent { + span, + ancestors, + live_candidates: candidates.keys().cloned().collect(), + }); // register the relation of relay_parent to candidate.. - // ..and the reverse association. - for (relay_parent_or_ancestor, (receipt_hash, receipt)) in candidates.clone() { - self - .reverse - .insert(receipt_hash.clone(), relay_parent_or_ancestor.clone()); - let per_candidate = self.per_candidate.entry(receipt_hash.clone()) - .or_default(); - per_candidate.validator_index = validator_index.clone(); - per_candidate.validators = validators.clone(); - - self - .receipts - .entry(relay_parent_or_ancestor) - .or_default() - .insert((receipt_hash, receipt)); - } - - // collect the ancestors again from the hash map - let ancestors = candidates - .iter() - .filter_map(|(ancestor_or_relay_parent, _receipt)| { - if ancestor_or_relay_parent == &relay_parent { - None - } else { - Some(*ancestor_or_relay_parent) + for (receipt_hash, fetched) in candidates { + let candidate_entry = match self.per_candidate.entry(receipt_hash) { + Entry::Occupied(e) => e.into_mut(), + Entry::Vacant(e) => { + if let FetchedLiveCandidate::Fresh(descriptor) = fetched { + e.insert(PerCandidate { + message_vault: HashMap::new(), + received_messages: HashMap::new(), + sent_messages: HashMap::new(), + validators: validators.clone(), + validator_index, + descriptor, + live_in: HashSet::new(), + span: if validator_index.is_some() { + jaeger::candidate_hash_span(&receipt_hash, "pending-availability") + } else { + jaeger::JaegerSpan::Disabled + }, + }) + } else { + tracing::warn!(target: LOG_TARGET, "No `per_candidate` but not fresh. logic error"); + continue; + } } - }) - .collect::>(); - - // mark all the ancestors as "needed" by this newly added relay parent - for ancestor in ancestors.iter() { - self.ancestry - .entry(ancestor.clone()) - .or_default() - .insert(relay_parent); - } + }; - self - .per_relay_parent - .entry(relay_parent) - .or_default() - .ancestors = ancestors; + // Create some span that will make it able to switch between the candidate and relay parent span. + let mut span = per_relay_parent.span.child("live-candidate"); + span.add_string_tag("candidate-hash", &format!("{:?}", receipt_hash)); - Ok(()) + candidate_entry.span.add_follows_from(&span); + candidate_entry.live_in.insert(relay_parent); + } } - fn remove_relay_parent(&mut self, relay_parent: &Hash) -> Result<()> { - // we might be ancestor of some other relay_parent - if let Some(ref mut descendants) = self.ancestry.get_mut(relay_parent) { - // if we were the last user, and it is - // not explicitly set to be worked on by the overseer - if descendants.is_empty() { - // remove from the ancestry index - self.ancestry.remove(relay_parent); - // and also remove the actual receipt - self.receipts.remove(relay_parent); - self.per_candidate.remove(relay_parent); - } - } + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + fn remove_relay_parent(&mut self, relay_parent: &Hash) { if let Some(per_relay_parent) = self.per_relay_parent.remove(relay_parent) { - // remove all "references" from the hash maps and sets for all ancestors - for ancestor in per_relay_parent.ancestors { - // one of our decendants might be ancestor of some other relay_parent - if let Some(ref mut descendants) = self.ancestry.get_mut(&ancestor) { - // we do not need this descendant anymore - descendants.remove(&relay_parent); - // if we were the last user, and it is - // not explicitly set to be worked on by the overseer - if descendants.is_empty() && !self.per_relay_parent.contains_key(&ancestor) { - // remove from the ancestry index - self.ancestry.remove(&ancestor); - // and also remove the actual receipt - self.receipts.remove(&ancestor); - self.per_candidate.remove(&ancestor); + for candidate_hash in per_relay_parent.live_candidates { + // Prune the candidate if this was the last member of our view + // to consider it live (including its ancestors). + if let Entry::Occupied(mut occ) = self.per_candidate.entry(candidate_hash) { + occ.get_mut().live_in.remove(relay_parent); + if occ.get().live_in.is_empty() { + occ.remove(); } } } } - Ok(()) + } + + /// Removes all entries from live_under which aren't referenced in the ancestry of + /// one of our live relay-chain heads. + fn clean_up_live_under_cache(&mut self) { + let extended_view: HashSet<_> = self.per_relay_parent.iter() + .map(|(r_hash, v)| v.ancestors.iter().cloned().chain(iter::once(*r_hash))) + .flatten() + .collect(); + + self.live_under.retain(|ancestor_hash, _| extended_view.contains(ancestor_hash)); } } +fn cached_live_candidates_unioned<'a>( + per_relay_parent: &'a HashMap, + relay_parents: impl IntoIterator + 'a, +) -> HashSet { + relay_parents + .into_iter() + .filter_map(|r| per_relay_parent.get(r)) + .map(|per_relay_parent| per_relay_parent.live_candidates.iter().cloned()) + .flatten() + .collect() +} + /// Deal with network bridge updates and track what needs to be tracked /// which depends on the message type received. +#[tracing::instrument(level = "trace", skip(ctx, keystore, metrics), fields(subsystem = LOG_TARGET))] async fn handle_network_msg( ctx: &mut Context, - keystore: KeyStorePtr, + keystore: &SyncCryptoStorePtr, state: &mut ProtocolState, + metrics: &Metrics, bridge_message: NetworkBridgeEvent, ) -> Result<()> where @@ -307,61 +333,74 @@ where state.peer_views.remove(&peerid); } NetworkBridgeEvent::PeerViewChange(peerid, view) => { - handle_peer_view_change(ctx, state, peerid, view).await?; + handle_peer_view_change(ctx, state, peerid, view, metrics).await; } NetworkBridgeEvent::OurViewChange(view) => { - handle_our_view_change(ctx, keystore, state, view).await?; + handle_our_view_change(ctx, keystore, state, view, metrics).await?; } NetworkBridgeEvent::PeerMessage(remote, msg) => { let gossiped_availability = match msg { - protocol_v1::AvailabilityDistributionMessage::Chunk(candidate_hash, chunk) => - AvailabilityGossipMessage { candidate_hash, erasure_chunk: chunk } + protocol_v1::AvailabilityDistributionMessage::Chunk(candidate_hash, chunk) => { + AvailabilityGossipMessage { + candidate_hash, + erasure_chunk: chunk, + } + } }; - process_incoming_peer_message(ctx, state, remote, gossiped_availability).await?; + process_incoming_peer_message(ctx, state, remote, gossiped_availability, metrics) + .await?; } } Ok(()) } - /// Handle the changes necessary when our view changes. +#[tracing::instrument(level = "trace", skip(ctx, keystore, metrics), fields(subsystem = LOG_TARGET))] async fn handle_our_view_change( ctx: &mut Context, - keystore: KeyStorePtr, + keystore: &SyncCryptoStorePtr, state: &mut ProtocolState, - view: View, + view: OurView, + metrics: &Metrics, ) -> Result<()> where Context: SubsystemContext, { - let old_view = std::mem::replace(&mut (state.view), view); + let _timer = metrics.time_handle_our_view_change(); + + let old_view = std::mem::replace(&mut state.view, view); // needed due to borrow rules let view = state.view.clone(); - let added = view.difference(&old_view).collect::>(); // add all the relay parents and fill the cache - for added in added.iter() { - let added = **added; - let validators = query_validators(ctx, added).await?; - let validator_index = obtain_our_validator_index( - &validators, - keystore.clone(), + for (added, span) in view.span_per_head().iter().filter(|v| !old_view.contains(&v.0)) { + let span = PerLeafSpan::new(span.clone(), "availability-distribution"); + + let validators = query_validators(ctx, *added).await?; + let validator_index = obtain_our_validator_index(&validators, keystore.clone()).await; + let (candidates, ancestors) + = query_live_candidates(ctx, &mut state.live_under, *added).await?; + + state.add_relay_parent( + *added, + validators, + validator_index, + candidates, + ancestors, + span, ); - state.add_relay_parent(ctx, added, validators, validator_index).await?; } // handle all candidates - for (candidate_hash, _receipt) in state.cached_live_candidates_unioned(added) { - let per_candidate = state - .per_candidate - .entry(candidate_hash) - .or_default(); - - // assure the node has the validator role - if per_candidate.validator_index.is_none() { - continue; + let mut messages_out = Vec::new(); + for candidate_hash in state.cached_live_candidates_unioned(view.difference(&old_view)) { + // If we are not a validator for this candidate, let's skip it. + match state.per_candidate.get(&candidate_hash) { + None => continue, + Some(c) if c.validator_index.is_none() => continue, + Some(_) => {}, }; // check if the availability is present in the store exists @@ -369,8 +408,6 @@ where continue; } - let validator_count = per_candidate.validators.len(); - // obtain interested peers in the candidate hash let peers: Vec = state .peer_views @@ -379,143 +416,131 @@ where .filter(|(_peer, view)| { // collect all direct interests of a peer w/o ancestors state - .cached_live_candidates_unioned(view.0.iter()) - .contains_key(&candidate_hash) + .cached_live_candidates_unioned(view.heads.iter()) + .contains(&candidate_hash) }) .map(|(peer, _view)| peer.clone()) .collect(); + let per_candidate = state.per_candidate.get_mut(&candidate_hash) + .expect("existence checked above; qed"); + + let validator_count = per_candidate.validators.len(); + // distribute all erasure messages to interested peers for chunk_index in 0u32..(validator_count as u32) { + let _span = { + let mut span = per_candidate.span.child("load-and-distribute"); + span.add_string_tag("chunk-index", &format!("{}", chunk_index)); + span + }; + let message = if let Some(message) = per_candidate.message_vault.get(&chunk_index) { + tracing::trace!( + target: LOG_TARGET, + %chunk_index, + ?candidate_hash, + "Retrieved chunk from message vault", + ); + message.clone() + } else if let Some(erasure_chunk) = query_chunk(ctx, candidate_hash, chunk_index as ValidatorIndex).await? { + tracing::trace!( + target: LOG_TARGET, + %chunk_index, + ?candidate_hash, + "Retrieved chunk from availability storage", + ); - // only the peers which did not receive this particular erasure chunk - let per_candidate = state - .per_candidate - .entry(candidate_hash) - .or_default(); + let msg = AvailabilityGossipMessage { + candidate_hash, + erasure_chunk, + }; - // obtain the chunks from the cache, if not fallback - // and query the availability store - let message_id = (candidate_hash, chunk_index); - let erasure_chunk = if let Some(message) = per_candidate.message_vault.get(&chunk_index) { - message.erasure_chunk.clone() - } else if let Some(erasure_chunk) = query_chunk(ctx, candidate_hash, chunk_index as ValidatorIndex).await? { - erasure_chunk + per_candidate.add_message(chunk_index, msg.clone()); + + msg } else { + tracing::error!( + target: LOG_TARGET, + %chunk_index, + ?candidate_hash, + "Availability store reported that we have the availability data, but we could not retrieve a chunk of it!", + ); continue; }; - debug_assert_eq!(erasure_chunk.index, chunk_index); + debug_assert_eq!(message.erasure_chunk.index, chunk_index); let peers = peers .iter() - .filter(|peer| { - // only pick those which were not sent before - !per_candidate - .sent_messages - .get(*peer) - .filter(|set| { - set.contains(&message_id) - }) - .is_some() - }) - .map(|peer| peer.clone()) + .filter(|peer| per_candidate.message_required_by_peer(peer, chunk_index)) + .cloned() .collect::>(); - let message = AvailabilityGossipMessage { - candidate_hash, - erasure_chunk, - }; - send_tracked_gossip_message_to_peers(ctx, per_candidate, peers, message).await?; + add_tracked_messages_to_batch(&mut messages_out, per_candidate, metrics, peers, iter::once(message)); } - } - // cleanup the removed relay parents and their states - let removed = old_view.difference(&view).collect::>(); - for removed in removed { - state.remove_relay_parent(&removed)?; + // traces are better if we wait until the loop is done to drop. + per_candidate.drop_span_after_own_availability(); } - Ok(()) -} -#[inline(always)] -async fn send_tracked_gossip_message_to_peers( - ctx: &mut Context, - per_candidate: &mut PerCandidate, - peers: Vec, - message: AvailabilityGossipMessage, -) -> Result<()> -where - Context: SubsystemContext, -{ - send_tracked_gossip_messages_to_peers(ctx, per_candidate, peers, iter::once(message)).await -} + // send all batched messages out. + send_batch_to_network(ctx, messages_out).await; -#[inline(always)] -async fn send_tracked_gossip_messages_to_peer( - ctx: &mut Context, - per_candidate: &mut PerCandidate, - peer: PeerId, - message_iter: impl IntoIterator, -) -> Result<()> -where - Context: SubsystemContext, -{ - send_tracked_gossip_messages_to_peers(ctx, per_candidate, vec![peer], message_iter).await + // cleanup the removed relay parents and their states + old_view.difference(&view).for_each(|r| state.remove_relay_parent(r)); + state.clean_up_live_under_cache(); + + Ok(()) } -async fn send_tracked_gossip_messages_to_peers( - ctx: &mut Context, +// After this function is invoked, the state reflects the messages as having been sent to a peer. +#[tracing::instrument(level = "trace", skip(batch, metrics, message_iter), fields(subsystem = LOG_TARGET))] +fn add_tracked_messages_to_batch( + batch: &mut Vec<(Vec, protocol_v1::ValidationProtocol)>, per_candidate: &mut PerCandidate, + metrics: &Metrics, peers: Vec, message_iter: impl IntoIterator, -) -> Result<()> -where - Context: SubsystemContext, -{ - if peers.is_empty() { - return Ok(()) - } +) { for message in message_iter { for peer in peers.iter() { - let message_id = (message.candidate_hash, message.erasure_chunk.index); per_candidate .sent_messages .entry(peer.clone()) .or_default() - .insert(message_id); + .insert(message.erasure_chunk.index); } - per_candidate - .message_vault - .insert(message.erasure_chunk.index, message.clone()); - - let wire_message = protocol_v1::AvailabilityDistributionMessage::Chunk( - message.candidate_hash, - message.erasure_chunk, - ); - - ctx.send_message(AllMessages::NetworkBridge( - NetworkBridgeMessage::SendValidationMessage( + if !peers.is_empty() { + batch.push(( peers.clone(), - protocol_v1::ValidationProtocol::AvailabilityDistribution(wire_message), - ), - )) - .await - .map_err::(Into::into)?; + protocol_v1::ValidationProtocol::AvailabilityDistribution(message.into()), + )); + + metrics.on_chunk_distributed(); + } } +} - Ok(()) +async fn send_batch_to_network( + ctx: &mut impl SubsystemContext, + batch: Vec<(Vec, protocol_v1::ValidationProtocol)>, +) { + if !batch.is_empty() { + ctx.send_message(NetworkBridgeMessage::SendValidationMessages(batch).into()).await + } } // Send the difference between two views which were not sent // to that particular peer. +#[tracing::instrument(level = "trace", skip(ctx, metrics), fields(subsystem = LOG_TARGET))] async fn handle_peer_view_change( ctx: &mut Context, state: &mut ProtocolState, origin: PeerId, view: View, -) -> Result<()> + metrics: &Metrics, +) where Context: SubsystemContext, { @@ -525,182 +550,240 @@ where *current = view; + if added.is_empty() { + return + } + // only contains the intersection of what we are interested and // the union of all relay parent's candidates. let added_candidates = state.cached_live_candidates_unioned(added.iter()); - // Send all messages we've seen before and the peer is now interested - // in to that peer. - - for (candidate_hash, _receipt) in added_candidates { - let per_candidate = state.per_candidate.entry(candidate_hash).or_default(); + // Send all messages we've seen before and the peer is now interested in. + let mut batch = Vec::new(); + for candidate_hash in added_candidates { + let per_candidate = match state.per_candidate.get_mut(&candidate_hash) { + Some(p) => p, + None => continue, + }; // obtain the relevant chunk indices not sent yet - let messages = ((0 as ValidatorIndex) - ..(per_candidate.validators.len() as ValidatorIndex)) + let messages = ((0 as ValidatorIndex)..(per_candidate.validators.len() as ValidatorIndex)) .into_iter() .filter_map(|erasure_chunk_index: ValidatorIndex| { - let message_id = (candidate_hash, erasure_chunk_index); - // try to pick up the message from the message vault // so we send as much as we have per_candidate .message_vault .get(&erasure_chunk_index) - .filter(|_| { - // check if that erasure chunk was already sent before - if let Some(sent_set) = per_candidate.sent_messages.get(&origin) { - if sent_set.contains(&message_id) { - return false; - } - } - true - }) + .filter(|_| per_candidate.message_required_by_peer(&origin, erasure_chunk_index)) }) .cloned() .collect::>(); - send_tracked_gossip_messages_to_peer(ctx, per_candidate, origin.clone(), messages).await?; + add_tracked_messages_to_batch(&mut batch, per_candidate, metrics, vec![origin.clone()], messages); } - Ok(()) + + send_batch_to_network(ctx, batch).await; } /// Obtain the first key which has a signing key. /// Returns the index within the validator set as `ValidatorIndex`, if there exists one, /// otherwise, `None` is returned. -fn obtain_our_validator_index( +async fn obtain_our_validator_index( validators: &[ValidatorId], - keystore: KeyStorePtr, + keystore: SyncCryptoStorePtr, ) -> Option { - let keystore = keystore.read(); - validators.iter().enumerate().find_map(|(idx, validator)| { - if keystore.has_keys(&[(validator.to_raw_vec(), PARACHAIN_KEY_TYPE_ID)]) { - Some(idx as ValidatorIndex) - } else { - None + for (idx, validator) in validators.iter().enumerate() { + if CryptoStore::has_keys( + &*keystore, + &[(validator.to_raw_vec(), PARACHAIN_KEY_TYPE_ID)], + ) + .await + { + return Some(idx as ValidatorIndex); } - }) + } + None } /// Handle an incoming message from a peer. +#[tracing::instrument(level = "trace", skip(ctx, metrics), fields(subsystem = LOG_TARGET))] async fn process_incoming_peer_message( ctx: &mut Context, state: &mut ProtocolState, origin: PeerId, message: AvailabilityGossipMessage, + metrics: &Metrics, ) -> Result<()> where Context: SubsystemContext, { + let _timer = metrics.time_process_incoming_peer_message(); + // obtain the set of candidates we are interested in based on our current view - let live_candidates = state.cached_live_candidates_unioned(state.view.0.iter()); + let live_candidates = state.cached_live_candidates_unioned(state.view.heads.iter()); // check if the candidate is of interest - let live_candidate = if let Some(live_candidate) = live_candidates.get(&message.candidate_hash) - { - live_candidate - } else { - return modify_reputation(ctx, origin, COST_NOT_A_LIVE_CANDIDATE).await; - }; - - // check the merkle proof - let root = &live_candidate.commitments.erasure_root; - let anticipated_hash = if let Ok(hash) = branch_hash( - root, - &message.erasure_chunk.proof, - message.erasure_chunk.index as usize, - ) { - hash + let candidate_entry = if live_candidates.contains(&message.candidate_hash) { + state.per_candidate + .get_mut(&message.candidate_hash) + .expect("All live candidates are contained in per_candidate; qed") } else { - return modify_reputation(ctx, origin, COST_MERKLE_PROOF_INVALID).await; + tracing::trace!( + target: LOG_TARGET, + candidate_hash = ?message.candidate_hash, + peer = %origin, + "Peer send not live candidate", + ); + modify_reputation(ctx, origin, COST_NOT_A_LIVE_CANDIDATE).await; + return Ok(()) }; - let erasure_chunk_hash = BlakeTwo256::hash(&message.erasure_chunk.chunk); - if anticipated_hash != erasure_chunk_hash { - return modify_reputation(ctx, origin, COST_MERKLE_PROOF_INVALID).await; - } - - // an internal unique identifier of this message - let message_id = (message.candidate_hash, message.erasure_chunk.index); - - { - let per_candidate = state.per_candidate.entry(message_id.0.clone()).or_default(); - + // Handle a duplicate before doing expensive checks. + if let Some(existing) = candidate_entry.message_vault.get(&message.erasure_chunk.index) { + let span = candidate_entry.span.child("handle-duplicate"); // check if this particular erasure chunk was already sent by that peer before { - let received_set = per_candidate + let _span = span.child("check-entry"); + let received_set = candidate_entry .received_messages .entry(origin.clone()) .or_default(); - if received_set.contains(&message_id) { - return modify_reputation(ctx, origin, COST_PEER_DUPLICATE_MESSAGE).await; - } else { - received_set.insert(message_id.clone()); + + if !received_set.insert(message.erasure_chunk.index) { + modify_reputation(ctx, origin, COST_PEER_DUPLICATE_MESSAGE).await; + return Ok(()); } } - // insert into known messages and change reputation - if per_candidate - .message_vault - .insert(message_id.1, message.clone()) - .is_some() + // check that the message content matches what we have already before rewarding + // the peer. { - modify_reputation(ctx, origin, BENEFIT_VALID_MESSAGE).await?; - } else { - modify_reputation(ctx, origin, BENEFIT_VALID_MESSAGE_FIRST).await?; - - // save the chunk for our index - if let Some(validator_index) = per_candidate.validator_index { - if message.erasure_chunk.index == validator_index { - if let Err(_e) = store_chunk( - ctx, - message.candidate_hash.clone(), - message.erasure_chunk.index, - message.erasure_chunk.clone(), - ).await? { - warn!(target: TARGET, "Failed to store erasure chunk to availability store"); - } - } + let _span = span.child("check-accurate"); + if existing == &message { + modify_reputation(ctx, origin, BENEFIT_VALID_MESSAGE).await; + } else { + modify_reputation(ctx, origin, COST_MERKLE_PROOF_INVALID).await; } - }; + } + + return Ok(()); } - // condense the peers to the peers with interest on the candidate - let peers = state - .peer_views - .clone() - .into_iter() - .filter(|(_peer, view)| { - // peers view must contain the candidate hash too - state - .cached_live_candidates_unioned(view.0.iter()) - .contains_key(&message_id.0) - }) - .map(|(peer, _)| -> PeerId { peer.clone() }) - .collect::>(); - let per_candidate = state.per_candidate.entry(message_id.0.clone()).or_default(); + let span = { + let mut span = candidate_entry.span.child("process-new-chunk"); + span.add_string_tag("peer-id", &origin.to_base58()); + span + }; - let peers = peers - .into_iter() - .filter(|peer| { - let peer: PeerId = peer.clone(); - // avoid sending duplicate messages - per_candidate - .sent_messages - .entry(peer) + // check the merkle proof against the erasure root in the candidate descriptor. + let anticipated_hash = { + let _span = span.child("check-merkle-root"); + match branch_hash( + &candidate_entry.descriptor.erasure_root, + &message.erasure_chunk.proof, + message.erasure_chunk.index as usize, + ) { + Ok(hash) => hash, + Err(e) => { + tracing::trace!( + target: LOG_TARGET, + candidate_hash = ?message.candidate_hash, + peer = %origin, + error = ?e, + "Failed to calculate chunk merkle proof", + ); + modify_reputation(ctx, origin, COST_MERKLE_PROOF_INVALID).await; + return Ok(()); + }, + } + }; + + { + let _span = span.child("check-chunk-hash"); + let erasure_chunk_hash = BlakeTwo256::hash(&message.erasure_chunk.chunk); + if anticipated_hash != erasure_chunk_hash { + tracing::trace!( + target: LOG_TARGET, + candidate_hash = ?message.candidate_hash, + peer = %origin, + "Peer sent chunk with invalid merkle proof", + ); + modify_reputation(ctx, origin, COST_MERKLE_PROOF_INVALID).await; + return Ok(()); + } + } + + { + // insert into known messages and change reputation. we've guaranteed + // above that the message vault doesn't contain any message under this + // chunk index already. + + candidate_entry + .received_messages + .entry(origin.clone()) .or_default() - .contains(&message_id) - }) - .collect::>(); + .insert(message.erasure_chunk.index); + + modify_reputation(ctx, origin, BENEFIT_VALID_MESSAGE_FIRST).await; + + // save the chunk for our index + if Some(message.erasure_chunk.index) == candidate_entry.validator_index { + let _span = span.child("store-our-chunk"); + if store_chunk( + ctx, + message.candidate_hash, + candidate_entry.descriptor.relay_parent, + message.erasure_chunk.index, + message.erasure_chunk.clone(), + ).await?.is_err() { + tracing::warn!( + target: LOG_TARGET, + "Failed to store erasure chunk to availability store" + ); + } + } + + candidate_entry.add_message(message.erasure_chunk.index, message.clone()); + candidate_entry.drop_span_after_own_availability(); + } + + // condense the peers to the peers with interest on the candidate + let peers = { + let _span = span.child("determine-recipient-peers"); + let per_relay_parent = &state.per_relay_parent; + state + .peer_views + .clone() + .into_iter() + .filter(|(_, view)| { + // peers view must contain the candidate hash too + cached_live_candidates_unioned( + per_relay_parent, + view.heads.iter(), + ).contains(&message.candidate_hash) + }) + .map(|(peer, _)| -> PeerId { peer.clone() }) + .filter(|peer| candidate_entry.message_required_by_peer(peer, message.erasure_chunk.index)) + .collect::>() + }; + + drop(span); // gossip that message to interested peers - send_tracked_gossip_message_to_peers(ctx, per_candidate, peers, message).await + let mut batch = Vec::new(); + add_tracked_messages_to_batch(&mut batch, candidate_entry, metrics, peers, iter::once(message)); + send_batch_to_network(ctx, batch).await; + + Ok(()) } /// The bitfield distribution subsystem. pub struct AvailabilityDistributionSubsystem { /// Pointer to a keystore, which is required for determining this nodes validator index. - keystore: KeyStorePtr, + keystore: SyncCryptoStorePtr, + /// Prometheus metrics. + metrics: Metrics, } impl AvailabilityDistributionSubsystem { @@ -708,32 +791,55 @@ impl AvailabilityDistributionSubsystem { const K: usize = 3; /// Create a new instance of the availability distribution. - pub fn new(keystore: KeyStorePtr) -> Self { - Self { keystore } + pub fn new(keystore: SyncCryptoStorePtr, metrics: Metrics) -> Self { + Self { keystore, metrics } } /// Start processing work as passed on from the Overseer. - async fn run(self, mut ctx: Context) -> Result<()> + async fn run(self, ctx: Context) -> Result<()> + where + Context: SubsystemContext, + { + let mut state = ProtocolState { + peer_views: HashMap::new(), + view: Default::default(), + live_under: HashMap::new(), + per_relay_parent: HashMap::new(), + per_candidate: HashMap::new(), + }; + + self.run_inner(ctx, &mut state).await + } + + /// Start processing work. + #[tracing::instrument(skip(self, ctx), fields(subsystem = LOG_TARGET))] + async fn run_inner(self, mut ctx: Context, state: &mut ProtocolState) -> Result<()> where Context: SubsystemContext, { // work: process incoming messages from the overseer. - let mut state = ProtocolState::default(); loop { - let message = ctx.recv().await.map_err::(Into::into)?; + let message = ctx + .recv() + .await + .map_err(|e| Error::IncomingMessageChannel(e))?; match message { FromOverseer::Communication { msg: AvailabilityDistributionMessage::NetworkBridgeUpdateV1(event), } => { if let Err(e) = handle_network_msg( &mut ctx, - self.keystore.clone(), - &mut state, - event - ).await { - warn!( - target: TARGET, - "Failed to handle incomming network messages: {:?}", e + &self.keystore.clone(), + state, + &self.metrics, + event, + ) + .await + { + tracing::warn!( + target: LOG_TARGET, + err = ?e, + "Failed to handle incoming network messages", ); } } @@ -743,7 +849,7 @@ impl AvailabilityDistributionSubsystem { })) => { // handled at view change } - FromOverseer::Signal(OverseerSignal::BlockFinalized(_)) => {} + FromOverseer::Signal(OverseerSignal::BlockFinalized(..)) => {} FromOverseer::Signal(OverseerSignal::Conclude) => { return Ok(()); } @@ -756,110 +862,112 @@ impl Subsystem for AvailabilityDistributionSubsystem where Context: SubsystemContext + Sync + Send, { - type Metrics = (); - fn start(self, ctx: Context) -> SpawnedSubsystem { + let future = self + .run(ctx) + .map_err(|e| SubsystemError::with_origin("availability-distribution", e)) + .boxed(); + SpawnedSubsystem { name: "availability-distribution-subsystem", - future: Box::pin(async move { self.run(ctx) }.map(|_| ())), + future, } } } -/// Obtain all live candidates based on an iterator of relay heads. -async fn query_live_candidates_without_ancestors( +/// Metadata about a candidate that is part of the live_candidates set. +/// +/// Those which were not present in a cache are "fresh" and have their candidate descriptor attached. This +/// information is propagated to the higher level where it can be used to create data entries. Cached candidates +/// already have entries associated with them, and thus don't need this metadata to be fetched. +#[derive(Debug)] +enum FetchedLiveCandidate { + Cached, + Fresh(CandidateDescriptor), +} + +/// Obtain all live candidates for all given `relay_blocks`. +/// +/// This returns a set of all candidate hashes pending availability within the state +/// of the explicitly referenced relay heads. +/// +/// This also queries the provided `live_under` cache before reaching into the +/// runtime and updates it with the information learned. +#[tracing::instrument(level = "trace", skip(ctx, relay_blocks, live_under), fields(subsystem = LOG_TARGET))] +async fn query_pending_availability_at( ctx: &mut Context, - relay_parents: impl IntoIterator, -) -> Result> + relay_blocks: impl IntoIterator, + live_under: &mut HashMap>, +) -> Result> where Context: SubsystemContext, { - let iter = relay_parents.into_iter(); - let hint = iter.size_hint(); - - let mut live_candidates = HashSet::with_capacity(hint.1.unwrap_or(hint.0)); - for relay_parent in iter { - let paras = query_para_ids(ctx, relay_parent).await?; - for para in paras { - if let Some(ccr) = query_pending_availability(ctx, relay_parent, para).await? { - live_candidates.insert(ccr); - } + let mut live_candidates = HashMap::new(); + + // fetch and fill out cache for each of these + for relay_parent in relay_blocks { + let receipts_for = match live_under.entry(relay_parent) { + Entry::Occupied(e) => { + live_candidates.extend( + e.get().iter().cloned().map(|c| (c, FetchedLiveCandidate::Cached)) + ); + continue + }, + e => e.or_default(), + }; + + for (receipt_hash, descriptor) in query_pending_availability(ctx, relay_parent).await? { + // unfortunately we have no good way of telling the candidate was + // cached until now. But we don't clobber a `Cached` entry if there + // is one already. + live_candidates.entry(receipt_hash).or_insert(FetchedLiveCandidate::Fresh(descriptor)); + receipts_for.insert(receipt_hash); } } + Ok(live_candidates) } -/// Obtain all live candidates based on an iterator or relay heads including `k` ancestors. +/// Obtain all live candidates under a particular relay head. This implicitly includes +/// `K` ancestors of the head, such that the candidates pending availability in all of +/// the states of the head and the ancestors are unioned together to produce the +/// return type of this function. Each candidate hash is paired with information about +/// from where it was fetched. /// -/// Relay parent. +/// This also updates all `live_under` cached by the protocol state and returns a list +/// of up to `K` ancestors of the relay-parent. +#[tracing::instrument(level = "trace", skip(ctx, live_under), fields(subsystem = LOG_TARGET))] async fn query_live_candidates( ctx: &mut Context, - state: &mut ProtocolState, - relay_parents: impl IntoIterator, -) -> Result> + live_under: &mut HashMap>, + relay_parent: Hash, +) -> Result<(HashMap, Vec)> where Context: SubsystemContext, { - let iter = relay_parents.into_iter(); - let hint = iter.size_hint(); - - let capacity = hint.1.unwrap_or(hint.0) * (1 + AvailabilityDistributionSubsystem::K); - let mut live_candidates = - HashMap::::with_capacity(capacity); - - for relay_parent in iter { - - // register one of relay parents (not the ancestors) - let mut ancestors = query_up_to_k_ancestors_in_same_session( - ctx, - relay_parent, - AvailabilityDistributionSubsystem::K, - ) - .await?; - - ancestors.push(relay_parent); + // register one of relay parents (not the ancestors) + let ancestors = query_up_to_k_ancestors_in_same_session( + ctx, + relay_parent, + AvailabilityDistributionSubsystem::K, + ) + .await?; + // query the ones that were not present in the live_under cache and add them + // to it. + let live_candidates = query_pending_availability_at( + ctx, + ancestors.iter().cloned().chain(iter::once(relay_parent)), + live_under, + ).await?; - // ancestors might overlap, so check the cache too - let unknown = ancestors - .into_iter() - .filter(|relay_parent_or_ancestor| { - // use the ones which we pulled before - // but keep the unknown relay parents - state - .receipts - .get(relay_parent_or_ancestor) - .and_then(|receipts| { - // directly extend the live_candidates with the cached value - live_candidates.extend(receipts.into_iter().map( - |(receipt_hash, receipt)| { - ( - relay_parent, - (receipt_hash.clone(), receipt.clone()), - ) - }, - )); - Some(()) - }) - .is_none() - }) - .collect::>(); - - // query the ones that were not present in the receipts cache - let receipts = query_live_candidates_without_ancestors(ctx, unknown.clone()).await?; - live_candidates.extend( - unknown.into_iter().zip( - receipts - .into_iter() - .map(|receipt| (receipt.hash(), receipt)), - ), - ); - } - Ok(live_candidates) + Ok((live_candidates, ancestors)) } -/// Query all para IDs. -async fn query_para_ids(ctx: &mut Context, relay_parent: Hash) -> Result> +/// Query all hashes and descriptors of candidates pending availability at a particular block. +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] +async fn query_pending_availability(ctx: &mut Context, relay_parent: Hash) + -> Result> where Context: SubsystemContext, { @@ -868,63 +976,57 @@ where relay_parent, RuntimeApiRequest::AvailabilityCores(tx), ))) - .await - .map_err::(Into::into)?; + .await; - let all_para_ids: Vec<_> = rx - .await??; + let cores: Vec<_> = rx + .await + .map_err(|e| Error::AvailabilityCoresResponseChannel(e))? + .map_err(|e| Error::AvailabilityCores(e))?; - let occupied_para_ids = all_para_ids - .into_iter() - .filter_map(|core_state| { - if let CoreState::Occupied(occupied) = core_state { - Some(occupied.para_id) - } else { - None - } + Ok(cores.into_iter() + .filter_map(|core_state| if let CoreState::Occupied(occupied) = core_state { + Some((occupied.candidate_hash, occupied.candidate_descriptor)) + } else { + None }) - .collect(); - Ok(occupied_para_ids) + .collect()) } /// Modify the reputation of a peer based on its behavior. -async fn modify_reputation(ctx: &mut Context, peer: PeerId, rep: Rep) -> Result<()> +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] +async fn modify_reputation(ctx: &mut Context, peer: PeerId, rep: Rep) where Context: SubsystemContext, { - trace!( - target: TARGET, - "Reputation change of {:?} for peer {:?}", - rep, - peer + tracing::trace!( + target: LOG_TARGET, + rep = ?rep, + peer_id = ?peer, + "Reputation change for peer", ); ctx.send_message(AllMessages::NetworkBridge( NetworkBridgeMessage::ReportPeer(peer, rep), - )) - .await - .map_err::(Into::into) + )).await; } /// Query the proof of validity for a particular candidate hash. -async fn query_data_availability( - ctx: &mut Context, - candidate_hash: Hash, -) -> Result +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] +async fn query_data_availability(ctx: &mut Context, candidate_hash: CandidateHash) -> Result where Context: SubsystemContext, { let (tx, rx) = oneshot::channel(); ctx.send_message(AllMessages::AvailabilityStore( AvailabilityStoreMessage::QueryDataAvailability(candidate_hash, tx), - )) - .await?; - rx.await.map_err::(Into::into) -} + )).await; + rx.await.map_err(|e| Error::QueryAvailabilityResponseChannel(e)) +} +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn query_chunk( ctx: &mut Context, - candidate_hash: Hash, + candidate_hash: CandidateHash, validator_index: ValidatorIndex, ) -> Result> where @@ -932,16 +1034,17 @@ where { let (tx, rx) = oneshot::channel(); ctx.send_message(AllMessages::AvailabilityStore( - AvailabilityStoreMessage::QueryChunk(candidate_hash, validator_index, tx), - )) - .await?; - rx.await.map_err::(Into::into) -} + AvailabilityStoreMessage::QueryChunk(candidate_hash, validator_index, tx), + )).await; + rx.await.map_err(|e| Error::QueryChunkResponseChannel(e)) +} +#[tracing::instrument(level = "trace", skip(ctx, erasure_chunk), fields(subsystem = LOG_TARGET))] async fn store_chunk( ctx: &mut Context, - candidate_hash: Hash, + candidate_hash: CandidateHash, + relay_parent: Hash, validator_index: ValidatorIndex, erasure_chunk: ErasureChunk, ) -> Result> @@ -950,31 +1053,19 @@ where { let (tx, rx) = oneshot::channel(); ctx.send_message(AllMessages::AvailabilityStore( - AvailabilityStoreMessage::StoreChunk(candidate_hash, validator_index, erasure_chunk, tx), - )).await?; - rx.await.map_err::(Into::into) -} - -/// Request the head data for a particular para. -async fn query_pending_availability( - ctx: &mut Context, - relay_parent: Hash, - para: ParaId, -) -> Result> -where - Context: SubsystemContext, -{ - let (tx, rx) = oneshot::channel(); - ctx.send_message(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + AvailabilityStoreMessage::StoreChunk { + candidate_hash, relay_parent, - RuntimeApiRequest::CandidatePendingAvailability(para, tx), - ))) - .await?; - rx.await? - .map_err::(Into::into) + chunk: erasure_chunk, + tx, + } + )).await; + + rx.await.map_err(|e| Error::StoreChunkResponseChannel(e)) } /// Query the validator set. +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn query_validators( ctx: &mut Context, relay_parent: Hash, @@ -989,12 +1080,14 @@ where )); ctx.send_message(query_validators) - .await?; - rx.await? - .map_err::(Into::into) + .await; + rx.await + .map_err(|e| Error::QueryValidatorsResponseChannel(e))? + .map_err(|e| Error::QueryValidators(e)) } /// Query the hash of the `K` ancestors +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn query_k_ancestors( ctx: &mut Context, relay_parent: Hash, @@ -1011,12 +1104,14 @@ where }); ctx.send_message(query_ancestors) - .await?; - rx.await? - .map_err::(Into::into) + .await; + rx.await + .map_err(|e| Error::QueryAncestorsResponseChannel(e))? + .map_err(|e| Error::QueryAncestors(e)) } /// Query the session index of a relay parent +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn query_session_index_for_child( ctx: &mut Context, relay_parent: Hash, @@ -1031,12 +1126,14 @@ where )); ctx.send_message(query_session_idx_for_child) - .await?; - rx.await? - .map_err::(Into::into) + .await; + rx.await + .map_err(|e| Error::QuerySessionResponseChannel(e))? + .map_err(|e| Error::QuerySession(e)) } /// Queries up to k ancestors with the constraints of equiv session +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn query_up_to_k_ancestors_in_same_session( ctx: &mut Context, relay_parent: Hash, @@ -1056,24 +1153,77 @@ where // iterate from youngest to oldest let mut iter = ancestors.into_iter().peekable(); - while let Some(ancestor) = iter.next() { - if let Some(ancestor_parent) = iter.peek() { - let session = query_session_index_for_child(ctx, *ancestor_parent).await?; - if session != desired_session { - break; - } - acc.push(ancestor); - } else { - // either ended up at genesis or the blocks were - // already pruned + while let Some((ancestor, ancestor_parent)) = iter.next().and_then(|a| iter.peek().map(|ap| (a, ap))) { + if query_session_index_for_child(ctx, *ancestor_parent).await? != desired_session { break; } + acc.push(ancestor); } debug_assert!(acc.len() <= k); Ok(acc) } +#[derive(Clone)] +struct MetricsInner { + gossipped_availability_chunks: prometheus::Counter, + handle_our_view_change: prometheus::Histogram, + process_incoming_peer_message: prometheus::Histogram, +} -#[cfg(test)] -mod tests; +/// Availability Distribution metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_chunk_distributed(&self) { + if let Some(metrics) = &self.0 { + metrics.gossipped_availability_chunks.inc(); + } + } + + /// Provide a timer for `handle_our_view_change` which observes on drop. + fn time_handle_our_view_change(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.handle_our_view_change.start_timer()) + } + + /// Provide a timer for `process_incoming_peer_message` which observes on drop. + fn time_process_incoming_peer_message(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.process_incoming_peer_message.start_timer()) + } +} + +impl metrics::Metrics for Metrics { + fn try_register( + registry: &prometheus::Registry, + ) -> std::result::Result { + let metrics = MetricsInner { + gossipped_availability_chunks: prometheus::register( + prometheus::Counter::new( + "parachain_gossipped_availability_chunks_total", + "Number of availability chunks gossipped to other peers.", + )?, + registry, + )?, + handle_our_view_change: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_availability_distribution_handle_our_view_change", + "Time spent within `availability_distribution::handle_our_view_change`", + ) + )?, + registry, + )?, + process_incoming_peer_message: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_availability_distribution_process_incoming_peer_message", + "Time spent within `availability_distribution::process_incoming_peer_message`", + ) + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} diff --git a/node/network/availability-distribution/src/tests.rs b/node/network/availability-distribution/src/tests.rs index 0c27e4c21264a63a495c8538fcb81627f6835223..f1573dc62d4c00319e32cb463a55004c8fd77722 100644 --- a/node/network/availability-distribution/src/tests.rs +++ b/node/network/availability-distribution/src/tests.rs @@ -17,138 +17,126 @@ use super::*; use assert_matches::assert_matches; use polkadot_erasure_coding::{branches, obtain_chunks_v1 as obtain_chunks}; +use polkadot_node_network_protocol::{view, ObservedRole, our_view}; +use polkadot_node_subsystem_util::TimeoutExt; use polkadot_primitives::v1::{ AvailableData, BlockData, CandidateCommitments, CandidateDescriptor, GroupIndex, - GroupRotationInfo, HeadData, PersistedValidationData, OccupiedCore, - PoV, ScheduledCore, ValidatorPair, + GroupRotationInfo, HeadData, OccupiedCore, PersistedValidationData, PoV, ScheduledCore, Id as ParaId, + CommittedCandidateReceipt, }; -use polkadot_subsystem_testhelpers::{self as test_helpers}; -use polkadot_node_subsystem_util::TimeoutExt; -use polkadot_node_network_protocol::ObservedRole; +use polkadot_subsystem_testhelpers as test_helpers; use futures::{executor, future, Future}; -use futures_timer::Delay; -use smallvec::smallvec; -use std::time::Duration; +use sc_keystore::LocalKeystore; +use sp_application_crypto::AppKey; +use sp_keystore::{SyncCryptoStore, SyncCryptoStorePtr}; +use sp_keyring::Sr25519Keyring; +use std::{sync::Arc, time::Duration}; +use maplit::hashmap; macro_rules! view { - ( $( $hash:expr ),* $(,)? ) => [ - View(vec![ $( $hash.clone() ),* ]) - ]; - } - -macro_rules! delay { - ($delay:expr) => { - Delay::new(Duration::from_millis($delay)).await; + ( $( $hash:expr ),* $(,)? ) => { + // Finalized number unimportant for availability distribution. + View { heads: vec![ $( $hash.clone() ),* ], finalized_number: 0 } }; } -fn chunk_protocol_message(message: AvailabilityGossipMessage) - -> protocol_v1::AvailabilityDistributionMessage -{ +fn chunk_protocol_message( + message: AvailabilityGossipMessage, +) -> protocol_v1::AvailabilityDistributionMessage { protocol_v1::AvailabilityDistributionMessage::Chunk( message.candidate_hash, message.erasure_chunk, ) } +fn make_per_candidate() -> PerCandidate { + PerCandidate { + live_in: HashSet::new(), + message_vault: HashMap::new(), + received_messages: HashMap::new(), + sent_messages: HashMap::new(), + validators: Vec::new(), + validator_index: None, + descriptor: Default::default(), + span: jaeger::JaegerSpan::Disabled, + } +} + struct TestHarness { virtual_overseer: test_helpers::TestSubsystemContextHandle, } fn test_harness>( - keystore: KeyStorePtr, - test: impl FnOnce(TestHarness) -> T, -) { - let _ = env_logger::builder() - .is_test(true) - .filter( - Some("polkadot_availability_distribution"), - log::LevelFilter::Trace, - ) - .try_init(); + keystore: SyncCryptoStorePtr, + test_fx: impl FnOnce(TestHarness) -> T, +) -> ProtocolState { + sp_tracing::try_init_simple(); let pool = sp_core::testing::TaskExecutor::new(); - let (context, virtual_overseer) = test_helpers::make_subsystem_context(pool.clone()); - let subsystem = AvailabilityDistributionSubsystem::new(keystore); - let subsystem = subsystem.run(context); + let subsystem = AvailabilityDistributionSubsystem::new(keystore, Default::default()); + let mut state = ProtocolState::default(); + { + let subsystem = subsystem.run_inner(context, &mut state); - let test_fut = test(TestHarness { virtual_overseer }); + let test_fut = test_fx(TestHarness { virtual_overseer }); - futures::pin_mut!(test_fut); - futures::pin_mut!(subsystem); - - executor::block_on(future::select(test_fut, subsystem)); -} + futures::pin_mut!(test_fut); + futures::pin_mut!(subsystem); -const TIMEOUT: Duration = Duration::from_millis(100); + executor::block_on(future::select(test_fut, subsystem)); + } -async fn overseer_signal( - overseer: &mut test_helpers::TestSubsystemContextHandle, - signal: OverseerSignal, -) { - delay!(50); - overseer - .send(FromOverseer::Signal(signal)) - .timeout(TIMEOUT) - .await - .expect("10ms is more than enough for sending signals."); + state } async fn overseer_send( overseer: &mut test_helpers::TestSubsystemContextHandle, - msg: AvailabilityDistributionMessage, + msg: impl Into, ) { - log::trace!("Sending message:\n{:?}", &msg); - overseer - .send(FromOverseer::Communication { msg }) - .timeout(TIMEOUT) - .await - .expect("10ms is more than enough for sending messages."); + let msg = msg.into(); + tracing::trace!(msg = ?msg, "sending message"); + overseer.send(FromOverseer::Communication { msg }).await } async fn overseer_recv( overseer: &mut test_helpers::TestSubsystemContextHandle, ) -> AllMessages { - log::trace!("Waiting for message ..."); - let msg = overseer - .recv() - .timeout(TIMEOUT) - .await - .expect("TIMEOUT is enough to recv."); - log::trace!("Received message:\n{:?}", &msg); + tracing::trace!("waiting for message ..."); + let msg = overseer.recv().await; + tracing::trace!(msg = ?msg, "received message"); msg } -fn dummy_occupied_core(para: ParaId) -> CoreState { +fn occupied_core_from_candidate(receipt: &CommittedCandidateReceipt) -> CoreState { CoreState::Occupied(OccupiedCore { - para_id: para, next_up_on_available: None, occupied_since: 0, time_out_at: 5, next_up_on_time_out: None, availability: Default::default(), group_responsible: GroupIndex::from(0), + candidate_hash: receipt.hash(), + candidate_descriptor: receipt.descriptor().clone(), }) } -use sp_keyring::Sr25519Keyring; - #[derive(Clone)] struct TestState { chain_ids: Vec, validators: Vec, validator_public: Vec, - validator_index: Option, validator_groups: (Vec>, GroupRotationInfo), head_data: HashMap, - keystore: KeyStorePtr, + keystore: SyncCryptoStorePtr, relay_parent: Hash, ancestors: Vec, availability_cores: Vec, persisted_validation_data: PersistedValidationData, + candidates: Vec, + pov_blocks: Vec, } fn validator_pubkeys(val_ids: &[Sr25519Keyring]) -> Vec { @@ -170,12 +158,14 @@ impl Default for TestState { Sr25519Keyring::Dave, ]; - let keystore = keystore::Store::new_in_memory(); + let keystore: SyncCryptoStorePtr = Arc::new(LocalKeystore::in_memory()); - keystore - .write() - .insert_ephemeral_from_seed::(&validators[0].to_seed()) - .expect("Insert key into keystore"); + SyncCryptoStore::sr25519_generate_new( + &*keystore, + ValidatorId::ID, + Some(&validators[0].to_seed()), + ) + .expect("Insert key into keystore"); let validator_public = validator_pubkeys(&validators); @@ -213,9 +203,41 @@ impl Default for TestState { parent_head: HeadData(vec![7, 8, 9]), block_number: Default::default(), hrmp_mqc_heads: Vec::new(), + dmq_mqc_head: Default::default(), + max_pov_size: 1024, + relay_storage_root: Default::default(), + }; + + let pov_block_a = PoV { + block_data: BlockData(vec![42, 43, 44]), }; - let validator_index = Some((validators.len() - 1) as ValidatorIndex); + let pov_block_b = PoV { + block_data: BlockData(vec![45, 46, 47]), + }; + + let candidates = vec![ + TestCandidateBuilder { + para_id: chain_ids[0], + relay_parent: relay_parent, + pov_hash: pov_block_a.hash(), + erasure_root: make_erasure_root(persisted_validation_data.clone(), validators.len(), pov_block_a.clone()), + head_data: head_data.get(&chain_ids[0]).unwrap().clone(), + ..Default::default() + } + .build(), + TestCandidateBuilder { + para_id: chain_ids[1], + relay_parent: relay_parent, + pov_hash: pov_block_b.hash(), + erasure_root: make_erasure_root(persisted_validation_data.clone(), validators.len(), pov_block_b.clone()), + head_data: head_data.get(&chain_ids[1]).unwrap().clone(), + ..Default::default() + } + .build(), + ]; + + let pov_blocks = vec![pov_block_a, pov_block_b]; Self { chain_ids, @@ -228,34 +250,42 @@ impl Default for TestState { persisted_validation_data, relay_parent, ancestors, - validator_index, + candidates, + pov_blocks, } } } -fn make_available_data(test: &TestState, pov: PoV) -> AvailableData { +fn make_available_data(validation_data: PersistedValidationData, pov: PoV) -> AvailableData { AvailableData { - validation_data: test.persisted_validation_data.clone(), - pov, + validation_data, + pov: Arc::new(pov), } } -fn make_erasure_root(test: &TestState, pov: PoV) -> Hash { - let available_data = make_available_data(test, pov); +fn make_erasure_root(peristed: PersistedValidationData, validator_count: usize, pov: PoV) -> Hash { + let available_data = make_available_data(peristed, pov); - let chunks = obtain_chunks(test.validators.len(), &available_data).unwrap(); + let chunks = obtain_chunks(validator_count, &available_data).unwrap(); branches(&chunks).root() } +fn make_erasure_chunks(peristed: PersistedValidationData, validator_count: usize, pov: PoV) -> Vec { + let available_data = make_available_data(peristed, pov); + + derive_erasure_chunks_with_proofs(validator_count, &available_data) +} + fn make_valid_availability_gossip( test: &TestState, - candidate_hash: Hash, + candidate: usize, erasure_chunk_index: u32, - pov: PoV, ) -> AvailabilityGossipMessage { - let available_data = make_available_data(test, pov); - - let erasure_chunks = derive_erasure_chunks_with_proofs(test.validators.len(), &available_data); + let erasure_chunks = make_erasure_chunks( + test.persisted_validation_data.clone(), + test.validator_public.len(), + test.pov_blocks[candidate].clone(), + ); let erasure_chunk: ErasureChunk = erasure_chunks .get(erasure_chunk_index as usize) @@ -263,7 +293,7 @@ fn make_valid_availability_gossip( .clone(); AvailabilityGossipMessage { - candidate_hash, + candidate_hash: test.candidates[candidate].hash(), erasure_chunk, } } @@ -284,11 +314,11 @@ impl TestCandidateBuilder { para_id: self.para_id, pov_hash: self.pov_hash, relay_parent: self.relay_parent, + erasure_root: self.erasure_root, ..Default::default() }, commitments: CandidateCommitments { head_data: self.head_data, - erasure_root: self.erasure_root, ..Default::default() }, } @@ -299,25 +329,13 @@ impl TestCandidateBuilder { fn helper_integrity() { let test_state = TestState::default(); - let pov_block = PoV { - block_data: BlockData(vec![42, 43, 44]), - }; - - let pov_hash = pov_block.hash(); - - let candidate = TestCandidateBuilder { - para_id: test_state.chain_ids[0], - relay_parent: test_state.relay_parent, - pov_hash: pov_hash, - erasure_root: make_erasure_root(&test_state, pov_block.clone()), - ..Default::default() - } - .build(); - - let message = - make_valid_availability_gossip(&test_state, dbg!(candidate.hash()), 2, pov_block.clone()); + let message = make_valid_availability_gossip( + &test_state, + 0, + 2, + ); - let root = dbg!(&candidate.commitments.erasure_root); + let root = &test_state.candidates[0].descriptor.erasure_root; let anticipated_hash = branch_hash( root, @@ -352,541 +370,558 @@ fn derive_erasure_chunks_with_proofs( erasure_chunks } -#[test] -fn reputation_verification() { - let test_state = TestState::default(); - - test_harness(test_state.keystore.clone(), |test_harness| async move { - let TestHarness { - mut virtual_overseer, - } = test_harness; - - let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); - - let pov_block_a = PoV { - block_data: BlockData(vec![42, 43, 44]), - }; - - let pov_block_b = PoV { - block_data: BlockData(vec![45, 46, 47]), - }; - - let pov_block_c = PoV { - block_data: BlockData(vec![48, 49, 50]), - }; - - let pov_hash_a = pov_block_a.hash(); - let pov_hash_b = pov_block_b.hash(); - let pov_hash_c = pov_block_c.hash(); - - let candidates = vec![ - TestCandidateBuilder { - para_id: test_state.chain_ids[0], - relay_parent: test_state.relay_parent, - pov_hash: pov_hash_a, - erasure_root: make_erasure_root(&test_state, pov_block_a.clone()), - ..Default::default() - } - .build(), - TestCandidateBuilder { - para_id: test_state.chain_ids[0], - relay_parent: test_state.relay_parent, - pov_hash: pov_hash_b, - erasure_root: make_erasure_root(&test_state, pov_block_b.clone()), - head_data: expected_head_data.clone(), - ..Default::default() - } - .build(), - TestCandidateBuilder { - para_id: test_state.chain_ids[1], - relay_parent: Hash::repeat_byte(0xFA), - pov_hash: pov_hash_c, - erasure_root: make_erasure_root(&test_state, pov_block_c.clone()), - head_data: test_state - .head_data - .get(&test_state.chain_ids[1]) - .unwrap() - .clone(), - ..Default::default() +async fn expect_chunks_network_message( + virtual_overseer: &mut test_helpers::TestSubsystemContextHandle, + peers: &[Vec], + candidates: &[CandidateHash], + chunks: &[ErasureChunk], +) { + if chunks.is_empty() { return } + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendValidationMessages(msgs) + ) => { + assert_eq!(msgs.len(), chunks.len()); + for (send_peers, msg) in msgs { + assert_matches!( + msg, + protocol_v1::ValidationProtocol::AvailabilityDistribution( + protocol_v1::AvailabilityDistributionMessage::Chunk(send_candidate, send_chunk) + ) => { + let i = chunks.iter().position(|c| c == &send_chunk).unwrap(); + assert!(candidates.contains(&send_candidate), format!("Could not find candidate: {:?}", send_candidate)); + assert_eq!(&peers[i], &send_peers); + } + ); } - .build(), - ]; - - let TestState { - chain_ids, - keystore: _, - validators: _, - validator_public, - validator_groups, - availability_cores, - head_data: _, - persisted_validation_data: _, - relay_parent: current, - ancestors, - validator_index: _, - } = test_state.clone(); - - let _ = validator_groups; - let _ = availability_cores; - - let peer_a = PeerId::random(); - let peer_b = PeerId::random(); - assert_ne!(&peer_a, &peer_b); - - log::trace!("peer A: {:?}", peer_a); - log::trace!("peer B: {:?}", peer_b); - - log::trace!("candidate A: {:?}", candidates[0].hash()); - log::trace!("candidate B: {:?}", candidates[1].hash()); - - overseer_signal( - &mut virtual_overseer, - OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { - activated: smallvec![current.clone()], - deactivated: smallvec![], - }), - ) - .await; - - overseer_send( - &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::OurViewChange(view![current,]), - ), - ) - .await; + } + ) +} - // obtain the validators per relay parent - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::Validators(tx), - )) => { - assert_eq!(relay_parent, current); - tx.send(Ok(validator_public.clone())).unwrap(); - } - ); +async fn change_our_view( + virtual_overseer: &mut test_helpers::TestSubsystemContextHandle, + view: OurView, + validator_public: &[ValidatorId], + ancestors: Vec, + session_per_relay_parent: HashMap, + availability_cores_per_relay_parent: HashMap>, + data_availability: HashMap, + chunk_data_per_candidate: HashMap, + send_chunks_to: HashMap>, +) { + overseer_send(virtual_overseer, NetworkBridgeEvent::OurViewChange(view.clone())).await; - let genesis = Hash::repeat_byte(0xAA); - // query of k ancestors, we only provide one - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::ChainApi(ChainApiMessage::Ancestors { - hash: relay_parent, - k, - response_channel: tx, - }) => { - assert_eq!(relay_parent, current); - assert_eq!(k, AvailabilityDistributionSubsystem::K + 1); - // 0xAA..AA will not be included, since there is no mean to determine - // its session index - tx.send(Ok(vec![ancestors[0].clone(), genesis])).unwrap(); - } - ); + // obtain the validators per relay parent + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(tx), + )) => { + assert!(view.contains(&relay_parent)); + tx.send(Ok(validator_public.to_vec())).unwrap(); + } + ); - // state query for each of them - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::SessionIndexForChild(tx) - )) => { - assert_eq!(relay_parent, current); - tx.send(Ok(1 as SessionIndex)).unwrap(); - } - ); + // query of k ancestors, we only provide one + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::Ancestors { + hash: relay_parent, + k, + response_channel: tx, + }) => { + assert!(view.contains(&relay_parent)); + assert_eq!(k, AvailabilityDistributionSubsystem::K + 1); + tx.send(Ok(ancestors.clone())).unwrap(); + } + ); + for _ in 0..session_per_relay_parent.len() { assert_matches!( - overseer_recv(&mut virtual_overseer).await, + overseer_recv(virtual_overseer).await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( relay_parent, RuntimeApiRequest::SessionIndexForChild(tx) )) => { - assert_eq!(relay_parent, genesis); - tx.send(Ok(1 as SessionIndex)).unwrap(); + let index = session_per_relay_parent.get(&relay_parent) + .expect(&format!("Session index for relay parent {:?} does not exist", relay_parent)); + tx.send(Ok(*index)).unwrap(); } ); + } - // subsystem peer id collection - // which will query the availability cores + for _ in 0..availability_cores_per_relay_parent.len() { assert_matches!( - overseer_recv(&mut virtual_overseer).await, + overseer_recv(virtual_overseer).await, AllMessages::RuntimeApi(RuntimeApiMessage::Request( relay_parent, RuntimeApiRequest::AvailabilityCores(tx) )) => { - assert_eq!(relay_parent, ancestors[0]); - // respond with a set of availability core states - tx.send(Ok(vec![ - dummy_occupied_core(chain_ids[0]), - dummy_occupied_core(chain_ids[1]) - ])).unwrap(); - } - ); + let cores = availability_cores_per_relay_parent.get(&relay_parent) + .expect(&format!("Availability core for relay parent {:?} does not exist", relay_parent)); - // now each of the relay parents in the view (1) will - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::CandidatePendingAvailability(para, tx) - )) => { - assert_eq!(relay_parent, ancestors[0]); - assert_eq!(para, chain_ids[0]); - tx.send(Ok(Some( - candidates[0].clone() - ))).unwrap(); + tx.send(Ok(cores.clone())).unwrap(); } ); + } - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::CandidatePendingAvailability(para, tx) - )) => { - assert_eq!(relay_parent, ancestors[0]); - assert_eq!(para, chain_ids[1]); - tx.send(Ok(Some( - candidates[1].clone() - ))).unwrap(); + let mut send_peers = Vec::new(); + let mut send_chunks = Vec::new(); + let mut candidates = Vec::new(); + for _ in 0..data_availability.len() { + let (available, candidate_hash) = assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::QueryDataAvailability( + candidate_hash, + tx, + ) + ) => { + let available = data_availability.get(&candidate_hash) + .expect(&format!("No data availability for candidate {:?}", candidate_hash)); + + tx.send(*available).unwrap(); + (available, candidate_hash) } ); - for _ in 0usize..1 { - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - _relay_parent, - RuntimeApiRequest::AvailabilityCores(tx), - )) => { - tx.send(Ok(vec![ - CoreState::Occupied(OccupiedCore { - para_id: chain_ids[0].clone(), - next_up_on_available: None, - occupied_since: 0, - time_out_at: 10, - next_up_on_time_out: None, - availability: Default::default(), - group_responsible: GroupIndex::from(0), - }), - CoreState::Free, - CoreState::Free, - CoreState::Occupied(OccupiedCore { - para_id: chain_ids[1].clone(), - next_up_on_available: None, - occupied_since: 1, - time_out_at: 7, - next_up_on_time_out: None, - availability: Default::default(), - group_responsible: GroupIndex::from(0), - }), - CoreState::Free, - CoreState::Free, - ])).unwrap(); - } - ); - - // query the availability cores for each of the paras (2) - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::RuntimeApi( - RuntimeApiMessage::Request( - _relay_parent, - RuntimeApiRequest::CandidatePendingAvailability(para, tx), - ) - ) => { - assert_eq!(para, chain_ids[0]); - tx.send(Ok(Some( - candidates[0].clone() - ))).unwrap(); - } - ); - - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - _relay_parent, - RuntimeApiRequest::CandidatePendingAvailability(para, tx), - )) => { - assert_eq!(para, chain_ids[1]); - tx.send(Ok(Some( - candidates[1].clone() - ))).unwrap(); - } - ); + if !available { + continue; } - let mut candidates2 = candidates.clone(); - // check if the availability store can provide the desired erasure chunks - for i in 0usize..2 { - log::trace!("0000"); - let avail_data = make_available_data(&test_state, pov_block_a.clone()); - let chunks = - derive_erasure_chunks_with_proofs(test_state.validators.len(), &avail_data); - - let expected; - // store the chunk to the av store - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::AvailabilityStore( - AvailabilityStoreMessage::QueryDataAvailability( - candidate_hash, - tx, - ) - ) => { - let index = candidates2.iter().enumerate().find(|x| { x.1.hash() == candidate_hash }).map(|x| x.0).unwrap(); - expected = dbg!(candidates2.swap_remove(index).hash()); - tx.send( - i == 0 - ).unwrap(); - } - ); - - assert_eq!(chunks.len(), test_state.validators.len()); + candidates.push(candidate_hash); + if let Some((pov, persisted)) = chunk_data_per_candidate.get(&candidate_hash) { + let chunks = make_erasure_chunks(persisted.clone(), validator_public.len(), pov.clone()); - log::trace!("xxxx"); - // retrieve a stored chunk - for (j, chunk) in chunks.into_iter().enumerate() { - log::trace!("yyyy i={}, j={}", i, j); - if i != 0 { - // not a validator, so this never happens - break; - } - assert_matches!( - overseer_recv(&mut virtual_overseer).await, + for _ in 0..chunks.len() { + let chunk = assert_matches!( + overseer_recv(virtual_overseer).await, AllMessages::AvailabilityStore( AvailabilityStoreMessage::QueryChunk( candidate_hash, - idx, + index, tx, ) ) => { - assert_eq!(candidate_hash, expected); - assert_eq!(j as u32, chunk.index); - assert_eq!(idx, j as u32); - tx.send( - Some(chunk.clone()) - ).unwrap(); + tracing::trace!("Query chunk {} for candidate {:?}", index, candidate_hash); + let chunk = chunks[index as usize].clone(); + tx.send(Some(chunk.clone())).unwrap(); + chunk } ); + + if let Some(peers) = send_chunks_to.get(&candidate_hash) { + send_peers.push(peers.clone()); + send_chunks.push(chunk); + } } + } - // setup peer a with interest in current - overseer_send( - &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerConnected(peer_a.clone(), ObservedRole::Full), - ), - ) - .await; + } + + expect_chunks_network_message(virtual_overseer, &send_peers, &candidates, &send_chunks).await; +} + +async fn setup_peer_with_view( + virtual_overseer: &mut test_helpers::TestSubsystemContextHandle, + peer: PeerId, + view: View, +) { + overseer_send(virtual_overseer, NetworkBridgeEvent::PeerConnected(peer.clone(), ObservedRole::Full)).await; - overseer_send( + overseer_send(virtual_overseer, NetworkBridgeEvent::PeerViewChange(peer, view)).await; +} + +async fn peer_send_message( + virtual_overseer: &mut test_helpers::TestSubsystemContextHandle, + peer: PeerId, + message: AvailabilityGossipMessage, + expected_reputation_change: Rep, +) { + overseer_send(virtual_overseer, NetworkBridgeEvent::PeerMessage(peer.clone(), chunk_protocol_message(message))).await; + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer( + rep_peer, + rep, + ) + ) => { + assert_eq!(peer, rep_peer); + assert_eq!(expected_reputation_change, rep); + } + ); +} + +#[test] +fn check_views() { + let test_state = TestState::default(); + + let peer_a = PeerId::random(); + let peer_a_2 = peer_a.clone(); + let peer_b = PeerId::random(); + let peer_b_2 = peer_b.clone(); + assert_ne!(&peer_a, &peer_b); + + let keystore = test_state.keystore.clone(); + let current = test_state.relay_parent; + let ancestors = test_state.ancestors.clone(); + + let state = test_harness(keystore, move |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + let TestState { + validator_public, + relay_parent: current, + ancestors, + candidates, + pov_blocks, + .. + } = test_state.clone(); + + let genesis = Hash::repeat_byte(0xAA); + change_our_view( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerViewChange(peer_a.clone(), view![current]), - ), - ) - .await; + our_view![current], + &validator_public, + vec![ancestors[0], genesis], + hashmap! { current => 1, genesis => 1 }, + hashmap! { + ancestors[0] => vec![ + occupied_core_from_candidate(&candidates[0]), + occupied_core_from_candidate(&candidates[1]), + ], + current => vec![ + CoreState::Occupied(OccupiedCore { + next_up_on_available: None, + occupied_since: 0, + time_out_at: 10, + next_up_on_time_out: None, + availability: Default::default(), + group_responsible: GroupIndex::from(0), + candidate_hash: candidates[0].hash(), + candidate_descriptor: candidates[0].descriptor().clone(), + }), + CoreState::Free, + CoreState::Free, + CoreState::Occupied(OccupiedCore { + next_up_on_available: None, + occupied_since: 1, + time_out_at: 7, + next_up_on_time_out: None, + availability: Default::default(), + group_responsible: GroupIndex::from(0), + candidate_hash: candidates[1].hash(), + candidate_descriptor: candidates[1].descriptor().clone(), + }), + CoreState::Free, + CoreState::Free, + ] + }, + hashmap! { + candidates[0].hash() => true, + candidates[1].hash() => false, + }, + hashmap! { + candidates[0].hash() => (pov_blocks[0].clone(), test_state.persisted_validation_data.clone()), + }, + hashmap! {}, + ).await; + + // setup peer a with interest in current + setup_peer_with_view(&mut virtual_overseer, peer_a.clone(), view![current]).await; // setup peer b with interest in ancestor - overseer_send( - &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerConnected(peer_b.clone(), ObservedRole::Full), - ), - ) - .await; + setup_peer_with_view(&mut virtual_overseer, peer_b.clone(), view![ancestors[0]]).await; + }); - overseer_send( - &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerViewChange(peer_b.clone(), view![ancestors[0]]), - ), - ) - .await; + assert_matches! { + state, + ProtocolState { + peer_views, + view, + .. + } => { + assert_eq!( + peer_views, + hashmap! { + peer_a_2 => view![current], + peer_b_2 => view![ancestors[0]], + }, + ); + assert_eq!(view, our_view![current]); + } + }; +} - delay!(100); +#[test] +fn reputation_verification() { + let test_state = TestState::default(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + assert_ne!(&peer_a, &peer_b); - let valid: AvailabilityGossipMessage = make_valid_availability_gossip( + let keystore = test_state.keystore.clone(); + + test_harness(keystore, move |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + let TestState { + relay_parent: current, + validator_public, + ancestors, + candidates, + pov_blocks, + .. + } = test_state.clone(); + + let valid = make_valid_availability_gossip( &test_state, - candidates[0].hash(), + 0, 2, - pov_block_a.clone(), ); - { - // valid (first, from b) - overseer_send( - &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerMessage( - peer_b.clone(), - chunk_protocol_message(valid.clone()), - ), - ), - ) - .await; + change_our_view( + &mut virtual_overseer, + our_view![current], + &validator_public, + vec![ancestors[0]], + hashmap! { current => 1 }, + hashmap! { + current => vec![ + occupied_core_from_candidate(&candidates[0]), + occupied_core_from_candidate(&candidates[1]), + ], + }, + hashmap! { candidates[0].hash() => true, candidates[1].hash() => false }, + hashmap! { candidates[0].hash() => (pov_blocks[0].clone(), test_state.persisted_validation_data.clone())}, + hashmap! {}, + ).await; - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer( - peer, - rep - ) - ) => { - assert_eq!(peer, peer_b); - assert_eq!(rep, BENEFIT_VALID_MESSAGE_FIRST); - } - ); - } + // valid (first, from b) + peer_send_message(&mut virtual_overseer, peer_b.clone(), valid.clone(), BENEFIT_VALID_MESSAGE).await; - { - // valid (duplicate, from b) - overseer_send( - &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerMessage( - peer_b.clone(), - chunk_protocol_message(valid.clone()), - ), - ), - ) - .await; + // valid (duplicate, from b) + peer_send_message(&mut virtual_overseer, peer_b.clone(), valid.clone(), COST_PEER_DUPLICATE_MESSAGE).await; - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer( - peer, - rep - ) - ) => { - assert_eq!(peer, peer_b); - assert_eq!(rep, COST_PEER_DUPLICATE_MESSAGE); - } - ); - } + // valid (second, from a) + peer_send_message(&mut virtual_overseer, peer_a.clone(), valid.clone(), BENEFIT_VALID_MESSAGE).await; + + // send the a message again, so we should detect the duplicate + peer_send_message(&mut virtual_overseer, peer_a.clone(), valid.clone(), COST_PEER_DUPLICATE_MESSAGE).await; + + // peer b sends a message before we have the view + // setup peer a with interest in parent x + overseer_send(&mut virtual_overseer, NetworkBridgeEvent::PeerDisconnected(peer_b.clone())).await; + + overseer_send(&mut virtual_overseer, NetworkBridgeEvent::PeerConnected(peer_b.clone(), ObservedRole::Full)).await; { - // valid (second, from a) - overseer_send( - &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - chunk_protocol_message(valid.clone()), - ), - ), - ) - .await; + // send another message + let valid = make_valid_availability_gossip(&test_state, 1, 2); - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer( - peer, - rep - ) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, BENEFIT_VALID_MESSAGE); - } + // Make peer a and b listen on `current` + overseer_send(&mut virtual_overseer, NetworkBridgeEvent::PeerViewChange(peer_a.clone(), view![current])).await; + + let mut chunks = make_erasure_chunks( + test_state.persisted_validation_data.clone(), + validator_public.len(), + pov_blocks[0].clone(), ); - } - // peer a is not interested in anything anymore - overseer_send( - &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerViewChange(peer_a.clone(), view![]), - ), - ) - .await; + // Both peers send us this chunk already + chunks.remove(2); - { - // send the a message again, so we should detect the duplicate - overseer_send( + let send_peers = chunks.iter().map(|_| vec![peer_a.clone()]).collect::>(); + expect_chunks_network_message(&mut virtual_overseer, &send_peers, &[candidates[0].hash()], &chunks).await; + + overseer_send(&mut virtual_overseer, NetworkBridgeEvent::PeerViewChange(peer_b.clone(), view![current])).await; + + let send_peers = chunks.iter().map(|_| vec![peer_b.clone()]).collect::>(); + expect_chunks_network_message(&mut virtual_overseer, &send_peers, &[candidates[0].hash()], &chunks).await; + + peer_send_message(&mut virtual_overseer, peer_a.clone(), valid.clone(), BENEFIT_VALID_MESSAGE_FIRST).await; + + expect_chunks_network_message( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - chunk_protocol_message(valid.clone()), - ), - ), - ) - .await; + &[vec![peer_b.clone()]], + &[candidates[1].hash()], + &[valid.erasure_chunk.clone()], + ).await; - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer( - peer, - rep - ) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, COST_PEER_DUPLICATE_MESSAGE); - } - ); + // Let B send the same message + peer_send_message(&mut virtual_overseer, peer_b.clone(), valid.clone(), BENEFIT_VALID_MESSAGE).await; } + }); +} - // peer b sends a message before we have the view - // setup peer a with interest in parent x - overseer_send( +#[test] +fn not_a_live_candidate_is_detected() { + let test_state = TestState::default(); + + let peer_a = PeerId::random(); + + let keystore = test_state.keystore.clone(); + + test_harness(keystore, move |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + let TestState { + relay_parent: current, + validator_public, + ancestors, + candidates, + pov_blocks, + .. + } = test_state.clone(); + + change_our_view( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerDisconnected(peer_b.clone()), - ), - ) - .await; + our_view![current], + &validator_public, + vec![ancestors[0]], + hashmap! { current => 1 }, + hashmap! { + current => vec![ + occupied_core_from_candidate(&candidates[0]), + ], + }, + hashmap! { candidates[0].hash() => true }, + hashmap! { candidates[0].hash() => (pov_blocks[0].clone(), test_state.persisted_validation_data.clone())}, + hashmap! {}, + ).await; + + let valid = make_valid_availability_gossip( + &test_state, + 1, + 1, + ); + + peer_send_message(&mut virtual_overseer, peer_a.clone(), valid.clone(), COST_NOT_A_LIVE_CANDIDATE).await; + }); +} + +#[test] +fn peer_change_view_before_us() { + let test_state = TestState::default(); + + let peer_a = PeerId::random(); + + let keystore = test_state.keystore.clone(); + + test_harness(keystore, move |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + let TestState { + relay_parent: current, + validator_public, + ancestors, + candidates, + pov_blocks, + .. + } = test_state.clone(); - delay!(10); + setup_peer_with_view(&mut virtual_overseer, peer_a.clone(), view![current]).await; - overseer_send( + change_our_view( &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerConnected(peer_b.clone(), ObservedRole::Full), - ), - ) - .await; + our_view![current], + &validator_public, + vec![ancestors[0]], + hashmap! { current => 1 }, + hashmap! { + current => vec![ + occupied_core_from_candidate(&candidates[0]), + ], + }, + hashmap! { candidates[0].hash() => true }, + hashmap! { candidates[0].hash() => (pov_blocks[0].clone(), test_state.persisted_validation_data.clone())}, + hashmap! { candidates[0].hash() => vec![peer_a.clone()] }, + ).await; - { - // send another message - let valid2: AvailabilityGossipMessage = make_valid_availability_gossip( - &test_state, - candidates[2].hash(), - 1, - pov_block_c.clone(), - ); + let valid = make_valid_availability_gossip( + &test_state, + 0, + 0, + ); - // send the a message before we send a view update - overseer_send( - &mut virtual_overseer, - AvailabilityDistributionMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - chunk_protocol_message(valid2), - ), - ), - ) - .await; + // We send peer a all the chunks of candidate0, so we just benefit him for sending a valid message + peer_send_message(&mut virtual_overseer, peer_a.clone(), valid.clone(), BENEFIT_VALID_MESSAGE).await; + }); +} - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer( - peer, - rep - ) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, COST_NOT_A_LIVE_CANDIDATE); - } - ); - } +#[test] +fn candidate_chunks_are_put_into_message_vault_when_candidate_is_first_seen() { + let test_state = TestState::default(); + + let peer_a = PeerId::random(); + + let keystore = test_state.keystore.clone(); + + test_harness(keystore, move |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + let TestState { + relay_parent: current, + validator_public, + ancestors, + candidates, + pov_blocks, + .. + } = test_state.clone(); + + change_our_view( + &mut virtual_overseer, + our_view![ancestors[0]], + &validator_public, + vec![ancestors[1]], + hashmap! { ancestors[0] => 1 }, + hashmap! { + ancestors[0] => vec![ + occupied_core_from_candidate(&candidates[0]), + ], + }, + hashmap! { candidates[0].hash() => true }, + hashmap! { candidates[0].hash() => (pov_blocks[0].clone(), test_state.persisted_validation_data.clone())}, + hashmap! {}, + ).await; + + change_our_view( + &mut virtual_overseer, + our_view![current], + &validator_public, + vec![ancestors[0]], + hashmap! { current => 1 }, + hashmap! { + current => vec![ + occupied_core_from_candidate(&candidates[0]), + ], + }, + hashmap! { candidates[0].hash() => true }, + hashmap! {}, + hashmap! {}, + ).await; + + // Let peera connect, we should send him all the chunks of the candidate + setup_peer_with_view(&mut virtual_overseer, peer_a.clone(), view![current]).await; + + let chunks = make_erasure_chunks( + test_state.persisted_validation_data.clone(), + validator_public.len(), + pov_blocks[0].clone(), + ); + let send_peers = chunks.iter().map(|_| vec![peer_a.clone()]).collect::>(); + expect_chunks_network_message( + &mut virtual_overseer, + &send_peers, + &[candidates[0].hash()], + &chunks, + ).await; }); } @@ -967,3 +1002,279 @@ fn k_ancestors_in_session() { executor::block_on(future::join(test_fut, sut).timeout(Duration::from_millis(1000))); } + +#[test] +fn clean_up_receipts_cache_unions_ancestors_and_view() { + let mut state = ProtocolState::default(); + + let hash_a = [0u8; 32].into(); + let hash_b = [1u8; 32].into(); + let hash_c = [2u8; 32].into(); + let hash_d = [3u8; 32].into(); + + state.live_under.insert(hash_a, HashSet::new()); + state.live_under.insert(hash_b, HashSet::new()); + state.live_under.insert(hash_c, HashSet::new()); + state.live_under.insert(hash_d, HashSet::new()); + + state.per_relay_parent.insert(hash_a, PerRelayParent { + ancestors: vec![hash_b], + live_candidates: HashSet::new(), + span: PerLeafSpan::new(Arc::new(jaeger::JaegerSpan::Disabled), "test"), + }); + + state.per_relay_parent.insert(hash_c, PerRelayParent { + ancestors: Vec::new(), + live_candidates: HashSet::new(), + span: PerLeafSpan::new(Arc::new(jaeger::JaegerSpan::Disabled), "test"), + }); + + state.clean_up_live_under_cache(); + + assert_eq!(state.live_under.len(), 3); + assert!(state.live_under.contains_key(&hash_a)); + assert!(state.live_under.contains_key(&hash_b)); + assert!(state.live_under.contains_key(&hash_c)); + assert!(!state.live_under.contains_key(&hash_d)); +} + +#[test] +fn remove_relay_parent_only_removes_per_candidate_if_final() { + let mut state = ProtocolState::default(); + + let hash_a = [0u8; 32].into(); + let hash_b = [1u8; 32].into(); + + let candidate_hash_a = CandidateHash([46u8; 32].into()); + + state.per_relay_parent.insert(hash_a, PerRelayParent { + ancestors: vec![], + live_candidates: std::iter::once(candidate_hash_a).collect(), + span: PerLeafSpan::new(Arc::new(jaeger::JaegerSpan::Disabled), "test"), + }); + + state.per_relay_parent.insert(hash_b, PerRelayParent { + ancestors: vec![], + live_candidates: std::iter::once(candidate_hash_a).collect(), + span: PerLeafSpan::new(Arc::new(jaeger::JaegerSpan::Disabled), "test"), + }); + + state.per_candidate.insert(candidate_hash_a, { + let mut per_candidate = make_per_candidate(); + per_candidate.live_in = vec![hash_a, hash_b].into_iter().collect(); + per_candidate + }); + + state.remove_relay_parent(&hash_a); + + assert!(!state.per_relay_parent.contains_key(&hash_a)); + assert!(!state.per_candidate.get(&candidate_hash_a).unwrap().live_in.contains(&hash_a)); + assert!(state.per_candidate.get(&candidate_hash_a).unwrap().live_in.contains(&hash_b)); + + state.remove_relay_parent(&hash_b); + + assert!(!state.per_relay_parent.contains_key(&hash_b)); + assert!(!state.per_candidate.contains_key(&candidate_hash_a)); +} + +#[test] +fn add_relay_parent_includes_all_live_candidates() { + let relay_parent = [0u8; 32].into(); + + let mut state = ProtocolState::default(); + + let ancestor_a = [1u8; 32].into(); + + let candidate_hash_a = CandidateHash([10u8; 32].into()); + let candidate_hash_b = CandidateHash([11u8; 32].into()); + + state.per_candidate.insert(candidate_hash_b, make_per_candidate()); + + let candidates = vec![ + (candidate_hash_a, FetchedLiveCandidate::Fresh(Default::default())), + (candidate_hash_b, FetchedLiveCandidate::Cached), + ].into_iter().collect(); + + state.add_relay_parent( + relay_parent, + Vec::new(), + None, + candidates, + vec![ancestor_a], + PerLeafSpan::new(Arc::new(jaeger::JaegerSpan::Disabled), "test"), + ); + + assert!( + state.per_candidate.get(&candidate_hash_a).unwrap().live_in.contains(&relay_parent) + ); + assert!( + state.per_candidate.get(&candidate_hash_b).unwrap().live_in.contains(&relay_parent) + ); + + let per_relay_parent = state.per_relay_parent.get(&relay_parent).unwrap(); + + assert!(per_relay_parent.live_candidates.contains(&candidate_hash_a)); + assert!(per_relay_parent.live_candidates.contains(&candidate_hash_b)); +} + +#[test] +fn query_pending_availability_at_pulls_from_and_updates_receipts() { + let hash_a = [0u8; 32].into(); + let hash_b = [1u8; 32].into(); + + let para_a = ParaId::from(1); + let para_b = ParaId::from(2); + let para_c = ParaId::from(3); + + let make_candidate = |para_id| { + let mut candidate = CommittedCandidateReceipt::default(); + candidate.descriptor.para_id = para_id; + candidate.descriptor.relay_parent = [69u8; 32].into(); + candidate + }; + + let candidate_a = make_candidate(para_a); + let candidate_b = make_candidate(para_b); + let candidate_c = make_candidate(para_c); + + let candidate_hash_a = candidate_a.hash(); + let candidate_hash_b = candidate_b.hash(); + let candidate_hash_c = candidate_c.hash(); + + // receipts has an initial entry for hash_a but not hash_b. + let mut receipts = HashMap::new(); + receipts.insert(hash_a, vec![candidate_hash_a, candidate_hash_b].into_iter().collect()); + + let pool = sp_core::testing::TaskExecutor::new(); + + let (mut ctx, mut virtual_overseer) = + test_helpers::make_subsystem_context::(pool); + + let test_fut = async move { + let live_candidates = query_pending_availability_at( + &mut ctx, + vec![hash_a, hash_b], + &mut receipts, + ).await.unwrap(); + + // although 'b' is cached from the perspective of hash_a, it gets overwritten when we query what's happening in + // + assert_eq!(live_candidates.len(), 3); + assert_matches!(live_candidates.get(&candidate_hash_a).unwrap(), FetchedLiveCandidate::Cached); + assert_matches!(live_candidates.get(&candidate_hash_b).unwrap(), FetchedLiveCandidate::Cached); + assert_matches!(live_candidates.get(&candidate_hash_c).unwrap(), FetchedLiveCandidate::Fresh(_)); + + assert!(receipts.get(&hash_b).unwrap().contains(&candidate_hash_b)); + assert!(receipts.get(&hash_b).unwrap().contains(&candidate_hash_c)); + }; + + let answer = async move { + // hash_a should be answered out of cache, so we should just have + // queried for hash_b. + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request( + r, + RuntimeApiRequest::AvailabilityCores(tx), + ) + ) if r == hash_b => { + let _ = tx.send(Ok(vec![ + CoreState::Occupied(OccupiedCore { + next_up_on_available: None, + occupied_since: 0, + time_out_at: 0, + next_up_on_time_out: None, + availability: Default::default(), + group_responsible: GroupIndex::from(0), + candidate_hash: candidate_hash_b, + candidate_descriptor: candidate_b.descriptor.clone(), + }), + CoreState::Occupied(OccupiedCore { + next_up_on_available: None, + occupied_since: 0, + time_out_at: 0, + next_up_on_time_out: None, + availability: Default::default(), + group_responsible: GroupIndex::from(0), + candidate_hash: candidate_hash_c, + candidate_descriptor: candidate_c.descriptor.clone(), + }), + ])); + } + ); + }; + + futures::pin_mut!(test_fut); + futures::pin_mut!(answer); + + executor::block_on(future::join(test_fut, answer)); +} + +#[test] +fn new_peer_gets_all_chunks_send() { + let test_state = TestState::default(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + assert_ne!(&peer_a, &peer_b); + + let keystore = test_state.keystore.clone(); + + test_harness(keystore, move |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + let TestState { + relay_parent: current, + validator_public, + ancestors, + candidates, + pov_blocks, + .. + } = test_state.clone(); + + let valid = make_valid_availability_gossip( + &test_state, + 1, + 2, + ); + + change_our_view( + &mut virtual_overseer, + our_view![current], + &validator_public, + vec![ancestors[0]], + hashmap! { current => 1 }, + hashmap! { + current => vec![ + occupied_core_from_candidate(&candidates[0]), + occupied_core_from_candidate(&candidates[1]) + ], + }, + hashmap! { candidates[0].hash() => true, candidates[1].hash() => false }, + hashmap! { candidates[0].hash() => (pov_blocks[0].clone(), test_state.persisted_validation_data.clone())}, + hashmap! {}, + ).await; + + peer_send_message(&mut virtual_overseer, peer_b.clone(), valid.clone(), BENEFIT_VALID_MESSAGE_FIRST).await; + + setup_peer_with_view(&mut virtual_overseer, peer_a.clone(), view![current]).await; + + let mut chunks = make_erasure_chunks( + test_state.persisted_validation_data.clone(), + validator_public.len(), + pov_blocks[0].clone(), + ); + + chunks.push(valid.erasure_chunk); + + let send_peers = chunks.iter().map(|_| vec![peer_a.clone()]).collect::>(); + + expect_chunks_network_message( + &mut virtual_overseer, + &send_peers, + &[candidates[0].hash(), candidates[1].hash()], + &chunks, + ).await; + }); +} diff --git a/node/network/bitfield-distribution/Cargo.toml b/node/network/bitfield-distribution/Cargo.toml index b8b19cbecbda806ead3cc01169109ba3cb576598..0333926f9d230b4e5e90ec42876b5093c2e234c6 100644 --- a/node/network/bitfield-distribution/Cargo.toml +++ b/node/network/bitfield-distribution/Cargo.toml @@ -5,25 +5,22 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.5" -futures-timer = "3.0.2" -log = "0.4.8" -streamunordered = "0.5.1" -codec = { package="parity-scale-codec", version = "1.3.4" } -node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } polkadot-primitives = { path = "../../../primitives" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } -polkadot-node-subsystem-util = { package = "polkadot-node-subsystem-util", path = "../../subsystem-util" } -polkadot-network-bridge = { path = "../../network/bridge" } +polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-node-network-protocol = { path = "../../network/protocol" } -sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } [dev-dependencies] polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -parking_lot = "0.11.0" +sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } maplit = "1.0.2" -smol = "0.3.3" -env_logger = "0.7.1" -assert_matches = "1.3.0" +log = "0.4.11" +env_logger = "0.8.2" +assert_matches = "1.4.0" diff --git a/node/network/bitfield-distribution/src/lib.rs b/node/network/bitfield-distribution/src/lib.rs index 9b0e5c747de46a5b8849f5c4b75bbd4deb0722b5..a771baf3ecbe10079662352c7ba79fe4e0121f47 100644 --- a/node/network/bitfield-distribution/src/lib.rs +++ b/node/network/bitfield-distribution/src/lib.rs @@ -20,16 +20,19 @@ //! for a particular relay parent. //! Independently of that, gossips on received messages from peers to other interested peers. -use codec::{Decode, Encode}; +#![deny(unused_crate_dependencies)] + +use parity_scale_codec::{Decode, Encode}; use futures::{channel::oneshot, FutureExt}; -use log::{trace, warn}; use polkadot_subsystem::messages::*; use polkadot_subsystem::{ - ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemResult, + PerLeafSpan, ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, SubsystemContext, + SubsystemResult, }; +use polkadot_node_subsystem_util::metrics::{self, prometheus}; use polkadot_primitives::v1::{Hash, SignedAvailabilityBitfield, SigningContext, ValidatorId}; -use polkadot_node_network_protocol::{v1 as protocol_v1, PeerId, NetworkBridgeEvent, View, ReputationChange}; +use polkadot_node_network_protocol::{v1 as protocol_v1, PeerId, NetworkBridgeEvent, View, ReputationChange, OurView}; use std::collections::{HashMap, HashSet}; const COST_SIGNATURE_INVALID: ReputationChange = @@ -76,21 +79,21 @@ impl BitfieldGossipMessage { /// Data used to track information of peers and relay parents the /// overseer ordered us to work on. -#[derive(Default, Clone)] +#[derive(Default, Debug)] struct ProtocolState { /// track all active peers and their views /// to determine what is relevant to them. peer_views: HashMap, /// Our current view. - view: View, + view: OurView, /// Additional data particular to a relay parent. per_relay_parent: HashMap, } /// Data for a particular relay parent. -#[derive(Debug, Clone, Default)] +#[derive(Debug)] struct PerRelayParentData { /// Signing context for a particular relay parent. signing_context: SigningContext, @@ -110,89 +113,118 @@ struct PerRelayParentData { /// Track messages that were already received by a peer /// to prevent flooding. message_received_from_peer: HashMap>, + + /// The span for this leaf/relay parent. + span: PerLeafSpan, } impl PerRelayParentData { + /// Create a new instance. + fn new(signing_context: SigningContext, validator_set: Vec, span: PerLeafSpan) -> Self { + Self { + signing_context, + validator_set, + span, + one_per_validator: Default::default(), + message_sent_to_peer: Default::default(), + message_received_from_peer: Default::default(), + } + } + /// Determines if that particular message signed by a validator is needed by the given peer. fn message_from_validator_needed_by_peer( &self, peer: &PeerId, validator: &ValidatorId, ) -> bool { - if let Some(set) = self.message_sent_to_peer.get(peer) { - !set.contains(validator) - } else { - false - } + self.message_sent_to_peer.get(peer).map(|v| !v.contains(validator)).unwrap_or(true) + && self.message_received_from_peer.get(peer).map(|v| !v.contains(validator)).unwrap_or(true) } } -const TARGET: &'static str = "bitd"; +const LOG_TARGET: &str = "bitfield_distribution"; /// The bitfield distribution subsystem. -pub struct BitfieldDistribution; +pub struct BitfieldDistribution { + metrics: Metrics, +} impl BitfieldDistribution { + /// Create a new instance of the `BitfieldDistribution` subsystem. + pub fn new(metrics: Metrics) -> Self { + Self { metrics } + } + /// Start processing work as passed on from the Overseer. - async fn run(mut ctx: Context) -> SubsystemResult<()> + #[tracing::instrument(skip(self, ctx), fields(subsystem = LOG_TARGET))] + async fn run(self, mut ctx: Context) where Context: SubsystemContext, { // work: process incoming messages from the overseer and process accordingly. let mut state = ProtocolState::default(); loop { - let message = ctx.recv().await?; + let message = match ctx.recv().await { + Ok(message) => message, + Err(e) => { + tracing::debug!(target: LOG_TARGET, err = ?e, "Failed to receive a message from Overseer, exiting"); + return; + }, + }; match message { FromOverseer::Communication { msg: BitfieldDistributionMessage::DistributeBitfield(hash, signed_availability), } => { - trace!(target: TARGET, "Processing DistributeBitfield"); - handle_bitfield_distribution(&mut ctx, &mut state, hash, signed_availability) - .await?; + tracing::trace!(target: LOG_TARGET, "Processing DistributeBitfield"); + handle_bitfield_distribution( + &mut ctx, + &mut state, + &self.metrics, + hash, + signed_availability, + ).await; } FromOverseer::Communication { msg: BitfieldDistributionMessage::NetworkBridgeUpdateV1(event), } => { - trace!(target: TARGET, "Processing NetworkMessage"); + tracing::trace!(target: LOG_TARGET, "Processing NetworkMessage"); // a network message was received - if let Err(e) = handle_network_msg(&mut ctx, &mut state, event).await { - warn!(target: TARGET, "Failed to handle incomming network messages: {:?}", e); - } + handle_network_msg(&mut ctx, &mut state, &self.metrics, event).await; } - FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { activated, deactivated })) => { - for relay_parent in activated { - trace!(target: TARGET, "Start {:?}", relay_parent); - // query basic system parameters once - if let Some((validator_set, signing_context)) = - query_basics(&mut ctx, relay_parent).await? - { - // If our runtime API fails, we don't take down the node, - // but we might alter peers' reputations erroneously as a result - // of not having the correct bookkeeping. If we have lost a race - // with state pruning, it is unlikely that peers will be sending - // us anything to do with this relay-parent anyway. - let _ = state.per_relay_parent.insert( - relay_parent, - PerRelayParentData { - signing_context, - validator_set, - ..Default::default() - }, - ); + FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { activated, .. })) => { + let _timer = self.metrics.time_active_leaves_update(); + + for (relay_parent, span) in activated { + tracing::trace!(target: LOG_TARGET, relay_parent = %relay_parent, "activated"); + let span = PerLeafSpan::new(span, "bitfield-distribution"); + let _span = span.child("query-basics"); + + // query validator set and signing context per relay_parent once only + match query_basics(&mut ctx, relay_parent).await { + Ok(Some((validator_set, signing_context))) => { + // If our runtime API fails, we don't take down the node, + // but we might alter peers' reputations erroneously as a result + // of not having the correct bookkeeping. If we have lost a race + // with state pruning, it is unlikely that peers will be sending + // us anything to do with this relay-parent anyway. + let _ = state.per_relay_parent.insert( + relay_parent, + PerRelayParentData::new(signing_context, validator_set, span), + ); + } + Err(e) => { + tracing::warn!(target: LOG_TARGET, err = ?e, "query_basics has failed"); + } + _ => {}, } } - - for relay_parent in deactivated { - trace!(target: TARGET, "Stop {:?}", relay_parent); - // defer the cleanup to the view change - } } - FromOverseer::Signal(OverseerSignal::BlockFinalized(hash)) => { - trace!(target: TARGET, "Block finalized {:?}", hash); + FromOverseer::Signal(OverseerSignal::BlockFinalized(hash, number)) => { + tracing::trace!(target: LOG_TARGET, hash = %hash, number = %number, "block finalized"); } FromOverseer::Signal(OverseerSignal::Conclude) => { - trace!(target: TARGET, "Conclude"); - return Ok(()); + tracing::trace!(target: LOG_TARGET, "Conclude"); + return; } } } @@ -200,15 +232,17 @@ impl BitfieldDistribution { } /// Modify the reputation of a peer based on its behaviour. +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn modify_reputation( ctx: &mut Context, peer: PeerId, rep: ReputationChange, -) -> SubsystemResult<()> +) where Context: SubsystemContext, { - trace!(target: TARGET, "Reputation change of {:?} for peer {:?}", rep, peer); + tracing::trace!(target: LOG_TARGET, rep = ?rep, peer_id = %peer, "reputation change"); + ctx.send_message(AllMessages::NetworkBridge( NetworkBridgeMessage::ReportPeer(peer, rep), )) @@ -218,40 +252,44 @@ where /// Distribute a given valid and signature checked bitfield message. /// /// For this variant the source is this node. +#[tracing::instrument(level = "trace", skip(ctx, metrics), fields(subsystem = LOG_TARGET))] async fn handle_bitfield_distribution( ctx: &mut Context, state: &mut ProtocolState, + metrics: &Metrics, relay_parent: Hash, signed_availability: SignedAvailabilityBitfield, -) -> SubsystemResult<()> +) where Context: SubsystemContext, { + let _timer = metrics.time_handle_bitfield_distribution(); + // Ignore anything the overseer did not tell this subsystem to work on let mut job_data = state.per_relay_parent.get_mut(&relay_parent); let job_data: &mut _ = if let Some(ref mut job_data) = job_data { job_data } else { - trace!( - target: TARGET, - "Not supposed to work on relay parent {} related data", - relay_parent + tracing::trace!( + target: LOG_TARGET, + relay_parent = %relay_parent, + "Not supposed to work on relay parent related data", ); - return Ok(()); + return; }; let validator_set = &job_data.validator_set; if validator_set.is_empty() { - trace!(target: TARGET, "Validator set for {:?} is empty", relay_parent); - return Ok(()); + tracing::trace!(target: LOG_TARGET, relay_parent = %relay_parent, "validator set is empty"); + return; } let validator_index = signed_availability.validator_index() as usize; let validator = if let Some(validator) = validator_set.get(validator_index) { validator.clone() } else { - trace!(target: TARGET, "Could not find a validator for index {}", validator_index); - return Ok(()); + tracing::trace!(target: LOG_TARGET, "Could not find a validator for index {}", validator_index); + return; }; let peer_views = &mut state.peer_views; @@ -260,85 +298,102 @@ where signed_availability, }; - relay_message(ctx, job_data, peer_views, validator, msg).await?; + relay_message(ctx, job_data, peer_views, validator, msg).await; - Ok(()) + metrics.on_own_bitfield_gossipped(); } /// Distribute a given valid and signature checked bitfield message. /// /// Can be originated by another subsystem or received via network from another peer. +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn relay_message( ctx: &mut Context, job_data: &mut PerRelayParentData, peer_views: &mut HashMap, validator: ValidatorId, message: BitfieldGossipMessage, -) -> SubsystemResult<()> +) where Context: SubsystemContext, { + let span = job_data.span.child("relay-msg"); + + let _span = span.child("provisionable"); // notify the overseer about a new and valid signed bitfield ctx.send_message(AllMessages::Provisioner( - ProvisionerMessage::ProvisionableData(ProvisionableData::Bitfield( - message.relay_parent.clone(), - message.signed_availability.clone(), - )), + ProvisionerMessage::ProvisionableData( + message.relay_parent, + ProvisionableData::Bitfield( + message.relay_parent, + message.signed_availability.clone(), + ), + ), )) - .await?; + .await; - let message_sent_to_peer = &mut (job_data.message_sent_to_peer); + drop(_span); + let _span = span.child("interested-peers"); // pass on the bitfield distribution to all interested peers let interested_peers = peer_views .iter() .filter_map(|(peer, view)| { // check interest in the peer in this message's relay parent if view.contains(&message.relay_parent) { + let message_needed = job_data.message_from_validator_needed_by_peer(&peer, &validator); // track the message as sent for this peer - message_sent_to_peer + job_data.message_sent_to_peer .entry(peer.clone()) .or_default() .insert(validator.clone()); - Some(peer.clone()) + if message_needed { + Some(peer.clone()) + } else { + None + } } else { None } }) .collect::>(); + drop(_span); if interested_peers.is_empty() { - trace!( - target: TARGET, - "No peers are interested in gossip for relay parent {:?}", - message.relay_parent + tracing::trace!( + target: LOG_TARGET, + relay_parent = %message.relay_parent, + "no peers are interested in gossip for relay parent", ); } else { + let _span = span.child("gossip"); ctx.send_message(AllMessages::NetworkBridge( NetworkBridgeMessage::SendValidationMessage( interested_peers, message.into_validation_protocol(), ), )) - .await?; + .await; } - Ok(()) } /// Handle an incoming message from a peer. +#[tracing::instrument(level = "trace", skip(ctx, metrics), fields(subsystem = LOG_TARGET))] async fn process_incoming_peer_message( ctx: &mut Context, state: &mut ProtocolState, + metrics: &Metrics, origin: PeerId, message: BitfieldGossipMessage, -) -> SubsystemResult<()> +) where Context: SubsystemContext, { // we don't care about this, not part of our view. if !state.view.contains(&message.relay_parent) { - return modify_reputation(ctx, origin, COST_NOT_IN_VIEW).await; + modify_reputation(ctx, origin, COST_NOT_IN_VIEW).await; + return; } // Ignore anything the overseer did not tell this subsystem to work on. @@ -346,17 +401,29 @@ where let job_data: &mut _ = if let Some(ref mut job_data) = job_data { job_data } else { - return modify_reputation(ctx, origin, COST_NOT_IN_VIEW).await; + modify_reputation(ctx, origin, COST_NOT_IN_VIEW).await; + return; + }; + + let mut _span = { + let mut span = job_data.span.child("msg-received"); + span.add_string_tag("peer-id", &origin.to_base58()); + span.add_string_tag( + "claimed-validator", + &message.signed_availability.validator_index().to_string(), + ); + span }; let validator_set = &job_data.validator_set; if validator_set.is_empty() { - trace!( - target: TARGET, - "Validator set for relay parent {:?} is empty", - &message.relay_parent + tracing::trace!( + target: LOG_TARGET, + relay_parent = %message.relay_parent, + "Validator set is empty", ); - return modify_reputation(ctx, origin, COST_MISSING_PEER_SESSION_KEY).await; + modify_reputation(ctx, origin, COST_MISSING_PEER_SESSION_KEY).await; + return; } // Use the (untrusted) validator index provided by the signed payload @@ -366,7 +433,8 @@ where let validator = if let Some(validator) = validator_set.get(validator_index) { validator.clone() } else { - return modify_reputation(ctx, origin, COST_VALIDATOR_INDEX_INVALID).await; + modify_reputation(ctx, origin, COST_VALIDATOR_INDEX_INVALID).await; + return; }; // Check if the peer already sent us a message for the validator denoted in the message earlier. @@ -380,7 +448,8 @@ where if !received_set.contains(&validator) { received_set.insert(validator.clone()); } else { - return modify_reputation(ctx, origin, COST_PEER_DUPLICATE_MESSAGE).await; + modify_reputation(ctx, origin, COST_PEER_DUPLICATE_MESSAGE).await; + return; }; if message @@ -388,21 +457,22 @@ where .check_signature(&signing_context, &validator) .is_ok() { + metrics.on_bitfield_received(); let one_per_validator = &mut (job_data.one_per_validator); // only relay_message a message of a validator once if one_per_validator.get(&validator).is_some() { - trace!( - target: TARGET, - "Already received a message for validator at index {}", - validator_index + tracing::trace!( + target: LOG_TARGET, + validator_index, + "already received a message for validator", ); - modify_reputation(ctx, origin, BENEFIT_VALID_MESSAGE).await?; - return Ok(()); + modify_reputation(ctx, origin, BENEFIT_VALID_MESSAGE).await; + return; } one_per_validator.insert(validator.clone(), message.clone()); - relay_message(ctx, job_data, &mut state.peer_views, validator, message).await?; + relay_message(ctx, job_data, &mut state.peer_views, validator, message).await; modify_reputation(ctx, origin, BENEFIT_VALID_MESSAGE_FIRST).await } else { @@ -412,14 +482,18 @@ where /// Deal with network bridge updates and track what needs to be tracked /// which depends on the message type received. +#[tracing::instrument(level = "trace", skip(ctx, metrics), fields(subsystem = LOG_TARGET))] async fn handle_network_msg( ctx: &mut Context, state: &mut ProtocolState, + metrics: &Metrics, bridge_message: NetworkBridgeEvent, -) -> SubsystemResult<()> +) where Context: SubsystemContext, { + let _timer = metrics.time_handle_network_msg(); + match bridge_message { NetworkBridgeEvent::PeerConnected(peerid, _role) => { // insert if none already present @@ -430,35 +504,36 @@ where state.peer_views.remove(&peerid); } NetworkBridgeEvent::PeerViewChange(peerid, view) => { - handle_peer_view_change(ctx, state, peerid, view).await?; + handle_peer_view_change(ctx, state, peerid, view).await; } NetworkBridgeEvent::OurViewChange(view) => { - handle_our_view_change(state, view)?; + handle_our_view_change(state, view); } NetworkBridgeEvent::PeerMessage(remote, message) => { match message { protocol_v1::BitfieldDistributionMessage::Bitfield(relay_parent, bitfield) => { - trace!(target: TARGET, "Received bitfield gossip from peer {:?}", &remote); + tracing::trace!(target: LOG_TARGET, peer_id = %remote, "received bitfield gossip from peer"); let gossiped_bitfield = BitfieldGossipMessage { relay_parent, signed_availability: bitfield, }; - process_incoming_peer_message(ctx, state, remote, gossiped_bitfield).await?; + process_incoming_peer_message(ctx, state, metrics, remote, gossiped_bitfield).await; } } } } - Ok(()) } /// Handle the changes necassary when our view changes. -fn handle_our_view_change(state: &mut ProtocolState, view: View) -> SubsystemResult<()> { +#[tracing::instrument(level = "trace", fields(subsystem = LOG_TARGET))] +fn handle_our_view_change(state: &mut ProtocolState, view: OurView) { let old_view = std::mem::replace(&mut (state.view), view); for added in state.view.difference(&old_view) { if !state.per_relay_parent.contains_key(&added) { - warn!( - target: TARGET, + tracing::warn!( + target: LOG_TARGET, + added = %added, "Our view contains {} but the overseer never told use we should work on this", &added ); @@ -468,26 +543,22 @@ fn handle_our_view_change(state: &mut ProtocolState, view: View) -> SubsystemRes // cleanup relay parents we are not interested in any more let _ = state.per_relay_parent.remove(&removed); } - Ok(()) } // Send the difference between two views which were not sent // to that particular peer. +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn handle_peer_view_change( ctx: &mut Context, state: &mut ProtocolState, origin: PeerId, view: View, -) -> SubsystemResult<()> +) where Context: SubsystemContext, { - let current = state.peer_views.entry(origin.clone()).or_default(); - - let added: Vec = view.difference(&*current).cloned().collect(); - - *current = view; + let added = state.peer_views.entry(origin.clone()).or_default().replace_difference(view).cloned().collect::>(); // Send all messages we've seen before and the peer is now interested // in to that peer. @@ -517,31 +588,31 @@ where .collect(); for (validator, message) in delta_set.into_iter() { - send_tracked_gossip_message(ctx, state, origin.clone(), validator, message).await?; + send_tracked_gossip_message(ctx, state, origin.clone(), validator, message).await; } - - Ok(()) } /// Send a gossip message and track it in the per relay parent data. +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn send_tracked_gossip_message( ctx: &mut Context, state: &mut ProtocolState, dest: PeerId, validator: ValidatorId, message: BitfieldGossipMessage, -) -> SubsystemResult<()> +) where Context: SubsystemContext, { let job_data = if let Some(job_data) = state.per_relay_parent.get_mut(&message.relay_parent) { job_data } else { - return Ok(()); + return; }; - let message_sent_to_peer = &mut (job_data.message_sent_to_peer); - message_sent_to_peer + let _span = job_data.span.child("gossip"); + + job_data.message_sent_to_peer .entry(dest.clone()) .or_default() .insert(validator.clone()); @@ -551,27 +622,27 @@ where vec![dest], message.into_validation_protocol(), ), - )) - .await?; - - Ok(()) + )).await; } impl Subsystem for BitfieldDistribution where C: SubsystemContext + Sync + Send, { - type Metrics = (); - fn start(self, ctx: C) -> SpawnedSubsystem { + let future = self.run(ctx) + .map(|_| Ok(())) + .boxed(); + SpawnedSubsystem { name: "bitfield-distribution-subsystem", - future: Box::pin(async move { Self::run(ctx) }.map(|_| ())), + future, } } } /// Query our validator set and signing context for a particular relay parent. +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn query_basics( ctx: &mut Context, relay_parent: Hash, @@ -593,7 +664,7 @@ where )); ctx.send_messages(std::iter::once(query_validators).chain(std::iter::once(query_signing))) - .await?; + .await; match (validators_rx.await?, session_rx.await?) { (Ok(v), Ok(s)) => Ok(Some(( @@ -601,37 +672,121 @@ where SigningContext { parent_hash: relay_parent, session_index: s }, ))), (Err(e), _) | (_, Err(e)) => { - warn!(target: TARGET, "Failed to fetch basics from runtime API: {:?}", e); + tracing::warn!(target: LOG_TARGET, err = ?e, "Failed to fetch basics from runtime API"); Ok(None) } } } +#[derive(Clone)] +struct MetricsInner { + gossipped_own_availability_bitfields: prometheus::Counter, + received_availability_bitfields: prometheus::Counter, + active_leaves_update: prometheus::Histogram, + handle_bitfield_distribution: prometheus::Histogram, + handle_network_msg: prometheus::Histogram, +} + +/// Bitfield Distribution metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_own_bitfield_gossipped(&self) { + if let Some(metrics) = &self.0 { + metrics.gossipped_own_availability_bitfields.inc(); + } + } + + fn on_bitfield_received(&self) { + if let Some(metrics) = &self.0 { + metrics.received_availability_bitfields.inc(); + } + } + + /// Provide a timer for `active_leaves_update` which observes on drop. + fn time_active_leaves_update(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.active_leaves_update.start_timer()) + } + + /// Provide a timer for `handle_bitfield_distribution` which observes on drop. + fn time_handle_bitfield_distribution(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.handle_bitfield_distribution.start_timer()) + } + + /// Provide a timer for `handle_network_msg` which observes on drop. + fn time_handle_network_msg(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.handle_network_msg.start_timer()) + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> Result { + let metrics = MetricsInner { + gossipped_own_availability_bitfields: prometheus::register( + prometheus::Counter::new( + "parachain_gossipped_own_availabilty_bitfields_total", + "Number of own availability bitfields sent to other peers." + )?, + registry, + )?, + received_availability_bitfields: prometheus::register( + prometheus::Counter::new( + "parachain_received_availabilty_bitfields_total", + "Number of valid availability bitfields received from other peers." + )?, + registry, + )?, + active_leaves_update: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_bitfield_distribution_active_leaves_update", + "Time spent within `bitfield_distribution::active_leaves_update`", + ) + )?, + registry, + )?, + handle_bitfield_distribution: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_bitfield_distribution_handle_bitfield_distribution", + "Time spent within `bitfield_distribution::handle_bitfield_distribution`", + ) + )?, + registry, + )?, + handle_network_msg: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_bitfield_distribution_handle_network_msg", + "Time spent within `bitfield_distribution::handle_network_msg`", + ) + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) + } +} + + #[cfg(test)] mod test { use super::*; use bitvec::bitvec; use futures::executor; use maplit::hashmap; - use polkadot_primitives::v1::{Signed, ValidatorPair, AvailabilityBitfield}; + use polkadot_primitives::v1::{Signed, AvailabilityBitfield}; use polkadot_node_subsystem_test_helpers::make_subsystem_context; use polkadot_node_subsystem_util::TimeoutExt; - use sp_core::crypto::Pair; + use sp_keystore::{SyncCryptoStorePtr, SyncCryptoStore}; + use sp_application_crypto::AppKey; + use sp_keystore::testing::KeyStore; + use std::sync::Arc; use std::time::Duration; use assert_matches::assert_matches; - use polkadot_node_network_protocol::ObservedRole; - - macro_rules! view { - ( $( $hash:expr ),* $(,)? ) => [ - View(vec![ $( $hash.clone() ),* ]) - ]; - } - - macro_rules! peers { - ( $( $peer:expr ),* $(,)? ) => [ - vec![ $( $peer.clone() ),* ] - ]; - } + use polkadot_node_network_protocol::{view, ObservedRole, our_view}; + use polkadot_subsystem::JaegerSpan; macro_rules! launch { ($fut:expr) => { @@ -639,7 +794,6 @@ mod test { .timeout(Duration::from_millis(10)) .await .expect("10ms is more than enough for sending messages.") - .expect("Error values should really never occur.") }; } @@ -664,41 +818,47 @@ mod test { }, message_received_from_peer: hashmap!{}, message_sent_to_peer: hashmap!{}, + span: PerLeafSpan::new(Arc::new(JaegerSpan::Disabled), "test"), }, }, peer_views: peers .into_iter() .map(|peer| (peer, view!(relay_parent))) .collect(), - view: view!(relay_parent), + view: our_view!(relay_parent), } } - fn state_with_view(view: View, relay_parent: Hash) -> (ProtocolState, SigningContext, ValidatorPair) { + fn state_with_view( + view: OurView, + relay_parent: Hash, + ) -> (ProtocolState, SigningContext, SyncCryptoStorePtr, ValidatorId) { let mut state = ProtocolState::default(); - let (validator_pair, _seed) = ValidatorPair::generate(); - let validator = validator_pair.public(); - let signing_context = SigningContext { session_index: 1, parent_hash: relay_parent.clone(), }; - state.per_relay_parent = view.0.iter().map(|relay_parent| {( + let keystore : SyncCryptoStorePtr = Arc::new(KeyStore::new()); + let validator = SyncCryptoStore::sr25519_generate_new(&*keystore, ValidatorId::ID, None) + .expect("generating sr25519 key not to fail"); + + state.per_relay_parent = view.heads.iter().map(|relay_parent| {( relay_parent.clone(), PerRelayParentData { signing_context: signing_context.clone(), - validator_set: vec![validator.clone()], + validator_set: vec![validator.clone().into()], one_per_validator: hashmap!{}, message_received_from_peer: hashmap!{}, message_sent_to_peer: hashmap!{}, + span: PerLeafSpan::new(Arc::new(JaegerSpan::Disabled), "test"), }) }).collect(); state.view = view; - (state, signing_context, validator_pair) + (state, signing_context, keystore, validator.into()) } #[test] @@ -719,16 +879,21 @@ mod test { parent_hash: hash_a.clone(), }; - // validator 0 key pair - let (validator_pair, _seed) = ValidatorPair::generate(); - let validator = validator_pair.public(); - // another validator not part of the validatorset - let (mallicious, _seed) = ValidatorPair::generate(); + let keystore : SyncCryptoStorePtr = Arc::new(KeyStore::new()); + let malicious = SyncCryptoStore::sr25519_generate_new(&*keystore, ValidatorId::ID, None) + .expect("Malicious key created"); + let validator = SyncCryptoStore::sr25519_generate_new(&*keystore, ValidatorId::ID, None) + .expect("Malicious key created"); let payload = AvailabilityBitfield(bitvec![bitvec::order::Lsb0, u8; 1u8; 32]); - let signed = - Signed::::sign(payload, &signing_context, 0, &mallicious); + let signed = executor::block_on(Signed::::sign( + &keystore, + payload, + &signing_context, + 0, + &malicious.into(), + )).expect("should be signed"); let msg = BitfieldGossipMessage { relay_parent: hash_a.clone(), @@ -740,7 +905,7 @@ mod test { make_subsystem_context::(pool); let mut state = prewarmed_state( - validator.clone(), + validator.into(), signing_context.clone(), msg.clone(), vec![peer_b.clone()], @@ -750,6 +915,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.into_network_message()), )); @@ -781,14 +947,18 @@ mod test { assert_ne!(peer_a, peer_b); // validator 0 key pair - let (mut state, signing_context, validator_pair) = - state_with_view(view![hash_a, hash_b], hash_a.clone()); + let (mut state, signing_context, keystore, validator) = state_with_view(our_view![hash_a, hash_b], hash_a.clone()); state.peer_views.insert(peer_b.clone(), view![hash_a]); let payload = AvailabilityBitfield(bitvec![bitvec::order::Lsb0, u8; 1u8; 32]); - let signed = - Signed::::sign(payload, &signing_context, 42, &validator_pair); + let signed = executor::block_on(Signed::::sign( + &keystore, + payload, + &signing_context, + 42, + &validator, + )).expect("should be signed"); let msg = BitfieldGossipMessage { relay_parent: hash_a.clone(), @@ -803,6 +973,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerMessage(peer_b.clone(), msg.into_network_message()), )); @@ -834,13 +1005,17 @@ mod test { assert_ne!(peer_a, peer_b); // validator 0 key pair - let (mut state, signing_context, validator_pair) = - state_with_view(view![hash_a, hash_b], hash_a.clone()); + let (mut state, signing_context, keystore, validator) = state_with_view(our_view![hash_a, hash_b], hash_a.clone()); // create a signed message by validator 0 let payload = AvailabilityBitfield(bitvec![bitvec::order::Lsb0, u8; 1u8; 32]); - let signed_bitfield = - Signed::::sign(payload, &signing_context, 0, &validator_pair); + let signed_bitfield = executor::block_on(Signed::::sign( + &keystore, + payload, + &signing_context, + 0, + &validator, + )).expect("should be signed"); let msg = BitfieldGossipMessage { relay_parent: hash_a.clone(), @@ -856,6 +1031,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerMessage( peer_b.clone(), msg.clone().into_network_message(), @@ -868,6 +1044,7 @@ mod test { assert_matches!( handle.recv().await, AllMessages::Provisioner(ProvisionerMessage::ProvisionableData( + _, ProvisionableData::Bitfield(hash, signed) )) => { assert_eq!(hash, hash_a); @@ -889,6 +1066,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerMessage( peer_a.clone(), msg.clone().into_network_message(), @@ -909,6 +1087,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerMessage( peer_b.clone(), msg.clone().into_network_message(), @@ -927,6 +1106,101 @@ mod test { }); } + #[test] + fn do_not_relay_message_twice() { + let _ = env_logger::builder() + .filter(None, log::LevelFilter::Trace) + .is_test(true) + .try_init(); + + let hash = Hash::random(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + assert_ne!(peer_a, peer_b); + + // validator 0 key pair + let (mut state, signing_context, keystore, validator) = state_with_view(our_view![hash], hash.clone()); + + // create a signed message by validator 0 + let payload = AvailabilityBitfield(bitvec![bitvec::order::Lsb0, u8; 1u8; 32]); + let signed_bitfield = executor::block_on(Signed::::sign( + &keystore, + payload, + &signing_context, + 0, + &validator, + )).expect("should be signed"); + + state.peer_views.insert(peer_b.clone(), view![hash]); + state.peer_views.insert(peer_a.clone(), view![hash]); + + let msg = BitfieldGossipMessage { + relay_parent: hash.clone(), + signed_availability: signed_bitfield.clone(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = + make_subsystem_context::(pool); + + executor::block_on(async move { + relay_message( + &mut ctx, + state.per_relay_parent.get_mut(&hash).unwrap(), + &mut state.peer_views, + validator.clone(), + msg.clone(), + ).await; + + assert_matches!( + handle.recv().await, + AllMessages::Provisioner(ProvisionerMessage::ProvisionableData( + _, + ProvisionableData::Bitfield(h, signed) + )) => { + assert_eq!(h, hash); + assert_eq!(signed, signed_bitfield) + } + ); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendValidationMessage(peers, send_msg), + ) => { + assert_eq!(2, peers.len()); + assert!(peers.contains(&peer_a)); + assert!(peers.contains(&peer_b)); + assert_eq!(send_msg, msg.clone().into_validation_protocol()); + } + ); + + // Relaying the message a second time shouldn't work. + relay_message( + &mut ctx, + state.per_relay_parent.get_mut(&hash).unwrap(), + &mut state.peer_views, + validator.clone(), + msg.clone(), + ).await; + + assert_matches!( + handle.recv().await, + AllMessages::Provisioner(ProvisionerMessage::ProvisionableData( + _, + ProvisionableData::Bitfield(h, signed) + )) => { + assert_eq!(h, hash); + assert_eq!(signed, signed_bitfield) + } + ); + + // There shouldn't be any other message + assert!(handle.recv().timeout(Duration::from_millis(10)).await.is_none()); + }); + } + #[test] fn changing_view() { let _ = env_logger::builder() @@ -942,12 +1216,17 @@ mod test { assert_ne!(peer_a, peer_b); // validator 0 key pair - let (mut state, signing_context, validator_pair) = state_with_view(view![hash_a, hash_b], hash_a.clone()); + let (mut state, signing_context, keystore, validator) = state_with_view(our_view![hash_a, hash_b], hash_a.clone()); // create a signed message by validator 0 let payload = AvailabilityBitfield(bitvec![bitvec::order::Lsb0, u8; 1u8; 32]); - let signed_bitfield = - Signed::::sign(payload, &signing_context, 0, &validator_pair); + let signed_bitfield = executor::block_on(Signed::::sign( + &keystore, + payload, + &signing_context, + 0, + &validator, + )).expect("should be signed"); let msg = BitfieldGossipMessage { relay_parent: hash_a.clone(), @@ -962,6 +1241,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerConnected(peer_b.clone(), ObservedRole::Full), )); @@ -969,6 +1249,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerViewChange(peer_b.clone(), view![hash_a, hash_b]), )); @@ -978,6 +1259,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerMessage( peer_b.clone(), msg.clone().into_network_message(), @@ -988,6 +1270,7 @@ mod test { assert_matches!( handle.recv().await, AllMessages::Provisioner(ProvisionerMessage::ProvisionableData( + _, ProvisionableData::Bitfield(hash, signed) )) => { assert_eq!(hash, hash_a); @@ -995,17 +1278,6 @@ mod test { } ); - // gossip to the network - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage ( - peers, out_msg, - )) => { - assert_eq!(peers, peers![peer_b]); - assert_eq!(out_msg, msg.clone().into_validation_protocol()); - } - ); - // reputation change for peer B assert_matches!( handle.recv().await, @@ -1020,6 +1292,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerViewChange(peer_b.clone(), view![]), )); @@ -1034,6 +1307,7 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerMessage( peer_b.clone(), msg.clone().into_network_message(), @@ -1054,17 +1328,19 @@ mod test { launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerDisconnected(peer_b.clone()), )); // we are not interested in any peers at all anymore - state.view = view![]; + state.view = our_view![]; // on rx of the same message, since we are not interested, // should give penalty launch!(handle_network_msg( &mut ctx, &mut state, + &Default::default(), NetworkBridgeEvent::PeerMessage( peer_a.clone(), msg.clone().into_network_message(), @@ -1084,4 +1360,88 @@ mod test { }); } + + #[test] + fn do_not_send_message_back_to_origin() { + let _ = env_logger::builder() + .filter(None, log::LevelFilter::Trace) + .is_test(true) + .try_init(); + + let hash: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + assert_ne!(peer_a, peer_b); + + // validator 0 key pair + let (mut state, signing_context, keystore, validator) = state_with_view(our_view![hash], hash); + + // create a signed message by validator 0 + let payload = AvailabilityBitfield(bitvec![bitvec::order::Lsb0, u8; 1u8; 32]); + let signed_bitfield = executor::block_on(Signed::::sign( + &keystore, + payload, + &signing_context, + 0, + &validator, + )).expect("should be signed"); + + state.peer_views.insert(peer_b.clone(), view![hash]); + state.peer_views.insert(peer_a.clone(), view![hash]); + + let msg = BitfieldGossipMessage { + relay_parent: hash.clone(), + signed_availability: signed_bitfield.clone(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = + make_subsystem_context::(pool); + + executor::block_on(async move { + // send a first message + launch!(handle_network_msg( + &mut ctx, + &mut state, + &Default::default(), + NetworkBridgeEvent::PeerMessage( + peer_b.clone(), + msg.clone().into_network_message(), + ), + )); + + assert_matches!( + handle.recv().await, + AllMessages::Provisioner(ProvisionerMessage::ProvisionableData( + _, + ProvisionableData::Bitfield(hash, signed) + )) => { + assert_eq!(hash, hash); + assert_eq!(signed, signed_bitfield) + } + ); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendValidationMessage(peers, send_msg), + ) => { + assert_eq!(1, peers.len()); + assert!(peers.contains(&peer_a)); + assert_eq!(send_msg, msg.clone().into_validation_protocol()); + } + ); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, BENEFIT_VALID_MESSAGE_FIRST) + } + ); + }); + } } diff --git a/node/network/bridge/Cargo.toml b/node/network/bridge/Cargo.toml index 555f158b782e75f12438345e636d8c3a23f4f3d4..132fdc4b16ecd5931ecdc2274a71cc4b7eac6382 100644 --- a/node/network/bridge/Cargo.toml +++ b/node/network/bridge/Cargo.toml @@ -5,20 +5,20 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.5" -log = "0.4.8" -futures-timer = "3.0.2" -streamunordered = "0.5.1" +async-trait = "0.1.42" +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" polkadot-primitives = { path = "../../../primitives" } -parity-scale-codec = "1.3.4" +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +sc-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } polkadot-node-network-protocol = { path = "../protocol" } [dev-dependencies] -assert_matches = "1.3.0" -parking_lot = "0.10.0" +assert_matches = "1.4.0" +parking_lot = "0.11.1" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/bridge/src/lib.rs b/node/network/bridge/src/lib.rs index b531d5977433c5b5c7cdb5e34b5b97421e11b1ca..a0159479122ee729ef588c86fa3acbce1e834f3f 100644 --- a/node/network/bridge/src/lib.rs +++ b/node/network/bridge/src/lib.rs @@ -16,57 +16,56 @@ //! The Network Bridge Subsystem - protocol multiplexer for Polkadot. +#![deny(unused_crate_dependencies)] +#![warn(missing_docs)] + + use parity_scale_codec::{Encode, Decode}; use futures::prelude::*; use futures::future::BoxFuture; use futures::stream::BoxStream; -use futures::channel::oneshot; +use futures::channel::mpsc; use sc_network::Event as NetworkEvent; -use sp_runtime::ConsensusEngineId; use polkadot_subsystem::{ ActiveLeavesUpdate, FromOverseer, OverseerSignal, Subsystem, SubsystemContext, SpawnedSubsystem, SubsystemError, - SubsystemResult, + SubsystemResult, JaegerSpan, }; use polkadot_subsystem::messages::{ NetworkBridgeMessage, AllMessages, AvailabilityDistributionMessage, BitfieldDistributionMessage, PoVDistributionMessage, StatementDistributionMessage, CollatorProtocolMessage, }; -use polkadot_primitives::v1::{Block, Hash, ValidatorId}; +use polkadot_primitives::v1::{AuthorityDiscoveryId, Block, Hash, BlockNumber}; use polkadot_node_network_protocol::{ - ObservedRole, ReputationChange, PeerId, PeerSet, View, NetworkBridgeEvent, v1 as protocol_v1 + ObservedRole, ReputationChange, PeerId, PeerSet, View, NetworkBridgeEvent, v1 as protocol_v1, OurView, }; -use std::collections::hash_map::{HashMap, Entry as HEntry}; +use std::collections::{HashMap, hash_map}; use std::iter::ExactSizeIterator; use std::pin::Pin; use std::sync::Arc; +mod validator_discovery; + /// The maximum amount of heads a peer is allowed to have in their view at any time. /// /// We use the same limit to compute the view sent to peers locally. const MAX_VIEW_HEADS: usize = 5; -/// The engine ID of the validation protocol. -pub const VALIDATION_PROTOCOL_ID: ConsensusEngineId = *b"pvn1"; /// The protocol name for the validation peer-set. pub const VALIDATION_PROTOCOL_NAME: &'static str = "/polkadot/validation/1"; -/// The engine ID of the collation protocol. -pub const COLLATION_PROTOCOL_ID: ConsensusEngineId = *b"pcn1"; /// The protocol name for the collation peer-set. pub const COLLATION_PROTOCOL_NAME: &'static str = "/polkadot/collation/1"; -const MALFORMED_MESSAGE_COST: ReputationChange - = ReputationChange::new(-500, "Malformed Network-bridge message"); -const UNCONNECTED_PEERSET_COST: ReputationChange - = ReputationChange::new(-50, "Message sent to un-connected peer-set"); -const MALFORMED_VIEW_COST: ReputationChange - = ReputationChange::new(-500, "Malformed view"); +const MALFORMED_MESSAGE_COST: ReputationChange = ReputationChange::new(-500, "Malformed Network-bridge message"); +const UNCONNECTED_PEERSET_COST: ReputationChange = ReputationChange::new(-50, "Message sent to un-connected peer-set"); +const MALFORMED_VIEW_COST: ReputationChange = ReputationChange::new(-500, "Malformed view"); +const EMPTY_VIEW_COST: ReputationChange = ReputationChange::new(-500, "Peer sent us an empty view"); // network bridge log target -const TARGET: &'static str = "network_bridge"; +const LOG_TARGET: &'static str = "network_bridge"; /// Messages received on the network. #[derive(Debug, Encode, Decode, Clone)] @@ -79,12 +78,28 @@ pub enum WireMessage { ViewUpdate(View), } -/// Information about the notifications protocol. Should be used during network configuration -/// or shortly after startup to register the protocol with the network service. -pub fn notifications_protocol_info() -> Vec<(ConsensusEngineId, std::borrow::Cow<'static, str>)> { +/// Information about the extra peers set. Should be used during network configuration +/// to register the protocol with the network service. +pub fn peers_sets_info() -> Vec { vec![ - (VALIDATION_PROTOCOL_ID, VALIDATION_PROTOCOL_NAME.into()), - (COLLATION_PROTOCOL_ID, COLLATION_PROTOCOL_NAME.into()), + sc_network::config::NonDefaultSetConfig { + notifications_protocol: VALIDATION_PROTOCOL_NAME.into(), + set_config: sc_network::config::SetConfig { + in_peers: 25, + out_peers: 0, + reserved_nodes: Vec::new(), + non_reserved_mode: sc_network::config::NonReservedPeerMode::Accept, + }, + }, + sc_network::config::NonDefaultSetConfig { + notifications_protocol: COLLATION_PROTOCOL_NAME.into(), + set_config: sc_network::config::SetConfig { + in_peers: 25, + out_peers: 0, + reserved_nodes: Vec::new(), + non_reserved_mode: sc_network::config::NonReservedPeerMode::Accept, + }, + } ] } @@ -101,8 +116,8 @@ pub enum NetworkAction { pub trait Network: Send + 'static { /// Get a stream of all events occurring on the network. This may include events unrelated /// to the Polkadot protocol - the user of this function should filter only for events related - /// to the [`VALIDATION_PROTOCOL_ID`](VALIDATION_PROTOCOL_ID) - /// or [`COLLATION_PROTOCOL_ID`](COLLATION_PROTOCOL_ID) + /// to the [`VALIDATION_PROTOCOL_NAME`](VALIDATION_PROTOCOL_NAME) + /// or [`COLLATION_PROTOCOL_NAME`](COLLATION_PROTOCOL_NAME) fn event_stream(&mut self) -> BoxStream<'static, NetworkEvent>; /// Get access to an underlying sink for all network actions. @@ -134,6 +149,7 @@ impl Network for Arc> { sc_network::NetworkService::event_stream(self, "polkadot-network-bridge").boxed() } + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] fn action_sink<'a>(&'a mut self) -> Pin + Send + 'a>> { @@ -151,20 +167,23 @@ impl Network for Arc> { fn start_send(self: Pin<&mut Self>, action: NetworkAction) -> SubsystemResult<()> { match action { - NetworkAction::ReputationChange(peer, cost_benefit) => self.0.report_peer( - peer, - cost_benefit, - ), + NetworkAction::ReputationChange(peer, cost_benefit) => { + tracing::debug!(target: LOG_TARGET, "Changing reputation: {:?} for {}", cost_benefit, peer); + self.0.report_peer( + peer, + cost_benefit, + ) + } NetworkAction::WriteNotification(peer, peer_set, message) => { match peer_set { PeerSet::Validation => self.0.write_notification( peer, - VALIDATION_PROTOCOL_ID, + VALIDATION_PROTOCOL_NAME.into(), message, ), PeerSet::Collation => self.0.write_notification( peer, - COLLATION_PROTOCOL_ID, + COLLATION_PROTOCOL_NAME.into(), message, ), } @@ -188,31 +207,46 @@ impl Network for Arc> { } /// The network bridge subsystem. -pub struct NetworkBridge(N); +pub struct NetworkBridge { + network_service: N, + authority_discovery_service: AD, +} -impl NetworkBridge { - /// Create a new network bridge subsystem with underlying network service. +impl NetworkBridge { + /// Create a new network bridge subsystem with underlying network service and authority discovery service. /// /// This assumes that the network service has had the notifications protocol for the network - /// bridge already registered. See [`notifications_protocol_info`](notifications_protocol_info). - pub fn new(net_service: N) -> Self { - NetworkBridge(net_service) + /// bridge already registered. See [`peers_sets_info`](peers_sets_info). + pub fn new(network_service: N, authority_discovery_service: AD) -> Self { + NetworkBridge { + network_service, + authority_discovery_service, + } } } -impl Subsystem for NetworkBridge +impl Subsystem for NetworkBridge where - Net: Network, + Net: Network + validator_discovery::Network, + AD: validator_discovery::AuthorityDiscovery, Context: SubsystemContext, { - type Metrics = (); - fn start(self, ctx: Context) -> SpawnedSubsystem { // Swallow error because failure is fatal to the node and we log with more precision // within `run_network`. + let Self { network_service, authority_discovery_service } = self; + let future = run_network( + network_service, + authority_discovery_service, + ctx, + ) + .map_err(|e| { + SubsystemError::with_origin("network-bridge", e) + }) + .boxed(); SpawnedSubsystem { name: "network-bridge-subsystem", - future: run_network(self.0, ctx).map(|_| ()).boxed(), + future, } } } @@ -224,12 +258,16 @@ struct PeerData { #[derive(Debug)] enum Action { - SendValidationMessage(Vec, protocol_v1::ValidationProtocol), - SendCollationMessage(Vec, protocol_v1::CollationProtocol), - ConnectToValidators(PeerSet, Vec, oneshot::Sender>), + SendValidationMessages(Vec<(Vec, protocol_v1::ValidationProtocol)>), + SendCollationMessages(Vec<(Vec, protocol_v1::CollationProtocol)>), + ConnectToValidators { + validator_ids: Vec, + connected: mpsc::Sender<(AuthorityDiscoveryId, PeerId)>, + }, ReportPeer(PeerId, ReputationChange), ActiveLeaves(ActiveLeavesUpdate), + BlockFinalized(BlockNumber), PeerConnected(PeerSet, PeerId, ObservedRole), PeerDisconnected(PeerSet, PeerId), @@ -243,60 +281,68 @@ enum Action { Nop, } +#[tracing::instrument(level = "trace", fields(subsystem = LOG_TARGET))] fn action_from_overseer_message( res: polkadot_subsystem::SubsystemResult>, ) -> Action { match res { Ok(FromOverseer::Signal(OverseerSignal::ActiveLeaves(active_leaves))) => Action::ActiveLeaves(active_leaves), + Ok(FromOverseer::Signal(OverseerSignal::BlockFinalized(_hash, number))) + => Action::BlockFinalized(number), Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => Action::Abort, Ok(FromOverseer::Communication { msg }) => match msg { NetworkBridgeMessage::ReportPeer(peer, rep) => Action::ReportPeer(peer, rep), NetworkBridgeMessage::SendValidationMessage(peers, msg) - => Action::SendValidationMessage(peers, msg), + => Action::SendValidationMessages(vec![(peers, msg)]), NetworkBridgeMessage::SendCollationMessage(peers, msg) - => Action::SendCollationMessage(peers, msg), - NetworkBridgeMessage::ConnectToValidators(peer_set, validators, res) - => Action::ConnectToValidators(peer_set, validators, res), + => Action::SendCollationMessages(vec![(peers, msg)]), + NetworkBridgeMessage::SendValidationMessages(msgs) + => Action::SendValidationMessages(msgs), + NetworkBridgeMessage::SendCollationMessages(msgs) + => Action::SendCollationMessages(msgs), + NetworkBridgeMessage::ConnectToValidators { validator_ids, connected } + => Action::ConnectToValidators { validator_ids, connected }, }, - Ok(FromOverseer::Signal(OverseerSignal::BlockFinalized(_))) - => Action::Nop, Err(e) => { - log::warn!(target: TARGET, "Shutting down Network Bridge due to error {:?}", e); + tracing::warn!(target: LOG_TARGET, err = ?e, "Shutting down Network Bridge due to error"); Action::Abort } } } +#[tracing::instrument(level = "trace", fields(subsystem = LOG_TARGET))] fn action_from_network_message(event: Option) -> Action { match event { None => { - log::info!(target: TARGET, "Shutting down Network Bridge: underlying event stream concluded"); + tracing::info!(target: LOG_TARGET, "Shutting down Network Bridge: underlying event stream concluded"); Action::Abort } - Some(NetworkEvent::Dht(_)) => Action::Nop, - Some(NetworkEvent::NotificationStreamOpened { remote, engine_id, role }) => { + Some(NetworkEvent::Dht(_)) | + Some(NetworkEvent::SyncConnected { .. }) | + Some(NetworkEvent::SyncDisconnected { .. }) => Action::Nop, + Some(NetworkEvent::NotificationStreamOpened { remote, protocol, role }) => { let role = role.into(); - match engine_id { - x if x == VALIDATION_PROTOCOL_ID + match protocol { + x if x == VALIDATION_PROTOCOL_NAME => Action::PeerConnected(PeerSet::Validation, remote, role), - x if x == COLLATION_PROTOCOL_ID + x if x == COLLATION_PROTOCOL_NAME => Action::PeerConnected(PeerSet::Collation, remote, role), _ => Action::Nop, } } - Some(NetworkEvent::NotificationStreamClosed { remote, engine_id }) => { - match engine_id { - x if x == VALIDATION_PROTOCOL_ID + Some(NetworkEvent::NotificationStreamClosed { remote, protocol }) => { + match protocol { + x if x == VALIDATION_PROTOCOL_NAME => Action::PeerDisconnected(PeerSet::Validation, remote), - x if x == COLLATION_PROTOCOL_ID + x if x == COLLATION_PROTOCOL_NAME => Action::PeerDisconnected(PeerSet::Collation, remote), _ => Action::Nop, } } Some(NetworkEvent::NotificationsReceived { remote, messages }) => { let v_messages: Result, _> = messages.iter() - .filter(|(engine_id, _)| engine_id == &VALIDATION_PROTOCOL_ID) + .filter(|(protocol, _)| protocol == &VALIDATION_PROTOCOL_NAME) .map(|(_, msg_bytes)| WireMessage::decode(&mut msg_bytes.as_ref())) .collect(); @@ -306,7 +352,7 @@ fn action_from_network_message(event: Option) -> Action { }; let c_messages: Result, _> = messages.iter() - .filter(|(engine_id, _)| engine_id == &COLLATION_PROTOCOL_ID) + .filter(|(protocol, _)| protocol == &COLLATION_PROTOCOL_NAME) .map(|(_, msg_bytes)| WireMessage::decode(&mut msg_bytes.as_ref())) .collect(); @@ -322,20 +368,29 @@ fn action_from_network_message(event: Option) -> Action { } } -fn construct_view(live_heads: &[Hash]) -> View { - View(live_heads.iter().rev().take(MAX_VIEW_HEADS).cloned().collect()) +fn construct_view(live_heads: impl DoubleEndedIterator, finalized_number: BlockNumber) -> View { + View { + heads: live_heads.rev().take(MAX_VIEW_HEADS).collect(), + finalized_number + } } -async fn update_view( +#[tracing::instrument(level = "trace", skip(net, ctx, validation_peers, collation_peers), fields(subsystem = LOG_TARGET))] +async fn update_our_view( net: &mut impl Network, ctx: &mut impl SubsystemContext, - live_heads: &[Hash], + live_heads: &[(Hash, Arc)], local_view: &mut View, + finalized_number: BlockNumber, validation_peers: &HashMap, collation_peers: &HashMap, ) -> SubsystemResult<()> { - let new_view = construct_view(live_heads); - if *local_view == new_view { return Ok(()) } + let new_view = construct_view(live_heads.iter().map(|v| v.0), finalized_number); + + // We only want to send a view update when the heads changed, not when only the finalized block changed. + if local_view.heads == new_view.heads { + return Ok(()) + } *local_view = new_view.clone(); @@ -348,30 +403,21 @@ async fn update_view( send_collation_message( net, collation_peers.keys().cloned(), - WireMessage::ViewUpdate(new_view.clone()), + WireMessage::ViewUpdate(new_view), ).await?; - if let Err(e) = dispatch_validation_event_to_all( - NetworkBridgeEvent::OurViewChange(new_view.clone()), - ctx, - ).await { - log::warn!(target: TARGET, "Aborting - Failure to dispatch messages to overseer"); - return Err(e) - } + let our_view = OurView::new(live_heads.iter().cloned(), finalized_number); - if let Err(e) = dispatch_collation_event_to_all( - NetworkBridgeEvent::OurViewChange(new_view.clone()), - ctx, - ).await { - log::warn!(target: TARGET, "Aborting - Failure to dispatch messages to overseer"); - return Err(e) - } + dispatch_validation_event_to_all(NetworkBridgeEvent::OurViewChange(our_view.clone()), ctx).await; + + dispatch_collation_event_to_all(NetworkBridgeEvent::OurViewChange(our_view), ctx).await; Ok(()) } // Handle messages on a specific peer-set. The peer is expected to be connected on that // peer-set. +#[tracing::instrument(level = "trace", skip(peers, messages, net), fields(subsystem = LOG_TARGET))] async fn handle_peer_messages( peer: PeerId, peers: &mut HashMap, @@ -391,12 +437,19 @@ async fn handle_peer_messages( for message in messages { outgoing_messages.push(match message { WireMessage::ViewUpdate(new_view) => { - if new_view.0.len() > MAX_VIEW_HEADS { + if new_view.heads.len() > MAX_VIEW_HEADS { net.report_peer( peer.clone(), MALFORMED_VIEW_COST, ).await?; + continue + } else if new_view.heads.is_empty() { + net.report_peer( + peer.clone(), + EMPTY_VIEW_COST, + ).await?; + continue } else if new_view == peer_data.view { continue @@ -418,6 +471,7 @@ async fn handle_peer_messages( Ok(outgoing_messages) } +#[tracing::instrument(level = "trace", skip(net, peers), fields(subsystem = LOG_TARGET))] async fn send_validation_message( net: &mut impl Network, peers: I, @@ -430,6 +484,7 @@ async fn send_validation_message( send_message(net, peers, PeerSet::Validation, message).await } +#[tracing::instrument(level = "trace", skip(net, peers), fields(subsystem = LOG_TARGET))] async fn send_collation_message( net: &mut impl Network, peers: I, @@ -481,21 +536,22 @@ async fn send_message( async fn dispatch_validation_event_to_all( event: NetworkBridgeEvent, ctx: &mut impl SubsystemContext, -) -> SubsystemResult<()> { +) { dispatch_validation_events_to_all(std::iter::once(event), ctx).await } async fn dispatch_collation_event_to_all( event: NetworkBridgeEvent, ctx: &mut impl SubsystemContext, -) -> SubsystemResult<()> { +) { dispatch_collation_events_to_all(std::iter::once(event), ctx).await } +#[tracing::instrument(level = "trace", skip(events, ctx), fields(subsystem = LOG_TARGET))] async fn dispatch_validation_events_to_all( events: I, ctx: &mut impl SubsystemContext, -) -> SubsystemResult<()> +) where I: IntoIterator>, I::IntoIter: Send, @@ -523,10 +579,11 @@ async fn dispatch_validation_events_to_all( ctx.send_messages(events.into_iter().flat_map(messages_for)).await } +#[tracing::instrument(level = "trace", skip(events, ctx), fields(subsystem = LOG_TARGET))] async fn dispatch_collation_events_to_all( events: I, ctx: &mut impl SubsystemContext, -) -> SubsystemResult<()> +) where I: IntoIterator>, I::IntoIter: Send, @@ -540,20 +597,30 @@ async fn dispatch_collation_events_to_all( ctx.send_messages(events.into_iter().flat_map(messages_for)).await } -async fn run_network( - mut net: N, +#[tracing::instrument(skip(network_service, authority_discovery_service, ctx), fields(subsystem = LOG_TARGET))] +async fn run_network( + mut network_service: N, + mut authority_discovery_service: AD, mut ctx: impl SubsystemContext, -) -> SubsystemResult<()> { - let mut event_stream = net.event_stream().fuse(); +) -> SubsystemResult<()> +where + N: Network + validator_discovery::Network, + AD: validator_discovery::AuthorityDiscovery, +{ + let mut event_stream = network_service.event_stream().fuse(); // Most recent heads are at the back. - let mut live_heads: Vec = Vec::with_capacity(MAX_VIEW_HEADS); - let mut local_view = View(Vec::new()); + let mut live_heads: Vec<(Hash, Arc)> = Vec::with_capacity(MAX_VIEW_HEADS); + let mut local_view = View::default(); + let mut finalized_number = 0; let mut validation_peers: HashMap = HashMap::new(); let mut collation_peers: HashMap = HashMap::new(); + let mut validator_discovery = validator_discovery::Service::::new(); + loop { + let action = { let subsystem_next = ctx.recv().fuse(); let mut net_event_next = event_stream.next().fuse(); @@ -569,60 +636,91 @@ async fn run_network( Action::Nop => {} Action::Abort => return Ok(()), - Action::SendValidationMessage(peers, msg) => send_message( - &mut net, - peers, - PeerSet::Validation, - WireMessage::ProtocolMessage(msg), - ).await?, - - Action::SendCollationMessage(peers, msg) => send_message( - &mut net, - peers, - PeerSet::Collation, - WireMessage::ProtocolMessage(msg), - ).await?, + Action::SendValidationMessages(msgs) => { + for (peers, msg) in msgs { + send_message( + &mut network_service, + peers, + PeerSet::Validation, + WireMessage::ProtocolMessage(msg), + ).await? + } + } - Action::ConnectToValidators(_peer_set, _validators, _res) => { - // TODO: https://github.com/paritytech/polkadot/issues/1461 + Action::SendCollationMessages(msgs) => { + for (peers, msg) in msgs { + send_message( + &mut network_service, + peers, + PeerSet::Collation, + WireMessage::ProtocolMessage(msg), + ).await? + } } - Action::ReportPeer(peer, rep) => net.report_peer(peer, rep).await?, + Action::ConnectToValidators { + validator_ids, + connected, + } => { + let (ns, ads) = validator_discovery.on_request( + validator_ids, + connected, + network_service, + authority_discovery_service, + ).await; + network_service = ns; + authority_discovery_service = ads; + }, + + Action::ReportPeer(peer, rep) => network_service.report_peer(peer, rep).await?, Action::ActiveLeaves(ActiveLeavesUpdate { activated, deactivated }) => { live_heads.extend(activated); - live_heads.retain(|h| !deactivated.contains(h)); + live_heads.retain(|h| !deactivated.contains(&h.0)); - update_view( - &mut net, + update_our_view( + &mut network_service, &mut ctx, &live_heads, &mut local_view, + finalized_number, &validation_peers, &collation_peers, ).await?; } + Action::BlockFinalized(number) => { + debug_assert!(finalized_number < number); + + // we don't send the view updates here, but delay them until the next `Action::ActiveLeaves` + // otherwise it might break assumptions of some of the subsystems + // that we never send the same `ActiveLeavesUpdate` + // this is fine, we will get `Action::ActiveLeaves` on block finalization anyway + finalized_number = number; + }, + Action::PeerConnected(peer_set, peer, role) => { let peer_map = match peer_set { PeerSet::Validation => &mut validation_peers, PeerSet::Collation => &mut collation_peers, }; + validator_discovery.on_peer_connected(&peer, &mut authority_discovery_service).await; + match peer_map.entry(peer.clone()) { - HEntry::Occupied(_) => continue, - HEntry::Vacant(vacant) => { - vacant.insert(PeerData { - view: View(Vec::new()), + hash_map::Entry::Occupied(_) => continue, + hash_map::Entry::Vacant(vacant) => { + let _ = vacant.insert(PeerData { + view: View::default(), }); - let res = match peer_set { + match peer_set { PeerSet::Validation => dispatch_validation_events_to_all( vec![ NetworkBridgeEvent::PeerConnected(peer.clone(), role), NetworkBridgeEvent::PeerViewChange( peer, - View(Default::default()), + View::default(), ), ], &mut ctx, @@ -632,16 +730,11 @@ async fn run_network( NetworkBridgeEvent::PeerConnected(peer.clone(), role), NetworkBridgeEvent::PeerViewChange( peer, - View(Default::default()), + View::default(), ), ], &mut ctx, ).await, - }; - - if let Err(e) = res { - log::warn!("Aborting - Failure to dispatch messages to overseer"); - return Err(e); } } } @@ -652,8 +745,10 @@ async fn run_network( PeerSet::Collation => &mut collation_peers, }; + validator_discovery.on_peer_disconnected(&peer); + if peer_map.remove(&peer).is_some() { - let res = match peer_set { + match peer_set { PeerSet::Validation => dispatch_validation_event_to_all( NetworkBridgeEvent::PeerDisconnected(peer), &mut ctx, @@ -662,14 +757,6 @@ async fn run_network( NetworkBridgeEvent::PeerDisconnected(peer), &mut ctx, ).await, - }; - - if let Err(e) = res { - log::warn!( - target: TARGET, - "Aborting - Failure to dispatch messages to overseer", - ); - return Err(e) } } }, @@ -679,19 +766,10 @@ async fn run_network( peer.clone(), &mut validation_peers, v_messages, - &mut net, + &mut network_service, ).await?; - if let Err(e) = dispatch_validation_events_to_all( - events, - &mut ctx, - ).await { - log::warn!( - target: TARGET, - "Aborting - Failure to dispatch messages to overseer", - ); - return Err(e) - } + dispatch_validation_events_to_all(events, &mut ctx).await; } if !c_messages.is_empty() { @@ -699,32 +777,27 @@ async fn run_network( peer.clone(), &mut collation_peers, c_messages, - &mut net, + &mut network_service, ).await?; - if let Err(e) = dispatch_collation_events_to_all( - events, - &mut ctx, - ).await { - log::warn!( - target: TARGET, - "Aborting - Failure to dispatch messages to overseer", - ); - return Err(e) - } + dispatch_collation_events_to_all(events, &mut ctx).await; } }, } } } + #[cfg(test)] mod tests { use super::*; use futures::channel::mpsc; use futures::executor; + use std::borrow::Cow; use std::sync::Arc; + use std::collections::HashSet; + use async_trait::async_trait; use parking_lot::Mutex; use assert_matches::assert_matches; @@ -732,6 +805,8 @@ mod tests { use polkadot_node_subsystem_test_helpers::{ SingleItemSink, SingleItemStream, TestSubsystemContextHandle, }; + use polkadot_node_network_protocol::view; + use sc_network::Multiaddr; use sp_keyring::Sr25519Keyring; // The subsystem's view of the network - only supports a single call to `event_stream`. @@ -740,6 +815,8 @@ mod tests { action_tx: mpsc::UnboundedSender, } + struct TestAuthorityDiscovery; + // The test's view of the network. This receives updates from the subsystem in the form // of `NetworkAction`s. struct TestNetworkHandle { @@ -750,6 +827,7 @@ mod tests { fn new_test_network() -> ( TestNetwork, TestNetworkHandle, + TestAuthorityDiscovery, ) { let (net_tx, net_rx) = polkadot_node_subsystem_test_helpers::single_item_sink(); let (action_tx, action_rx) = mpsc::unbounded(); @@ -763,13 +841,14 @@ mod tests { action_rx, net_tx, }, + TestAuthorityDiscovery, ) } - fn peer_set_engine_id(peer_set: PeerSet) -> ConsensusEngineId { + fn peer_set_protocol(peer_set: PeerSet) -> std::borrow::Cow<'static, str> { match peer_set { - PeerSet::Validation => VALIDATION_PROTOCOL_ID, - PeerSet::Collation => COLLATION_PROTOCOL_ID, + PeerSet::Validation => VALIDATION_PROTOCOL_NAME.into(), + PeerSet::Collation => COLLATION_PROTOCOL_NAME.into(), } } @@ -788,6 +867,28 @@ mod tests { } } + #[async_trait] + impl validator_discovery::Network for TestNetwork { + async fn add_peers_to_reserved_set(&mut self, _protocol: Cow<'static, str>, _: HashSet) -> Result<(), String> { + Ok(()) + } + + async fn remove_peers_from_reserved_set(&mut self, _protocol: Cow<'static, str>, _: HashSet) -> Result<(), String> { + Ok(()) + } + } + + #[async_trait] + impl validator_discovery::AuthorityDiscovery for TestAuthorityDiscovery { + async fn get_addresses_by_authority_id(&mut self, _authority: AuthorityDiscoveryId) -> Option> { + None + } + + async fn get_authority_id_by_peer_id(&mut self, _peer_id: PeerId) -> Option { + None + } + } + impl TestNetworkHandle { // Get the next network action. async fn next_network_action(&mut self) -> NetworkAction { @@ -807,7 +908,7 @@ mod tests { async fn connect_peer(&mut self, peer: PeerId, peer_set: PeerSet, role: ObservedRole) { self.send_network_event(NetworkEvent::NotificationStreamOpened { remote: peer, - engine_id: peer_set_engine_id(peer_set), + protocol: peer_set_protocol(peer_set), role: role.into(), }).await; } @@ -815,14 +916,14 @@ mod tests { async fn disconnect_peer(&mut self, peer: PeerId, peer_set: PeerSet) { self.send_network_event(NetworkEvent::NotificationStreamClosed { remote: peer, - engine_id: peer_set_engine_id(peer_set), + protocol: peer_set_protocol(peer_set), }).await; } async fn peer_message(&mut self, peer: PeerId, peer_set: PeerSet, message: Vec) { self.send_network_event(NetworkEvent::NotificationsReceived { remote: peer, - messages: vec![(peer_set_engine_id(peer_set), message.into())], + messages: vec![(peer_set_protocol(peer_set), message.into())], }).await; } @@ -831,10 +932,11 @@ mod tests { } } - // network actions are sensitive to ordering of `PeerId`s within a `HashMap`, so - // we need to use this to prevent fragile reliance on peer ordering. - fn network_actions_contains(actions: &[NetworkAction], action: &NetworkAction) -> bool { - actions.iter().find(|&x| x == action).is_some() + /// Assert that the given actions contain the given `action`. + fn assert_network_actions_contains(actions: &[NetworkAction], action: &NetworkAction) { + if !actions.iter().any(|x| x == action) { + panic!("Could not find `{:?}` in `{:?}`", action, actions); + } } struct TestHarness { @@ -844,11 +946,12 @@ mod tests { fn test_harness>(test: impl FnOnce(TestHarness) -> T) { let pool = sp_core::testing::TaskExecutor::new(); - let (network, network_handle) = new_test_network(); + let (network, network_handle, discovery) = new_test_network(); let (context, virtual_overseer) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); let network_bridge = run_network( network, + discovery, context, ) .map_err(|_| panic!("subsystem execution failed")) @@ -862,7 +965,7 @@ mod tests { futures::pin_mut!(test_fut); futures::pin_mut!(network_bridge); - executor::block_on(future::select(test_fut, network_bridge)); + let _ = executor::block_on(future::select(test_fut, network_bridge)); } async fn assert_sends_validation_event_to_all( @@ -929,34 +1032,98 @@ mod tests { ObservedRole::Full, ).await; - let hash_a = Hash::from([1; 32]); + let hash_a = Hash::repeat_byte(1); + + virtual_overseer.send( + FromOverseer::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::start_work(hash_a, Arc::new(JaegerSpan::Disabled)), + )) + ).await; + + let actions = network_handle.next_network_actions(2).await; + let wire_message = WireMessage::::ViewUpdate( + view![hash_a] + ).encode(); + + assert_network_actions_contains( + &actions, + &NetworkAction::WriteNotification( + peer_a, + PeerSet::Validation, + wire_message.clone(), + ), + ); + + assert_network_actions_contains( + &actions, + &NetworkAction::WriteNotification( + peer_b, + PeerSet::Validation, + wire_message.clone(), + ), + ); + }); + } + + #[test] + fn do_not_send_view_update_when_only_finalized_block_changed() { + test_harness(|test_harness| async move { + let TestHarness { mut network_handle, mut virtual_overseer } = test_harness; + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + + network_handle.connect_peer( + peer_a.clone(), + PeerSet::Validation, + ObservedRole::Full, + ).await; + network_handle.connect_peer( + peer_b.clone(), + PeerSet::Validation, + ObservedRole::Full, + ).await; + + let hash_a = Hash::repeat_byte(1); + + virtual_overseer.send(FromOverseer::Signal(OverseerSignal::BlockFinalized(Hash::random(), 5))).await; + + // Send some empty active leaves update + // + // This should not trigger a view update to our peers. + virtual_overseer.send( + FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::default())) + ).await; + // This should trigger the view update to our peers. virtual_overseer.send( - FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(hash_a))) + FromOverseer::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::start_work(hash_a, Arc::new(JaegerSpan::Disabled)), + )) ).await; let actions = network_handle.next_network_actions(2).await; let wire_message = WireMessage::::ViewUpdate( - View(vec![hash_a]) + View { heads: vec![hash_a], finalized_number: 5 } ).encode(); - assert!(network_actions_contains( + assert_network_actions_contains( &actions, &NetworkAction::WriteNotification( peer_a, PeerSet::Validation, wire_message.clone(), ), - )); + ); - assert!(network_actions_contains( + assert_network_actions_contains( &actions, &NetworkAction::WriteNotification( peer_b, PeerSet::Validation, wire_message.clone(), ), - )); + ); }); } @@ -972,7 +1139,7 @@ mod tests { network_handle.connect_peer(peer.clone(), PeerSet::Validation, ObservedRole::Full).await; - let view = View(vec![Hash::from([1u8; 32])]); + let view = view![Hash::repeat_byte(1)]; // bridge will inform about all connected peers. { @@ -982,7 +1149,7 @@ mod tests { ).await; assert_sends_validation_event_to_all( - NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + NetworkBridgeEvent::PeerViewChange(peer.clone(), View::default()), &mut virtual_overseer, ).await; } @@ -1026,7 +1193,7 @@ mod tests { ).await; assert_sends_validation_event_to_all( - NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + NetworkBridgeEvent::PeerViewChange(peer.clone(), View::default()), &mut virtual_overseer, ).await; } @@ -1091,7 +1258,7 @@ mod tests { ).await; assert_sends_validation_event_to_all( - NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + NetworkBridgeEvent::PeerViewChange(peer.clone(), View::default()), &mut virtual_overseer, ).await; } @@ -1103,7 +1270,7 @@ mod tests { ).await; assert_sends_collation_event_to_all( - NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + NetworkBridgeEvent::PeerViewChange(peer.clone(), View::default()), &mut virtual_overseer, ).await; } @@ -1117,25 +1284,27 @@ mod tests { // to show that we're still connected on the collation protocol, send a view update. - let hash_a = Hash::from([1; 32]); + let hash_a = Hash::repeat_byte(1); virtual_overseer.send( - FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(hash_a))) + FromOverseer::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::start_work(hash_a, Arc::new(JaegerSpan::Disabled)), + )) ).await; let actions = network_handle.next_network_actions(1).await; let wire_message = WireMessage::::ViewUpdate( - View(vec![hash_a]) + view![hash_a] ).encode(); - assert!(network_actions_contains( + assert_network_actions_contains( &actions, &NetworkAction::WriteNotification( peer.clone(), PeerSet::Collation, wire_message.clone(), ), - )); + ); }); } @@ -1161,7 +1330,7 @@ mod tests { ).await; assert_sends_validation_event_to_all( - NetworkBridgeEvent::PeerViewChange(peer_a.clone(), View(Default::default())), + NetworkBridgeEvent::PeerViewChange(peer_a.clone(), View::default()), &mut virtual_overseer, ).await; } @@ -1173,7 +1342,7 @@ mod tests { ).await; assert_sends_collation_event_to_all( - NetworkBridgeEvent::PeerViewChange(peer_b.clone(), View(Default::default())), + NetworkBridgeEvent::PeerViewChange(peer_b.clone(), View::default()), &mut virtual_overseer, ).await; } @@ -1195,13 +1364,13 @@ mod tests { ).await; let actions = network_handle.next_network_actions(1).await; - assert!(network_actions_contains( + assert_network_actions_contains( &actions, &NetworkAction::ReputationChange( peer_a.clone(), UNCONNECTED_PEERSET_COST, ), - )); + ); // peer B has the message relayed. @@ -1246,7 +1415,7 @@ mod tests { ).await; assert_sends_validation_event_to_all( - NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + NetworkBridgeEvent::PeerViewChange(peer.clone(), View::default()), &mut virtual_overseer, ).await; } @@ -1258,13 +1427,13 @@ mod tests { ).await; assert_sends_collation_event_to_all( - NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + NetworkBridgeEvent::PeerViewChange(peer.clone(), View::default()), &mut virtual_overseer, ).await; } - let view_a = View(vec![[1; 32].into()]); - let view_b = View(vec![[2; 32].into()]); + let view_a = view![Hash::repeat_byte(1)]; + let view_b = view![Hash::repeat_byte(2)]; network_handle.peer_message( peer.clone(), @@ -1290,6 +1459,50 @@ mod tests { }); } + #[test] + fn sent_views_include_finalized_number_update() { + test_harness(|test_harness| async move { + let TestHarness { mut network_handle, mut virtual_overseer } = test_harness; + + let peer_a = PeerId::random(); + + network_handle.connect_peer( + peer_a.clone(), + PeerSet::Validation, + ObservedRole::Full, + ).await; + + let hash_a = Hash::repeat_byte(1); + let hash_b = Hash::repeat_byte(2); + + virtual_overseer.send( + FromOverseer::Signal(OverseerSignal::BlockFinalized(hash_a, 1)) + ).await; + virtual_overseer.send( + FromOverseer::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::start_work(hash_b, Arc::new(JaegerSpan::Disabled)), + )) + ).await; + + let actions = network_handle.next_network_actions(1).await; + let wire_message = WireMessage::::ViewUpdate( + View { + heads: vec![hash_b], + finalized_number: 1, + } + ).encode(); + + assert_network_actions_contains( + &actions, + &NetworkAction::WriteNotification( + peer_a.clone(), + PeerSet::Validation, + wire_message.clone(), + ), + ); + }); + } + #[test] fn send_messages_to_peers() { test_harness(|test_harness| async move { @@ -1311,7 +1524,7 @@ mod tests { ).await; assert_sends_validation_event_to_all( - NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + NetworkBridgeEvent::PeerViewChange(peer.clone(), View::default()), &mut virtual_overseer, ).await; } @@ -1323,7 +1536,7 @@ mod tests { ).await; assert_sends_collation_event_to_all( - NetworkBridgeEvent::PeerViewChange(peer.clone(), View(Default::default())), + NetworkBridgeEvent::PeerViewChange(peer.clone(), View::default()), &mut virtual_overseer, ).await; } diff --git a/node/network/bridge/src/validator_discovery.rs b/node/network/bridge/src/validator_discovery.rs new file mode 100644 index 0000000000000000000000000000000000000000..89e72a7aa9cfe44df53bba9cca0ed117d952c84b --- /dev/null +++ b/node/network/bridge/src/validator_discovery.rs @@ -0,0 +1,638 @@ +// Copyright 2020 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 validator discovery service for the Network Bridge. + +use core::marker::PhantomData; +use std::borrow::Cow; +use std::collections::{HashSet, HashMap, hash_map}; +use std::sync::Arc; + +use async_trait::async_trait; +use futures::channel::mpsc; + +use sc_network::multiaddr::{Multiaddr, Protocol}; +use sc_authority_discovery::Service as AuthorityDiscoveryService; +use polkadot_node_network_protocol::PeerId; +use polkadot_primitives::v1::{AuthorityDiscoveryId, Block, Hash}; + +const LOG_TARGET: &str = "validator_discovery"; + +/// An abstraction over networking for the purposes of validator discovery service. +#[async_trait] +pub trait Network: Send + 'static { + /// Ask the network to connect to these nodes and not disconnect from them until removed from the priority group. + async fn add_peers_to_reserved_set(&mut self, protocol: Cow<'static, str>, multiaddresses: HashSet) -> Result<(), String>; + /// Remove the peers from the priority group. + async fn remove_peers_from_reserved_set(&mut self, protocol: Cow<'static, str>, multiaddresses: HashSet) -> Result<(), String>; +} + +/// An abstraction over the authority discovery service. +#[async_trait] +pub trait AuthorityDiscovery: Send + 'static { + /// Get the addresses for the given [`AuthorityId`] from the local address cache. + async fn get_addresses_by_authority_id(&mut self, authority: AuthorityDiscoveryId) -> Option>; + /// Get the [`AuthorityId`] for the given [`PeerId`] from the local address cache. + async fn get_authority_id_by_peer_id(&mut self, peer_id: PeerId) -> Option; +} + +#[async_trait] +impl Network for Arc> { + async fn add_peers_to_reserved_set(&mut self, protocol: Cow<'static, str>, multiaddresses: HashSet) -> Result<(), String> { + sc_network::NetworkService::add_peers_to_reserved_set(&**self, protocol, multiaddresses) + } + + async fn remove_peers_from_reserved_set(&mut self, protocol: Cow<'static, str>, multiaddresses: HashSet) -> Result<(), String> { + sc_network::NetworkService::remove_peers_from_reserved_set(&**self, protocol, multiaddresses) + } +} + +#[async_trait] +impl AuthorityDiscovery for AuthorityDiscoveryService { + async fn get_addresses_by_authority_id(&mut self, authority: AuthorityDiscoveryId) -> Option> { + AuthorityDiscoveryService::get_addresses_by_authority_id(self, authority).await + } + + async fn get_authority_id_by_peer_id(&mut self, peer_id: PeerId) -> Option { + AuthorityDiscoveryService::get_authority_id_by_peer_id(self, peer_id).await + } +} + +/// This struct tracks the state for one `ConnectToValidators` request. +struct NonRevokedConnectionRequestState { + requested: Vec, + pending: HashSet, + sender: mpsc::Sender<(AuthorityDiscoveryId, PeerId)>, +} + +impl NonRevokedConnectionRequestState { + /// Create a new instance of `ConnectToValidatorsState`. + pub fn new( + requested: Vec, + pending: HashSet, + sender: mpsc::Sender<(AuthorityDiscoveryId, PeerId)>, + ) -> Self { + Self { + requested, + pending, + sender, + } + } + + pub fn on_authority_connected(&mut self, authority: &AuthorityDiscoveryId, peer_id: &PeerId) { + if self.pending.remove(authority) { + // an error may happen if the request was revoked or + // the channel's buffer is full, ignoring it is fine + let _ = self.sender.try_send((authority.clone(), peer_id.clone())); + } + } + + /// Returns `true` if the request is revoked. + pub fn is_revoked(&mut self) -> bool { + self.sender.is_closed() + } + + pub fn requested(&self) -> &[AuthorityDiscoveryId] { + self.requested.as_ref() + } +} + +/// Will be called by [`Service::on_request`] when a request was revoked. +/// +/// Takes the `map` of requested validators and the `id` of the validator that should be revoked. +/// +/// Returns `Some(id)` iff the request counter is `0`. +fn on_revoke(map: &mut HashMap, id: AuthorityDiscoveryId) -> Option { + if let hash_map::Entry::Occupied(mut entry) = map.entry(id) { + if entry.get_mut().saturating_sub(1) == 0 { + return Some(entry.remove_entry().0); + } + } + + None +} + +fn peer_id_from_multiaddr(addr: &Multiaddr) -> Option { + addr.iter().last().and_then(|protocol| if let Protocol::P2p(multihash) = protocol { + PeerId::from_multihash(multihash).ok() + } else { + None + }) +} + +pub(super) struct Service { + // Peers that are connected to us and authority ids associated to them. + connected_peers: HashMap>, + // The `u64` counts the number of pending non-revoked requests for this validator + // note: the validators in this map are not necessarily present + // in the `connected_validators` map. + // Invariant: the value > 0 for non-revoked requests. + requested_validators: HashMap, + non_revoked_discovery_requests: Vec, + // PhantomData used to make the struct generic instead of having generic methods + _phantom: PhantomData<(N, AD)>, +} + +impl Service { + pub fn new() -> Self { + Self { + connected_peers: HashMap::new(), + requested_validators: HashMap::new(), + non_revoked_discovery_requests: Vec::new(), + _phantom: PhantomData, + } + } + + /// Find connected validators using the given `validator_ids`. + /// + /// Returns a [`HashMap`] that contains the found [`AuthorityDiscoveryId`]'s and their associated [`PeerId`]'s. + #[tracing::instrument(level = "trace", skip(self, authority_discovery_service), fields(subsystem = LOG_TARGET))] + async fn find_connected_validators( + &mut self, + validator_ids: &[AuthorityDiscoveryId], + authority_discovery_service: &mut AD, + ) -> HashMap { + let mut result = HashMap::new(); + + for id in validator_ids { + // First check if we already cached the validator + if let Some(pid) = self.connected_peers + .iter() + .find_map(|(pid, ids)| if ids.contains(&id) { Some(pid) } else { None }) { + result.insert(id.clone(), pid.clone()); + continue; + } + + // If not ask the authority discovery + if let Some(addresses) = authority_discovery_service.get_addresses_by_authority_id(id.clone()).await { + for peer_id in addresses.iter().filter_map(peer_id_from_multiaddr) { + if let Some(ids) = self.connected_peers.get_mut(&peer_id) { + ids.insert(id.clone()); + result.insert(id.clone(), peer_id.clone()); + } + } + } + } + + result + } + + /// On a new connection request, a priority group update will be issued. + /// It will ask the network to connect to the validators and not disconnect + /// from them at least until all the pending requests containing them are revoked. + /// + /// This method will also clean up all previously revoked requests. + /// it takes `network_service` and `authority_discovery_service` by value + /// and returns them as a workaround for the Future: Send requirement imposed by async fn impl. + #[tracing::instrument(level = "trace", skip(self, connected, network_service, authority_discovery_service), fields(subsystem = LOG_TARGET))] + pub async fn on_request( + &mut self, + validator_ids: Vec, + mut connected: mpsc::Sender<(AuthorityDiscoveryId, PeerId)>, + mut network_service: N, + mut authority_discovery_service: AD, + ) -> (N, AD) { + const MAX_ADDR_PER_PEER: usize = 3; + + // Increment the counter of how many times the validators were requested. + validator_ids.iter().for_each(|id| *self.requested_validators.entry(id.clone()).or_default() += 1); + let already_connected = self.find_connected_validators(&validator_ids, &mut authority_discovery_service).await; + + // try to send already connected peers + for (id, peer) in already_connected.iter() { + match connected.try_send((id.clone(), peer.clone())) { + Err(e) if e.is_disconnected() => { + // the request is already revoked + for peer_id in validator_ids { + let _ = on_revoke(&mut self.requested_validators, peer_id); + } + return (network_service, authority_discovery_service); + } + Err(_) => { + // the channel's buffer is full + // ignore the error, the receiver will miss out some peers + // but that's fine + break; + } + Ok(()) => continue, + } + } + + // collect multiaddress of validators + let mut multiaddr_to_add = HashSet::new(); + for authority in validator_ids.iter() { + let result = authority_discovery_service.get_addresses_by_authority_id(authority.clone()).await; + if let Some(addresses) = result { + // We might have several `PeerId`s per `AuthorityId` + // depending on the number of sentry nodes, + // so we limit the max number of sentries per node to connect to. + // They are going to be removed soon though: + // https://github.com/paritytech/substrate/issues/6845 + multiaddr_to_add.extend(addresses.into_iter().take(MAX_ADDR_PER_PEER)); + } + } + + // clean up revoked requests + let mut revoked_indices = Vec::new(); + let mut revoked_validators = Vec::new(); + for (i, maybe_revoked) in self.non_revoked_discovery_requests.iter_mut().enumerate() { + if maybe_revoked.is_revoked() { + for id in maybe_revoked.requested() { + if let Some(id) = on_revoke(&mut self.requested_validators, id.clone()) { + revoked_validators.push(id); + } + } + revoked_indices.push(i); + } + } + + // clean up revoked requests states + for to_revoke in revoked_indices.into_iter().rev() { + drop(self.non_revoked_discovery_requests.swap_remove(to_revoke)); + } + + // multiaddresses to remove + let mut multiaddr_to_remove = HashSet::new(); + for id in revoked_validators.into_iter() { + let result = authority_discovery_service.get_addresses_by_authority_id(id).await; + if let Some(addresses) = result { + multiaddr_to_remove.extend(addresses.into_iter()); + } + } + + // ask the network to connect to these nodes and not disconnect + // from them until removed from the set + if let Err(e) = network_service.add_peers_to_reserved_set( + super::COLLATION_PROTOCOL_NAME.into(), + multiaddr_to_add.clone(), + ).await { + tracing::warn!(target: LOG_TARGET, err = ?e, "AuthorityDiscoveryService returned an invalid multiaddress"); + } + if let Err(e) = network_service.add_peers_to_reserved_set( + super::VALIDATION_PROTOCOL_NAME.into(), + multiaddr_to_add, + ).await { + tracing::warn!(target: LOG_TARGET, err = ?e, "AuthorityDiscoveryService returned an invalid multiaddress"); + } + // the addresses are known to be valid + let _ = network_service.remove_peers_from_reserved_set( + super::COLLATION_PROTOCOL_NAME.into(), + multiaddr_to_remove.clone() + ).await; + let _ = network_service.remove_peers_from_reserved_set( + super::VALIDATION_PROTOCOL_NAME.into(), + multiaddr_to_remove + ).await; + + let pending = validator_ids.iter() + .cloned() + .filter(|id| !already_connected.contains_key(id)) + .collect::>(); + + self.non_revoked_discovery_requests.push(NonRevokedConnectionRequestState::new( + validator_ids, + pending, + connected, + )); + + (network_service, authority_discovery_service) + } + + /// Should be called when a peer connected. + #[tracing::instrument(level = "trace", skip(self, authority_discovery_service), fields(subsystem = LOG_TARGET))] + pub async fn on_peer_connected(&mut self, peer_id: &PeerId, authority_discovery_service: &mut AD) { + // check if it's an authority we've been waiting for + let maybe_authority = authority_discovery_service.get_authority_id_by_peer_id(peer_id.clone()).await; + if let Some(authority) = maybe_authority { + for request in self.non_revoked_discovery_requests.iter_mut() { + let _ = request.on_authority_connected(&authority, peer_id); + } + + self.connected_peers.entry(peer_id.clone()).or_default().insert(authority); + } else { + self.connected_peers.insert(peer_id.clone(), Default::default()); + } + } + + /// Should be called when a peer disconnected. + pub fn on_peer_disconnected(&mut self, peer_id: &PeerId) { + self.connected_peers.remove(peer_id); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use futures::stream::StreamExt as _; + + use sp_keyring::Sr25519Keyring; + + + fn new_service() -> Service { + Service::new() + } + + fn new_network() -> (TestNetwork, TestAuthorityDiscovery) { + (TestNetwork::default(), TestAuthorityDiscovery::new()) + } + + #[derive(Default)] + struct TestNetwork { + peers_set: HashSet, + } + + #[derive(Default)] + struct TestAuthorityDiscovery { + by_authority_id: HashMap, + by_peer_id: HashMap, + } + + impl TestAuthorityDiscovery { + fn new() -> Self { + let peer_ids = known_peer_ids(); + let authorities = known_authorities(); + let multiaddr = known_multiaddr(); + Self { + by_authority_id: authorities.iter() + .cloned() + .zip(multiaddr.into_iter()) + .collect(), + by_peer_id: peer_ids.into_iter() + .zip(authorities.into_iter()) + .collect(), + } + } + } + + #[async_trait] + impl Network for TestNetwork { + async fn add_peers_to_reserved_set(&mut self, _protocol: Cow<'static, str>, multiaddresses: HashSet) -> Result<(), String> { + self.peers_set.extend(multiaddresses.into_iter()); + Ok(()) + } + + async fn remove_peers_from_reserved_set(&mut self, _protocol: Cow<'static, str>, multiaddresses: HashSet) -> Result<(), String> { + self.peers_set.retain(|elem| !multiaddresses.contains(elem)); + Ok(()) + } + } + + #[async_trait] + impl AuthorityDiscovery for TestAuthorityDiscovery { + async fn get_addresses_by_authority_id(&mut self, authority: AuthorityDiscoveryId) -> Option> { + self.by_authority_id.get(&authority).cloned().map(|addr| vec![addr]) + } + + async fn get_authority_id_by_peer_id(&mut self, peer_id: PeerId) -> Option { + self.by_peer_id.get(&peer_id).cloned() + } + } + + fn known_authorities() -> Vec { + [ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + ].iter().map(|k| k.public().into()).collect() + } + + fn known_peer_ids() -> Vec { + (0..3).map(|_| PeerId::random()).collect() + } + + fn known_multiaddr() -> Vec { + vec![ + "/ip4/127.0.0.1/tcp/1234".parse().unwrap(), + "/ip4/127.0.0.1/tcp/1235".parse().unwrap(), + "/ip4/127.0.0.1/tcp/1236".parse().unwrap(), + ] + } + + #[test] + fn request_is_revoked_when_the_receiver_is_dropped() { + let (sender, receiver) = mpsc::channel(0); + + let mut request = NonRevokedConnectionRequestState::new( + Vec::new(), + HashSet::new(), + sender, + ); + + assert!(!request.is_revoked()); + + drop(receiver); + + assert!(request.is_revoked()); + } + + #[test] + fn requests_are_fulfilled_immediately_for_already_connected_peers() { + let mut service = new_service(); + + let (ns, mut ads) = new_network(); + + let peer_ids: Vec<_> = ads.by_peer_id.keys().cloned().collect(); + let authority_ids: Vec<_> = ads.by_peer_id.values().cloned().collect(); + + futures::executor::block_on(async move { + let req1 = vec![authority_ids[0].clone(), authority_ids[1].clone()]; + let (sender, mut receiver) = mpsc::channel(2); + + service.on_peer_connected(&peer_ids[0], &mut ads).await; + + let _ = service.on_request( + req1, + sender, + ns, + ads, + ).await; + + + // the results should be immediately available + let reply1 = receiver.next().await.unwrap(); + assert_eq!(reply1.0, authority_ids[0]); + assert_eq!(reply1.1, peer_ids[0]); + }); + } + + #[test] + fn requests_are_fulfilled_on_peer_connection() { + let mut service = new_service(); + + let (ns, ads) = new_network(); + + let peer_ids: Vec<_> = ads.by_peer_id.keys().cloned().collect(); + let authority_ids: Vec<_> = ads.by_peer_id.values().cloned().collect(); + + futures::executor::block_on(async move { + let req1 = vec![authority_ids[0].clone(), authority_ids[1].clone()]; + let (sender, mut receiver) = mpsc::channel(2); + + let (_, mut ads) = service.on_request( + req1, + sender, + ns, + ads, + ).await; + + + service.on_peer_connected(&peer_ids[0], &mut ads).await; + let reply1 = receiver.next().await.unwrap(); + assert_eq!(reply1.0, authority_ids[0]); + assert_eq!(reply1.1, peer_ids[0]); + + service.on_peer_connected(&peer_ids[1], &mut ads).await; + let reply2 = receiver.next().await.unwrap(); + assert_eq!(reply2.0, authority_ids[1]); + assert_eq!(reply2.1, peer_ids[1]); + }); + } + + // Test cleanup works. + #[test] + fn requests_are_removed_on_revoke() { + let mut service = new_service(); + + let (ns, mut ads) = new_network(); + + let peer_ids: Vec<_> = ads.by_peer_id.keys().cloned().collect(); + let authority_ids: Vec<_> = ads.by_peer_id.values().cloned().collect(); + + futures::executor::block_on(async move { + let (sender, mut receiver) = mpsc::channel(1); + + service.on_peer_connected(&peer_ids[0], &mut ads).await; + service.on_peer_connected(&peer_ids[1], &mut ads).await; + + let (ns, ads) = service.on_request( + vec![authority_ids[0].clone()], + sender, + ns, + ads, + ).await; + + let _ = receiver.next().await.unwrap(); + // revoke the request + drop(receiver); + + let (sender, mut receiver) = mpsc::channel(1); + + let _ = service.on_request( + vec![authority_ids[1].clone()], + sender, + ns, + ads, + ).await; + + let reply = receiver.next().await.unwrap(); + assert_eq!(reply.0, authority_ids[1]); + assert_eq!(reply.1, peer_ids[1]); + assert_eq!(service.non_revoked_discovery_requests.len(), 1); + }); + } + + // More complex test with overlapping revoked requests + #[test] + fn revoking_requests_with_overlapping_validator_sets() { + let mut service = new_service(); + + let (ns, mut ads) = new_network(); + + let peer_ids: Vec<_> = ads.by_peer_id.keys().cloned().collect(); + let authority_ids: Vec<_> = ads.by_peer_id.values().cloned().collect(); + + futures::executor::block_on(async move { + let (sender, mut receiver) = mpsc::channel(1); + + service.on_peer_connected(&peer_ids[0], &mut ads).await; + service.on_peer_connected(&peer_ids[1], &mut ads).await; + + let (ns, ads) = service.on_request( + vec![authority_ids[0].clone(), authority_ids[2].clone()], + sender, + ns, + ads, + ).await; + + let _ = receiver.next().await.unwrap(); + // revoke the first request + drop(receiver); + + let (sender, mut receiver) = mpsc::channel(1); + + let (ns, ads) = service.on_request( + vec![authority_ids[0].clone(), authority_ids[1].clone()], + sender, + ns, + ads, + ).await; + + let _ = receiver.next().await.unwrap(); + assert_eq!(service.non_revoked_discovery_requests.len(), 1); + assert_eq!(ns.peers_set.len(), 2); + + // revoke the second request + drop(receiver); + + let (sender, mut receiver) = mpsc::channel(1); + + let (ns, _) = service.on_request( + vec![authority_ids[0].clone()], + sender, + ns, + ads, + ).await; + + let _ = receiver.next().await.unwrap(); + assert_eq!(service.non_revoked_discovery_requests.len(), 1); + assert_eq!(ns.peers_set.len(), 1); + }); + } + + /// A test for when a validator connects, but the authority discovery not yet knows that the connecting node + /// is a validator. This can happen for example at startup of a node. + #[test] + fn handle_validator_connect_without_authority_discovery_knowing_it() { + let mut service = new_service(); + + let ns = TestNetwork::default(); + let mut ads = TestAuthorityDiscovery::default(); + + let validator_peer_id = PeerId::random(); + let validator_id: AuthorityDiscoveryId = Sr25519Keyring::Alice.public().into(); + + futures::executor::block_on(async move { + let (sender, mut receiver) = mpsc::channel(1); + + service.on_peer_connected(&validator_peer_id, &mut ads).await; + + let address = known_multiaddr()[0].clone().with(Protocol::P2p(validator_peer_id.clone().into())); + ads.by_peer_id.insert(validator_peer_id.clone(), validator_id.clone()); + ads.by_authority_id.insert(validator_id.clone(), address); + + let _ = service.on_request( + vec![validator_id.clone()], + sender, + ns, + ads, + ).await; + + assert_eq!((validator_id.clone(), validator_peer_id.clone()), receiver.next().await.unwrap()); + assert!(service.connected_peers.get(&validator_peer_id).unwrap().contains(&validator_id)); + }); + } +} diff --git a/node/network/collator-protocol/Cargo.toml b/node/network/collator-protocol/Cargo.toml index 8469bc5b9450ff37a9bac77f33a4775de0d2266a..618d77cba74fc03514d31a922e752ee00c849bcd 100644 --- a/node/network/collator-protocol/Cargo.toml +++ b/node/network/collator-protocol/Cargo.toml @@ -5,23 +5,21 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.5" -log = "0.4.11" -derive_more = "0.99.9" +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" +thiserror = "1.0.23" -codec = { package="parity-scale-codec", version = "1.3.4", features = ["std"] } polkadot-primitives = { path = "../../../primitives" } -polkadot-network-bridge = { path = "../../network/bridge" } polkadot-node-network-protocol = { path = "../../network/protocol" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } [dev-dependencies] -env_logger = "0.7.1" -assert_matches = "1.3.0" -smol-timeout = "0.1.0" -smallvec = "1.4.2" +log = "0.4.11" +env_logger = "0.8.2" +assert_matches = "1.4.0" futures-timer = "3.0.2" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["std"] } diff --git a/node/network/collator-protocol/src/collator_side.rs b/node/network/collator-protocol/src/collator_side.rs index 297ccce7e389b1429ada2b51195a4e952f8ec618..ef061062ae1d6cde594cdb0dccfd0cc68221b9db 100644 --- a/node/network/collator-protocol/src/collator_side.rs +++ b/node/network/collator-protocol/src/collator_side.rs @@ -14,30 +14,161 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; + +use super::{LOG_TARGET, Result}; + +use futures::{select, FutureExt}; -use futures::channel::oneshot; -use log::{trace, warn}; use polkadot_primitives::v1::{ - CollatorId, CoreIndex, CoreState, Hash, Id as ParaId, CandidateReceipt, - PoV, ValidatorId, + CollatorId, CoreIndex, CoreState, Hash, Id as ParaId, CandidateReceipt, PoV, ValidatorId, }; -use super::{TARGET, Result}; use polkadot_subsystem::{ + jaeger, PerLeafSpan, FromOverseer, OverseerSignal, SubsystemContext, - messages::{ - AllMessages, CollatorProtocolMessage, RuntimeApiMessage, RuntimeApiRequest, - NetworkBridgeMessage, - }, -}; -use polkadot_node_network_protocol::{ - v1 as protocol_v1, View, PeerId, PeerSet, NetworkBridgeEvent, RequestId, + messages::{AllMessages, CollatorProtocolMessage, NetworkBridgeMessage}, }; +use polkadot_node_network_protocol::{v1 as protocol_v1, View, PeerId, NetworkBridgeEvent, RequestId, OurView}; use polkadot_node_subsystem_util::{ + validator_discovery, request_validators_ctx, request_validator_groups_ctx, + request_availability_cores_ctx, + metrics::{self, prometheus}, }; +#[derive(Clone, Default)] +pub struct Metrics(Option); + +impl Metrics { + fn on_advertisment_made(&self) { + if let Some(metrics) = &self.0 { + metrics.advertisements_made.inc(); + } + } + + fn on_collation_sent(&self) { + if let Some(metrics) = &self.0 { + metrics.collations_sent.inc(); + } + } + + /// Provide a timer for handling `ConnectionRequest` which observes on drop. + fn time_handle_connection_request(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.handle_connection_request.start_timer()) + } + + /// Provide a timer for `process_msg` which observes on drop. + fn time_process_msg(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.process_msg.start_timer()) + } +} + +#[derive(Clone)] +struct MetricsInner { + advertisements_made: prometheus::Counter, + collations_sent: prometheus::Counter, + handle_connection_request: prometheus::Histogram, + process_msg: prometheus::Histogram, +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) + -> std::result::Result + { + let metrics = MetricsInner { + advertisements_made: prometheus::register( + prometheus::Counter::new( + "parachain_collation_advertisements_made_total", + "A number of collation advertisements sent to validators.", + )?, + registry, + )?, + collations_sent: prometheus::register( + prometheus::Counter::new( + "parachain_collations_sent_total", + "A number of collations sent to validators.", + )?, + registry, + )?, + handle_connection_request: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_collator_protocol_collator_handle_connection_request", + "Time spent within `collator_protocol_collator::handle_connection_request`", + ) + )?, + registry, + )?, + process_msg: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_collator_protocol_collator_process_msg", + "Time spent within `collator_protocol_collator::process_msg`", + ) + )?, + registry, + )?, + }; + + Ok(Metrics(Some(metrics))) + } +} + +/// The group of validators that is assigned to our para at a given point of time. +/// +/// This structure is responsible for keeping track of which validators belong to a certain group for a para. It also +/// stores a mapping from [`PeerId`] to [`ValidatorId`] as we learn about it over the lifetime of this object. Besides +/// that it also keeps track to which validators we advertised our collation. +struct ValidatorGroup { + /// All [`ValidatorId`]'s that are assigned to us in this group. + validator_ids: HashSet, + /// The mapping from [`PeerId`] to [`ValidatorId`]. This is filled over time as we learn the [`PeerId`]'s from the + /// authority discovery. It is not ensured that this will contain *all* validators of this group. + peer_ids: HashMap, + /// All [`ValidatorId`]'s of the current group to that we advertised our collation. + advertised_to: HashSet, +} + +impl ValidatorGroup { + /// Returns `true` if we should advertise our collation to the given peer. + fn should_advertise_to(&self, peer: &PeerId) -> bool { + match self.peer_ids.get(peer) { + Some(validator_id) => !self.advertised_to.contains(validator_id), + None => false, + } + } + + /// Should be called after we advertised our collation to the given `peer` to keep track of it. + fn advertised_to_peer(&mut self, peer: &PeerId) { + if let Some(validator_id) = self.peer_ids.get(peer) { + self.advertised_to.insert(validator_id.clone()); + } + } + + /// Add a [`PeerId`] that belongs to the given [`ValidatorId`]. + /// + /// This returns `true` if the given validator belongs to this group and we could insert its [`PeerId`]. + fn add_peer_id_for_validator(&mut self, peer_id: &PeerId, validator_id: &ValidatorId) -> bool { + if !self.validator_ids.contains(validator_id) { + false + } else { + self.peer_ids.insert(peer_id.clone(), validator_id.clone()); + true + } + } +} + +impl From> for ValidatorGroup { + fn from(validator_ids: HashSet) -> Self { + Self { + validator_ids, + peer_ids: HashMap::new(), + advertised_to: HashSet::new(), + } + } +} + #[derive(Default)] struct State { /// Our id. @@ -52,51 +183,60 @@ struct State { peer_views: HashMap, /// Our own view. - view: View, + view: OurView, + + /// Span per relay parent. + span_per_relay_parent: HashMap, /// Possessed collations. /// /// We will keep up to one local collation per relay-parent. collations: HashMap, - /// Our validator groups active leafs. - our_validators_groups: HashMap>, + /// Our validator groups per active leaf. + our_validators_groups: HashMap, - /// Validators we know about via `ConnectToValidators` message. - /// - /// These are the only validators we are interested in talking to and as such - /// all actions from peers not in this map will be ignored. - /// Entries in this map will be cleared as validator groups in `our_validator_groups` - /// go out of scope with their respective deactivated leafs. - known_validators: HashMap, + /// List of peers where we declared ourself as a collator. + declared_at: HashSet, + + /// The connection requests to validators per relay parent. + connection_requests: validator_discovery::ConnectionRequests, + + /// Metrics. + metrics: Metrics, +} + +impl State { + /// Returns `true` if the given `peer` is interested in the leaf that is represented by `relay_parent`. + fn peer_interested_in_leaf(&self, peer: &PeerId, relay_parent: &Hash) -> bool { + self.peer_views.get(peer).map(|v| v.contains(relay_parent)).unwrap_or(false) + } } /// Distribute a collation. -/// +/// /// Figure out the core our para is assigned to and the relevant validators. /// Issue a connection request to these validators. /// If the para is not scheduled or next up on any core, at the relay-parent, /// or the relay-parent isn't in the active-leaves set, we ignore the message /// as it must be invalid in that case - although this indicates a logic error /// elsewhere in the node. -async fn distribute_collation( - ctx: &mut Context, +#[tracing::instrument(level = "trace", skip(ctx, state, pov), fields(subsystem = LOG_TARGET))] +async fn distribute_collation( + ctx: &mut impl SubsystemContext, state: &mut State, id: ParaId, receipt: CandidateReceipt, pov: PoV, -) -> Result<()> -where - Context: SubsystemContext -{ +) -> Result<()> { let relay_parent = receipt.descriptor.relay_parent; // This collation is not in the active-leaves set. if !state.view.contains(&relay_parent) { - warn!( - target: TARGET, - "Distribute collation message parent {:?} is outside of our view", - relay_parent, + tracing::warn!( + target: LOG_TARGET, + relay_parent = %relay_parent, + "distribute collation message parent is outside of our view", ); return Ok(()); @@ -110,33 +250,36 @@ where // Determine which core 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, id, relay_parent).await? { - Some(core) => core, - None => { - warn!( - target: TARGET, - "Looks like no core is assigned to {:?} at {:?}", id, relay_parent, + Some(core) => core, + None => { + tracing::warn!( + target: LOG_TARGET, + para_id = %id, + relay_parent = %relay_parent, + "looks like no core is assigned to {} at {}", id, relay_parent, ); - return Ok(()); + + return Ok(()) } }; // Determine the group on that core and the next group on that core. - let our_validators = match determine_our_validators(ctx, our_core, num_cores, relay_parent).await? { - Some(validators) => validators, - None => { - warn!( - target: TARGET, - "There are no validators assigned to {:?} core", our_core, - ); + let (current_validators, next_validators) = determine_our_validators(ctx, our_core, num_cores, relay_parent).await?; - return Ok(()); - } - }; + if current_validators.is_empty() && next_validators.is_empty() { + tracing::warn!( + target: LOG_TARGET, + core = ?our_core, + "there are no validators assigned to core", + ); - state.our_validators_groups.insert(relay_parent, our_validators.clone()); + return Ok(()); + } // Issue a discovery request for the validators of the current group and the next group. - connect_to_validators(ctx, state, our_validators).await?; + connect_to_validators(ctx, relay_parent, state, current_validators.union(&next_validators).cloned().collect()).await?; + + state.our_validators_groups.insert(relay_parent, current_validators.into()); state.collations.insert(relay_parent, (receipt, pov)); @@ -145,24 +288,13 @@ where /// Get the Id of the Core that is assigned to the para being collated on if any /// and the total number of cores. -async fn determine_core( - ctx: &mut Context, +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] +async fn determine_core( + ctx: &mut impl SubsystemContext, para_id: ParaId, relay_parent: Hash, -) -> Result> -where - Context: SubsystemContext -{ - let (tx, rx) = oneshot::channel(); - - ctx.send_message(AllMessages::RuntimeApi( - RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::AvailabilityCores(tx), - ) - )).await?; - - let cores = rx.await??; +) -> Result> { + let cores = request_availability_cores_ctx(relay_parent, ctx).await?.await??; for (idx, core) in cores.iter().enumerate() { if let CoreState::Scheduled(occupied) = core { @@ -175,175 +307,169 @@ where Ok(None) } -/// Figure out a group of validators assigned to the para being collated on. -/// -/// This returns validators for the current group and the next group. -async fn determine_our_validators( - ctx: &mut Context, +/// Figure out current and next group of validators assigned to the para being collated on. +/// +/// Returns [`ValidatorId`]'s of current and next group as determined based on the `relay_parent`. +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] +async fn determine_our_validators( + ctx: &mut impl SubsystemContext, core_index: CoreIndex, cores: usize, relay_parent: Hash, -) -> Result>> -where - Context: SubsystemContext -{ +) -> Result<(HashSet, HashSet)> { let groups = request_validator_groups_ctx(relay_parent, ctx).await?; let groups = groups.await??; let current_group_index = groups.1.group_for_core(core_index, cores); - - let mut connect_to_validators = match groups.0.get(current_group_index.0 as usize) { - Some(group) => group.clone(), - None => return Ok(None), - }; + let current_validators = groups.0.get(current_group_index.0 as usize).map(|v| v.as_slice()).unwrap_or_default(); let next_group_idx = (current_group_index.0 as usize + 1) % groups.0.len(); + let next_validators = groups.0.get(next_group_idx).map(|v| v.as_slice()).unwrap_or_default(); - if let Some(next_group) = groups.0.get(next_group_idx) { - connect_to_validators.extend_from_slice(&next_group); - } - - let validators = request_validators_ctx(relay_parent, ctx).await?; + let validators = request_validators_ctx(relay_parent, ctx).await?.await??; - let validators = validators.await??; + let current_validators = current_validators.iter().map(|i| validators[*i as usize].clone()).collect(); + let next_validators = next_validators.iter().map(|i| validators[*i as usize].clone()).collect(); - let validators = connect_to_validators - .into_iter() - .map(|idx| validators[idx as usize].clone()) - .collect(); - - Ok(Some(validators)) + Ok((current_validators, next_validators)) } -/// Issue a `Declare` collation message to a set of peers. -async fn declare( - ctx: &mut Context, +/// Issue a `Declare` collation message to the given `peer`. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] +async fn declare( + ctx: &mut impl SubsystemContext, state: &mut State, - to: Vec, -) -> Result<()> -where - Context: SubsystemContext -{ + peer: PeerId, +) { let wire_message = protocol_v1::CollatorProtocolMessage::Declare(state.our_id.clone()); ctx.send_message(AllMessages::NetworkBridge( NetworkBridgeMessage::SendCollationMessage( - to, + vec![peer], protocol_v1::CollationProtocol::CollatorProtocol(wire_message), ) - )).await?; - - Ok(()) + )).await; } -/// Issue a connection request to a set of validators. -async fn connect_to_validators( - ctx: &mut Context, +/// Issue a connection request to a set of validators and +/// revoke the previous connection request. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] +async fn connect_to_validators( + ctx: &mut impl SubsystemContext, + relay_parent: Hash, state: &mut State, validators: Vec, -) -> Result<()> -where - Context: SubsystemContext -{ - let (tx, rx) = oneshot::channel(); - - ctx.send_message(AllMessages::NetworkBridge( - NetworkBridgeMessage::ConnectToValidators(PeerSet::Collation, validators, tx), - )).await?; - - let mut validators_ids = rx.await?; +) -> Result<()> { + let request = validator_discovery::connect_to_validators( + ctx, + relay_parent, + validators, + ).await?; - for id in validators_ids.drain(..) { - state.known_validators.insert(id.1, id.0); - } + state.connection_requests.put(relay_parent, request); Ok(()) } -/// Advertise collation to a set of relay chain validators. -async fn advertise_collation( - ctx: &mut Context, +/// Advertise collation to the given `peer`. +/// +/// This will only advertise a collation if there exists one for the given `relay_parent` and the given `peer` is +/// set as validator for our para at the given `relay_parent`. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] +async fn advertise_collation( + ctx: &mut impl SubsystemContext, state: &mut State, relay_parent: Hash, - to: Vec, -) -> Result<()> -where - Context: SubsystemContext -{ + peer: PeerId, +) { let collating_on = match state.collating_on { - Some(collating_on) => collating_on, - None => { - return Ok(()); - } + Some(collating_on) => collating_on, + None => return, }; + let should_advertise = state.our_validators_groups + .get(&relay_parent) + .map(|g| g.should_advertise_to(&peer)) + .unwrap_or(false); + + if !state.collations.contains_key(&relay_parent) || !should_advertise { + return; + } + let wire_message = protocol_v1::CollatorProtocolMessage::AdvertiseCollation(relay_parent, collating_on); ctx.send_message(AllMessages::NetworkBridge( NetworkBridgeMessage::SendCollationMessage( - to, + vec![peer.clone()], protocol_v1::CollationProtocol::CollatorProtocol(wire_message), ) - )).await?; + )).await; - Ok(()) + if let Some(validators) = state.our_validators_groups.get_mut(&relay_parent) { + validators.advertised_to_peer(&peer); + } + + state.metrics.on_advertisment_made(); } /// The main incoming message dispatching switch. -async fn process_msg( - ctx: &mut Context, +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] +async fn process_msg( + ctx: &mut impl SubsystemContext, state: &mut State, msg: CollatorProtocolMessage, -) -> Result<()> -where - Context: SubsystemContext -{ +) -> Result<()> { use CollatorProtocolMessage::*; + let _timer = state.metrics.time_process_msg(); + match msg { CollateOn(id) => { state.collating_on = Some(id); } DistributeCollation(receipt, pov) => { + let _span1 = state.span_per_relay_parent + .get(&receipt.descriptor.relay_parent).map(|s| s.child("distributing-collation")); + let _span2 = jaeger::pov_span(&pov, "distributing-collation"); match state.collating_on { Some(id) if 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. - warn!( - target: TARGET, - "DistributeCollation message for para {:?} while collating on {:?}", - receipt.descriptor.para_id, - id, + tracing::warn!( + target: LOG_TARGET, + para_id = %receipt.descriptor.para_id, + collating_on = %id, + "DistributeCollation for unexpected para_id", ); } Some(id) => { distribute_collation(ctx, state, id, receipt, pov).await?; } None => { - warn!( - target: TARGET, - "DistributeCollation message for para {:?} while not collating on any", - receipt.descriptor.para_id, + tracing::warn!( + target: LOG_TARGET, + para_id = %receipt.descriptor.para_id, + "DistributeCollation message while not collating on any", ); } } } FetchCollation(_, _, _, _) => { - warn!( - target: TARGET, + tracing::warn!( + target: LOG_TARGET, "FetchCollation message is not expected on the collator side of the protocol", ); } ReportCollator(_) => { - warn!( - target: TARGET, + tracing::warn!( + target: LOG_TARGET, "ReportCollator message is not expected on the collator side of the protocol", ); } NoteGoodCollation(_) => { - warn!( - target: TARGET, + tracing::warn!( + target: LOG_TARGET, "NoteGoodCollation message is not expected on the collator side of the protocol", ); } @@ -353,9 +479,10 @@ where state, event, ).await { - warn!( - target: TARGET, - "Failed to handle incoming network message: {:?}", e, + tracing::warn!( + target: LOG_TARGET, + err = ?e, + "Failed to handle incoming network message", ); } }, @@ -365,16 +492,15 @@ where } /// Issue a response to a previously requested collation. -async fn send_collation( - ctx: &mut Context, +#[tracing::instrument(level = "trace", skip(ctx, state, pov), fields(subsystem = LOG_TARGET))] +async fn send_collation( + ctx: &mut impl SubsystemContext, + state: &mut State, request_id: RequestId, origin: PeerId, receipt: CandidateReceipt, pov: PoV, -) -> Result<()> -where - Context: SubsystemContext -{ +) { let wire_message = protocol_v1::CollatorProtocolMessage::Collation( request_id, receipt, @@ -386,63 +512,64 @@ where vec![origin], protocol_v1::CollationProtocol::CollatorProtocol(wire_message), ) - )).await?; + )).await; - Ok(()) + state.metrics.on_collation_sent(); } /// A networking messages switch. -async fn handle_incoming_peer_message( - ctx: &mut Context, +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] +async fn handle_incoming_peer_message( + ctx: &mut impl SubsystemContext, state: &mut State, origin: PeerId, msg: protocol_v1::CollatorProtocolMessage, -) -> Result<()> -where - Context: SubsystemContext -{ +) -> Result<()> { use protocol_v1::CollatorProtocolMessage::*; match msg { - Declare(_) => { - warn!( - target: TARGET, + Declare(_) => { + tracing::warn!( + target: LOG_TARGET, "Declare message is not expected on the collator side of the protocol", ); } - AdvertiseCollation(_, _) => { - warn!( - target: TARGET, + AdvertiseCollation(_, _) => { + tracing::warn!( + target: LOG_TARGET, "AdvertiseCollation message is not expected on the collator side of the protocol", ); } - RequestCollation(request_id, relay_parent, para_id) => { + RequestCollation(request_id, relay_parent, para_id) => { + let _span = state.span_per_relay_parent.get(&relay_parent).map(|s| s.child("request-collation")); match state.collating_on { Some(our_para_id) => { if our_para_id == para_id { if let Some(collation) = state.collations.get(&relay_parent).cloned() { - send_collation(ctx, request_id, origin, collation.0, collation.1).await?; + let _span = _span.as_ref().map(|s| s.child("sending")); + send_collation(ctx, state, request_id, origin, collation.0, collation.1).await; } } else { - warn!( - target: TARGET, - "Received a RequestCollation for {:?} while collating on {:?}", - para_id, our_para_id, + tracing::warn!( + target: LOG_TARGET, + for_para_id = %para_id, + our_para_id = %our_para_id, + "received a RequestCollation for unexpected para_id", ); } } None => { - warn!( - target: TARGET, - "Received a RequestCollation for {:?} while not collating on any para", - para_id, + tracing::warn!( + target: LOG_TARGET, + for_para_id = %para_id, + "received a RequestCollation while not collating on any para", ); } } } - Collation(_, _, _) => { - warn!( - target: TARGET, + Collation(_, _, _) => { + tracing::warn!( + target: LOG_TARGET, "Collation message is not expected on the collator side of the protocol", ); } @@ -452,15 +579,13 @@ where } /// Our view has changed. -async fn handle_peer_view_change( - ctx: &mut Context, +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] +async fn handle_peer_view_change( + ctx: &mut impl SubsystemContext, state: &mut State, peer_id: PeerId, view: View, -) -> Result<()> -where - Context: SubsystemContext -{ +) { let current = state.peer_views.entry(peer_id.clone()).or_default(); let added: Vec = view.difference(&*current).cloned().collect(); @@ -468,64 +593,66 @@ where *current = view; for added in added.into_iter() { - if state.collations.contains_key(&added) { - advertise_collation(ctx, state, added.clone(), vec![peer_id.clone()]).await?; - } + advertise_collation(ctx, state, added, peer_id.clone()).await; } - - Ok(()) } -/// A peer is connected. +/// A validator is connected. /// -/// We first want to check if this is a validator we are expecting to talk to -/// and if so `Declare` that we are a collator with a given `CollatorId`. -async fn handle_peer_connected( - ctx: &mut Context, +/// `Declare` that we are a collator with a given `CollatorId`. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] +async fn handle_validator_connected( + ctx: &mut impl SubsystemContext, state: &mut State, peer_id: PeerId, -) -> Result<()> -where - Context: SubsystemContext -{ - if !state.known_validators.contains_key(&peer_id) { - trace!(target: TARGET, "An unknown peer has connected {:?}", peer_id); + validator_id: ValidatorId, + relay_parent: Hash, +) { + let not_declared = state.declared_at.insert(peer_id.clone()); - return Ok(()) + if not_declared { + declare(ctx, state, peer_id.clone()).await; } - state.peer_views.entry(peer_id.clone()).or_default(); - - declare(ctx, state, vec![peer_id]).await?; + // Store the PeerId and find out if we should advertise to this peer. + // + // If this peer does not belong to the para validators, we also don't need to try to advertise our collation. + let advertise = if let Some(validators) = state.our_validators_groups.get_mut(&relay_parent) { + validators.add_peer_id_for_validator(&peer_id, &validator_id) + } else { + false + }; - Ok(()) + if advertise && state.peer_interested_in_leaf(&peer_id, &relay_parent) { + advertise_collation(ctx, state, relay_parent, peer_id).await; + } } /// Bridge messages switch. -async fn handle_network_msg( - ctx: &mut Context, +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] +async fn handle_network_msg( + ctx: &mut impl SubsystemContext, state: &mut State, bridge_message: NetworkBridgeEvent, -) -> Result<()> -where - Context: SubsystemContext -{ +) -> Result<()> { use NetworkBridgeEvent::*; match bridge_message { - PeerConnected(peer_id, _observed_role) => { - handle_peer_connected(ctx, state, peer_id).await?; + PeerConnected(_peer_id, _observed_role) => { + // If it is possible that a disconnected validator would attempt a reconnect + // it should be handled here. } PeerViewChange(peer_id, view) => { - handle_peer_view_change(ctx, state, peer_id, view).await?; + handle_peer_view_change(ctx, state, peer_id, view).await; } PeerDisconnected(peer_id) => { state.peer_views.remove(&peer_id); + state.declared_at.remove(&peer_id); } OurViewChange(view) => { handle_our_view_change(state, view).await?; } - PeerMessage(remote, msg) => { + PeerMessage(remote, msg) => { handle_incoming_peer_message(ctx, state, remote, msg).await?; } } @@ -534,71 +661,87 @@ where } /// Handles our view changes. +#[tracing::instrument(level = "trace", skip(state), fields(subsystem = LOG_TARGET))] async fn handle_our_view_change( state: &mut State, - view: View, + view: OurView, ) -> Result<()> { - let old_view = std::mem::replace(&mut (state.view), view); - - let view = state.view.clone(); - - let removed = old_view.difference(&view).collect::>(); - - for removed in removed.into_iter() { - state.collations.remove(&removed); - if let Some(group) = state.our_validators_groups.remove(&removed) { - state.known_validators.retain(|_, v| !group.contains(v)); - } + for removed in state.view.difference(&view) { + state.collations.remove(removed); + state.our_validators_groups.remove(removed); + state.connection_requests.remove(removed); + state.span_per_relay_parent.remove(removed); } + state.view = view; + Ok(()) } /// The collator protocol collator side main loop. -pub(crate) async fn run(mut ctx: Context, our_id: CollatorId) -> Result<()> -where - Context: SubsystemContext -{ +#[tracing::instrument(skip(ctx, metrics), fields(subsystem = LOG_TARGET))] +pub(crate) async fn run( + mut ctx: impl SubsystemContext, + our_id: CollatorId, + metrics: Metrics, +) -> Result<()> { use FromOverseer::*; use OverseerSignal::*; - let mut state = State::default(); - - state.our_id = our_id; + let mut state = State { + metrics, + our_id, + ..Default::default() + }; loop { - match ctx.recv().await? { - Communication { msg } => process_msg(&mut ctx, &mut state, msg).await?, - Signal(ActiveLeaves(_update)) => {} - Signal(BlockFinalized(_)) => {} - Signal(Conclude) => break, + select! { + res = state.connection_requests.next().fuse() => { + let _timer = state.metrics.time_handle_connection_request(); + + handle_validator_connected( + &mut ctx, + &mut state, + res.peer_id, + res.validator_id, + res.relay_parent, + ).await; + }, + msg = ctx.recv().fuse() => match msg? { + Communication { msg } => { + if let Err(e) = process_msg(&mut ctx, &mut state, msg).await { + tracing::warn!(target: LOG_TARGET, err = ?e, "Failed to process message"); + } + }, + Signal(ActiveLeaves(_update)) => {} + Signal(BlockFinalized(..)) => {} + Signal(Conclude) => return Ok(()), + } } } - - Ok(()) } #[cfg(test)] mod tests { use super::*; - use log::trace; - use std::time::Duration; - use futures::{executor, future, Future}; + use std::{time::Duration, sync::Arc}; + use assert_matches::assert_matches; - use smallvec::smallvec; + use futures::{executor, future, Future, channel::mpsc}; use sp_core::crypto::Pair; use sp_keyring::Sr25519Keyring; use polkadot_primitives::v1::{ BlockData, CandidateDescriptor, CollatorPair, ScheduledCore, - ValidatorIndex, GroupRotationInfo, + ValidatorIndex, GroupRotationInfo, AuthorityDiscoveryId, + SessionIndex, SessionInfo, }; - use polkadot_subsystem::ActiveLeavesUpdate; + use polkadot_subsystem::{ActiveLeavesUpdate, messages::{RuntimeApiMessage, RuntimeApiRequest}, JaegerSpan}; use polkadot_node_subsystem_util::TimeoutExt; - use polkadot_subsystem_testhelpers::{self as test_helpers}; - use polkadot_node_network_protocol::ObservedRole; + use polkadot_subsystem_testhelpers as test_helpers; + use polkadot_node_network_protocol::{view, our_view}; #[derive(Default)] struct TestCandidateBuilder { @@ -624,26 +767,29 @@ mod tests { #[derive(Clone)] struct TestState { - chain_ids: Vec, + para_id: ParaId, validators: Vec, validator_public: Vec, + validator_authority_id: Vec, validator_peer_id: Vec, validator_groups: (Vec>, GroupRotationInfo), relay_parent: Hash, - availability_cores: Vec, + availability_core: CoreState, our_collator_pair: CollatorPair, + session_index: SessionIndex, } fn validator_pubkeys(val_ids: &[Sr25519Keyring]) -> Vec { val_ids.iter().map(|v| v.public().into()).collect() } + fn validator_authority_id(val_ids: &[Sr25519Keyring]) -> Vec { + val_ids.iter().map(|v| v.public().into()).collect() + } + impl Default for TestState { fn default() -> Self { - let chain_a = ParaId::from(1); - let chain_b = ParaId::from(2); - - let chain_ids = vec![chain_a, chain_b]; + let para_id = ParaId::from(1); let validators = vec![ Sr25519Keyring::Alice, @@ -654,12 +800,13 @@ mod tests { ]; let validator_public = validator_pubkeys(&validators); + let validator_authority_id = validator_authority_id(&validators); let validator_peer_id = std::iter::repeat_with(|| PeerId::random()) .take(validator_public.len()) .collect(); - let validator_groups = vec![vec![2, 0, 4], vec![1], vec![3]]; + let validator_groups = vec![vec![2, 0, 4], vec![3, 2, 4]]; let group_rotation_info = GroupRotationInfo { session_start_block: 0, group_rotation_frequency: 100, @@ -667,36 +814,96 @@ mod tests { }; let validator_groups = (validator_groups, group_rotation_info); - let availability_cores = vec![ - CoreState::Scheduled(ScheduledCore { - para_id: chain_ids[0], - collator: None, - }), - CoreState::Scheduled(ScheduledCore { - para_id: chain_ids[1], - collator: None, - }), - ]; + let availability_core = CoreState::Scheduled(ScheduledCore { + para_id, + collator: None, + }); - let relay_parent = Hash::repeat_byte(0x05); + let relay_parent = Hash::random(); let our_collator_pair = CollatorPair::generate().0; Self { - chain_ids, + para_id, validators, validator_public, + validator_authority_id, validator_peer_id, validator_groups, relay_parent, - availability_cores, + availability_core, our_collator_pair, + session_index: 1, + } + } + } + + impl TestState { + fn current_group_validator_indices(&self) -> &[ValidatorIndex] { + &self.validator_groups.0[0] + } + + fn current_session_index(&self) -> SessionIndex { + self.session_index + } + + fn current_group_validator_peer_ids(&self) -> Vec { + self.current_group_validator_indices().iter().map(|i| self.validator_peer_id[*i as usize].clone()).collect() + } + + fn current_group_validator_authority_ids(&self) -> Vec { + self.current_group_validator_indices() + .iter() + .map(|i| self.validator_authority_id[*i as usize].clone()) + .collect() + } + + fn current_group_validator_ids(&self) -> Vec { + self.current_group_validator_indices() + .iter() + .map(|i| self.validator_public[*i as usize].clone()) + .collect() + } + + fn next_group_validator_indices(&self) -> &[ValidatorIndex] { + &self.validator_groups.0[1] + } + + fn next_group_validator_authority_ids(&self) -> Vec { + self.next_group_validator_indices() + .iter() + .map(|i| self.validator_authority_id[*i as usize].clone()) + .collect() + } + + /// Generate a new relay parent and inform the subsystem about the new view. + /// + /// If `merge_views == true` it means the subsystem will be informed that we working on the old `relay_parent` + /// and the new one. + async fn advance_to_new_round(&mut self, virtual_overseer: &mut VirtualOverseer, merge_views: bool) { + let old_relay_parent = self.relay_parent; + + while self.relay_parent == old_relay_parent { + self.relay_parent.randomize(); } + + let our_view = if merge_views { + our_view![old_relay_parent, self.relay_parent] + } else { + our_view![self.relay_parent] + }; + + overseer_send( + virtual_overseer, + CollatorProtocolMessage::NetworkBridgeUpdateV1(NetworkBridgeEvent::OurViewChange(our_view)), + ).await; } } + type VirtualOverseer = test_helpers::TestSubsystemContextHandle; + struct TestHarness { - virtual_overseer: test_helpers::TestSubsystemContextHandle, + virtual_overseer: VirtualOverseer, } fn test_harness>( @@ -710,7 +917,7 @@ mod tests { log::LevelFilter::Trace, ) .filter( - Some(TARGET), + Some(LOG_TARGET), log::LevelFilter::Trace, ) .try_init(); @@ -719,7 +926,7 @@ mod tests { let (context, virtual_overseer) = test_helpers::make_subsystem_context(pool.clone()); - let subsystem = run(context, collator_id); + let subsystem = run(context, collator_id, Metrics::default()); let test_fut = test(TestHarness { virtual_overseer }); @@ -735,7 +942,7 @@ mod tests { overseer: &mut test_helpers::TestSubsystemContextHandle, msg: CollatorProtocolMessage, ) { - trace!("Sending message:\n{:?}", &msg); + tracing::trace!(msg = ?msg, "sending message"); overseer .send(FromOverseer::Communication { msg }) .timeout(TIMEOUT) @@ -750,7 +957,7 @@ mod tests { .await .expect(&format!("{:?} is more than enough to receive messages", TIMEOUT)); - trace!("Received message:\n{:?}", &msg); + tracing::trace!(msg = ?msg, "received message"); msg } @@ -759,7 +966,7 @@ mod tests { overseer: &mut test_helpers::TestSubsystemContextHandle, timeout: Duration, ) -> Option { - trace!("Waiting for message..."); + tracing::trace!("waiting for message..."); overseer .recv() .timeout(timeout) @@ -777,180 +984,269 @@ mod tests { .expect(&format!("{:?} is more than enough for sending signals.", TIMEOUT)); } - #[test] - fn advertise_and_send_collation() { - let test_state = TestState::default(); - - test_harness(test_state.our_collator_pair.public(), |test_harness| async move { - let current = test_state.relay_parent; - let TestHarness { - mut virtual_overseer, - } = test_harness; + // Setup the system by sending the `CollateOn`, `ActiveLeaves` and `OurViewChange` messages. + async fn setup_system(virtual_overseer: &mut VirtualOverseer, test_state: &TestState) { + overseer_send( + virtual_overseer, + CollatorProtocolMessage::CollateOn(test_state.para_id), + ).await; + + overseer_signal( + virtual_overseer, + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: [(test_state.relay_parent, Arc::new(JaegerSpan::Disabled))][..].into(), + deactivated: [][..].into(), + }), + ).await; + + overseer_send( + virtual_overseer, + CollatorProtocolMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::OurViewChange(our_view![test_state.relay_parent]), + ), + ).await; + } - let pov_block = PoV { - block_data: BlockData(vec![42, 43, 44]), - }; + /// Result of [`distribute_collation`] + struct DistributeCollation { + /// Should be used to inform the subsystem about connected validators. + connected: mpsc::Sender<(AuthorityDiscoveryId, PeerId)>, + candidate: CandidateReceipt, + pov_block: PoV, + } - let pov_hash = pov_block.hash(); + /// Create some PoV and distribute it. + async fn distribute_collation( + virtual_overseer: &mut VirtualOverseer, + test_state: &TestState, + ) -> DistributeCollation { + // Now we want to distribute a PoVBlock + let pov_block = PoV { + block_data: BlockData(vec![42, 43, 44]), + }; + + let pov_hash = pov_block.hash(); + + let candidate = TestCandidateBuilder { + para_id: test_state.para_id, + relay_parent: test_state.relay_parent, + pov_hash, + ..Default::default() + }.build(); + + overseer_send( + virtual_overseer, + CollatorProtocolMessage::DistributeCollation(candidate.clone(), pov_block.clone()), + ).await; + + // obtain the availability cores. + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::AvailabilityCores(tx) + )) => { + assert_eq!(relay_parent, test_state.relay_parent); + tx.send(Ok(vec![test_state.availability_core.clone()])).unwrap(); + } + ); - let candidate = TestCandidateBuilder { - para_id: test_state.chain_ids[0], - relay_parent: test_state.relay_parent, - pov_hash, - ..Default::default() - }.build(); + // Obtain the validator groups + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::ValidatorGroups(tx) + )) => { + assert_eq!(relay_parent, test_state.relay_parent); + tx.send(Ok(test_state.validator_groups.clone())).unwrap(); + } + ); - overseer_send( - &mut virtual_overseer, - CollatorProtocolMessage::CollateOn(test_state.chain_ids[0]) - ).await; + // obtain the validators per relay parent + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(tx), + )) => { + assert_eq!(relay_parent, test_state.relay_parent); + tx.send(Ok(test_state.validator_public.clone())).unwrap(); + } + ); - overseer_signal( - &mut virtual_overseer, - OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { - activated: smallvec![current.clone()], - deactivated: smallvec![], - }), - ).await; + // obtain the validator_id to authority_id mapping + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + assert_eq!(relay_parent, test_state.relay_parent); + tx.send(Ok(test_state.current_session_index())).unwrap(); + } + ); - overseer_send( - &mut virtual_overseer, - CollatorProtocolMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::OurViewChange(View(vec![current])), - ), - ).await; + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionInfo(index, tx), + )) => { + assert_eq!(relay_parent, test_state.relay_parent); + assert_eq!(index, test_state.current_session_index()); - overseer_send( - &mut virtual_overseer, - CollatorProtocolMessage::DistributeCollation(candidate.clone(), pov_block.clone()), - ).await; + let validators = test_state.current_group_validator_ids(); + let current_discovery_keys = test_state.current_group_validator_authority_ids(); + let next_discovery_keys = test_state.next_group_validator_authority_ids(); - // obtain the availability cores. - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::AvailabilityCores(tx) - )) => { - assert_eq!(relay_parent, current); - tx.send(Ok(test_state.availability_cores.clone())).unwrap(); - } - ); + let discovery_keys = [¤t_discovery_keys[..], &next_discovery_keys[..]].concat(); - // Obtain the validator groups - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::ValidatorGroups(tx) - )) => { - assert_eq!(relay_parent, current); - tx.send(Ok(test_state.validator_groups.clone())).unwrap(); - } - ); + tx.send(Ok(Some(SessionInfo { + validators, + discovery_keys, + ..Default::default() + }))).unwrap(); + } + ); - // obtain the validators per relay parent - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::Validators(tx), - )) => { - assert_eq!(relay_parent, current); - tx.send(Ok(test_state.validator_public.clone())).unwrap(); + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ConnectToValidators { + connected, + .. } - ); - - // We now should connect to our validator group. - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ConnectToValidators( - peer_set, - validators, - tx, - ) - ) => { - assert_eq!(peer_set, PeerSet::Collation); - assert_eq!(validators.len(), 4); - assert!(validators.contains(&test_state.validator_public[2])); - assert!(validators.contains(&test_state.validator_public[0])); - assert!(validators.contains(&test_state.validator_public[4])); - assert!(validators.contains(&test_state.validator_public[1])); - - tx.send(vec![ - (test_state.validator_public[2].clone(), test_state.validator_peer_id[2].clone()), - (test_state.validator_public[0].clone(), test_state.validator_peer_id[0].clone()), - (test_state.validator_public[4].clone(), test_state.validator_peer_id[4].clone()), - (test_state.validator_public[1].clone(), test_state.validator_peer_id[1].clone()), - ]).unwrap(); + ) => { + DistributeCollation { + connected, + candidate, + pov_block, } - ); + } + ) + } - // Validator 2 connects. - overseer_send( - &mut virtual_overseer, - CollatorProtocolMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerConnected( - test_state.validator_peer_id[2].clone(), - ObservedRole::Authority, - ) + /// Connect a peer + async fn connect_peer(virtual_overseer: &mut VirtualOverseer, peer: PeerId) { + overseer_send( + virtual_overseer, + CollatorProtocolMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerConnected( + peer.clone(), + polkadot_node_network_protocol::ObservedRole::Authority, ), - ).await; + ), + ).await; + + overseer_send( + virtual_overseer, + CollatorProtocolMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerViewChange(peer, view![]), + ), + ).await; + } - // We declare to the connected validator that we are a collator. - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::SendCollationMessage( - to, - protocol_v1::CollationProtocol::CollatorProtocol(wire_message), - ) - ) => { - assert_eq!(to, vec![test_state.validator_peer_id[2].clone()]); - assert_matches!( - wire_message, - protocol_v1::CollatorProtocolMessage::Declare(collator_id) => { - assert_eq!(collator_id, test_state.our_collator_pair.public()); - } - ); - } - ); + /// Disconnect a peer + async fn disconnect_peer(virtual_overseer: &mut VirtualOverseer, peer: PeerId) { + overseer_send( + virtual_overseer, + CollatorProtocolMessage::NetworkBridgeUpdateV1(NetworkBridgeEvent::PeerDisconnected(peer)), + ).await; + } - // Send info about peer's view. - overseer_send( - &mut virtual_overseer, - CollatorProtocolMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::PeerViewChange( - test_state.validator_peer_id[2].clone(), - View(vec![current]), - ) + /// Check that the next received message is a `Declare` message. + async fn expect_declare_msg(virtual_overseer: &mut VirtualOverseer, test_state: &TestState, peer: &PeerId) { + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendCollationMessage( + to, + protocol_v1::CollationProtocol::CollatorProtocol(wire_message), ) - ).await; + ) => { + assert_eq!(to[0], *peer); + assert_matches!( + wire_message, + protocol_v1::CollatorProtocolMessage::Declare(collator_id) => { + assert_eq!(collator_id, test_state.our_collator_pair.public()); + } + ); + } + ); + } + + /// Check that the next received message is a collation advertisment message. + async fn expect_advertise_collation_msg( + virtual_overseer: &mut VirtualOverseer, + test_state: &TestState, + peer: &PeerId, + expected_relay_parent: Hash, + ) { + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendCollationMessage( + to, + protocol_v1::CollationProtocol::CollatorProtocol(wire_message), + ) + ) => { + assert_eq!(to[0], *peer); + assert_matches!( + wire_message, + protocol_v1::CollatorProtocolMessage::AdvertiseCollation( + relay_parent, + collating_on, + ) => { + assert_eq!(relay_parent, expected_relay_parent); + assert_eq!(collating_on, test_state.para_id); + } + ); + } + ); + } + + /// Send a message that the given peer's view changed. + async fn send_peer_view_change(virtual_overseer: &mut VirtualOverseer, peer: &PeerId, hashes: Vec) { + overseer_send( + virtual_overseer, + CollatorProtocolMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerViewChange(peer.clone(), View { heads: hashes, finalized_number: 0 }), + ), + ).await; + } + + #[test] + fn advertise_and_send_collation() { + let mut test_state = TestState::default(); + + test_harness(test_state.our_collator_pair.public(), |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + setup_system(&mut virtual_overseer, &test_state).await; + + let DistributeCollation { mut connected, candidate, pov_block } = + distribute_collation(&mut virtual_overseer, &test_state).await; + test_state.current_group_validator_authority_ids() + .into_iter() + .zip(test_state.current_group_validator_peer_ids()) + .for_each(|r| connected.try_send(r).unwrap()); + + // We declare to the connected validators that we are a collator. + // We need to catch all `Declare` messages to the validators we've + // previosly connected to. + for peer_id in test_state.current_group_validator_peer_ids() { + expect_declare_msg(&mut virtual_overseer, &test_state, &peer_id).await; + } + + let peer = test_state.current_group_validator_peer_ids()[0].clone(); + + // Send info about peer's view. + send_peer_view_change(&mut virtual_overseer, &peer, vec![test_state.relay_parent]).await; // The peer is interested in a leaf that we have a collation for; // advertise it. - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::SendCollationMessage( - to, - protocol_v1::CollationProtocol::CollatorProtocol(wire_message), - ) - ) => { - assert_eq!(to, vec![test_state.validator_peer_id[2].clone()]); - assert_matches!( - wire_message, - protocol_v1::CollatorProtocolMessage::AdvertiseCollation( - relay_parent, - collating_on, - ) => { - assert_eq!(relay_parent, current); - assert_eq!(collating_on, test_state.chain_ids[0]); - } - ); - } - ); + expect_advertise_collation_msg(&mut virtual_overseer, &test_state, &peer, test_state.relay_parent).await; let request_id = 42; @@ -959,11 +1255,11 @@ mod tests { &mut virtual_overseer, CollatorProtocolMessage::NetworkBridgeUpdateV1( NetworkBridgeEvent::PeerMessage( - test_state.validator_peer_id[2].clone(), + peer.clone(), protocol_v1::CollatorProtocolMessage::RequestCollation( request_id, - current, - test_state.chain_ids[0], + test_state.relay_parent, + test_state.para_id, ) ) ) @@ -978,7 +1274,7 @@ mod tests { protocol_v1::CollationProtocol::CollatorProtocol(wire_message), ) ) => { - assert_eq!(to, vec![test_state.validator_peer_id[2].clone()]); + assert_eq!(to, vec![peer]); assert_matches!( wire_message, protocol_v1::CollatorProtocolMessage::Collation(req_id, receipt, pov) => { @@ -990,34 +1286,188 @@ mod tests { } ); - let new_head = Hash::repeat_byte(0xA); - - // Collator's view moves on. - overseer_send( - &mut virtual_overseer, - CollatorProtocolMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::OurViewChange(View(vec![new_head])), - ), - ).await; + let old_relay_parent = test_state.relay_parent; + test_state.advance_to_new_round(&mut virtual_overseer, false).await; - let request_id = 43; + let peer = test_state.validator_peer_id[2].clone(); // Re-request a collation. overseer_send( &mut virtual_overseer, CollatorProtocolMessage::NetworkBridgeUpdateV1( NetworkBridgeEvent::PeerMessage( - test_state.validator_peer_id[2].clone(), + peer.clone(), protocol_v1::CollatorProtocolMessage::RequestCollation( - request_id, - current, - test_state.chain_ids[0], + 43, + old_relay_parent, + test_state.para_id, ) ) ) ).await; assert!(overseer_recv_with_timeout(&mut virtual_overseer, TIMEOUT).await.is_none()); + + let DistributeCollation { mut connected, .. } = + distribute_collation(&mut virtual_overseer, &test_state).await; + test_state.current_group_validator_authority_ids() + .into_iter() + .zip(test_state.current_group_validator_peer_ids()) + .for_each(|r| connected.try_send(r).unwrap()); + + // Send info about peer's view. + overseer_send( + &mut virtual_overseer, + CollatorProtocolMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerViewChange( + peer.clone(), + view![test_state.relay_parent], + ) + ) + ).await; + + expect_advertise_collation_msg(&mut virtual_overseer, &test_state, &peer, test_state.relay_parent).await; }); } + + /// This test ensures that we declare a collator at a validator by sending the `Declare` message as soon as the + /// collator is aware of the validator being connected. + #[test] + fn collators_are_registered_correctly_at_validators() { + let test_state = TestState::default(); + + test_harness(test_state.our_collator_pair.public(), |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + let peer = test_state.validator_peer_id[0].clone(); + let validator_id = test_state.validator_authority_id[0].clone(); + + setup_system(&mut virtual_overseer, &test_state).await; + + // A validator connected to us + connect_peer(&mut virtual_overseer, peer.clone()).await; + + let mut connected = distribute_collation(&mut virtual_overseer, &test_state).await.connected; + connected.try_send((validator_id, peer.clone())).unwrap(); + + expect_declare_msg(&mut virtual_overseer, &test_state, &peer).await; + }) + } + + #[test] + fn collations_are_only_advertised_to_validators_with_correct_view() { + let test_state = TestState::default(); + + test_harness(test_state.our_collator_pair.public(), |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + let peer = test_state.current_group_validator_peer_ids()[0].clone(); + let validator_id = test_state.current_group_validator_authority_ids()[0].clone(); + + let peer2 = test_state.current_group_validator_peer_ids()[1].clone(); + let validator_id2 = test_state.current_group_validator_authority_ids()[1].clone(); + + setup_system(&mut virtual_overseer, &test_state).await; + + // A validator connected to us + connect_peer(&mut virtual_overseer, peer.clone()).await; + + // Connect the second validator + connect_peer(&mut virtual_overseer, peer2.clone()).await; + + // And let it tell us that it is has the same view. + send_peer_view_change(&mut virtual_overseer, &peer2, vec![test_state.relay_parent]).await; + + let mut connected = distribute_collation(&mut virtual_overseer, &test_state).await.connected; + connected.try_send((validator_id, peer.clone())).unwrap(); + connected.try_send((validator_id2, peer2.clone())).unwrap(); + + expect_declare_msg(&mut virtual_overseer, &test_state, &peer).await; + expect_declare_msg(&mut virtual_overseer, &test_state, &peer2).await; + + expect_advertise_collation_msg(&mut virtual_overseer, &test_state, &peer2, test_state.relay_parent).await; + + // The other validator announces that it changed its view. + send_peer_view_change(&mut virtual_overseer, &peer, vec![test_state.relay_parent]).await; + + // After changing the view we should receive the advertisement + expect_advertise_collation_msg(&mut virtual_overseer, &test_state, &peer, test_state.relay_parent).await; + }) + } + + #[test] + fn collate_on_two_different_relay_chain_blocks() { + let mut test_state = TestState::default(); + + test_harness(test_state.our_collator_pair.public(), |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + let peer = test_state.current_group_validator_peer_ids()[0].clone(); + let validator_id = test_state.current_group_validator_authority_ids()[0].clone(); + + let peer2 = test_state.current_group_validator_peer_ids()[1].clone(); + let validator_id2 = test_state.current_group_validator_authority_ids()[1].clone(); + + setup_system(&mut virtual_overseer, &test_state).await; + + // A validator connected to us + connect_peer(&mut virtual_overseer, peer.clone()).await; + + // Connect the second validator + connect_peer(&mut virtual_overseer, peer2.clone()).await; + + let mut connected = distribute_collation(&mut virtual_overseer, &test_state).await.connected; + connected.try_send((validator_id.clone(), peer.clone())).unwrap(); + connected.try_send((validator_id2.clone(), peer2.clone())).unwrap(); + + expect_declare_msg(&mut virtual_overseer, &test_state, &peer).await; + expect_declare_msg(&mut virtual_overseer, &test_state, &peer2).await; + + let old_relay_parent = test_state.relay_parent; + + // Advance to a new round, while informing the subsystem that the old and the new relay parent are active. + test_state.advance_to_new_round(&mut virtual_overseer, true).await; + + let mut connected = distribute_collation(&mut virtual_overseer, &test_state).await.connected; + connected.try_send((validator_id, peer.clone())).unwrap(); + connected.try_send((validator_id2, peer2.clone())).unwrap(); + + send_peer_view_change(&mut virtual_overseer, &peer, vec![old_relay_parent]).await; + expect_advertise_collation_msg(&mut virtual_overseer, &test_state, &peer, old_relay_parent).await; + + send_peer_view_change(&mut virtual_overseer, &peer2, vec![test_state.relay_parent]).await; + expect_advertise_collation_msg(&mut virtual_overseer, &test_state, &peer2, test_state.relay_parent).await; + }) + } + + #[test] + fn validator_reconnect_does_not_advertise_a_second_time() { + let test_state = TestState::default(); + + test_harness(test_state.our_collator_pair.public(), |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + let peer = test_state.current_group_validator_peer_ids()[0].clone(); + let validator_id = test_state.current_group_validator_authority_ids()[0].clone(); + + setup_system(&mut virtual_overseer, &test_state).await; + + // A validator connected to us + connect_peer(&mut virtual_overseer, peer.clone()).await; + + let mut connected = distribute_collation(&mut virtual_overseer, &test_state).await.connected; + connected.try_send((validator_id.clone(), peer.clone())).unwrap(); + + expect_declare_msg(&mut virtual_overseer, &test_state, &peer).await; + send_peer_view_change(&mut virtual_overseer, &peer, vec![test_state.relay_parent]).await; + expect_advertise_collation_msg(&mut virtual_overseer, &test_state, &peer, test_state.relay_parent).await; + + // Disconnect and reconnect directly + disconnect_peer(&mut virtual_overseer, peer.clone()).await; + connect_peer(&mut virtual_overseer, peer.clone()).await; + send_peer_view_change(&mut virtual_overseer, &peer, vec![test_state.relay_parent]).await; + + assert!(overseer_recv_with_timeout(&mut virtual_overseer, TIMEOUT).await.is_none()); + }) + } } diff --git a/node/network/collator-protocol/src/lib.rs b/node/network/collator-protocol/src/lib.rs index bf1c009b44f8db274dbdb0de1f26fad6e8ba7b57..ba1147fef94f55aa052da0b96694abe2131e697e 100644 --- a/node/network/collator-protocol/src/lib.rs +++ b/node/network/collator-protocol/src/lib.rs @@ -17,16 +17,16 @@ //! The Collator Protocol allows collators and validators talk to each other. //! This subsystem implements both sides of the collator protocol. -#![deny(missing_docs)] +#![deny(missing_docs, unused_crate_dependencies)] +#![recursion_limit="256"] use std::time::Duration; -use futures::{channel::oneshot, FutureExt}; -use log::trace; +use futures::{channel::oneshot, FutureExt, TryFutureExt}; +use thiserror::Error; use polkadot_subsystem::{ Subsystem, SubsystemContext, SubsystemError, SpawnedSubsystem, errors::RuntimeApiError, - metrics::{self, prometheus}, messages::{ AllMessages, CollatorProtocolMessage, NetworkBridgeMessage, }, @@ -35,72 +35,76 @@ use polkadot_node_network_protocol::{ PeerId, ReputationChange as Rep, }; use polkadot_primitives::v1::CollatorId; -use polkadot_node_subsystem_util as util; +use polkadot_node_subsystem_util::{ + self as util, + metrics::prometheus, +}; mod collator_side; mod validator_side; -const TARGET: &'static str = "colp"; +const LOG_TARGET: &'static str = "collator_protocol"; const REQUEST_TIMEOUT: Duration = Duration::from_secs(1); -#[derive(Debug, derive_more::From)] +#[derive(Debug, Error)] enum Error { - #[from] - Subsystem(SubsystemError), - #[from] - Oneshot(oneshot::Canceled), - #[from] - RuntimeApi(RuntimeApiError), - #[from] - UtilError(util::Error), + #[error(transparent)] + Subsystem(#[from] SubsystemError), + #[error(transparent)] + Oneshot(#[from] oneshot::Canceled), + #[error(transparent)] + RuntimeApi(#[from] RuntimeApiError), + #[error(transparent)] + UtilError(#[from] util::Error), + #[error(transparent)] + Prometheus(#[from] prometheus::PrometheusError), } type Result = std::result::Result; -enum ProtocolSide { - Validator, - Collator(CollatorId), +/// What side of the collator protocol is being engaged +pub enum ProtocolSide { + /// Validators operate on the relay chain. + Validator(validator_side::Metrics), + /// Collators operate on a parachain. + Collator(CollatorId, collator_side::Metrics), } /// The collator protocol subsystem. pub struct CollatorProtocolSubsystem { - protocol_side: ProtocolSide, + protocol_side: ProtocolSide, } impl CollatorProtocolSubsystem { /// Start the collator protocol. /// If `id` is `Some` this is a collator side of the protocol. - /// If `id` is `None` this is a validator side of the protocol. - pub fn new(id: Option) -> Self { - let protocol_side = match id { - Some(id) => ProtocolSide::Collator(id), - None => ProtocolSide::Validator, - }; - + /// If `id` is `None` this is a validator side of the protocol. + /// Caller must provide a registry for prometheus metrics. + pub fn new(protocol_side: ProtocolSide) -> Self { Self { protocol_side, } } + #[tracing::instrument(skip(self, ctx), fields(subsystem = LOG_TARGET))] async fn run(self, ctx: Context) -> Result<()> where Context: SubsystemContext, { match self.protocol_side { - ProtocolSide::Validator => validator_side::run(ctx, REQUEST_TIMEOUT).await, - ProtocolSide::Collator(id) => collator_side::run(ctx, id).await, - } - } -} - -/// Collator protocol metrics. -#[derive(Default, Clone)] -pub struct Metrics; - -impl metrics::Metrics for Metrics { - fn try_register(_registry: &prometheus::Registry) - -> std::result::Result { - Ok(Metrics) + ProtocolSide::Validator(metrics) => validator_side::run( + ctx, + REQUEST_TIMEOUT, + metrics, + ).await, + ProtocolSide::Collator(id, metrics) => collator_side::run( + ctx, + id, + metrics, + ).await, + }.map_err(|e| { + SubsystemError::with_origin("collator-protocol", e).into() + }) } } @@ -108,29 +112,33 @@ impl Subsystem for CollatorProtocolSubsystem where Context: SubsystemContext + Sync + Send, { - type Metrics = Metrics; - fn start(self, ctx: Context) -> SpawnedSubsystem { + let future = self + .run(ctx) + .map_err(|e| SubsystemError::with_origin("collator-protocol", e)) + .boxed(); + SpawnedSubsystem { name: "collator-protocol-subsystem", - future: Box::pin(async move { self.run(ctx) }.map(|_| ())), + future, } } } /// Modify the reputation of a peer based on its behavior. -async fn modify_reputation(ctx: &mut Context, peer: PeerId, rep: Rep) -> Result<()> +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] +async fn modify_reputation(ctx: &mut Context, peer: PeerId, rep: Rep) where Context: SubsystemContext, { - trace!( - target: TARGET, - "Reputation change of {:?} for peer {:?}", rep, peer, + tracing::trace!( + target: LOG_TARGET, + rep = ?rep, + peer_id = %peer, + "reputation change for peer", ); ctx.send_message(AllMessages::NetworkBridge( NetworkBridgeMessage::ReportPeer(peer, rep), - )).await?; - - Ok(()) + )).await; } diff --git a/node/network/collator-protocol/src/validator_side.rs b/node/network/collator-protocol/src/validator_side.rs index a41d2628b58a1169707cdec8301455d93da73c3a..561dda7d741e1e705a7e5168da9199306e1ec25d 100644 --- a/node/network/collator-protocol/src/validator_side.rs +++ b/node/network/collator-protocol/src/validator_side.rs @@ -14,40 +14,108 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use std::collections::{HashMap, HashSet}; -use std::time::Duration; -use std::task::Poll; +use std::{collections::{HashMap, HashSet}, time::Duration, task::Poll, sync::Arc}; use futures::{ StreamExt, + FutureExt, channel::oneshot, future::BoxFuture, stream::FuturesUnordered, }; -use log::{trace, warn}; use polkadot_primitives::v1::{ Id as ParaId, CandidateReceipt, CollatorId, Hash, PoV, }; use polkadot_subsystem::{ + jaeger, PerLeafSpan, JaegerSpan, FromOverseer, OverseerSignal, SubsystemContext, messages::{ AllMessages, CandidateSelectionMessage, CollatorProtocolMessage, NetworkBridgeMessage, }, }; use polkadot_node_network_protocol::{ - v1 as protocol_v1, View, PeerId, ReputationChange as Rep, RequestId, - NetworkBridgeEvent, + v1 as protocol_v1, View, OurView, PeerId, ReputationChange as Rep, RequestId, NetworkBridgeEvent, }; -use polkadot_node_subsystem_util::TimeoutExt; +use polkadot_node_subsystem_util::{TimeoutExt as _, metrics::{self, prometheus}}; -use super::{modify_reputation, TARGET, Result}; +use super::{modify_reputation, LOG_TARGET, Result}; const COST_UNEXPECTED_MESSAGE: Rep = Rep::new(-10, "An unexpected message"); const COST_REQUEST_TIMED_OUT: Rep = Rep::new(-20, "A collation request has timed out"); const COST_REPORT_BAD: Rep = Rep::new(-50, "A collator was reported by another subsystem"); const BENEFIT_NOTIFY_GOOD: Rep = Rep::new(50, "A collator was noted good by another subsystem"); +#[derive(Clone, Default)] +pub struct Metrics(Option); + +impl Metrics { + fn on_request(&self, succeeded: std::result::Result<(), ()>) { + if let Some(metrics) = &self.0 { + match succeeded { + Ok(()) => metrics.collation_requests.with_label_values(&["succeeded"]).inc(), + Err(()) => metrics.collation_requests.with_label_values(&["failed"]).inc(), + } + } + } + + /// Provide a timer for `process_msg` which observes on drop. + fn time_process_msg(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.process_msg.start_timer()) + } + + /// Provide a timer for `handle_collation_request_result` which observes on drop. + fn time_handle_collation_request_result(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.handle_collation_request_result.start_timer()) + } +} + +#[derive(Clone)] +struct MetricsInner { + collation_requests: prometheus::CounterVec, + process_msg: prometheus::Histogram, + handle_collation_request_result: prometheus::Histogram, +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) + -> std::result::Result + { + let metrics = MetricsInner { + collation_requests: prometheus::register( + prometheus::CounterVec::new( + prometheus::Opts::new( + "parachain_collation_requests_total", + "Number of collations requested from Collators.", + ), + &["success"], + )?, + registry, + )?, + process_msg: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_collator_protocol_validator_process_msg", + "Time spent within `collator_protocol_validator::process_msg`", + ) + )?, + registry, + )?, + handle_collation_request_result: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_collator_protocol_validator_handle_collation_request_result", + "Time spent within `collator_protocol_validator::handle_collation_request_result`", + ) + )?, + registry, + )?, + }; + + Ok(Metrics(Some(metrics))) + } +} + #[derive(Debug)] enum CollationRequestResult { Received(RequestId), @@ -58,7 +126,7 @@ enum CollationRequestResult { /// It may timeout or end in a graceful fashion if a requested /// collation has been received sucessfully or chain has moved on. struct CollationRequest { - // The response for this request has been received successfully or + // The response for this request has been received successfully or // chain has moved forward and this request is no longer relevant. received: oneshot::Receiver<()>, @@ -79,7 +147,6 @@ impl CollationRequest { request_id, } = self; - match received.timeout(timeout).await { None => Timeout(request_id), Some(_) => Received(request_id), @@ -99,7 +166,7 @@ struct PerRequest { #[derive(Default)] struct State { /// Our own view. - view: View, + view: OurView, /// Track all active collators and their views. peer_views: HashMap, @@ -107,9 +174,9 @@ struct State { /// Peers that have declared themselves as collators. known_collators: HashMap, - /// Advertisments received from collators. We accept one advertisment + /// Advertisements received from collators. We accept one advertisement /// per collator per source per relay-parent. - advertisments: HashMap>, + advertisements: HashMap>, /// Derive RequestIds from this. next_request_id: RequestId, @@ -130,13 +197,25 @@ struct State { requests_in_progress: FuturesUnordered>, /// Delay after which a collation request would time out. - request_timeout: Duration, + request_timeout: Duration, /// Possessed collations. collations: HashMap<(Hash, ParaId), Vec<(CollatorId, CandidateReceipt, PoV)>>, + + /// Leaves have recently moved out of scope. + /// These are looked into when we receive previously requested collations that we + /// are no longer interested in. + recently_removed_heads: HashSet, + + /// Metrics. + metrics: Metrics, + + /// Span per relay parent. + span_per_relay_parent: HashMap, } /// Another subsystem has requested to fetch collations on a particular leaf for some para. +#[tracing::instrument(level = "trace", skip(ctx, state, tx), fields(subsystem = LOG_TARGET))] async fn fetch_collation( ctx: &mut Context, state: &mut State, @@ -144,7 +223,7 @@ async fn fetch_collation( collator_id: CollatorId, para_id: ParaId, tx: oneshot::Sender<(CandidateReceipt, PoV)> -) -> Result<()> +) where Context: SubsystemContext { @@ -155,12 +234,13 @@ where if let Err(e) = tx.send((collation.1.clone(), collation.2.clone())) { // We do not want this to be fatal because the receving subsystem // may have closed the results channel for some reason. - trace!( - target: TARGET, - "Failed to send collation: {:?}", e, + tracing::trace!( + target: LOG_TARGET, + err = ?e, + "Failed to send collation", ); } - return Ok(()); + return; } } } @@ -169,7 +249,7 @@ where let mut relevant_advertiser = None; // Has the collator in question advertised a relevant collation? - for (k, v) in state.advertisments.iter() { + for (k, v) in state.advertisements.iter() { if v.contains(&(para_id, relay_parent)) { if state.known_collators.get(k) == Some(&collator_id) { relevant_advertiser = Some(k.clone()); @@ -180,18 +260,17 @@ where // Request the collation. // Assume it is `request_collation`'s job to check and ignore duplicate requests. if let Some(relevant_advertiser) = relevant_advertiser { - request_collation(ctx, state, relay_parent, para_id, relevant_advertiser, tx).await?; + request_collation(ctx, state, relay_parent, para_id, relevant_advertiser, tx).await; } - - Ok(()) } /// Report a collator for some malicious actions. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] async fn report_collator( ctx: &mut Context, state: &mut State, id: CollatorId, -) -> Result<()> +) where Context: SubsystemContext { @@ -200,34 +279,32 @@ where // is a tolerable thing to do. for (k, v) in state.known_collators.iter() { if *v == id { - modify_reputation(ctx, k.clone(), COST_REPORT_BAD).await?; + modify_reputation(ctx, k.clone(), COST_REPORT_BAD).await; } } - - Ok(()) } /// Some other subsystem has reported a collator as a good one, bump reputation. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] async fn note_good_collation( ctx: &mut Context, state: &mut State, id: CollatorId, -) -> Result<()> +) where Context: SubsystemContext { for (peer_id, collator_id) in state.known_collators.iter() { if id == *collator_id { - modify_reputation(ctx, peer_id.clone(), BENEFIT_NOTIFY_GOOD).await?; + modify_reputation(ctx, peer_id.clone(), BENEFIT_NOTIFY_GOOD).await; } } - - Ok(()) } /// A peer's view has changed. A number of things should be done: /// - Ongoing collation requests have to be cancelled. -/// - Advertisments by this peer that are no longer relevant have to be removed. +/// - Advertisements by this peer that are no longer relevant have to be removed. +#[tracing::instrument(level = "trace", skip(state), fields(subsystem = LOG_TARGET))] async fn handle_peer_view_change( state: &mut State, peer_id: PeerId, @@ -239,8 +316,8 @@ async fn handle_peer_view_change( *current = view; - if let Some(advertisments) = state.advertisments.get_mut(&peer_id) { - advertisments.retain(|(_, relay_parent)| !removed.contains(relay_parent)); + if let Some(advertisements) = state.advertisements.get_mut(&peer_id) { + advertisements.retain(|(_, relay_parent)| !removed.contains(relay_parent)); } let mut requests_to_cancel = Vec::new(); @@ -269,6 +346,7 @@ async fn handle_peer_view_change( /// - Cancel all ongoing requests /// - Reply to interested parties if any /// - Store collation. +#[tracing::instrument(level = "trace", skip(ctx, state, pov), fields(subsystem = LOG_TARGET))] async fn received_collation( ctx: &mut Context, state: &mut State, @@ -276,7 +354,7 @@ async fn received_collation( request_id: RequestId, receipt: CandidateReceipt, pov: PoV, -) -> Result<()> +) where Context: SubsystemContext { @@ -291,6 +369,7 @@ where let _ = per_request.received.send(()); if let Some(collator_id) = state.known_collators.get(&origin) { let _ = per_request.result.send((receipt.clone(), pov.clone())); + state.metrics.on_request(Ok(())); state.collations .entry((relay_parent, para_id)) @@ -300,14 +379,12 @@ where } } } else { - // TODO: https://github.com/paritytech/polkadot/issues/1694 - // This is tricky. If our chain has moved on, we have already canceled - // the relevant request and removed it from the map; so and we are not expecting - // this reply although technically it is not a malicious behaviur. - modify_reputation(ctx, origin, COST_UNEXPECTED_MESSAGE).await?; + // If this collation is not just a delayed one that we were expecting, + // but our view has moved on, in that case modify peer's reputation. + if !state.recently_removed_heads.contains(&relay_parent) { + modify_reputation(ctx, origin, COST_UNEXPECTED_MESSAGE).await; + } } - - Ok(()) } /// Request a collation from the network. @@ -316,6 +393,7 @@ where /// - Check if the requested collation is in our view. /// - Update PerRequest records with the `result` field if necessary. /// And as such invocations of this function may rely on that. +#[tracing::instrument(level = "trace", skip(ctx, state, result), fields(subsystem = LOG_TARGET))] async fn request_collation( ctx: &mut Context, state: &mut State, @@ -323,26 +401,30 @@ async fn request_collation( para_id: ParaId, peer_id: PeerId, result: oneshot::Sender<(CandidateReceipt, PoV)>, -) -> Result<()> +) where Context: SubsystemContext { if !state.view.contains(&relay_parent) { - trace!( - target: TARGET, - "Collation by {} on {} on relay parent {} is no longer in view", - peer_id, para_id, relay_parent, + tracing::trace!( + target: LOG_TARGET, + peer_id = %peer_id, + para_id = %para_id, + relay_parent = %relay_parent, + "collation is no longer in view", ); - return Ok(()); + return; } if state.requested_collations.contains_key(&(relay_parent, para_id.clone(), peer_id.clone())) { - trace!( - target: TARGET, - "Collation by {} on {} on relay parent {} has already been requested", - peer_id, para_id, relay_parent, + tracing::trace!( + target: LOG_TARGET, + peer_id = %peer_id, + para_id = %para_id, + relay_parent = %relay_parent, + "collation has already been requested", ); - return Ok(()); + return; } let request_id = state.next_request_id; @@ -365,9 +447,7 @@ where state.requests_info.insert(request_id, per_request); - state.requests_in_progress.push(Box::pin(async move { - request.wait().await - })); + state.requests_in_progress.push(request.wait().boxed()); let wire_message = protocol_v1::CollatorProtocolMessage::RequestCollation( request_id, @@ -380,18 +460,17 @@ where vec![peer_id], protocol_v1::CollationProtocol::CollatorProtocol(wire_message), ) - )).await?; - - Ok(()) + )).await; } /// Notify `CandidateSelectionSubsystem` that a collation has been advertised. +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn notify_candidate_selection( ctx: &mut Context, collator: CollatorId, relay_parent: Hash, para_id: ParaId, -) -> Result<()> +) where Context: SubsystemContext { @@ -401,50 +480,52 @@ where para_id, collator, ) - )).await?; - - Ok(()) + )).await; } /// Networking message has been received. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] async fn process_incoming_peer_message( ctx: &mut Context, state: &mut State, origin: PeerId, msg: protocol_v1::CollatorProtocolMessage, -)-> Result<()> +) where Context: SubsystemContext { use protocol_v1::CollatorProtocolMessage::*; match msg { - Declare(id) => { + Declare(id) => { state.known_collators.insert(origin.clone(), id); state.peer_views.entry(origin).or_default(); } - AdvertiseCollation(relay_parent, para_id) => { - state.advertisments.entry(origin.clone()).or_default().insert((para_id, relay_parent)); + AdvertiseCollation(relay_parent, para_id) => { + let _span = state.span_per_relay_parent.get(&relay_parent).map(|s| s.child("advertise-collation")); + state.advertisements.entry(origin.clone()).or_default().insert((para_id, relay_parent)); if let Some(collator) = state.known_collators.get(&origin) { - notify_candidate_selection(ctx, collator.clone(), relay_parent, para_id).await?; + notify_candidate_selection(ctx, collator.clone(), relay_parent, para_id).await; } } - RequestCollation(_, _, _) => { + RequestCollation(_, _, _) => { // This is a validator side of the protocol, collation requests are not expected here. - return modify_reputation(ctx, origin, COST_UNEXPECTED_MESSAGE).await; + modify_reputation(ctx, origin, COST_UNEXPECTED_MESSAGE).await; } - Collation(request_id, receipt, pov) => { - received_collation(ctx, state, origin, request_id, receipt, pov).await?; + Collation(request_id, receipt, pov) => { + let _span1 = state.span_per_relay_parent.get(&receipt.descriptor.relay_parent) + .map(|s| s.child("received-collation")); + let _span2 = jaeger::pov_span(&pov, "received-collation"); + received_collation(ctx, state, origin, request_id, receipt, pov).await; } } - - Ok(()) } /// A leaf has become inactive so we want to /// - Cancel all ongoing collation requests that are on top of that leaf. /// - Remove all stored collations relevant to that leaf. +#[tracing::instrument(level = "trace", skip(state), fields(subsystem = LOG_TARGET))] async fn remove_relay_parent( state: &mut State, relay_parent: Hash, @@ -470,48 +551,66 @@ async fn remove_relay_parent( } /// Our view has changed. +#[tracing::instrument(level = "trace", skip(state), fields(subsystem = LOG_TARGET))] async fn handle_our_view_change( state: &mut State, - view: View, + view: OurView, ) -> Result<()> { - let old_view = std::mem::replace(&mut (state.view), view); + let old_view = std::mem::replace(&mut state.view, view); + + let added: HashMap> = state.view + .span_per_head() + .iter() + .filter(|v| !old_view.contains(&v.0)) + .map(|v| (v.0.clone(), v.1.clone())) + .collect(); + added.into_iter().for_each(|(h, s)| { + state.span_per_relay_parent.insert(h, PerLeafSpan::new(s, "validator-side")); + }); let removed = old_view .difference(&state.view) .cloned() .collect::>(); + // Update the set of recently removed chain heads. + state.recently_removed_heads.clear(); + for removed in removed.into_iter() { + state.recently_removed_heads.insert(removed.clone()); remove_relay_parent(state, removed).await?; + state.span_per_relay_parent.remove(&removed); } Ok(()) } /// A request has timed out. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] async fn request_timed_out( ctx: &mut Context, state: &mut State, id: RequestId, -) -> Result<()> +) where Context: SubsystemContext { + state.metrics.on_request(Err(())); + // We have to go backwards in the map, again. if let Some(key) = find_val_in_map(&state.requested_collations, &id) { if let Some(_) = state.requested_collations.remove(&key) { if let Some(_) = state.requests_info.remove(&id) { let peer_id = key.2; - modify_reputation(ctx, peer_id, COST_REQUEST_TIMED_OUT).await?; + modify_reputation(ctx, peer_id, COST_REQUEST_TIMED_OUT).await; } } } - - Ok(()) } /// Bridge event switch. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] async fn handle_network_msg( ctx: &mut Context, state: &mut State, @@ -537,7 +636,7 @@ where handle_our_view_change(state, view).await?; }, PeerMessage(remote, msg) => { - process_incoming_peer_message(ctx, state, remote, msg).await?; + process_incoming_peer_message(ctx, state, remote, msg).await; } } @@ -545,37 +644,42 @@ where } /// The main message receiver switch. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] async fn process_msg( ctx: &mut Context, msg: CollatorProtocolMessage, state: &mut State, -) -> Result<()> +) where Context: SubsystemContext { use CollatorProtocolMessage::*; + let _timer = state.metrics.time_process_msg(); + match msg { CollateOn(id) => { - warn!( - target: TARGET, - "CollateOn({}) message is not expected on the validator side of the protocol", id, + tracing::warn!( + target: LOG_TARGET, + para_id = %id, + "CollateOn message is not expected on the validator side of the protocol", ); } DistributeCollation(_, _) => { - warn!( - target: TARGET, + tracing::warn!( + target: LOG_TARGET, "DistributeCollation message is not expected on the validator side of the protocol", ); } FetchCollation(relay_parent, collator_id, para_id, tx) => { - fetch_collation(ctx, state, relay_parent, collator_id, para_id, tx).await?; + let _span = state.span_per_relay_parent.get(&relay_parent).map(|s| s.child("fetch-collation")); + fetch_collation(ctx, state, relay_parent, collator_id, para_id, tx).await; } ReportCollator(id) => { - report_collator(ctx, state, id).await?; + report_collator(ctx, state, id).await; } NoteGoodCollation(id) => { - note_good_collation(ctx, state, id).await?; + note_good_collation(ctx, state, id).await; } NetworkBridgeUpdateV1(event) => { if let Err(e) = handle_network_msg( @@ -583,19 +687,23 @@ where state, event, ).await { - warn!( - target: TARGET, - "Failed to handle incoming network message: {:?}", e, + tracing::warn!( + target: LOG_TARGET, + err = ?e, + "Failed to handle incoming network message", ); } } } - - Ok(()) } /// The main run loop. -pub(crate) async fn run(mut ctx: Context, request_timeout: Duration) -> Result<()> +#[tracing::instrument(skip(ctx, metrics), fields(subsystem = LOG_TARGET))] +pub(crate) async fn run( + mut ctx: Context, + request_timeout: Duration, + metrics: Metrics, + ) -> Result<()> where Context: SubsystemContext { @@ -604,17 +712,18 @@ where let mut state = State { request_timeout, + metrics, ..Default::default() }; loop { if let Poll::Ready(msg) = futures::poll!(ctx.recv()) { let msg = msg?; - trace!(target: TARGET, "Received a message {:?}", msg); + tracing::trace!(target: LOG_TARGET, msg = ?msg, "received a message"); match msg { - Communication { msg } => process_msg(&mut ctx, msg, &mut state).await?, - Signal(BlockFinalized(_)) => {} + Communication { msg } => process_msg(&mut ctx, msg, &mut state).await, + Signal(BlockFinalized(..)) => {} Signal(ActiveLeaves(_)) => {} Signal(Conclude) => { break } } @@ -622,12 +731,14 @@ where } while let Poll::Ready(Some(request)) = futures::poll!(state.requests_in_progress.next()) { + let _timer = state.metrics.time_handle_collation_request_result(); + // Request has timed out, we need to penalize the collator and re-send the request // if the chain has not moved on yet. match request { CollationRequestResult::Timeout(id) => { - trace!(target: TARGET, "Request timed out {}", id); - request_timed_out(&mut ctx, &mut state, id).await?; + tracing::trace!(target: LOG_TARGET, id, "request timed out"); + request_timed_out(&mut ctx, &mut state, id).await; } CollationRequestResult::Received(id) => { state.requests_info.remove(&id); @@ -658,6 +769,7 @@ mod tests { use polkadot_primitives::v1::{BlockData, CollatorPair}; use polkadot_subsystem_testhelpers as test_helpers; + use polkadot_node_network_protocol::our_view; #[derive(Clone)] struct TestState { @@ -698,7 +810,7 @@ mod tests { log::LevelFilter::Trace, ) .filter( - Some(TARGET), + Some(LOG_TARGET), log::LevelFilter::Trace, ) .try_init(); @@ -707,7 +819,7 @@ mod tests { let (context, virtual_overseer) = test_helpers::make_subsystem_context(pool.clone()); - let subsystem = run(context, Duration::from_millis(50)); + let subsystem = run(context, Duration::from_millis(50), Metrics::default()); let test_fut = test(TestHarness { virtual_overseer }); @@ -723,7 +835,7 @@ mod tests { overseer: &mut test_helpers::TestSubsystemContextHandle, msg: CollatorProtocolMessage, ) { - log::trace!("Sending message:\n{:?}", &msg); + tracing::trace!("Sending message:\n{:?}", &msg); overseer .send(FromOverseer::Communication { msg }) .timeout(TIMEOUT) @@ -738,7 +850,7 @@ mod tests { .await .expect(&format!("{:?} is enough to receive messages.", TIMEOUT)); - log::trace!("Received message:\n{:?}", &msg); + tracing::trace!("Received message:\n{:?}", &msg); msg } @@ -747,16 +859,16 @@ mod tests { overseer: &mut test_helpers::TestSubsystemContextHandle, timeout: Duration, ) -> Option { - log::trace!("Waiting for message..."); + tracing::trace!("Waiting for message..."); overseer .recv() .timeout(timeout) .await } - // As we receive a relevan advertisment act on it and issue a collation request. + // As we receive a relevant advertisement act on it and issue a collation request. #[test] - fn act_on_advertisment() { + fn act_on_advertisement() { let test_state = TestState::default(); test_harness(|test_harness| async move { @@ -765,12 +877,12 @@ mod tests { } = test_harness; let pair = CollatorPair::generate().0; - log::trace!("activating"); + tracing::trace!("activating"); overseer_send( &mut virtual_overseer, CollatorProtocolMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::OurViewChange(View(vec![test_state.relay_parent])) + NetworkBridgeEvent::OurViewChange(our_view![test_state.relay_parent]) ) ).await; @@ -828,7 +940,7 @@ mod tests { overseer_send( &mut virtual_overseer, CollatorProtocolMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::OurViewChange(View(vec![test_state.relay_parent])) + NetworkBridgeEvent::OurViewChange(our_view![test_state.relay_parent]) ) ).await; @@ -919,7 +1031,7 @@ mod tests { overseer_send( &mut virtual_overseer, CollatorProtocolMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::OurViewChange(View(vec![Hash::repeat_byte(0x42)])) + NetworkBridgeEvent::OurViewChange(our_view![Hash::repeat_byte(0x42)]) ) ).await; @@ -947,7 +1059,7 @@ mod tests { overseer_send( &mut virtual_overseer, CollatorProtocolMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::OurViewChange(View(vec![test_state.relay_parent])) + NetworkBridgeEvent::OurViewChange(our_view![test_state.relay_parent]) ) ).await; @@ -1013,7 +1125,7 @@ mod tests { // A test scenario that takes the following steps // - Two collators connect, declare themselves and advertise a collation relevant to // our view. - // - This results subsystem acting upon these advertisments and issuing two messages to + // - This results subsystem acting upon these advertisements and issuing two messages to // the CandidateBacking subsystem. // - CandidateBacking requests both of the collations. // - Collation protocol requests these collations. @@ -1031,8 +1143,8 @@ mod tests { overseer_send( &mut virtual_overseer, CollatorProtocolMessage::NetworkBridgeUpdateV1( - NetworkBridgeEvent::OurViewChange(View(vec![test_state.relay_parent])) - ) + NetworkBridgeEvent::OurViewChange(our_view![test_state.relay_parent]) + ), ).await; let peer_b = PeerId::random(); diff --git a/node/network/pov-distribution/Cargo.toml b/node/network/pov-distribution/Cargo.toml index cedc94732cfb832cc7206bc977815a078f95d081..a78eb21beb12ab4eee4130a0269d04ad9dbe1830 100644 --- a/node/network/pov-distribution/Cargo.toml +++ b/node/network/pov-distribution/Cargo.toml @@ -5,19 +5,22 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.5" -log = "0.4.8" -futures-timer = "3.0.2" -streamunordered = "0.5.1" +futures = "0.3.8" +thiserror = "1.0.23" +tracing = "0.1.22" +tracing-futures = "0.2.4" + polkadot-primitives = { path = "../../../primitives" } -node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } -parity-scale-codec = "1.3.4" -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-node-network-protocol = { path = "../../network/protocol" } [dev-dependencies] -parking_lot = "0.10.0" -assert_matches = "1.3.0" +assert_matches = "1.4.0" +env_logger = "0.8.1" +log = "0.4.11" + sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } + polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } diff --git a/runtime/parachains/src/validity.rs b/node/network/pov-distribution/src/error.rs similarity index 58% rename from runtime/parachains/src/validity.rs rename to node/network/pov-distribution/src/error.rs index 1f45de2df705364ccbaa6a14810b43d0900ee2e2..754c1e56c5234828305214742a77d66989b1c302 100644 --- a/runtime/parachains/src/validity.rs +++ b/node/network/pov-distribution/src/error.rs @@ -13,3 +13,21 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . + +//! The `Error` and `Result` types used by the subsystem. + +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum Error { + #[error(transparent)] + Subsystem(#[from] polkadot_subsystem::SubsystemError), + #[error(transparent)] + OneshotRecv(#[from] futures::channel::oneshot::Canceled), + #[error(transparent)] + Runtime(#[from] polkadot_subsystem::errors::RuntimeApiError), + #[error(transparent)] + Util(#[from] polkadot_node_subsystem_util::Error), +} + +pub type Result = std::result::Result; diff --git a/node/network/pov-distribution/src/lib.rs b/node/network/pov-distribution/src/lib.rs index 552981244d2474960eba81673d9dc155cbebe0d9..5ee1f14063e2afe5a3009bd34c8f82c756eb84b5 100644 --- a/node/network/pov-distribution/src/lib.rs +++ b/node/network/pov-distribution/src/lib.rs @@ -19,15 +19,28 @@ //! This is a gossip implementation of code that is responsible for distributing PoVs //! among validators. -use polkadot_primitives::v1::{Hash, PoV, CandidateDescriptor}; +#![deny(unused_crate_dependencies)] +#![warn(missing_docs)] + +use polkadot_primitives::v1::{ + Hash, PoV, CandidateDescriptor, ValidatorId, Id as ParaId, CoreIndex, CoreState, +}; use polkadot_subsystem::{ - ActiveLeavesUpdate, OverseerSignal, SubsystemContext, Subsystem, SubsystemResult, FromOverseer, SpawnedSubsystem, + ActiveLeavesUpdate, OverseerSignal, SubsystemContext, SubsystemResult, SubsystemError, Subsystem, + FromOverseer, SpawnedSubsystem, + messages::{ + PoVDistributionMessage, AllMessages, NetworkBridgeMessage, + }, }; -use polkadot_subsystem::messages::{ - PoVDistributionMessage, RuntimeApiMessage, RuntimeApiRequest, AllMessages, NetworkBridgeMessage, +use polkadot_node_subsystem_util::{ + validator_discovery, + request_validators_ctx, + request_validator_groups_ctx, + request_availability_cores_ctx, + metrics::{self, prometheus}, }; use polkadot_node_network_protocol::{ - v1 as protocol_v1, ReputationChange as Rep, NetworkBridgeEvent, PeerId, View, + v1 as protocol_v1, ReputationChange as Rep, NetworkBridgeEvent, PeerId, OurView, }; use futures::prelude::*; @@ -36,6 +49,11 @@ use futures::channel::oneshot; use std::collections::{hash_map::{Entry, HashMap}, HashSet}; use std::sync::Arc; +mod error; + +#[cfg(test)] +mod tests; + const COST_APPARENT_FLOOD: Rep = Rep::new(-500, "Peer appears to be flooding us with PoV requests"); const COST_UNEXPECTED_POV: Rep = Rep::new(-500, "Peer sent us an unexpected PoV"); const COST_AWAITED_NOT_IN_VIEW: Rep @@ -45,37 +63,57 @@ const BENEFIT_FRESH_POV: Rep = Rep::new(25, "Peer supplied us with an awaited Po const BENEFIT_LATE_POV: Rep = Rep::new(10, "Peer supplied us with an awaited PoV, \ but was not the first to do so"); +const LOG_TARGET: &str = "pov_distribution"; + /// The PoV Distribution Subsystem. -pub struct PoVDistribution; +pub struct PoVDistribution { + // Prometheus metrics + metrics: Metrics, +} impl Subsystem for PoVDistribution where C: SubsystemContext { - type Metrics = (); - fn start(self, ctx: C) -> SpawnedSubsystem { // Swallow error because failure is fatal to the node and we log with more precision // within `run`. + let future = self.run(ctx) + .map_err(|e| SubsystemError::with_origin("pov-distribution", e)) + .boxed(); SpawnedSubsystem { name: "pov-distribution-subsystem", - future: run(ctx).map(|_| ()).boxed(), + future, } } } +#[derive(Default)] struct State { + /// A state of things going on on a per-relay-parent basis. relay_parent_state: HashMap, + + /// Info on peers. peer_state: HashMap, - our_view: View, + + /// Our own view. + our_view: OurView, + + /// Connect to relevant groups of validators at different relay parents. + connection_requests: validator_discovery::ConnectionRequests, + + /// Metrics. + metrics: Metrics, } struct BlockBasedState { known: HashMap>, + /// All the PoVs we are or were fetching, coupled with channels expecting the data. /// /// This may be an empty list, which indicates that we were once awaiting this PoV but have /// received it already. fetching: HashMap>>>, + n_validators: usize, } @@ -103,6 +141,7 @@ fn send_pov_message(relay_parent: Hash, pov_hash: Hash, pov: PoV) /// Handles the signal. If successful, returns `true` if the subsystem should conclude, /// `false` otherwise. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] async fn handle_signal( state: &mut State, ctx: &mut impl SubsystemContext, @@ -111,56 +150,67 @@ async fn handle_signal( match signal { OverseerSignal::Conclude => Ok(true), OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { activated, deactivated }) => { - for relay_parent in activated { - let (vals_tx, vals_rx) = oneshot::channel(); - ctx.send_message(AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::Validators(vals_tx), - ))).await?; - - let n_validators = match vals_rx.await? { - Ok(v) => v.len(), + let _timer = state.metrics.time_handle_signal(); + + for (relay_parent, _span) in activated { + match request_validators_ctx(relay_parent, ctx).await { + Ok(vals_rx) => { + let n_validators = match vals_rx.await? { + Ok(v) => v.len(), + Err(e) => { + tracing::warn!( + target: LOG_TARGET, + err = ?e, + "Error fetching validators from runtime API for active leaf", + ); + + // Not adding bookkeeping here might make us behave funny, but we + // shouldn't take down the node on spurious runtime API errors. + // + // and this is "behave funny" as in be bad at our job, but not in any + // slashable or security-related way. + continue; + } + }; + + state.relay_parent_state.insert(relay_parent, BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators, + }); + } Err(e) => { - log::warn!(target: "pov_distribution", - "Error fetching validators from runtime API for active leaf: {:?}", - e + // continue here also as above. + tracing::warn!( + target: LOG_TARGET, + err = ?e, + "Error fetching validators from runtime API for active leaf", ); - - // Not adding bookkeeping here might make us behave funny, but we - // shouldn't take down the node on spurious runtime API errors. - // - // and this is "behave funny" as in be bad at our job, but not in any - // slashable or security-related way. - continue; } - }; - - state.relay_parent_state.insert(relay_parent, BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: n_validators, - }); + } } for relay_parent in deactivated { + state.connection_requests.remove(&relay_parent); state.relay_parent_state.remove(&relay_parent); } Ok(false) } - OverseerSignal::BlockFinalized(_) => Ok(false), + OverseerSignal::BlockFinalized(..) => Ok(false), } } /// Notify peers that we are awaiting a given PoV hash. /// /// This only notifies peers who have the relay parent in their view. +#[tracing::instrument(level = "trace", skip(peers, ctx), fields(subsystem = LOG_TARGET))] async fn notify_all_we_are_awaiting( peers: &mut HashMap, ctx: &mut impl SubsystemContext, relay_parent: Hash, pov_hash: Hash, -) -> SubsystemResult<()> { +) { // We use `awaited` as a proxy for which heads are in the peer's view. let peers_to_send: Vec<_> = peers.iter() .filter_map(|(peer, state)| if state.awaited.contains_key(&relay_parent) { @@ -170,23 +220,26 @@ async fn notify_all_we_are_awaiting( }) .collect(); - if peers_to_send.is_empty() { return Ok(()) } + if peers_to_send.is_empty() { + return; + } let payload = awaiting_message(relay_parent, vec![pov_hash]); ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( peers_to_send, payload, - ))).await + ))).await; } /// Notify one peer about everything we're awaiting at a given relay-parent. +#[tracing::instrument(level = "trace", skip(ctx, relay_parent_state), fields(subsystem = LOG_TARGET))] async fn notify_one_we_are_awaiting_many( peer: &PeerId, ctx: &mut impl SubsystemContext, relay_parent_state: &HashMap, relay_parent: Hash, -) -> SubsystemResult<()> { +) { let awaiting_hashes = relay_parent_state.get(&relay_parent).into_iter().flat_map(|s| { // Send the peer everything we are fetching at this relay-parent s.fetching.iter() @@ -194,24 +247,28 @@ async fn notify_one_we_are_awaiting_many( .map(|(pov_hash, _)| *pov_hash) }).collect::>(); - if awaiting_hashes.is_empty() { return Ok(()) } + if awaiting_hashes.is_empty() { + return; + } let payload = awaiting_message(relay_parent, awaiting_hashes); ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( vec![peer.clone()], payload, - ))).await + ))).await; } /// Distribute a PoV to peers who are awaiting it. +#[tracing::instrument(level = "trace", skip(peers, ctx, metrics, pov), fields(subsystem = LOG_TARGET))] async fn distribute_to_awaiting( peers: &mut HashMap, ctx: &mut impl SubsystemContext, + metrics: &Metrics, relay_parent: Hash, pov_hash: Hash, pov: &PoV, -) -> SubsystemResult<()> { +) { // Send to all peers who are awaiting the PoV and have that relay-parent in their view. // // Also removes it from their awaiting set. @@ -225,32 +282,106 @@ async fn distribute_to_awaiting( })) .collect(); - if peers_to_send.is_empty() { return Ok(()) } + if peers_to_send.is_empty() { return; } let payload = send_pov_message(relay_parent, pov_hash, pov.clone()); ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( peers_to_send, payload, - ))).await + ))).await; + + metrics.on_pov_distributed(); +} + +/// Get the Id of the Core that is assigned to the para being collated on if any +/// and the total number of cores. +async fn determine_core( + ctx: &mut impl SubsystemContext, + para_id: ParaId, + relay_parent: Hash, +) -> error::Result> { + let cores = request_availability_cores_ctx(relay_parent, ctx).await?.await??; + + for (idx, core) in cores.iter().enumerate() { + if let CoreState::Scheduled(occupied) = core { + if occupied.para_id == para_id { + return Ok(Some(((idx as u32).into(), cores.len()))); + } + } + } + + Ok(None) +} + +/// Figure out a group of validators assigned to a given `ParaId`. +async fn determine_validators_for_core( + ctx: &mut impl SubsystemContext, + core_index: CoreIndex, + num_cores: usize, + relay_parent: Hash, +) -> error::Result>> { + let groups = request_validator_groups_ctx(relay_parent, ctx).await?.await??; + + let group_index = groups.1.group_for_core(core_index, num_cores); + + let connect_to_validators = match groups.0.get(group_index.0 as usize) { + Some(group) => group.clone(), + None => return Ok(None), + }; + + let validators = request_validators_ctx(relay_parent, ctx).await?.await??; + + let validators = connect_to_validators + .into_iter() + .map(|idx| validators[idx as usize].clone()) + .collect(); + + Ok(Some(validators)) +} + +async fn determine_relevant_validators( + ctx: &mut impl SubsystemContext, + relay_parent: Hash, + para_id: ParaId, +) -> error::Result>> { + // Determine which core the para_id is assigned to. + let (core, num_cores) = match determine_core(ctx, para_id, relay_parent).await? { + Some(core) => core, + None => { + tracing::warn!( + target: LOG_TARGET, + "Looks like no core is assigned to {:?} at {:?}", + para_id, + relay_parent, + ); + + return Ok(None); + } + }; + + determine_validators_for_core(ctx, core, num_cores, relay_parent).await } /// Handles a `FetchPoV` message. +#[tracing::instrument(level = "trace", skip(ctx, state, response_sender), fields(subsystem = LOG_TARGET))] async fn handle_fetch( state: &mut State, ctx: &mut impl SubsystemContext, relay_parent: Hash, descriptor: CandidateDescriptor, response_sender: oneshot::Sender>, -) -> SubsystemResult<()> { +) { + let _timer = state.metrics.time_handle_fetch(); + let relay_parent_state = match state.relay_parent_state.get_mut(&relay_parent) { Some(s) => s, - None => return Ok(()), + None => return, }; if let Some(pov) = relay_parent_state.known.get(&descriptor.pov_hash) { let _ = response_sender.send(pov.clone()); - return Ok(()); + return; } { @@ -258,18 +389,48 @@ async fn handle_fetch( Entry::Occupied(mut e) => { // we are already awaiting this PoV if there is an entry. e.get_mut().push(response_sender); - return Ok(()); + return; } Entry::Vacant(e) => { - e.insert(vec![response_sender]); + if let Ok(Some(relevant_validators)) = determine_relevant_validators( + ctx, + relay_parent, + descriptor.para_id, + ).await { + // We only need one connection request per (relay_parent, para_id) + // so here we take this shortcut to avoid calling `connect_to_validators` + // more than once. + if !state.connection_requests.contains_request(&relay_parent) { + match validator_discovery::connect_to_validators( + ctx, + relay_parent, + relevant_validators.clone(), + ).await { + Ok(new_connection_request) => { + state.connection_requests.put(relay_parent, new_connection_request); + } + Err(e) => { + tracing::debug!( + target: LOG_TARGET, + "Failed to create a validator connection request {:?}", + e, + ); + } + } + } + + e.insert(vec![response_sender]); + } } } } if relay_parent_state.fetching.len() > 2 * relay_parent_state.n_validators { - log::warn!("Other subsystems have requested PoV distribution to \ - fetch more PoVs than reasonably expected: {}", relay_parent_state.fetching.len()); - return Ok(()); + tracing::warn!( + relay_parent_state.fetching.len = relay_parent_state.fetching.len(), + "other subsystems have requested PoV distribution to fetch more PoVs than reasonably expected", + ); + return; } // Issue an `Awaiting` message to all peers with this in their view. @@ -282,16 +443,19 @@ async fn handle_fetch( } /// Handles a `DistributePoV` message. +#[tracing::instrument(level = "trace", skip(ctx, state, pov), fields(subsystem = LOG_TARGET))] async fn handle_distribute( state: &mut State, ctx: &mut impl SubsystemContext, relay_parent: Hash, descriptor: CandidateDescriptor, pov: Arc, -) -> SubsystemResult<()> { +) { + let _timer = state.metrics.time_handle_distribute(); + let relay_parent_state = match state.relay_parent_state.get_mut(&relay_parent) { - None => return Ok(()), Some(s) => s, + None => return, }; if let Some(our_awaited) = relay_parent_state.fetching.get_mut(&descriptor.pov_hash) { @@ -309,6 +473,7 @@ async fn handle_distribute( distribute_to_awaiting( &mut state.peer_state, ctx, + &state.metrics, relay_parent, descriptor.pov_hash, &*pov, @@ -316,31 +481,33 @@ async fn handle_distribute( } /// Report a reputation change for a peer. +#[tracing::instrument(level = "trace", skip(ctx), fields(subsystem = LOG_TARGET))] async fn report_peer( ctx: &mut impl SubsystemContext, peer: PeerId, rep: Rep, -) -> SubsystemResult<()> { +) { ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::ReportPeer(peer, rep))).await } /// Handle a notification from a peer that they are awaiting some PoVs. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] async fn handle_awaiting( state: &mut State, ctx: &mut impl SubsystemContext, peer: PeerId, relay_parent: Hash, pov_hashes: Vec, -) -> SubsystemResult<()> { - if !state.our_view.0.contains(&relay_parent) { - report_peer(ctx, peer, COST_AWAITED_NOT_IN_VIEW).await?; - return Ok(()); +) { + if !state.our_view.contains(&relay_parent) { + report_peer(ctx, peer, COST_AWAITED_NOT_IN_VIEW).await; + return; } let relay_parent_state = match state.relay_parent_state.get_mut(&relay_parent) { None => { - log::warn!("PoV Distribution relay parent state out-of-sync with our view"); - return Ok(()); + tracing::warn!("PoV Distribution relay parent state out-of-sync with our view"); + return; } Some(s) => s, }; @@ -349,8 +516,8 @@ async fn handle_awaiting( state.peer_state.get_mut(&peer).and_then(|s| s.awaited.get_mut(&relay_parent)) { None => { - report_peer(ctx, peer, COST_AWAITED_NOT_IN_VIEW).await?; - return Ok(()); + report_peer(ctx, peer, COST_AWAITED_NOT_IN_VIEW).await; + return; } Some(a) => a, }; @@ -364,21 +531,20 @@ async fn handle_awaiting( let payload = send_pov_message(relay_parent, pov_hash, (&**pov).clone()); ctx.send_message(AllMessages::NetworkBridge( NetworkBridgeMessage::SendValidationMessage(vec![peer.clone()], payload) - )).await?; + )).await; } else { peer_awaiting.insert(pov_hash); } } } else { - report_peer(ctx, peer, COST_APPARENT_FLOOD).await?; + report_peer(ctx, peer, COST_APPARENT_FLOOD).await; } - - Ok(()) } /// Handle an incoming PoV from our peer. Reports them if unexpected, rewards them if not. /// /// Completes any requests awaiting that PoV. +#[tracing::instrument(level = "trace", skip(ctx, state, pov), fields(subsystem = LOG_TARGET))] async fn handle_incoming_pov( state: &mut State, ctx: &mut impl SubsystemContext, @@ -386,11 +552,11 @@ async fn handle_incoming_pov( relay_parent: Hash, pov_hash: Hash, pov: PoV, -) -> SubsystemResult<()> { +) { let relay_parent_state = match state.relay_parent_state.get_mut(&relay_parent) { None => { - report_peer(ctx, peer, COST_UNEXPECTED_POV).await?; - return Ok(()); + report_peer(ctx, peer, COST_UNEXPECTED_POV).await; + return; }, Some(r) => r, }; @@ -399,16 +565,16 @@ async fn handle_incoming_pov( // Do validity checks and complete all senders awaiting this PoV. let fetching = match relay_parent_state.fetching.get_mut(&pov_hash) { None => { - report_peer(ctx, peer, COST_UNEXPECTED_POV).await?; - return Ok(()); + report_peer(ctx, peer, COST_UNEXPECTED_POV).await; + return; } Some(f) => f, }; let hash = pov.hash(); if hash != pov_hash { - report_peer(ctx, peer, COST_UNEXPECTED_POV).await?; - return Ok(()); + report_peer(ctx, peer, COST_UNEXPECTED_POV).await; + return; } let pov = Arc::new(pov); @@ -416,10 +582,10 @@ async fn handle_incoming_pov( if fetching.is_empty() { // fetching is empty whenever we were awaiting something and // it was completed afterwards. - report_peer(ctx, peer.clone(), BENEFIT_LATE_POV).await?; + report_peer(ctx, peer.clone(), BENEFIT_LATE_POV).await; } else { // fetching is non-empty when the peer just provided us with data we needed. - report_peer(ctx, peer.clone(), BENEFIT_FRESH_POV).await?; + report_peer(ctx, peer.clone(), BENEFIT_FRESH_POV).await; } for response_sender in fetching.drain(..) { @@ -438,34 +604,41 @@ async fn handle_incoming_pov( distribute_to_awaiting( &mut state.peer_state, ctx, + &state.metrics, relay_parent, pov_hash, &*pov, ).await } +/// Handles a newly connected validator in the context of some relay leaf. +fn handle_validator_connected(state: &mut State, peer_id: PeerId) { + state.peer_state.entry(peer_id).or_default(); +} + /// Handles a network bridge update. +#[tracing::instrument(level = "trace", skip(ctx, state), fields(subsystem = LOG_TARGET))] async fn handle_network_update( state: &mut State, ctx: &mut impl SubsystemContext, update: NetworkBridgeEvent, -) -> SubsystemResult<()> { +) { + let _timer = state.metrics.time_handle_network_update(); + match update { NetworkBridgeEvent::PeerConnected(peer, _observed_role) => { - state.peer_state.insert(peer, PeerState { awaited: HashMap::new() }); - Ok(()) + handle_validator_connected(state, peer); } NetworkBridgeEvent::PeerDisconnected(peer) => { state.peer_state.remove(&peer); - Ok(()) } NetworkBridgeEvent::PeerViewChange(peer_id, view) => { if let Some(peer_state) = state.peer_state.get_mut(&peer_id) { // prune anything not in the new view. - peer_state.awaited.retain(|relay_parent, _| view.0.contains(&relay_parent)); + peer_state.awaited.retain(|relay_parent, _| view.contains(&relay_parent)); // introduce things from the new view. - for relay_parent in view.0.iter() { + for relay_parent in view.heads.iter() { if let Entry::Vacant(entry) = peer_state.awaited.entry(*relay_parent) { entry.insert(HashSet::new()); @@ -475,12 +648,11 @@ async fn handle_network_update( ctx, &state.relay_parent_state, *relay_parent, - ).await?; + ).await; } } } - Ok(()) } NetworkBridgeEvent::PeerMessage(peer, message) => { match message { @@ -505,954 +677,160 @@ async fn handle_network_update( } NetworkBridgeEvent::OurViewChange(view) => { state.our_view = view; - Ok(()) - } - } -} - -async fn run( - mut ctx: impl SubsystemContext, -) -> SubsystemResult<()> { - let mut state = State { - relay_parent_state: HashMap::new(), - peer_state: HashMap::new(), - our_view: View(Vec::new()), - }; - - loop { - match ctx.recv().await? { - FromOverseer::Signal(signal) => if handle_signal(&mut state, &mut ctx, signal).await? { - return Ok(()); - }, - FromOverseer::Communication { msg } => match msg { - PoVDistributionMessage::FetchPoV(relay_parent, descriptor, response_sender) => - handle_fetch( - &mut state, - &mut ctx, - relay_parent, - descriptor, - response_sender, - ).await?, - PoVDistributionMessage::DistributePoV(relay_parent, descriptor, pov) => - handle_distribute( - &mut state, - &mut ctx, - relay_parent, - descriptor, - pov, - ).await?, - PoVDistributionMessage::NetworkBridgeUpdateV1(event) => - handle_network_update( - &mut state, - &mut ctx, - event, - ).await?, - }, } } } -#[cfg(test)] -mod tests { - use super::*; - use futures::executor; - use polkadot_primitives::v1::BlockData; - use assert_matches::assert_matches; - - fn make_pov(data: Vec) -> PoV { - PoV { block_data: BlockData(data) } - } - - fn make_peer_state(awaited: Vec<(Hash, Vec)>) - -> PeerState - { - PeerState { - awaited: awaited.into_iter().map(|(rp, h)| (rp, h.into_iter().collect())).collect() - } - } - - #[test] - fn distributes_to_those_awaiting_and_completes_local() { - let hash_a: Hash = [0; 32].into(); - let hash_b: Hash = [1; 32].into(); - - let peer_a = PeerId::random(); - let peer_b = PeerId::random(); - let peer_c = PeerId::random(); - - let (pov_send, pov_recv) = oneshot::channel(); - let pov = make_pov(vec![1, 2, 3]); - let pov_hash = pov.hash(); - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - let mut b = BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }; - - b.fetching.insert(pov_hash, vec![pov_send]); - s.insert(hash_a, b); - s - }, - peer_state: { - let mut s = HashMap::new(); - - // peer A has hash_a in its view and is awaiting the PoV. - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_a, vec![pov_hash])]), - ); - - // peer B has hash_a in its view but is not awaiting. - s.insert( - peer_b.clone(), - make_peer_state(vec![(hash_a, vec![])]), - ); - - // peer C doesn't have hash_a in its view but is awaiting the PoV under hash_b. - s.insert( - peer_c.clone(), - make_peer_state(vec![(hash_b, vec![pov_hash])]), - ); - - s - }, - our_view: View(vec![hash_a, hash_b]), - }; - - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - let mut descriptor = CandidateDescriptor::default(); - descriptor.pov_hash = pov_hash; - - executor::block_on(async move { - handle_distribute( - &mut state, - &mut ctx, - hash_a, - descriptor, - Arc::new(pov.clone()), - ).await.unwrap(); - - assert!(!state.peer_state[&peer_a].awaited[&hash_a].contains(&pov_hash)); - assert!(state.peer_state[&peer_c].awaited[&hash_b].contains(&pov_hash)); - - // our local sender also completed - assert_eq!(&*pov_recv.await.unwrap(), &pov); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::SendValidationMessage(peers, message) - ) => { - assert_eq!(peers, vec![peer_a.clone()]); - assert_eq!( - message, - send_pov_message(hash_a, pov_hash, pov.clone()), - ); - } - ) - }); +impl PoVDistribution { + /// Create a new instance of `PovDistribution`. + pub fn new(metrics: Metrics) -> Self { + Self { metrics } } - #[test] - fn we_inform_peers_with_same_view_we_are_awaiting() { - let hash_a: Hash = [0; 32].into(); - let hash_b: Hash = [1; 32].into(); - - let peer_a = PeerId::random(); - let peer_b = PeerId::random(); - - let (pov_send, _) = oneshot::channel(); - let pov = make_pov(vec![1, 2, 3]); - let pov_hash = pov.hash(); - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - let b = BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }; - - s.insert(hash_a, b); - s - }, - peer_state: { - let mut s = HashMap::new(); - - // peer A has hash_a in its view. - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_a, vec![])]), - ); - - // peer B doesn't have hash_a in its view. - s.insert( - peer_b.clone(), - make_peer_state(vec![(hash_b, vec![])]), - ); - - s - }, - our_view: View(vec![hash_a]), - }; - - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - let mut descriptor = CandidateDescriptor::default(); - descriptor.pov_hash = pov_hash; - - executor::block_on(async move { - handle_fetch( - &mut state, - &mut ctx, - hash_a, - descriptor, - pov_send, - ).await.unwrap(); - - assert_eq!(state.relay_parent_state[&hash_a].fetching[&pov_hash].len(), 1); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::SendValidationMessage(peers, message) - ) => { - assert_eq!(peers, vec![peer_a.clone()]); - assert_eq!( - message, - awaiting_message(hash_a, vec![pov_hash]), - ); - } - ) - }); - } - - #[test] - fn peer_view_change_leads_to_us_informing() { - let hash_a: Hash = [0; 32].into(); - let hash_b: Hash = [1; 32].into(); - - let peer_a = PeerId::random(); - - let (pov_a_send, _) = oneshot::channel(); - - let pov_a = make_pov(vec![1, 2, 3]); - let pov_a_hash = pov_a.hash(); - - let pov_b = make_pov(vec![4, 5, 6]); - let pov_b_hash = pov_b.hash(); - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - let mut b = BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }; - - // pov_a is still being fetched, whereas the fetch of pov_b has already - // completed, as implied by the empty vector. - b.fetching.insert(pov_a_hash, vec![pov_a_send]); - b.fetching.insert(pov_b_hash, vec![]); - - s.insert(hash_a, b); - s - }, - peer_state: { - let mut s = HashMap::new(); - - // peer A doesn't yet have hash_a in its view. - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_b, vec![])]), - ); - - s - }, - our_view: View(vec![hash_a]), - }; - - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - - executor::block_on(async move { - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerViewChange(peer_a.clone(), View(vec![hash_a, hash_b])), - ).await.unwrap(); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::SendValidationMessage(peers, message) - ) => { - assert_eq!(peers, vec![peer_a.clone()]); - assert_eq!( - message, - awaiting_message(hash_a, vec![pov_a_hash]), - ); - } - ) - }); - } - - #[test] - fn peer_complete_fetch_and_is_rewarded() { - let hash_a: Hash = [0; 32].into(); - - let peer_a = PeerId::random(); - let peer_b = PeerId::random(); - - let (pov_send, pov_recv) = oneshot::channel(); - - let pov = make_pov(vec![1, 2, 3]); - let pov_hash = pov.hash(); - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - let mut b = BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }; - - // pov is being fetched. - b.fetching.insert(pov_hash, vec![pov_send]); - - s.insert(hash_a, b); - s - }, - peer_state: { - let mut s = HashMap::new(); - - // peers A and B are functionally the same. - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_a, vec![])]), - ); - - s.insert( - peer_b.clone(), - make_peer_state(vec![(hash_a, vec![])]), - ); - - s - }, - our_view: View(vec![hash_a]), - }; - - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - - executor::block_on(async move { - // Peer A answers our request before peer B. - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - send_pov_message(hash_a, pov_hash, pov.clone()), - ).focus().unwrap(), - ).await.unwrap(); - - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerMessage( - peer_b.clone(), - send_pov_message(hash_a, pov_hash, pov.clone()), - ).focus().unwrap(), - ).await.unwrap(); - - assert_eq!(&*pov_recv.await.unwrap(), &pov); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer(peer, rep) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, BENEFIT_FRESH_POV); - } - ); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer(peer, rep) - ) => { - assert_eq!(peer, peer_b); - assert_eq!(rep, BENEFIT_LATE_POV); + #[tracing::instrument(skip(self, ctx), fields(subsystem = LOG_TARGET))] + async fn run( + self, + mut ctx: impl SubsystemContext, + ) -> SubsystemResult<()> { + let mut state = State::default(); + state.metrics = self.metrics; + + loop { + // `select_biased` is used since receiving connection notifications and + // peer view update messages may be racy and we want connection notifications + // first. + futures::select_biased! { + v = state.connection_requests.next().fuse() => handle_validator_connected(&mut state, v.peer_id), + v = ctx.recv().fuse() => { + match v? { + FromOverseer::Signal(signal) => if handle_signal( + &mut state, + &mut ctx, + signal, + ).await? { + return Ok(()); + } + FromOverseer::Communication { msg } => match msg { + PoVDistributionMessage::FetchPoV(relay_parent, descriptor, response_sender) => + handle_fetch( + &mut state, + &mut ctx, + relay_parent, + descriptor, + response_sender, + ).await, + PoVDistributionMessage::DistributePoV(relay_parent, descriptor, pov) => + handle_distribute( + &mut state, + &mut ctx, + relay_parent, + descriptor, + pov, + ).await, + PoVDistributionMessage::NetworkBridgeUpdateV1(event) => + handle_network_update( + &mut state, + &mut ctx, + event, + ).await, + } + } } - ); - }); + } + } } +} - #[test] - fn peer_punished_for_sending_bad_pov() { - let hash_a: Hash = [0; 32].into(); - - let peer_a = PeerId::random(); - - let (pov_send, _) = oneshot::channel(); - - let pov = make_pov(vec![1, 2, 3]); - let pov_hash = pov.hash(); - - let bad_pov = make_pov(vec![6, 6, 6]); - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - let mut b = BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }; - - // pov is being fetched. - b.fetching.insert(pov_hash, vec![pov_send]); - - s.insert(hash_a, b); - s - }, - peer_state: { - let mut s = HashMap::new(); - - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_a, vec![])]), - ); - - s - }, - our_view: View(vec![hash_a]), - }; - - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - - executor::block_on(async move { - // Peer A answers our request: right relay parent, awaited hash, wrong PoV. - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - send_pov_message(hash_a, pov_hash, bad_pov.clone()), - ).focus().unwrap(), - ).await.unwrap(); - - // didn't complete our sender. - assert_eq!(state.relay_parent_state[&hash_a].fetching[&pov_hash].len(), 1); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer(peer, rep) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, COST_UNEXPECTED_POV); - } - ); - }); - } - #[test] - fn peer_punished_for_sending_unexpected_pov() { - let hash_a: Hash = [0; 32].into(); - - let peer_a = PeerId::random(); - - let pov = make_pov(vec![1, 2, 3]); - let pov_hash = pov.hash(); - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - let b = BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }; - - s.insert(hash_a, b); - s - }, - peer_state: { - let mut s = HashMap::new(); - - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_a, vec![])]), - ); - - s - }, - our_view: View(vec![hash_a]), - }; - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - - executor::block_on(async move { - // Peer A answers our request: right relay parent, awaited hash, wrong PoV. - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - send_pov_message(hash_a, pov_hash, pov.clone()), - ).focus().unwrap(), - ).await.unwrap(); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer(peer, rep) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, COST_UNEXPECTED_POV); - } - ); - }); - } +#[derive(Clone)] +struct MetricsInner { + povs_distributed: prometheus::Counter, + handle_signal: prometheus::Histogram, + handle_fetch: prometheus::Histogram, + handle_distribute: prometheus::Histogram, + handle_network_update: prometheus::Histogram, +} - #[test] - fn peer_punished_for_sending_pov_out_of_our_view() { - let hash_a: Hash = [0; 32].into(); - let hash_b: Hash = [1; 32].into(); - - let peer_a = PeerId::random(); - - let pov = make_pov(vec![1, 2, 3]); - let pov_hash = pov.hash(); - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - let b = BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }; - - s.insert(hash_a, b); - s - }, - peer_state: { - let mut s = HashMap::new(); - - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_a, vec![])]), - ); - - s - }, - our_view: View(vec![hash_a]), - }; +/// Availability Distribution metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - - executor::block_on(async move { - // Peer A answers our request: right relay parent, awaited hash, wrong PoV. - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - send_pov_message(hash_b, pov_hash, pov.clone()), - ).focus().unwrap(), - ).await.unwrap(); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer(peer, rep) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, COST_UNEXPECTED_POV); - } - ); - }); +impl Metrics { + fn on_pov_distributed(&self) { + if let Some(metrics) = &self.0 { + metrics.povs_distributed.inc(); + } } - #[test] - fn peer_reported_for_awaiting_too_much() { - let hash_a: Hash = [0; 32].into(); - - let peer_a = PeerId::random(); - let n_validators = 10; - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - let b = BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators, - }; - - s.insert(hash_a, b); - s - }, - peer_state: { - let mut s = HashMap::new(); - - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_a, vec![])]), - ); - - s - }, - our_view: View(vec![hash_a]), - }; - - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - - executor::block_on(async move { - let max_plausibly_awaited = n_validators * 2; - - // The peer awaits a plausible (albeit unlikely) amount of PoVs. - for i in 0..max_plausibly_awaited { - let pov_hash = make_pov(vec![i as u8; 32]).hash(); - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - awaiting_message(hash_a, vec![pov_hash]), - ).focus().unwrap(), - ).await.unwrap(); - } - - assert_eq!(state.peer_state[&peer_a].awaited[&hash_a].len(), max_plausibly_awaited); - - // The last straw: - let last_pov_hash = make_pov(vec![max_plausibly_awaited as u8; 32]).hash(); - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - awaiting_message(hash_a, vec![last_pov_hash]), - ).focus().unwrap(), - ).await.unwrap(); - - // No more bookkeeping for you! - assert_eq!(state.peer_state[&peer_a].awaited[&hash_a].len(), max_plausibly_awaited); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer(peer, rep) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, COST_APPARENT_FLOOD); - } - ); - }); + /// Provide a timer for `handle_signal` which observes on drop. + fn time_handle_signal(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.handle_signal.start_timer()) } - #[test] - fn peer_reported_for_awaiting_outside_their_view() { - let hash_a: Hash = [0; 32].into(); - let hash_b: Hash = [1; 32].into(); - - let peer_a = PeerId::random(); - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - s.insert(hash_a, BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }); - - s.insert(hash_b, BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }); - - s - }, - peer_state: { - let mut s = HashMap::new(); - - // Peer has only hash A in its view. - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_a, vec![])]), - ); - - s - }, - our_view: View(vec![hash_a, hash_b]), - }; - - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - - executor::block_on(async move { - let pov_hash = make_pov(vec![1, 2, 3]).hash(); - - // Hash B is in our view but not the peer's - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - awaiting_message(hash_b, vec![pov_hash]), - ).focus().unwrap(), - ).await.unwrap(); - - assert!(state.peer_state[&peer_a].awaited.get(&hash_b).is_none()); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer(peer, rep) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, COST_AWAITED_NOT_IN_VIEW); - } - ); - }); + /// Provide a timer for `handle_fetch` which observes on drop. + fn time_handle_fetch(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.handle_fetch.start_timer()) } - #[test] - fn peer_reported_for_awaiting_outside_our_view() { - let hash_a: Hash = [0; 32].into(); - let hash_b: Hash = [1; 32].into(); - - let peer_a = PeerId::random(); - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - s.insert(hash_a, BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }); - - s - }, - peer_state: { - let mut s = HashMap::new(); - - // Peer has hashes A and B in their view. - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_a, vec![]), (hash_b, vec![])]), - ); - - s - }, - our_view: View(vec![hash_a]), - }; - - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - - executor::block_on(async move { - let pov_hash = make_pov(vec![1, 2, 3]).hash(); - - // Hash B is in peer's view but not ours. - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - awaiting_message(hash_b, vec![pov_hash]), - ).focus().unwrap(), - ).await.unwrap(); - - // Illegal `awaited` is ignored. - assert!(state.peer_state[&peer_a].awaited[&hash_b].is_empty()); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer(peer, rep) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, COST_AWAITED_NOT_IN_VIEW); - } - ); - }); + /// Provide a timer for `handle_distribute` which observes on drop. + fn time_handle_distribute(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.handle_distribute.start_timer()) } - #[test] - fn peer_complete_fetch_leads_to_us_completing_others() { - let hash_a: Hash = [0; 32].into(); - - let peer_a = PeerId::random(); - let peer_b = PeerId::random(); - - let (pov_send, pov_recv) = oneshot::channel(); - - let pov = make_pov(vec![1, 2, 3]); - let pov_hash = pov.hash(); - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - let mut b = BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }; - - // pov is being fetched. - b.fetching.insert(pov_hash, vec![pov_send]); - - s.insert(hash_a, b); - s - }, - peer_state: { - let mut s = HashMap::new(); - - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_a, vec![])]), - ); - - // peer B is awaiting peer A's request. - s.insert( - peer_b.clone(), - make_peer_state(vec![(hash_a, vec![pov_hash])]), - ); - - s - }, - our_view: View(vec![hash_a]), - }; - - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - - executor::block_on(async move { - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - send_pov_message(hash_a, pov_hash, pov.clone()), - ).focus().unwrap(), - ).await.unwrap(); - - assert_eq!(&*pov_recv.await.unwrap(), &pov); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer(peer, rep) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, BENEFIT_FRESH_POV); - } - ); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::SendValidationMessage(peers, message) - ) => { - assert_eq!(peers, vec![peer_b.clone()]); - assert_eq!( - message, - send_pov_message(hash_a, pov_hash, pov.clone()), - ); - } - ); - - assert!(!state.peer_state[&peer_b].awaited[&hash_a].contains(&pov_hash)); - }); + /// Provide a timer for `handle_network_update` which observes on drop. + fn time_handle_network_update(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.handle_network_update.start_timer()) } +} - #[test] - fn peer_completing_request_no_longer_awaiting() { - let hash_a: Hash = [0; 32].into(); - - let peer_a = PeerId::random(); - - let (pov_send, pov_recv) = oneshot::channel(); - - let pov = make_pov(vec![1, 2, 3]); - let pov_hash = pov.hash(); - - let mut state = State { - relay_parent_state: { - let mut s = HashMap::new(); - let mut b = BlockBasedState { - known: HashMap::new(), - fetching: HashMap::new(), - n_validators: 10, - }; - - // pov is being fetched. - b.fetching.insert(pov_hash, vec![pov_send]); - - s.insert(hash_a, b); - s - }, - peer_state: { - let mut s = HashMap::new(); - - // peer A is registered as awaiting. - s.insert( - peer_a.clone(), - make_peer_state(vec![(hash_a, vec![pov_hash])]), - ); - - s - }, - our_view: View(vec![hash_a]), +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> std::result::Result { + let metrics = MetricsInner { + povs_distributed: prometheus::register( + prometheus::Counter::new( + "parachain_povs_distributed_total", + "Number of PoVs distributed to other peers." + )?, + registry, + )?, + handle_signal: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_pov_distribution_handle_signal", + "Time spent within `pov_distribution::handle_signal`", + ) + )?, + registry, + )?, + handle_fetch: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_pov_distribution_handle_fetch", + "Time spent within `pov_distribution::handle_fetch`", + ) + )?, + registry, + )?, + handle_distribute: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_pov_distribution_handle_distribute", + "Time spent within `pov_distribution::handle_distribute`", + ) + )?, + registry, + )?, + handle_network_update: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_pov_distribution_handle_network_update", + "Time spent within `pov_distribution::handle_network_update`", + ) + )?, + registry, + )?, }; - - let pool = sp_core::testing::TaskExecutor::new(); - let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); - - executor::block_on(async move { - handle_network_update( - &mut state, - &mut ctx, - NetworkBridgeEvent::PeerMessage( - peer_a.clone(), - send_pov_message(hash_a, pov_hash, pov.clone()), - ).focus().unwrap(), - ).await.unwrap(); - - assert_eq!(&*pov_recv.await.unwrap(), &pov); - - assert_matches!( - handle.recv().await, - AllMessages::NetworkBridge( - NetworkBridgeMessage::ReportPeer(peer, rep) - ) => { - assert_eq!(peer, peer_a); - assert_eq!(rep, BENEFIT_FRESH_POV); - } - ); - - // We received the PoV from peer A, so we do not consider it awaited by peer A anymore. - assert!(!state.peer_state[&peer_a].awaited[&hash_a].contains(&pov_hash)); - }); + Ok(Metrics(Some(metrics))) } } diff --git a/node/network/pov-distribution/src/tests.rs b/node/network/pov-distribution/src/tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..285f479e76ba55c060894bf95956892b6e09f3e6 --- /dev/null +++ b/node/network/pov-distribution/src/tests.rs @@ -0,0 +1,1556 @@ +// Copyright 2020-2021 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 std::{time::Duration, sync::Arc}; + +use assert_matches::assert_matches; +use futures::executor; +use tracing::trace; + +use sp_keyring::Sr25519Keyring; + +use polkadot_primitives::v1::{ + AuthorityDiscoveryId, BlockData, CoreState, GroupRotationInfo, Id as ParaId, + ScheduledCore, ValidatorIndex, SessionIndex, SessionInfo, +}; +use polkadot_subsystem::{messages::{RuntimeApiMessage, RuntimeApiRequest}, JaegerSpan}; +use polkadot_node_subsystem_test_helpers as test_helpers; +use polkadot_node_subsystem_util::TimeoutExt; +use polkadot_node_network_protocol::{view, our_view}; + +fn make_pov(data: Vec) -> PoV { + PoV { block_data: BlockData(data) } +} + +fn make_peer_state(awaited: Vec<(Hash, Vec)>) + -> PeerState +{ + PeerState { + awaited: awaited.into_iter().map(|(rp, h)| (rp, h.into_iter().collect())).collect() + } +} + +fn validator_pubkeys(val_ids: &[Sr25519Keyring]) -> Vec { + val_ids.iter().map(|v| v.public().into()).collect() +} + +fn validator_authority_id(val_ids: &[Sr25519Keyring]) -> Vec { + val_ids.iter().map(|v| v.public().into()).collect() +} + +type VirtualOverseer = test_helpers::TestSubsystemContextHandle; + +struct TestHarness { + virtual_overseer: VirtualOverseer, +} + +fn test_harness>( + test: impl FnOnce(TestHarness) -> T, +) { + let _ = env_logger::builder() + .is_test(true) + .filter( + Some("polkadot_pov_distribution"), + log::LevelFilter::Trace, + ) + .filter( + Some(LOG_TARGET), + log::LevelFilter::Trace, + ) + .try_init(); + + let pool = sp_core::testing::TaskExecutor::new(); + + let (context, virtual_overseer) = test_helpers::make_subsystem_context(pool.clone()); + + let subsystem = super::PoVDistribution::new(Metrics::default()); + + let subsystem = subsystem.run(context); + + let test_fut = test(TestHarness { virtual_overseer }); + + futures::pin_mut!(test_fut); + futures::pin_mut!(subsystem); + + executor::block_on(future::select(test_fut, subsystem)); +} + +const TIMEOUT: Duration = Duration::from_millis(100); + +async fn overseer_send( + overseer: &mut VirtualOverseer, + msg: PoVDistributionMessage, +) { + trace!("Sending message:\n{:?}", &msg); + overseer + .send(FromOverseer::Communication { msg }) + .timeout(TIMEOUT) + .await + .expect(&format!("{:?} is more than enough for sending messages.", TIMEOUT)); +} + +async fn overseer_recv( + overseer: &mut VirtualOverseer, +) -> AllMessages { + let msg = overseer_recv_with_timeout(overseer, TIMEOUT) + .await + .expect(&format!("{:?} is more than enough to receive messages", TIMEOUT)); + + trace!("Received message:\n{:?}", &msg); + + msg +} + +async fn overseer_recv_with_timeout( + overseer: &mut VirtualOverseer, + timeout: Duration, +) -> Option { + trace!("Waiting for message..."); + overseer + .recv() + .timeout(timeout) + .await +} + +async fn overseer_signal( + overseer: &mut VirtualOverseer, + signal: OverseerSignal, +) { + overseer + .send(FromOverseer::Signal(signal)) + .timeout(TIMEOUT) + .await + .expect(&format!("{:?} is more than enough for sending signals.", TIMEOUT)); +} + +#[derive(Clone)] +struct TestState { + chain_ids: Vec, + validators: Vec, + validator_public: Vec, + validator_authority_id: Vec, + validator_peer_id: Vec, + validator_groups: (Vec>, GroupRotationInfo), + relay_parent: Hash, + availability_cores: Vec, + session_index: SessionIndex, +} + +impl Default for TestState { + fn default() -> Self { + let chain_a = ParaId::from(1); + let chain_b = ParaId::from(2); + + let chain_ids = vec![chain_a, chain_b]; + + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Ferdie, + ]; + + let validator_public = validator_pubkeys(&validators); + let validator_authority_id = validator_authority_id(&validators); + + let validator_peer_id = std::iter::repeat_with(|| PeerId::random()) + .take(validator_public.len()) + .collect(); + + let validator_groups = vec![vec![2, 0, 4], vec![1], vec![3]]; + let group_rotation_info = GroupRotationInfo { + session_start_block: 0, + group_rotation_frequency: 100, + now: 1, + }; + let validator_groups = (validator_groups, group_rotation_info); + + let availability_cores = vec![ + CoreState::Scheduled(ScheduledCore { + para_id: chain_ids[0], + collator: None, + }), + CoreState::Scheduled(ScheduledCore { + para_id: chain_ids[1], + collator: None, + }), + ]; + + let relay_parent = Hash::repeat_byte(0x05); + + Self { + chain_ids, + validators, + validator_public, + validator_authority_id, + validator_peer_id, + validator_groups, + relay_parent, + availability_cores, + session_index: 1, + } + } +} + +async fn test_validator_discovery( + virtual_overseer: &mut VirtualOverseer, + expected_relay_parent: Hash, + session_index: SessionIndex, + validator_ids: &[ValidatorId], + discovery_ids: &[AuthorityDiscoveryId], + validator_group: &[ValidatorIndex], +) { + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + assert_eq!(relay_parent, expected_relay_parent); + tx.send(Ok(session_index)).unwrap(); + } + ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionInfo(index, tx), + )) => { + assert_eq!(relay_parent, expected_relay_parent); + assert_eq!(index, session_index); + + let validators = validator_group.iter() + .map(|idx| validator_ids[*idx as usize].clone()) + .collect(); + + let discovery_keys = validator_group.iter() + .map(|idx| discovery_ids[*idx as usize].clone()) + .collect(); + + tx.send(Ok(Some(SessionInfo { + validators, + discovery_keys, + ..Default::default() + }))).unwrap(); + } + ); +} + +#[test] +fn ask_validators_for_povs() { + let test_state = TestState::default(); + + test_harness(|test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + + let pov_block = PoV { + block_data: BlockData(vec![42, 43, 44]), + }; + + let pov_hash = pov_block.hash(); + + let mut candidate = CandidateDescriptor::default(); + + let current = test_state.relay_parent.clone(); + candidate.para_id = test_state.chain_ids[0]; + candidate.pov_hash = pov_hash; + candidate.relay_parent = test_state.relay_parent; + + overseer_signal( + &mut virtual_overseer, + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: [(test_state.relay_parent, Arc::new(JaegerSpan::Disabled))][..].into(), + deactivated: [][..].into(), + }), + ).await; + + // first subsystem will try to obtain validators. + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(tx), + )) => { + assert_eq!(relay_parent, current); + tx.send(Ok(test_state.validator_public.clone())).unwrap(); + } + ); + + let (tx, pov_fetch_result) = oneshot::channel(); + + overseer_send( + &mut virtual_overseer, + PoVDistributionMessage::FetchPoV(test_state.relay_parent.clone(), candidate, tx), + ).await; + + // obtain the availability cores. + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::AvailabilityCores(tx) + )) => { + assert_eq!(relay_parent, current); + tx.send(Ok(test_state.availability_cores.clone())).unwrap(); + } + ); + + // Obtain the validator groups + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::ValidatorGroups(tx) + )) => { + assert_eq!(relay_parent, current); + tx.send(Ok(test_state.validator_groups.clone())).unwrap(); + } + ); + + // obtain the validators per relay parent + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(tx), + )) => { + assert_eq!(relay_parent, current); + tx.send(Ok(test_state.validator_public.clone())).unwrap(); + } + ); + + test_validator_discovery( + &mut virtual_overseer, + current, + test_state.session_index, + &test_state.validator_public, + &test_state.validator_authority_id, + &test_state.validator_groups.0[0], + ).await; + + // We now should connect to our validator group. + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ConnectToValidators { + validator_ids, + mut connected, + .. + } + ) => { + assert_eq!(validator_ids.len(), 3); + assert!(validator_ids.iter().all(|id| test_state.validator_authority_id.contains(id))); + + let result = vec![ + (test_state.validator_authority_id[2].clone(), test_state.validator_peer_id[2].clone()), + (test_state.validator_authority_id[0].clone(), test_state.validator_peer_id[0].clone()), + (test_state.validator_authority_id[4].clone(), test_state.validator_peer_id[4].clone()), + ]; + + result.into_iter().for_each(|r| connected.try_send(r).unwrap()); + } + ); + + for i in vec![2, 0, 4] { + overseer_send( + &mut virtual_overseer, + PoVDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerViewChange( + test_state.validator_peer_id[i].clone(), + view![current], + ) + ) + ).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( + to_peers, + payload, + )) => { + assert_eq!(to_peers, vec![test_state.validator_peer_id[i].clone()]); + assert_eq!(payload, awaiting_message(current.clone(), vec![pov_hash.clone()])); + } + ); + } + + overseer_send( + &mut virtual_overseer, + PoVDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerMessage( + test_state.validator_peer_id[2].clone(), + protocol_v1::PoVDistributionMessage::SendPoV(current, pov_hash, pov_block.clone()), + ) + ) + ).await; + + assert_eq!(*pov_fetch_result.await.unwrap(), pov_block); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridge(NetworkBridgeMessage::ReportPeer(id, benefit)) => { + assert_eq!(benefit, BENEFIT_FRESH_POV); + assert_eq!(id, test_state.validator_peer_id[2].clone()); + } + ); + + // Now let's test that if some peer is ahead of us we would still + // send `Await` on `FetchPoV` message to it. + let next_leaf = Hash::repeat_byte(10); + + // A validator's view changes and now is lets say ahead of us. + overseer_send( + &mut virtual_overseer, + PoVDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerViewChange( + test_state.validator_peer_id[2].clone(), + view![next_leaf], + ) + ) + ).await; + + let pov_block = PoV { + block_data: BlockData(vec![45, 46, 47]), + }; + + let pov_hash = pov_block.hash(); + + let candidate = CandidateDescriptor { + para_id: test_state.chain_ids[0], + pov_hash, + relay_parent: next_leaf.clone(), + ..Default::default() + }; + + let (tx, _pov_fetch_result) = oneshot::channel(); + + overseer_signal( + &mut virtual_overseer, + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: [(next_leaf, Arc::new(JaegerSpan::Disabled))][..].into(), + deactivated: [current.clone()][..].into(), + }) + ).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(tx), + )) => { + assert_eq!(relay_parent, next_leaf); + tx.send(Ok(test_state.validator_public.clone())).unwrap(); + } + ); + + overseer_send( + &mut virtual_overseer, + PoVDistributionMessage::FetchPoV(next_leaf.clone(), candidate, tx), + ).await; + + // Obtain the availability cores. + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::AvailabilityCores(tx) + )) => { + assert_eq!(relay_parent, next_leaf); + tx.send(Ok(test_state.availability_cores.clone())).unwrap(); + } + ); + + // Obtain the validator groups + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::ValidatorGroups(tx) + )) => { + assert_eq!(relay_parent, next_leaf); + tx.send(Ok(test_state.validator_groups.clone())).unwrap(); + } + ); + + // obtain the validators per relay parent + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(tx), + )) => { + assert_eq!(relay_parent, next_leaf); + tx.send(Ok(test_state.validator_public.clone())).unwrap(); + } + ); + + // obtain the validator_id to authority_id mapping + test_validator_discovery( + &mut virtual_overseer, + next_leaf, + test_state.session_index, + &test_state.validator_public, + &test_state.validator_authority_id, + &test_state.validator_groups.0[0], + ).await; + + // We now should connect to our validator group. + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ConnectToValidators { + validator_ids, + mut connected, + .. + } + ) => { + assert_eq!(validator_ids.len(), 3); + assert!(validator_ids.iter().all(|id| test_state.validator_authority_id.contains(id))); + + let result = vec![ + (test_state.validator_authority_id[2].clone(), test_state.validator_peer_id[2].clone()), + (test_state.validator_authority_id[0].clone(), test_state.validator_peer_id[0].clone()), + (test_state.validator_authority_id[4].clone(), test_state.validator_peer_id[4].clone()), + ]; + + result.into_iter().for_each(|r| connected.try_send(r).unwrap()); + } + ); + + // We already know that the leaf in question in the peer's view so we request + // a chunk from them right away. + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( + to_peers, + payload, + )) => { + assert_eq!(to_peers, vec![test_state.validator_peer_id[2].clone()]); + assert_eq!(payload, awaiting_message(next_leaf.clone(), vec![pov_hash.clone()])); + } + ); + }); +} + +#[test] +fn distributes_to_those_awaiting_and_completes_local() { + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + let peer_c = PeerId::random(); + + let (pov_send, pov_recv) = oneshot::channel(); + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + b.fetching.insert(pov_hash, vec![pov_send]); + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + // peer A has hash_a in its view and is awaiting the PoV. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![pov_hash])]), + ); + + // peer B has hash_a in its view but is not awaiting. + s.insert( + peer_b.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + // peer C doesn't have hash_a in its view but is awaiting the PoV under hash_b. + s.insert( + peer_c.clone(), + make_peer_state(vec![(hash_b, vec![pov_hash])]), + ); + + s + }, + our_view: our_view![hash_a, hash_b], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + let mut descriptor = CandidateDescriptor::default(); + descriptor.pov_hash = pov_hash; + + executor::block_on(async move { + handle_distribute( + &mut state, + &mut ctx, + hash_a, + descriptor, + Arc::new(pov.clone()), + ).await; + + assert!(!state.peer_state[&peer_a].awaited[&hash_a].contains(&pov_hash)); + assert!(state.peer_state[&peer_c].awaited[&hash_b].contains(&pov_hash)); + + // our local sender also completed + assert_eq!(&*pov_recv.await.unwrap(), &pov); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendValidationMessage(peers, message) + ) => { + assert_eq!(peers, vec![peer_a.clone()]); + assert_eq!( + message, + send_pov_message(hash_a, pov_hash, pov.clone()), + ); + } + ) + }); +} + + +#[test] +fn we_inform_peers_with_same_view_we_are_awaiting() { + + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + + let (pov_send, _) = oneshot::channel(); + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + // peer A has hash_a in its view. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + // peer B doesn't have hash_a in its view. + s.insert( + peer_b.clone(), + make_peer_state(vec![(hash_b, vec![])]), + ); + + s + }, + our_view: our_view![hash_a], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + let mut descriptor = CandidateDescriptor::default(); + descriptor.pov_hash = pov_hash; + + let para_id_1 = ParaId::from(1); + let para_id_2 = ParaId::from(2); + + descriptor.para_id = para_id_1; + + let availability_cores = vec![ + CoreState::Scheduled(ScheduledCore { + para_id: para_id_1, + collator: None, + }), + CoreState::Scheduled(ScheduledCore { + para_id: para_id_2, + collator: None, + }), + ]; + + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Ferdie, + ]; + + let validator_authority_id = validator_authority_id(&validators); + let validators = validator_pubkeys(&validators); + + let validator_peer_id: Vec<_> = std::iter::repeat_with(|| PeerId::random()) + .take(validators.len()) + .collect(); + + let validator_groups = vec![vec![2, 0, 4], vec![1], vec![3]]; + let group_rotation_info = GroupRotationInfo { + session_start_block: 0, + group_rotation_frequency: 100, + now: 1, + }; + + let validator_groups = (validator_groups, group_rotation_info); + + executor::block_on(async move { + let handle_future = handle_fetch( + &mut state, + &mut ctx, + hash_a, + descriptor, + pov_send, + ); + + let check_future = async move { + //assert_eq!(state.relay_parent_state[&hash_a].fetching[&pov_hash].len(), 1); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::AvailabilityCores(tx) + )) => { + assert_eq!(relay_parent, hash_a); + tx.send(Ok(availability_cores)).unwrap(); + } + ); + + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::ValidatorGroups(tx) + )) => { + assert_eq!(relay_parent, hash_a); + tx.send(Ok(validator_groups.clone())).unwrap(); + } + ); + + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(tx), + )) => { + assert_eq!(relay_parent, hash_a); + tx.send(Ok(validators.clone())).unwrap(); + } + ); + + test_validator_discovery( + &mut handle, + hash_a, + 1, + &validators, + &validator_authority_id, + &validator_groups.0[0], + ).await; + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ConnectToValidators { + validator_ids, + mut connected, + .. + } + ) => { + assert_eq!(validator_ids.len(), 3); + assert!(validator_ids.iter().all(|id| validator_authority_id.contains(id))); + + let result = vec![ + (validator_authority_id[2].clone(), validator_peer_id[2].clone()), + (validator_authority_id[0].clone(), validator_peer_id[0].clone()), + (validator_authority_id[4].clone(), validator_peer_id[4].clone()), + ]; + + result.into_iter().for_each(|r| connected.try_send(r).unwrap()); + } + ); + + }; + + futures::join!(handle_future, check_future); + }); +} + +#[test] +fn peer_view_change_leads_to_us_informing() { + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + + let (pov_a_send, _) = oneshot::channel(); + + let pov_a = make_pov(vec![1, 2, 3]); + let pov_a_hash = pov_a.hash(); + + let pov_b = make_pov(vec![4, 5, 6]); + let pov_b_hash = pov_b.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + // pov_a is still being fetched, whereas the fetch of pov_b has already + // completed, as implied by the empty vector. + b.fetching.insert(pov_a_hash, vec![pov_a_send]); + b.fetching.insert(pov_b_hash, vec![]); + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + // peer A doesn't yet have hash_a in its view. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_b, vec![])]), + ); + + s + }, + our_view: our_view![hash_a], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + + executor::block_on(async move { + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerViewChange(peer_a.clone(), view![hash_a, hash_b]), + ).await; + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendValidationMessage(peers, message) + ) => { + assert_eq!(peers, vec![peer_a.clone()]); + assert_eq!( + message, + awaiting_message(hash_a, vec![pov_a_hash]), + ); + } + ) + }); +} + +#[test] +fn peer_complete_fetch_and_is_rewarded() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + + let (pov_send, pov_recv) = oneshot::channel(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + // pov is being fetched. + b.fetching.insert(pov_hash, vec![pov_send]); + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + // peers A and B are functionally the same. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s.insert( + peer_b.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: our_view![hash_a], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + + executor::block_on(async move { + // Peer A answers our request before peer B. + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + send_pov_message(hash_a, pov_hash, pov.clone()), + ).focus().unwrap(), + ).await; + + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_b.clone(), + send_pov_message(hash_a, pov_hash, pov.clone()), + ).focus().unwrap(), + ).await; + + assert_eq!(&*pov_recv.await.unwrap(), &pov); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, BENEFIT_FRESH_POV); + } + ); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_b); + assert_eq!(rep, BENEFIT_LATE_POV); + } + ); + }); +} + +#[test] +fn peer_punished_for_sending_bad_pov() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + + let (pov_send, _) = oneshot::channel(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let bad_pov = make_pov(vec![6, 6, 6]); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + // pov is being fetched. + b.fetching.insert(pov_hash, vec![pov_send]); + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: our_view![hash_a], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + + executor::block_on(async move { + // Peer A answers our request: right relay parent, awaited hash, wrong PoV. + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + send_pov_message(hash_a, pov_hash, bad_pov.clone()), + ).focus().unwrap(), + ).await; + + // didn't complete our sender. + assert_eq!(state.relay_parent_state[&hash_a].fetching[&pov_hash].len(), 1); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_UNEXPECTED_POV); + } + ); + }); +} + +#[test] +fn peer_punished_for_sending_unexpected_pov() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: our_view![hash_a], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + + executor::block_on(async move { + // Peer A answers our request: right relay parent, awaited hash, wrong PoV. + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + send_pov_message(hash_a, pov_hash, pov.clone()), + ).focus().unwrap(), + ).await; + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_UNEXPECTED_POV); + } + ); + }); +} + +#[test] +fn peer_punished_for_sending_pov_out_of_our_view() { + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: our_view![hash_a], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + + executor::block_on(async move { + // Peer A answers our request: right relay parent, awaited hash, wrong PoV. + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + send_pov_message(hash_b, pov_hash, pov.clone()), + ).focus().unwrap(), + ).await; + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_UNEXPECTED_POV); + } + ); + }); +} + +#[test] +fn peer_reported_for_awaiting_too_much() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + let n_validators = 10; + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators, + }; + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: our_view![hash_a], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + + executor::block_on(async move { + let max_plausibly_awaited = n_validators * 2; + + // The peer awaits a plausible (albeit unlikely) amount of PoVs. + for i in 0..max_plausibly_awaited { + let pov_hash = make_pov(vec![i as u8; 32]).hash(); + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + awaiting_message(hash_a, vec![pov_hash]), + ).focus().unwrap(), + ).await; + } + + assert_eq!(state.peer_state[&peer_a].awaited[&hash_a].len(), max_plausibly_awaited); + + // The last straw: + let last_pov_hash = make_pov(vec![max_plausibly_awaited as u8; 32]).hash(); + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + awaiting_message(hash_a, vec![last_pov_hash]), + ).focus().unwrap(), + ).await; + + // No more bookkeeping for you! + assert_eq!(state.peer_state[&peer_a].awaited[&hash_a].len(), max_plausibly_awaited); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_APPARENT_FLOOD); + } + ); + }); +} + +#[test] +fn peer_reported_for_awaiting_outside_their_view() { + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + s.insert(hash_a, BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }); + + s.insert(hash_b, BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }); + + s + }, + peer_state: { + let mut s = HashMap::new(); + + // Peer has only hash A in its view. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + s + }, + our_view: our_view![hash_a, hash_b], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + + executor::block_on(async move { + let pov_hash = make_pov(vec![1, 2, 3]).hash(); + + // Hash B is in our view but not the peer's + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + awaiting_message(hash_b, vec![pov_hash]), + ).focus().unwrap(), + ).await; + + assert!(state.peer_state[&peer_a].awaited.get(&hash_b).is_none()); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_AWAITED_NOT_IN_VIEW); + } + ); + }); +} + +#[test] +fn peer_reported_for_awaiting_outside_our_view() { + let hash_a: Hash = [0; 32].into(); + let hash_b: Hash = [1; 32].into(); + + let peer_a = PeerId::random(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + s.insert(hash_a, BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }); + + s + }, + peer_state: { + let mut s = HashMap::new(); + + // Peer has hashes A and B in their view. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![]), (hash_b, vec![])]), + ); + + s + }, + our_view: our_view![hash_a], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + + executor::block_on(async move { + let pov_hash = make_pov(vec![1, 2, 3]).hash(); + + // Hash B is in peer's view but not ours. + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + awaiting_message(hash_b, vec![pov_hash]), + ).focus().unwrap(), + ).await; + + // Illegal `awaited` is ignored. + assert!(state.peer_state[&peer_a].awaited[&hash_b].is_empty()); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, COST_AWAITED_NOT_IN_VIEW); + } + ); + }); +} + +#[test] +fn peer_complete_fetch_leads_to_us_completing_others() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + + let (pov_send, pov_recv) = oneshot::channel(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + // pov is being fetched. + b.fetching.insert(pov_hash, vec![pov_send]); + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![])]), + ); + + // peer B is awaiting peer A's request. + s.insert( + peer_b.clone(), + make_peer_state(vec![(hash_a, vec![pov_hash])]), + ); + + s + }, + our_view: our_view![hash_a], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + + executor::block_on(async move { + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + send_pov_message(hash_a, pov_hash, pov.clone()), + ).focus().unwrap(), + ).await; + + assert_eq!(&*pov_recv.await.unwrap(), &pov); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, BENEFIT_FRESH_POV); + } + ); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendValidationMessage(peers, message) + ) => { + assert_eq!(peers, vec![peer_b.clone()]); + assert_eq!( + message, + send_pov_message(hash_a, pov_hash, pov.clone()), + ); + } + ); + + assert!(!state.peer_state[&peer_b].awaited[&hash_a].contains(&pov_hash)); + }); +} + +#[test] +fn peer_completing_request_no_longer_awaiting() { + let hash_a: Hash = [0; 32].into(); + + let peer_a = PeerId::random(); + + let (pov_send, pov_recv) = oneshot::channel(); + + let pov = make_pov(vec![1, 2, 3]); + let pov_hash = pov.hash(); + + let mut state = State { + relay_parent_state: { + let mut s = HashMap::new(); + let mut b = BlockBasedState { + known: HashMap::new(), + fetching: HashMap::new(), + n_validators: 10, + }; + + // pov is being fetched. + b.fetching.insert(pov_hash, vec![pov_send]); + + s.insert(hash_a, b); + s + }, + peer_state: { + let mut s = HashMap::new(); + + // peer A is registered as awaiting. + s.insert( + peer_a.clone(), + make_peer_state(vec![(hash_a, vec![pov_hash])]), + ); + + s + }, + our_view: our_view![hash_a], + metrics: Default::default(), + connection_requests: Default::default(), + }; + + let pool = sp_core::testing::TaskExecutor::new(); + let (mut ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + + executor::block_on(async move { + handle_network_update( + &mut state, + &mut ctx, + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + send_pov_message(hash_a, pov_hash, pov.clone()), + ).focus().unwrap(), + ).await; + + assert_eq!(&*pov_recv.await.unwrap(), &pov); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(peer, rep) + ) => { + assert_eq!(peer, peer_a); + assert_eq!(rep, BENEFIT_FRESH_POV); + } + ); + + // We received the PoV from peer A, so we do not consider it awaited by peer A anymore. + assert!(!state.peer_state[&peer_a].awaited[&hash_a].contains(&pov_hash)); + }); +} diff --git a/node/network/protocol/Cargo.toml b/node/network/protocol/Cargo.toml index abcb6ae2adda370f3778d9c7ec476d53ae3a6337..5829ccdf8268902399eaca9135b29770aa97b219 100644 --- a/node/network/protocol/Cargo.toml +++ b/node/network/protocol/Cargo.toml @@ -8,7 +8,6 @@ description = "Primitives types for the Node-side" [dependencies] polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } -parity-scale-codec = { version = "1.3.4", default-features = false, features = ["derive"] } -runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +polkadot-node-jaeger = { path = "../../jaeger" } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/protocol/src/lib.rs b/node/network/protocol/src/lib.rs index 7658048ca5c8dbf59e024676744c1a807b7f7a9e..35dc3b3a1702ad7efa758a92d1a7ba1f82be8e23 100644 --- a/node/network/protocol/src/lib.rs +++ b/node/network/protocol/src/lib.rs @@ -16,11 +16,18 @@ //! Network protocol types for parachains. -use polkadot_primitives::v1::Hash; +#![deny(unused_crate_dependencies, unused_results)] +#![warn(missing_docs)] + +use polkadot_primitives::v1::{Hash, BlockNumber}; use parity_scale_codec::{Encode, Decode}; -use std::convert::TryFrom; +use std::{convert::TryFrom, fmt, collections::HashMap}; pub use sc_network::{ReputationChange, PeerId}; +#[doc(hidden)] +pub use polkadot_node_jaeger::JaegerSpan; +#[doc(hidden)] +pub use std::sync::Arc; /// A unique identifier of a request. pub type RequestId = u64; @@ -32,6 +39,14 @@ pub type ProtocolVersion = u32; #[derive(Debug, Clone, Copy, PartialEq)] pub struct WrongVariant; +impl fmt::Display for WrongVariant { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(formatter, "Wrong message variant") + } +} + +impl std::error::Error for WrongVariant {} + /// The peer-sets that the network manages. Different subsystems will use different peer-sets. #[derive(Debug, Clone, Copy, PartialEq)] pub enum PeerSet { @@ -90,8 +105,8 @@ pub enum NetworkBridgeEvent { /// Peer's `View` has changed. PeerViewChange(PeerId, View), - /// Our `View` has changed. - OurViewChange(View), + /// Our view has changed. + OurViewChange(OurView), } macro_rules! impl_try_from { @@ -146,26 +161,125 @@ impl NetworkBridgeEvent { } } -/// A succinct representation of a peer's view. This consists of a bounded amount of chain heads. +/// Specialized wrapper around [`View`]. +/// +/// Besides the access to the view itself, it also gives access to the [`JaegerSpan`] per leave/head. +#[derive(Debug, Clone, Default)] +pub struct OurView { + view: View, + span_per_head: HashMap>, +} + +impl OurView { + /// Creates a new instance. + pub fn new(heads: impl IntoIterator)>, finalized_number: BlockNumber) -> Self { + let state_per_head = heads.into_iter().collect::>(); + + Self { + view: View { + heads: state_per_head.keys().cloned().collect(), + finalized_number, + }, + span_per_head: state_per_head, + } + } + + /// Returns the span per head map. + /// + /// For each head there exists one span in this map. + pub fn span_per_head(&self) -> &HashMap> { + &self.span_per_head + } +} + +impl PartialEq for OurView { + fn eq(&self, other: &Self) -> bool { + self.view == other.view + } +} + +impl std::ops::Deref for OurView { + type Target = View; + + fn deref(&self) -> &View { + &self.view + } +} + +/// Construct a new [`OurView`] with the given chain heads, finalized number 0 and disabled [`JaegerSpan`]'s. +/// +/// NOTE: Use for tests only. +/// +/// # Example +/// +/// ``` +/// # use polkadot_node_network_protocol::our_view; +/// # use polkadot_primitives::v1::Hash; +/// let our_view = our_view![Hash::repeat_byte(1), Hash::repeat_byte(2)]; +/// ``` +#[macro_export] +macro_rules! our_view { + ( $( $hash:expr ),* $(,)? ) => { + $crate::OurView::new( + vec![ $( $hash.clone() ),* ].into_iter().map(|h| (h, $crate::Arc::new($crate::JaegerSpan::Disabled))), + 0, + ) + }; +} + +/// A succinct representation of a peer's view. This consists of a bounded amount of chain heads +/// and the highest known finalized block number. /// /// Up to `N` (5?) chain heads. #[derive(Default, Debug, Clone, PartialEq, Eq, Encode, Decode)] -pub struct View(pub Vec); +pub struct View { + /// A bounded amount of chain heads. + pub heads: Vec, + /// The highest known finalized block number. + pub finalized_number: BlockNumber, +} + +/// Construct a new view with the given chain heads and finalized number 0. +/// +/// NOTE: Use for tests only. +/// +/// # Example +/// +/// ``` +/// # use polkadot_node_network_protocol::view; +/// # use polkadot_primitives::v1::Hash; +/// let view = view![Hash::repeat_byte(1), Hash::repeat_byte(2)]; +/// ``` +#[macro_export] +macro_rules! view { + ( $( $hash:expr ),* $(,)? ) => { + $crate::View { heads: vec![ $( $hash.clone() ),* ], finalized_number: 0 } + }; +} impl View { + /// Replace `self` with `new`. + /// + /// Returns an iterator that will yield all elements of `new` that were not part of `self`. + pub fn replace_difference(&mut self, new: View) -> impl Iterator { + let old = std::mem::replace(self, new); + + self.heads.iter().filter(move |h| !old.contains(h)) + } + /// Returns an iterator of the hashes present in `Self` but not in `other`. pub fn difference<'a>(&'a self, other: &'a View) -> impl Iterator + 'a { - self.0.iter().filter(move |h| !other.contains(h)) + self.heads.iter().filter(move |h| !other.contains(h)) } /// An iterator containing hashes present in both `Self` and in `other`. pub fn intersection<'a>(&'a self, other: &'a View) -> impl Iterator + 'a { - self.0.iter().filter(move |h| other.contains(h)) + self.heads.iter().filter(move |h| other.contains(h)) } /// Whether the view contains a given hash. pub fn contains(&self, hash: &Hash) -> bool { - self.0.contains(hash) + self.heads.contains(hash) } } @@ -173,7 +287,7 @@ impl View { pub mod v1 { use polkadot_primitives::v1::{ Hash, CollatorId, Id as ParaId, ErasureChunk, CandidateReceipt, - SignedAvailabilityBitfield, PoV, + SignedAvailabilityBitfield, PoV, CandidateHash, }; use polkadot_node_primitives::SignedFullStatement; use parity_scale_codec::{Encode, Decode}; @@ -185,7 +299,7 @@ pub mod v1 { pub enum AvailabilityDistributionMessage { /// An erasure chunk for a given candidate hash. #[codec(index = "0")] - Chunk(Hash, ErasureChunk), + Chunk(CandidateHash, ErasureChunk), } /// Network messages used by the bitfield distribution subsystem. diff --git a/node/network/statement-distribution/Cargo.toml b/node/network/statement-distribution/Cargo.toml index c92fdcf6db902876b2fb271a92d88e197a6b11cd..e0e68ac2daf24c5af9719e43a8df5d314f6c2fc7 100644 --- a/node/network/statement-distribution/Cargo.toml +++ b/node/network/statement-distribution/Cargo.toml @@ -6,23 +6,23 @@ description = "Statement Distribution Subsystem" edition = "2018" [dependencies] -futures = "0.3.5" -log = "0.4.8" -futures-timer = "3.0.2" -streamunordered = "0.5.1" +futures = "0.3.8" +tracing = "0.1.22" +tracing-futures = "0.2.4" polkadot-primitives = { path = "../../../primitives" } node-primitives = { package = "polkadot-node-primitives", path = "../../primitives" } -parity-scale-codec = "1.3.4" -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../../subsystem" } +polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-node-network-protocol = { path = "../../network/protocol" } -arrayvec = "0.5.1" -indexmap = "1.4.0" +arrayvec = "0.5.2" +indexmap = "1.6.1" [dev-dependencies] -parking_lot = "0.10.0" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } -assert_matches = "1.3.0" +assert_matches = "1.4.0" sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/network/statement-distribution/src/lib.rs b/node/network/statement-distribution/src/lib.rs index cbdc8e5845a03d85fc413adeeb3c9f0819c5e544..05ff1753f2c1bc4309f5bf598ce59113c004aa14 100644 --- a/node/network/statement-distribution/src/lib.rs +++ b/node/network/statement-distribution/src/lib.rs @@ -19,24 +19,28 @@ //! This is responsible for distributing signed statements about candidate //! validity amongst validators. +#![deny(unused_crate_dependencies)] +#![warn(missing_docs)] + use polkadot_subsystem::{ Subsystem, SubsystemResult, SubsystemContext, SpawnedSubsystem, - ActiveLeavesUpdate, FromOverseer, OverseerSignal, -}; -use polkadot_subsystem::messages::{ - AllMessages, NetworkBridgeMessage, StatementDistributionMessage, CandidateBackingMessage, - RuntimeApiMessage, RuntimeApiRequest, + ActiveLeavesUpdate, FromOverseer, OverseerSignal, PerLeafSpan, + messages::{ + AllMessages, NetworkBridgeMessage, StatementDistributionMessage, CandidateBackingMessage, + RuntimeApiMessage, RuntimeApiRequest, + }, }; +use polkadot_node_subsystem_util::metrics::{self, prometheus}; use node_primitives::SignedFullStatement; use polkadot_primitives::v1::{ - Hash, CompactStatement, ValidatorIndex, ValidatorId, SigningContext, ValidatorSignature, + Hash, CompactStatement, ValidatorIndex, ValidatorId, SigningContext, ValidatorSignature, CandidateHash, }; use polkadot_node_network_protocol::{ - v1 as protocol_v1, View, PeerId, ReputationChange as Rep, NetworkBridgeEvent, + v1 as protocol_v1, View, PeerId, ReputationChange as Rep, NetworkBridgeEvent, OurView, }; use futures::prelude::*; -use futures::channel::oneshot; +use futures::channel::{mpsc, oneshot}; use indexmap::IndexSet; use std::collections::{HashMap, HashSet}; @@ -59,20 +63,32 @@ const BENEFIT_VALID_STATEMENT_FIRST: Rep = Rep::new( /// Typically we will only keep 1, but when a validator equivocates we will need to track 2. const VC_THRESHOLD: usize = 2; +const LOG_TARGET: &str = "statement_distribution"; + /// The statement distribution subsystem. -pub struct StatementDistribution; +pub struct StatementDistribution { + // Prometheus metrics + metrics: Metrics, +} impl Subsystem for StatementDistribution where C: SubsystemContext { - type Metrics = (); - fn start(self, ctx: C) -> SpawnedSubsystem { // Swallow error because failure is fatal to the node and we log with more precision // within `run`. SpawnedSubsystem { name: "statement-distribution-subsystem", - future: run(ctx).map(|_| ()).boxed(), + future: self.run(ctx).boxed(), + } + } +} + +impl StatementDistribution { + /// Create a new Statement Distribution Subsystem + pub fn new(metrics: Metrics) -> StatementDistribution { + StatementDistribution { + metrics, } } } @@ -84,43 +100,36 @@ impl Subsystem for StatementDistribution /// via other means. #[derive(Default)] struct VcPerPeerTracker { - local_observed: arrayvec::ArrayVec<[Hash; VC_THRESHOLD]>, - remote_observed: arrayvec::ArrayVec<[Hash; VC_THRESHOLD]>, + local_observed: arrayvec::ArrayVec<[CandidateHash; VC_THRESHOLD]>, + remote_observed: arrayvec::ArrayVec<[CandidateHash; VC_THRESHOLD]>, } impl VcPerPeerTracker { - // Note that the remote should now be aware that a validator has seconded a given candidate (by hash) - // based on a message that we have sent it from our local pool. - fn note_local(&mut self, h: Hash) { + /// Note that the remote should now be aware that a validator has seconded a given candidate (by hash) + /// based on a message that we have sent it from our local pool. + fn note_local(&mut self, h: CandidateHash) { if !note_hash(&mut self.local_observed, h) { - log::warn!("Statement distribution is erroneously attempting to distribute more \ + tracing::warn!("Statement distribution is erroneously attempting to distribute more \ than {} candidate(s) per validator index. Ignoring", VC_THRESHOLD); } } - // Note that the remote should now be aware that a validator has seconded a given candidate (by hash) - // based on a message that it has sent us. - // - // Returns `true` if the peer was allowed to send us such a message, `false` otherwise. - fn note_remote(&mut self, h: Hash) -> bool { + /// Note that the remote should now be aware that a validator has seconded a given candidate (by hash) + /// based on a message that it has sent us. + /// + /// Returns `true` if the peer was allowed to send us such a message, `false` otherwise. + fn note_remote(&mut self, h: CandidateHash) -> bool { note_hash(&mut self.remote_observed, h) } } fn note_hash( - observed: &mut arrayvec::ArrayVec<[Hash; VC_THRESHOLD]>, - h: Hash, + observed: &mut arrayvec::ArrayVec<[CandidateHash; VC_THRESHOLD]>, + h: CandidateHash, ) -> bool { if observed.contains(&h) { return true; } - if observed.is_full() { - false - } else { - observed.try_push(h).expect("length of storage guarded above; \ - only panics if length exceeds capacity; qed"); - - true - } + observed.try_push(h).is_ok() } /// knowledge that a peer has about goings-on in a relay parent. @@ -128,7 +137,7 @@ fn note_hash( struct PeerRelayParentKnowledge { /// candidates that the peer is aware of. This indicates that we can /// send other statements pertaining to that candidate. - known_candidates: HashSet, + known_candidates: HashSet, /// fingerprints of all statements a peer should be aware of: those that /// were sent to the peer by us. sent_statements: HashSet<(CompactStatement, ValidatorIndex)>, @@ -138,7 +147,7 @@ struct PeerRelayParentKnowledge { /// How many candidates this peer is aware of for each given validator index. seconded_counts: HashMap, /// How many statements we've received for each candidate that we're aware of. - received_message_count: HashMap, + received_message_count: HashMap, } impl PeerRelayParentKnowledge { @@ -153,6 +162,7 @@ impl PeerRelayParentKnowledge { /// /// This returns `Some(true)` if this is the first time the peer has become aware of a /// candidate with the given hash. + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] fn send(&mut self, fingerprint: &(CompactStatement, ValidatorIndex)) -> Option { let already_known = self.sent_statements.contains(fingerprint) || self.received_statements.contains(fingerprint); @@ -201,6 +211,7 @@ impl PeerRelayParentKnowledge { /// /// This returns `Ok(true)` if this is the first time the peer has become aware of a /// candidate with given hash. + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] fn receive( &mut self, fingerprint: &(CompactStatement, ValidatorIndex), @@ -235,7 +246,7 @@ impl PeerRelayParentKnowledge { { let received_per_candidate = self.received_message_count - .entry(candidate_hash.clone()) + .entry(*candidate_hash) .or_insert(0); if *received_per_candidate >= max_message_count { @@ -267,6 +278,7 @@ impl PeerData { /// /// This returns `Some(true)` if this is the first time the peer has become aware of a /// candidate with the given hash. + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] fn send( &mut self, relay_parent: &Hash, @@ -291,13 +303,16 @@ impl PeerData { /// /// This returns `Ok(true)` if this is the first time the peer has become aware of a /// candidate with given hash. + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] fn receive( &mut self, relay_parent: &Hash, fingerprint: &(CompactStatement, ValidatorIndex), max_message_count: usize, ) -> Result { - self.view_knowledge.get_mut(relay_parent).ok_or(COST_UNEXPECTED_STATEMENT)? + self.view_knowledge + .get_mut(relay_parent) + .ok_or(COST_UNEXPECTED_STATEMENT)? .receive(fingerprint, max_message_count) } } @@ -361,7 +376,7 @@ enum NotedStatement<'a> { struct ActiveHeadData { /// All candidates we are aware of for this head, keyed by hash. - candidates: HashSet, + candidates: HashSet, /// Stored statements for circulation to peers. /// /// These are iterable in insertion order, and `Seconded` statements are always @@ -373,16 +388,23 @@ struct ActiveHeadData { session_index: sp_staking::SessionIndex, /// How many `Seconded` statements we've seen per validator. seconded_counts: HashMap, + /// A Jaeger span for this head, so we can attach data to it. + span: PerLeafSpan, } impl ActiveHeadData { - fn new(validators: Vec, session_index: sp_staking::SessionIndex) -> Self { + fn new( + validators: Vec, + session_index: sp_staking::SessionIndex, + span: PerLeafSpan, + ) -> Self { ActiveHeadData { candidates: Default::default(), statements: Default::default(), validators, session_index, seconded_counts: Default::default(), + span, } } @@ -400,6 +422,7 @@ impl ActiveHeadData { /// /// Any other statements or those that reference a candidate we are not aware of cannot be accepted /// and will return `NotedStatement::NotUseful`. + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] fn note_statement(&mut self, statement: SignedFullStatement) -> NotedStatement { let validator_index = statement.validator_index(); let comparator = StoredStatementComparator { @@ -453,7 +476,7 @@ impl ActiveHeadData { } /// Get an iterator over all statements for the active head that are for a particular candidate. - fn statements_about(&self, candidate_hash: Hash) + fn statements_about(&self, candidate_hash: CandidateHash) -> impl Iterator + '_ { self.statements().filter(move |s| s.compact().candidate_hash() == &candidate_hash) @@ -476,51 +499,84 @@ fn check_statement_signature( .and_then(|v| statement.check_signature(&signing_context, v)) } +type StatementListeners = Vec>; + +/// Informs all registered listeners about a newly received statement. +/// +/// Removes all closed listeners. +#[tracing::instrument(level = "trace", skip(listeners), fields(subsystem = LOG_TARGET))] +async fn inform_statement_listeners( + statement: &SignedFullStatement, + listeners: &mut StatementListeners, +) { + // Ignore the errors since these will be removed later. + stream::iter(listeners.iter_mut()).for_each_concurrent( + None, + |listener| async move { + let _ = listener.send(statement.clone()).await; + } + ).await; + // Remove any closed listeners. + listeners.retain(|tx| !tx.is_closed()); +} + /// Places the statement in storage if it is new, and then /// circulates the statement to all peers who have not seen it yet, and /// sends all statements dependent on that statement to peers who could previously not receive /// them but now can. +#[tracing::instrument(level = "trace", skip(peers, ctx, active_heads, metrics), fields(subsystem = LOG_TARGET))] async fn circulate_statement_and_dependents( peers: &mut HashMap, active_heads: &mut HashMap, ctx: &mut impl SubsystemContext, relay_parent: Hash, statement: SignedFullStatement, -) -> SubsystemResult<()> { - if let Some(active_head)= active_heads.get_mut(&relay_parent) { - - // First circulate the statement directly to all peers needing it. - // The borrow of `active_head` needs to encompass only this (Rust) statement. - let outputs: Option<(Hash, Vec)> = { - match active_head.note_statement(statement) { - NotedStatement::Fresh(stored) => Some(( - stored.compact().candidate_hash().clone(), - circulate_statement(peers, ctx, relay_parent, stored).await?, - )), - _ => None, - } - }; + metrics: &Metrics, +) { + let active_head = match active_heads.get_mut(&relay_parent) { + Some(res) => res, + None => return, + }; - // Now send dependent statements to all peers needing them, if any. - if let Some((candidate_hash, peers_needing_dependents)) = outputs { - for peer in peers_needing_dependents { - if let Some(peer_data) = peers.get_mut(&peer) { - // defensive: the peer data should always be some because the iterator - // of peers is derived from the set of peers. - send_statements_about( - peer, - peer_data, - ctx, - relay_parent, - candidate_hash, - &*active_head - ).await?; - } + let _span = { + let mut span = active_head.span.child("circulate-statement"); + span.add_string_tag( + "candidate-hash", + &format!("{:?}", statement.payload().candidate_hash().0), + ); + span + }; + + // First circulate the statement directly to all peers needing it. + // The borrow of `active_head` needs to encompass only this (Rust) statement. + let outputs: Option<(CandidateHash, Vec)> = { + match active_head.note_statement(statement) { + NotedStatement::Fresh(stored) => Some(( + *stored.compact().candidate_hash(), + circulate_statement(peers, ctx, relay_parent, stored).await, + )), + _ => None, + } + }; + + // Now send dependent statements to all peers needing them, if any. + if let Some((candidate_hash, peers_needing_dependents)) = outputs { + for peer in peers_needing_dependents { + if let Some(peer_data) = peers.get_mut(&peer) { + // defensive: the peer data should always be some because the iterator + // of peers is derived from the set of peers. + send_statements_about( + peer, + peer_data, + ctx, + relay_parent, + candidate_hash, + &*active_head, + metrics, + ).await; } } } - - Ok(()) } fn statement_message(relay_parent: Hash, statement: SignedFullStatement) @@ -533,12 +589,13 @@ fn statement_message(relay_parent: Hash, statement: SignedFullStatement) /// Circulates a statement to all peers who have not seen it yet, and returns /// an iterator over peers who need to have dependent statements sent. +#[tracing::instrument(level = "trace", skip(peers, ctx), fields(subsystem = LOG_TARGET))] async fn circulate_statement( peers: &mut HashMap, ctx: &mut impl SubsystemContext, relay_parent: Hash, stored: &StoredStatement, -) -> SubsystemResult> { +) -> Vec { let fingerprint = stored.fingerprint(); let mut peers_to_send = HashMap::new(); @@ -555,25 +612,27 @@ async fn circulate_statement( ctx.send_message(AllMessages::NetworkBridge(NetworkBridgeMessage::SendValidationMessage( peers_to_send.keys().cloned().collect(), payload, - ))).await?; + ))).await; } - Ok(peers_to_send.into_iter().filter_map(|(peer, needs_dependent)| if needs_dependent { + peers_to_send.into_iter().filter_map(|(peer, needs_dependent)| if needs_dependent { Some(peer) } else { None - }).collect()) + }).collect() } /// Send all statements about a given candidate hash to a peer. +#[tracing::instrument(level = "trace", skip(peer_data, ctx, active_head, metrics), fields(subsystem = LOG_TARGET))] async fn send_statements_about( peer: PeerId, peer_data: &mut PeerData, ctx: &mut impl SubsystemContext, relay_parent: Hash, - candidate_hash: Hash, + candidate_hash: CandidateHash, active_head: &ActiveHeadData, -) -> SubsystemResult<()> { + metrics: &Metrics, +) { for statement in active_head.statements_about(candidate_hash) { if peer_data.send(&relay_parent, &statement.fingerprint()).is_some() { let payload = statement_message( @@ -583,21 +642,23 @@ async fn send_statements_about( ctx.send_message(AllMessages::NetworkBridge( NetworkBridgeMessage::SendValidationMessage(vec![peer.clone()], payload) - )).await?; + )).await; + + metrics.on_statement_distributed(); } } - - Ok(()) } /// Send all statements at a given relay-parent to a peer. +#[tracing::instrument(level = "trace", skip(peer_data, ctx, active_head, metrics), fields(subsystem = LOG_TARGET))] async fn send_statements( peer: PeerId, peer_data: &mut PeerData, ctx: &mut impl SubsystemContext, relay_parent: Hash, - active_head: &ActiveHeadData -) -> SubsystemResult<()> { + active_head: &ActiveHeadData, + metrics: &Metrics, +) { for statement in active_head.statements() { if peer_data.send(&relay_parent, &statement.fingerprint()).is_some() { let payload = statement_message( @@ -607,18 +668,18 @@ async fn send_statements( ctx.send_message(AllMessages::NetworkBridge( NetworkBridgeMessage::SendValidationMessage(vec![peer.clone()], payload) - )).await?; + )).await; + + metrics.on_statement_distributed(); } } - - Ok(()) } async fn report_peer( ctx: &mut impl SubsystemContext, peer: PeerId, rep: Rep, -) -> SubsystemResult<()> { +) { ctx.send_message(AllMessages::NetworkBridge( NetworkBridgeMessage::ReportPeer(peer, rep) )).await @@ -628,7 +689,8 @@ async fn report_peer( // if we were not already aware of it, along with the corresponding relay-parent. // // This function checks the signature and ensures the statement is compatible with our -// view. +// view. It also notifies candidate backing if the statement was previously unknown. +#[tracing::instrument(level = "trace", skip(peer_data, ctx, active_heads, metrics), fields(subsystem = LOG_TARGET))] async fn handle_incoming_message<'a>( peer: PeerId, peer_data: &mut PeerData, @@ -636,13 +698,16 @@ async fn handle_incoming_message<'a>( active_heads: &'a mut HashMap, ctx: &mut impl SubsystemContext, message: protocol_v1::StatementDistributionMessage, -) -> SubsystemResult> { + metrics: &Metrics, + statement_listeners: &mut StatementListeners, +) -> Option<(Hash, &'a StoredStatement)> { let (relay_parent, statement) = match message { protocol_v1::StatementDistributionMessage::Statement(r, s) => (r, s), }; if !our_view.contains(&relay_parent) { - return report_peer(ctx, peer, COST_UNEXPECTED_STATEMENT).await.map(|_| None); + report_peer(ctx, peer, COST_UNEXPECTED_STATEMENT).await; + return None; } let active_head = match active_heads.get_mut(&relay_parent) { @@ -650,14 +715,32 @@ async fn handle_incoming_message<'a>( None => { // This should never be out-of-sync with our view if the view updates // correspond to actual `StartWork` messages. So we just log and ignore. - log::warn!("Our view out-of-sync with active heads. Head {} not found", relay_parent); - return Ok(None); + tracing::warn!( + requested_relay_parent = %relay_parent, + "our view out-of-sync with active heads; head not found", + ); + return None; } }; + let candidate_hash = statement.payload().candidate_hash(); + let handle_incoming_span = { + let mut span = active_head.span.child("handle-incoming"); + span.add_string_tag( + "candidate-hash", + &format!("{:?}", candidate_hash.0), + ); + span.add_string_tag( + "peer-id", + &peer.to_base58(), + ); + span + }; + // check the signature on the statement. if let Err(()) = check_statement_signature(&active_head, relay_parent, &statement) { - return report_peer(ctx, peer, COST_INVALID_SIGNATURE).await.map(|_| None); + report_peer(ctx, peer, COST_INVALID_SIGNATURE).await; + return None; } // Ensure the statement is stored in the peer data. @@ -668,8 +751,8 @@ async fn handle_incoming_message<'a>( let max_message_count = active_head.validators.len() * 2; match peer_data.receive(&relay_parent, &fingerprint, max_message_count) { Err(rep) => { - report_peer(ctx, peer, rep).await?; - return Ok(None) + report_peer(ctx, peer, rep).await; + return None; } Ok(true) => { // Send the peer all statements concerning the candidate that we have, @@ -679,36 +762,51 @@ async fn handle_incoming_message<'a>( peer_data, ctx, relay_parent, - fingerprint.0.candidate_hash().clone(), + candidate_hash, &*active_head, - ).await? + metrics, + ).await; } Ok(false) => {} } + inform_statement_listeners(&statement, statement_listeners).await; + // Note: `peer_data.receive` already ensures that the statement is not an unbounded equivocation // or unpinned to a seconded candidate. So it is safe to place it into the storage. match active_head.note_statement(statement) { - NotedStatement::NotUseful => Ok(None), + NotedStatement::NotUseful => None, NotedStatement::UsefulButKnown => { - report_peer(ctx, peer, BENEFIT_VALID_STATEMENT).await?; - Ok(None) + report_peer(ctx, peer, BENEFIT_VALID_STATEMENT).await; + None } NotedStatement::Fresh(statement) => { - report_peer(ctx, peer, BENEFIT_VALID_STATEMENT_FIRST).await?; - Ok(Some((relay_parent, statement))) + report_peer(ctx, peer, BENEFIT_VALID_STATEMENT_FIRST).await; + + let mut _span = handle_incoming_span.child("notify-backing"); + + // When we receive a new message from a peer, we forward it to the + // candidate backing subsystem. + let message = AllMessages::CandidateBacking( + CandidateBackingMessage::Statement(relay_parent, statement.statement.clone()) + ); + ctx.send_message(message).await; + + Some((relay_parent, statement)) } } } /// Update a peer's view. Sends all newly unlocked statements based on the previous +#[tracing::instrument(level = "trace", skip(peer_data, ctx, active_heads, metrics), fields(subsystem = LOG_TARGET))] async fn update_peer_view_and_send_unlocked( peer: PeerId, peer_data: &mut PeerData, ctx: &mut impl SubsystemContext, active_heads: &HashMap, new_view: View, -) -> SubsystemResult<()> { + metrics: &Metrics, +) { let old_view = std::mem::replace(&mut peer_data.view, new_view); // Remove entries for all relay-parents in the old view but not the new. @@ -729,59 +827,65 @@ async fn update_peer_view_and_send_unlocked( ctx, new, active_head, - ).await?; + metrics, + ).await; } } - - Ok(()) } +#[tracing::instrument(level = "trace", skip(peers, active_heads, ctx, metrics), fields(subsystem = LOG_TARGET))] async fn handle_network_update( peers: &mut HashMap, active_heads: &mut HashMap, ctx: &mut impl SubsystemContext, - our_view: &mut View, + our_view: &mut OurView, update: NetworkBridgeEvent, -) -> SubsystemResult<()> { + metrics: &Metrics, + statement_listeners: &mut StatementListeners, +) { match update { NetworkBridgeEvent::PeerConnected(peer, _role) => { peers.insert(peer, PeerData { view: Default::default(), view_knowledge: Default::default(), }); - - Ok(()) } NetworkBridgeEvent::PeerDisconnected(peer) => { peers.remove(&peer); - Ok(()) } NetworkBridgeEvent::PeerMessage(peer, message) => { - match peers.get_mut(&peer) { + let handled_incoming = match peers.get_mut(&peer) { Some(data) => { - let new_stored = handle_incoming_message( + handle_incoming_message( peer, data, &*our_view, active_heads, ctx, message, - ).await?; - - if let Some((relay_parent, new)) = new_stored { - // When we receive a new message from a peer, we forward it to the - // candidate backing subsystem. - let message = AllMessages::CandidateBacking( - CandidateBackingMessage::Statement(relay_parent, new.statement.clone()) - ); - ctx.send_message(message).await?; - } - - Ok(()) + metrics, + statement_listeners, + ).await } - None => Ok(()), - } + None => None, + }; + // if we got a fresh message, we need to circulate it to all peers. + if let Some((relay_parent, statement)) = handled_incoming { + // we can ignore the set of peers who this function returns as now expecting + // dependent statements. + // + // we have the invariant in this subsystem that we never store a `Valid` or `Invalid` + // statement before a `Seconded` statement. `Seconded` statements are the only ones + // that require dependents. Thus, if this is a `Seconded` statement for a candidate we + // were not aware of before, we cannot have any dependent statements from the candidate. + let _ = circulate_statement( + peers, + ctx, + relay_parent, + statement, + ).await; + } } NetworkBridgeEvent::PeerViewChange(peer, view) => { match peers.get_mut(&peer) { @@ -792,9 +896,10 @@ async fn handle_network_update( ctx, &*active_heads, view, + metrics, ).await } - None => Ok(()), + None => (), } } NetworkBridgeEvent::OurViewChange(view) => { @@ -803,107 +908,218 @@ async fn handle_network_update( for new in our_view.difference(&old_view) { if !active_heads.contains_key(&new) { - log::warn!(target: "statement_distribution", "Our network bridge view update \ + tracing::warn!( + target: LOG_TARGET, + unknown_hash = %new, + "Our network bridge view update \ inconsistent with `StartWork` messages we have received from overseer. \ - Contains unknown hash {}", new); + Contains unknown hash.", + ); } } - - Ok(()) } } } -async fn run( - mut ctx: impl SubsystemContext, -) -> SubsystemResult<()> { - let mut peers: HashMap = HashMap::new(); - let mut our_view = View::default(); - let mut active_heads: HashMap = HashMap::new(); - - loop { - let message = ctx.recv().await?; - match message { - FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { activated, .. })) => { - for relay_parent in activated { - let (validators, session_index) = { - let (val_tx, val_rx) = oneshot::channel(); - let (session_tx, session_rx) = oneshot::channel(); - - let val_message = AllMessages::RuntimeApi( - RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::Validators(val_tx), - ), - ); - let session_message = AllMessages::RuntimeApi( - RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::SessionIndexForChild(session_tx), - ), - ); - - ctx.send_messages( - std::iter::once(val_message).chain(std::iter::once(session_message)) - ).await?; - - match (val_rx.await?, session_rx.await?) { - (Ok(v), Ok(s)) => (v, s), - (Err(e), _) | (_, Err(e)) => { - log::warn!( - target: "statement_distribution", - "Failed to fetch runtime API data for active leaf: {:?}", - e, - ); - - // Lacking this bookkeeping might make us behave funny, although - // not in any slashable way. But we shouldn't take down the node - // on what are likely spurious runtime API errors. - continue; +impl StatementDistribution { + #[tracing::instrument(skip(self, ctx), fields(subsystem = LOG_TARGET))] + async fn run( + self, + mut ctx: impl SubsystemContext, + ) -> SubsystemResult<()> { + let mut peers: HashMap = HashMap::new(); + let mut our_view = OurView::default(); + let mut active_heads: HashMap = HashMap::new(); + let mut statement_listeners = StatementListeners::new(); + let metrics = self.metrics; + + loop { + let message = ctx.recv().await?; + match message { + FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { activated, .. })) => { + let _timer = metrics.time_active_leaves_update(); + + for (relay_parent, span) in activated { + let span = PerLeafSpan::new(span, "statement-distribution"); + + let (validators, session_index) = { + let (val_tx, val_rx) = oneshot::channel(); + let (session_tx, session_rx) = oneshot::channel(); + + let val_message = AllMessages::RuntimeApi( + RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Validators(val_tx), + ), + ); + let session_message = AllMessages::RuntimeApi( + RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(session_tx), + ), + ); + + ctx.send_messages( + std::iter::once(val_message).chain(std::iter::once(session_message)) + ).await; + + match (val_rx.await?, session_rx.await?) { + (Ok(v), Ok(s)) => (v, s), + (Err(e), _) | (_, Err(e)) => { + tracing::warn!( + target: LOG_TARGET, + err = ?e, + "Failed to fetch runtime API data for active leaf", + ); + + // Lacking this bookkeeping might make us behave funny, although + // not in any slashable way. But we shouldn't take down the node + // on what are likely spurious runtime API errors. + continue; + } } - } - }; + }; - active_heads.entry(relay_parent) - .or_insert(ActiveHeadData::new(validators, session_index)); + active_heads.entry(relay_parent) + .or_insert(ActiveHeadData::new(validators, session_index, span)); + } + } + FromOverseer::Signal(OverseerSignal::BlockFinalized(..)) => { + // do nothing + } + FromOverseer::Signal(OverseerSignal::Conclude) => break, + FromOverseer::Communication { msg } => match msg { + StatementDistributionMessage::Share(relay_parent, statement) => { + let _timer = metrics.time_share(); + + inform_statement_listeners( + &statement, + &mut statement_listeners, + ).await; + circulate_statement_and_dependents( + &mut peers, + &mut active_heads, + &mut ctx, + relay_parent, + statement, + &metrics, + ).await; + } + StatementDistributionMessage::NetworkBridgeUpdateV1(event) => { + let _timer = metrics.time_network_bridge_update_v1(); + + handle_network_update( + &mut peers, + &mut active_heads, + &mut ctx, + &mut our_view, + event, + &metrics, + &mut statement_listeners, + ).await; + } + StatementDistributionMessage::RegisterStatementListener(tx) => { + statement_listeners.push(tx); + } } - } - FromOverseer::Signal(OverseerSignal::BlockFinalized(_block_hash)) => { - // do nothing - } - FromOverseer::Signal(OverseerSignal::Conclude) => break, - FromOverseer::Communication { msg } => match msg { - StatementDistributionMessage::Share(relay_parent, statement) => - circulate_statement_and_dependents( - &mut peers, - &mut active_heads, - &mut ctx, - relay_parent, - statement, - ).await?, - StatementDistributionMessage::NetworkBridgeUpdateV1(event) => - handle_network_update( - &mut peers, - &mut active_heads, - &mut ctx, - &mut our_view, - event, - ).await?, } } + Ok(()) + } +} + +#[derive(Clone)] +struct MetricsInner { + statements_distributed: prometheus::Counter, + active_leaves_update: prometheus::Histogram, + share: prometheus::Histogram, + network_bridge_update_v1: prometheus::Histogram, +} + +/// Statement Distribution metrics. +#[derive(Default, Clone)] +pub struct Metrics(Option); + +impl Metrics { + fn on_statement_distributed(&self) { + if let Some(metrics) = &self.0 { + metrics.statements_distributed.inc(); + } + } + + /// Provide a timer for `active_leaves_update` which observes on drop. + fn time_active_leaves_update(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.active_leaves_update.start_timer()) + } + + /// Provide a timer for `share` which observes on drop. + fn time_share(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.share.start_timer()) + } + + /// Provide a timer for `network_bridge_update_v1` which observes on drop. + fn time_network_bridge_update_v1(&self) -> Option { + self.0.as_ref().map(|metrics| metrics.network_bridge_update_v1.start_timer()) + } +} + +impl metrics::Metrics for Metrics { + fn try_register(registry: &prometheus::Registry) -> std::result::Result { + let metrics = MetricsInner { + statements_distributed: prometheus::register( + prometheus::Counter::new( + "parachain_statements_distributed_total", + "Number of candidate validity statements distributed to other peers." + )?, + registry, + )?, + active_leaves_update: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_statement_distribution_active_leaves_update", + "Time spent within `statement_distribution::active_leaves_update`", + ) + )?, + registry, + )?, + share: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_statement_distribution_share", + "Time spent within `statement_distribution::share`", + ) + )?, + registry, + )?, + network_bridge_update_v1: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "parachain_statement_distribution_network_bridge_update_v1", + "Time spent within `statement_distribution::network_bridge_update_v1`", + ) + )?, + registry, + )?, + }; + Ok(Metrics(Some(metrics))) } - Ok(()) } #[cfg(test)] mod tests { use super::*; + use std::sync::Arc; use sp_keyring::Sr25519Keyring; + use sp_application_crypto::AppKey; use node_primitives::Statement; use polkadot_primitives::v1::CommittedCandidateReceipt; use assert_matches::assert_matches; - use futures::executor; + use futures::executor::{self, block_on}; + use sp_keystore::{CryptoStore, SyncCryptoStorePtr, SyncCryptoStore}; + use sc_keystore::LocalKeystore; + use polkadot_node_network_protocol::{view, ObservedRole, our_view}; + use polkadot_subsystem::JaegerSpan; #[test] fn active_head_accepts_only_2_seconded_per_validator() { @@ -941,15 +1157,28 @@ mod tests { c }; - let mut head_data = ActiveHeadData::new(validators, session_index); + let mut head_data = ActiveHeadData::new( + validators, + session_index, + PerLeafSpan::new(Arc::new(JaegerSpan::Disabled), "test"), + ); + + let keystore: SyncCryptoStorePtr = Arc::new(LocalKeystore::in_memory()); + let alice_public = SyncCryptoStore::sr25519_generate_new( + &*keystore, ValidatorId::ID, Some(&Sr25519Keyring::Alice.to_seed()) + ).unwrap(); + let bob_public = SyncCryptoStore::sr25519_generate_new( + &*keystore, ValidatorId::ID, Some(&Sr25519Keyring::Bob.to_seed()) + ).unwrap(); // note A - let a_seconded_val_0 = SignedFullStatement::sign( + let a_seconded_val_0 = block_on(SignedFullStatement::sign( + &keystore, Statement::Seconded(candidate_a.clone()), &signing_context, 0, - &Sr25519Keyring::Alice.pair().into(), - ); + &alice_public.into(), + )).expect("should be signed"); let noted = head_data.note_statement(a_seconded_val_0.clone()); assert_matches!(noted, NotedStatement::Fresh(_)); @@ -960,50 +1189,54 @@ mod tests { assert_matches!(noted, NotedStatement::UsefulButKnown); // note B - let noted = head_data.note_statement(SignedFullStatement::sign( + let noted = head_data.note_statement(block_on(SignedFullStatement::sign( + &keystore, Statement::Seconded(candidate_b.clone()), &signing_context, 0, - &Sr25519Keyring::Alice.pair().into(), - )); + &alice_public.into(), + )).expect("should be signed")); assert_matches!(noted, NotedStatement::Fresh(_)); // note C (beyond 2 - ignored) - let noted = head_data.note_statement(SignedFullStatement::sign( + let noted = head_data.note_statement(block_on(SignedFullStatement::sign( + &keystore, Statement::Seconded(candidate_c.clone()), &signing_context, 0, - &Sr25519Keyring::Alice.pair().into(), - )); + &alice_public.into(), + )).expect("should be signed")); assert_matches!(noted, NotedStatement::NotUseful); // note B (new validator) - let noted = head_data.note_statement(SignedFullStatement::sign( + let noted = head_data.note_statement(block_on(SignedFullStatement::sign( + &keystore, Statement::Seconded(candidate_b.clone()), &signing_context, 1, - &Sr25519Keyring::Bob.pair().into(), - )); + &bob_public.into(), + )).expect("should be signed")); assert_matches!(noted, NotedStatement::Fresh(_)); // note C (new validator) - let noted = head_data.note_statement(SignedFullStatement::sign( + let noted = head_data.note_statement(block_on(SignedFullStatement::sign( + &keystore, Statement::Seconded(candidate_c.clone()), &signing_context, 1, - &Sr25519Keyring::Bob.pair().into(), - )); + &bob_public.into(), + )).expect("should be signed")); assert_matches!(noted, NotedStatement::Fresh(_)); } #[test] fn note_local_works() { - let hash_a: Hash = [1; 32].into(); - let hash_b: Hash = [2; 32].into(); + let hash_a = CandidateHash([1; 32].into()); + let hash_b = CandidateHash([2; 32].into()); let mut per_peer_tracker = VcPerPeerTracker::default(); per_peer_tracker.note_local(hash_a.clone()); @@ -1018,9 +1251,9 @@ mod tests { #[test] fn note_remote_works() { - let hash_a: Hash = [1; 32].into(); - let hash_b: Hash = [2; 32].into(); - let hash_c: Hash = [3; 32].into(); + let hash_a = CandidateHash([1; 32].into()); + let hash_b = CandidateHash([2; 32].into()); + let hash_c = CandidateHash([3; 32].into()); let mut per_peer_tracker = VcPerPeerTracker::default(); assert!(per_peer_tracker.note_remote(hash_a.clone())); @@ -1040,7 +1273,7 @@ mod tests { fn per_peer_relay_parent_knowledge_send() { let mut knowledge = PeerRelayParentKnowledge::default(); - let hash_a: Hash = [1; 32].into(); + let hash_a = CandidateHash([1; 32].into()); // Sending an un-pinned statement should not work and should have no effect. assert!(knowledge.send(&(CompactStatement::Valid(hash_a), 0)).is_none()); @@ -1072,7 +1305,7 @@ mod tests { fn cant_send_after_receiving() { let mut knowledge = PeerRelayParentKnowledge::default(); - let hash_a: Hash = [1; 32].into(); + let hash_a = CandidateHash([1; 32].into()); assert!(knowledge.receive(&(CompactStatement::Candidate(hash_a), 0), 3).unwrap()); assert!(knowledge.send(&(CompactStatement::Candidate(hash_a), 0)).is_none()); } @@ -1081,7 +1314,7 @@ mod tests { fn per_peer_relay_parent_knowledge_receive() { let mut knowledge = PeerRelayParentKnowledge::default(); - let hash_a: Hash = [1; 32].into(); + let hash_a = CandidateHash([1; 32].into()); assert_eq!( knowledge.receive(&(CompactStatement::Valid(hash_a), 0), 3), @@ -1118,8 +1351,8 @@ mod tests { assert_eq!(knowledge.received_statements.len(), 3); // number of prior `Ok`s. // Now make sure that the seconding limit is respected. - let hash_b: Hash = [2; 32].into(); - let hash_c: Hash = [3; 32].into(); + let hash_b = CandidateHash([2; 32].into()); + let hash_c = CandidateHash([3; 32].into()); assert_eq!( knowledge.receive(&(CompactStatement::Candidate(hash_b), 0), 3), @@ -1145,9 +1378,9 @@ mod tests { #[test] fn peer_view_update_sends_messages() { - let hash_a = [1; 32].into(); - let hash_b = [2; 32].into(); - let hash_c = [3; 32].into(); + let hash_a = Hash::repeat_byte(1); + let hash_b = Hash::repeat_byte(2); + let hash_c = Hash::repeat_byte(3); let candidate = { let mut c = CommittedCandidateReceipt::default(); @@ -1157,8 +1390,8 @@ mod tests { }; let candidate_hash = candidate.hash(); - let old_view = View(vec![hash_a, hash_b]); - let new_view = View(vec![hash_b, hash_c]); + let old_view = view![hash_a, hash_b]; + let new_view = view![hash_b, hash_c]; let mut active_heads = HashMap::new(); let validators = vec![ @@ -1173,33 +1406,52 @@ mod tests { session_index, }; + let keystore: SyncCryptoStorePtr = Arc::new(LocalKeystore::in_memory()); + + let alice_public = SyncCryptoStore::sr25519_generate_new( + &*keystore, ValidatorId::ID, Some(&Sr25519Keyring::Alice.to_seed()) + ).unwrap(); + let bob_public = SyncCryptoStore::sr25519_generate_new( + &*keystore, ValidatorId::ID, Some(&Sr25519Keyring::Bob.to_seed()) + ).unwrap(); + let charlie_public = SyncCryptoStore::sr25519_generate_new( + &*keystore, ValidatorId::ID, Some(&Sr25519Keyring::Charlie.to_seed()) + ).unwrap(); + let new_head_data = { - let mut data = ActiveHeadData::new(validators, session_index); + let mut data = ActiveHeadData::new( + validators, + session_index, + PerLeafSpan::new(Arc::new(JaegerSpan::Disabled), "test"), + ); - let noted = data.note_statement(SignedFullStatement::sign( + let noted = data.note_statement(block_on(SignedFullStatement::sign( + &keystore, Statement::Seconded(candidate.clone()), &signing_context, 0, - &Sr25519Keyring::Alice.pair().into(), - )); + &alice_public.into(), + )).expect("should be signed")); assert_matches!(noted, NotedStatement::Fresh(_)); - let noted = data.note_statement(SignedFullStatement::sign( + let noted = data.note_statement(block_on(SignedFullStatement::sign( + &keystore, Statement::Valid(candidate_hash), &signing_context, 1, - &Sr25519Keyring::Bob.pair().into(), - )); + &bob_public.into(), + )).expect("should be signed")); assert_matches!(noted, NotedStatement::Fresh(_)); - let noted = data.note_statement(SignedFullStatement::sign( + let noted = data.note_statement(block_on(SignedFullStatement::sign( + &keystore, Statement::Valid(candidate_hash), &signing_context, 2, - &Sr25519Keyring::Charlie.pair().into(), - )); + &charlie_public.into(), + )).expect("should be signed")); assert_matches!(noted, NotedStatement::Fresh(_)); @@ -1231,7 +1483,8 @@ mod tests { &mut ctx, &active_heads, new_view.clone(), - ).await.unwrap(); + &Default::default(), + ).await; assert_eq!(peer_data.view, new_view); assert!(!peer_data.view_knowledge.contains_key(&hash_a)); @@ -1277,9 +1530,9 @@ mod tests { #[test] fn circulated_statement_goes_to_all_peers_with_view() { - let hash_a = [1; 32].into(); - let hash_b = [2; 32].into(); - let hash_c = [3; 32].into(); + let hash_a = Hash::repeat_byte(1); + let hash_b = Hash::repeat_byte(2); + let hash_c = Hash::repeat_byte(3); let candidate = { let mut c = CommittedCandidateReceipt::default(); @@ -1292,15 +1545,15 @@ mod tests { let peer_b = PeerId::random(); let peer_c = PeerId::random(); - let peer_a_view = View(vec![hash_a]); - let peer_b_view = View(vec![hash_a, hash_b]); - let peer_c_view = View(vec![hash_b, hash_c]); + let peer_a_view = view![hash_a]; + let peer_b_view = view![hash_a, hash_b]; + let peer_c_view = view![hash_b, hash_c]; let session_index = 1; let peer_data_from_view = |view: View| PeerData { view: view.clone(), - view_knowledge: view.0.iter().map(|v| (v.clone(), Default::default())).collect(), + view_knowledge: view.heads.iter().map(|v| (v.clone(), Default::default())).collect(), }; let mut peer_data: HashMap<_, _> = vec![ @@ -1319,12 +1572,18 @@ mod tests { session_index, }; + let keystore: SyncCryptoStorePtr = Arc::new(LocalKeystore::in_memory()); + let alice_public = CryptoStore::sr25519_generate_new( + &*keystore, ValidatorId::ID, Some(&Sr25519Keyring::Alice.to_seed()) + ).await.unwrap(); + let statement = SignedFullStatement::sign( + &keystore, Statement::Seconded(candidate), &signing_context, 0, - &Sr25519Keyring::Alice.pair().into(), - ); + &alice_public.into(), + ).await.expect("should be signed"); StoredStatement { comparator: StoredStatementComparator { @@ -1341,7 +1600,7 @@ mod tests { &mut ctx, hash_b, &statement, - ).await.unwrap(); + ).await; { assert_eq!(needs_dependents.len(), 2); @@ -1382,4 +1641,162 @@ mod tests { ) }); } + + #[test] + fn receiving_from_one_sends_to_another_and_to_candidate_backing() { + let hash_a = Hash::repeat_byte(1); + + let candidate = { + let mut c = CommittedCandidateReceipt::default(); + c.descriptor.relay_parent = hash_a; + c.descriptor.para_id = 1.into(); + c + }; + + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + + let validators = vec![ + Sr25519Keyring::Alice.public().into(), + Sr25519Keyring::Bob.public().into(), + Sr25519Keyring::Charlie.public().into(), + ]; + + let session_index = 1; + + let pool = sp_core::testing::TaskExecutor::new(); + let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); + + let bg = async move { + let s = StatementDistribution { metrics: Default::default() }; + s.run(ctx).await.unwrap(); + }; + + let test_fut = async move { + // register our active heads. + handle.send(FromOverseer::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: vec![(hash_a, Arc::new(JaegerSpan::Disabled))].into(), + deactivated: vec![].into(), + }))).await; + + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(r, RuntimeApiRequest::Validators(tx)) + ) + if r == hash_a + => { + let _ = tx.send(Ok(validators)); + } + ); + + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(r, RuntimeApiRequest::SessionIndexForChild(tx)) + ) + if r == hash_a + => { + let _ = tx.send(Ok(session_index)); + } + ); + + // notify of peers and view + handle.send(FromOverseer::Communication { + msg: StatementDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerConnected(peer_a.clone(), ObservedRole::Full) + ) + }).await; + + handle.send(FromOverseer::Communication { + msg: StatementDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerConnected(peer_b.clone(), ObservedRole::Full) + ) + }).await; + + handle.send(FromOverseer::Communication { + msg: StatementDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerViewChange(peer_a.clone(), view![hash_a]) + ) + }).await; + + handle.send(FromOverseer::Communication { + msg: StatementDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerViewChange(peer_b.clone(), view![hash_a]) + ) + }).await; + + handle.send(FromOverseer::Communication { + msg: StatementDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::OurViewChange(our_view![hash_a]) + ) + }).await; + + // receive a seconded statement from peer A. it should be propagated onwards to peer B and to + // candidate backing. + let statement = { + let signing_context = SigningContext { + parent_hash: hash_a, + session_index, + }; + + let keystore: SyncCryptoStorePtr = Arc::new(LocalKeystore::in_memory()); + let alice_public = CryptoStore::sr25519_generate_new( + &*keystore, ValidatorId::ID, Some(&Sr25519Keyring::Alice.to_seed()) + ).await.unwrap(); + + SignedFullStatement::sign( + &keystore, + Statement::Seconded(candidate), + &signing_context, + 0, + &alice_public.into(), + ).await.expect("should be signed") + }; + + handle.send(FromOverseer::Communication { + msg: StatementDistributionMessage::NetworkBridgeUpdateV1( + NetworkBridgeEvent::PeerMessage( + peer_a.clone(), + protocol_v1::StatementDistributionMessage::Statement(hash_a, statement.clone()), + ) + ) + }).await; + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::ReportPeer(p, r) + ) if p == peer_a && r == BENEFIT_VALID_STATEMENT_FIRST => {} + ); + + assert_matches!( + handle.recv().await, + AllMessages::CandidateBacking( + CandidateBackingMessage::Statement(r, s) + ) if r == hash_a && s == statement => {} + ); + + assert_matches!( + handle.recv().await, + AllMessages::NetworkBridge( + NetworkBridgeMessage::SendValidationMessage( + recipients, + protocol_v1::ValidationProtocol::StatementDistribution( + protocol_v1::StatementDistributionMessage::Statement(r, s) + ), + ) + ) => { + assert_eq!(recipients, vec![peer_b.clone()]); + assert_eq!(r, hash_a); + assert_eq!(s, statement); + } + ); + }; + + futures::pin_mut!(test_fut); + futures::pin_mut!(bg); + + executor::block_on(future::select(test_fut, bg)); + } } diff --git a/node/overseer/Cargo.toml b/node/overseer/Cargo.toml index e21cb93631461247d8416f075e98b232686c9fc1..0887dd3e3b58c71a7744da9535ee1a27099c4f25 100644 --- a/node/overseer/Cargo.toml +++ b/node/overseer/Cargo.toml @@ -5,21 +5,22 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.5" -log = "0.4.8" +async-trait = "0.1.42" +client = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master" } +futures = "0.3.8" futures-timer = "3.0.2" -streamunordered = "0.5.1" +oorandom = "11.1.3" +polkadot-node-primitives = { package = "polkadot-node-primitives", path = "../primitives" } +polkadot-node-subsystem-util = { path = "../subsystem-util" } polkadot-primitives = { path = "../../primitives" } -client = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../subsystem" } -polkadot-node-primitives = { package = "polkadot-node-primitives", path = "../primitives" } -async-trait = "0.1" +tracing = "0.1.22" +tracing-futures = "0.2.4" [dev-dependencies] sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } polkadot-node-network-protocol = { path = "../network/protocol" } -futures = { version = "0.3.5", features = ["thread-pool"] } +futures = { version = "0.3.8", features = ["thread-pool"] } futures-timer = "3.0.2" -femme = "2.0.1" -log = "0.4.8" -kv-log-macro = "1.0.6" +femme = "2.1.1" +kv-log-macro = "1.0.7" diff --git a/node/overseer/examples/minimal-example.rs b/node/overseer/examples/minimal-example.rs index 4087429e6dc2d8275b774076f3f314d332e0bca2..e481d38adcc6bdfbe1f78ea170348de3320cebb3 100644 --- a/node/overseer/examples/minimal-example.rs +++ b/node/overseer/examples/minimal-example.rs @@ -25,15 +25,11 @@ use futures::{ FutureExt, StreamExt, }; use futures_timer::Delay; -use kv_log_macro as log; use polkadot_primitives::v1::{BlockData, PoV}; use polkadot_overseer::{Overseer, AllSubsystems}; -use polkadot_subsystem::{ - Subsystem, SubsystemContext, DummySubsystem, - SpawnedSubsystem, FromOverseer, -}; +use polkadot_subsystem::{Subsystem, SubsystemContext, SpawnedSubsystem, FromOverseer}; use polkadot_subsystem::messages::{ CandidateValidationMessage, CandidateBackingMessage, AllMessages, }; @@ -46,13 +42,13 @@ impl Subsystem1 { match ctx.try_recv().await { Ok(Some(msg)) => { if let FromOverseer::Communication { msg } = msg { - log::info!("msg {:?}", msg); + tracing::info!("msg {:?}", msg); } continue; } Ok(None) => (), Err(_) => { - log::info!("exiting"); + tracing::info!("exiting"); return; } } @@ -68,7 +64,7 @@ impl Subsystem1 { }.into(), tx, ) - )).await.unwrap(); + )).await; } } } @@ -76,11 +72,10 @@ impl Subsystem1 { impl Subsystem for Subsystem1 where C: SubsystemContext { - type Metrics = (); // no Prometheus metrics - fn start(self, ctx: C) -> SpawnedSubsystem { let future = Box::pin(async move { Self::run(ctx).await; + Ok(()) }); SpawnedSubsystem { @@ -98,7 +93,7 @@ impl Subsystem2 { "subsystem-2-job", Box::pin(async { loop { - log::info!("Job tick"); + tracing::info!("Job tick"); Delay::new(Duration::from_secs(1)).await; } }), @@ -107,12 +102,12 @@ impl Subsystem2 { loop { match ctx.try_recv().await { Ok(Some(msg)) => { - log::info!("Subsystem2 received message {:?}", msg); + tracing::info!("Subsystem2 received message {:?}", msg); continue; } Ok(None) => { pending!(); } Err(_) => { - log::info!("exiting"); + tracing::info!("exiting"); return; }, } @@ -123,11 +118,10 @@ impl Subsystem2 { impl Subsystem for Subsystem2 where C: SubsystemContext { - type Metrics = (); // no Prometheus metrics - fn start(self, ctx: C) -> SpawnedSubsystem { let future = Box::pin(async move { Self::run(ctx).await; + Ok(()) }); SpawnedSubsystem { @@ -145,23 +139,9 @@ fn main() { Delay::new(Duration::from_secs(1)).await; }); - let all_subsystems = AllSubsystems { - candidate_validation: Subsystem2, - candidate_backing: Subsystem1, - candidate_selection: DummySubsystem, - statement_distribution: DummySubsystem, - availability_distribution: DummySubsystem, - bitfield_signing: DummySubsystem, - bitfield_distribution: DummySubsystem, - provisioner: DummySubsystem, - pov_distribution: DummySubsystem, - runtime_api: DummySubsystem, - availability_store: DummySubsystem, - network_bridge: DummySubsystem, - chain_api: DummySubsystem, - collation_generation: DummySubsystem, - collator_protocol: DummySubsystem, - }; + let all_subsystems = AllSubsystems::<()>::dummy() + .replace_candidate_validation(Subsystem2) + .replace_candidate_backing(Subsystem1); let (overseer, _handler) = Overseer::new( vec![], all_subsystems, @@ -178,7 +158,7 @@ fn main() { select! { _ = overseer_fut => break, _ = timer_stream.next() => { - log::info!("tick"); + tracing::info!("tick"); } complete => break, } diff --git a/node/overseer/src/lib.rs b/node/overseer/src/lib.rs index 8228682fcdf8bbf0bdfc5b92784e5db7890b3e3e..598f4121c7a48efb7397cc6997266f95f7a4d901 100644 --- a/node/overseer/src/lib.rs +++ b/node/overseer/src/lib.rs @@ -17,7 +17,7 @@ //! # Overseer //! //! `overseer` implements the Overseer architecture described in the -//! [implementers-guide](https://github.com/paritytech/polkadot/blob/master/roadmap/implementers-guide/guide.md). +//! [implementers-guide](https://w3f.github.io/parachain-implementers-guide/node/index.html). //! For the motivations behind implementing the overseer itself you should //! check out that guide, documentation in this crate will be mostly discussing //! technical stuff. @@ -54,7 +54,12 @@ //! .................................................................. //! ``` -use std::fmt::Debug; +// #![deny(unused_results)] +// unused dependencies can not work for test and examples at the same time +// yielding false positives +#![warn(missing_docs)] + +use std::fmt::{self, Debug}; use std::pin::Pin; use std::sync::Arc; use std::task::Poll; @@ -63,13 +68,13 @@ use std::collections::{hash_map, HashMap}; use futures::channel::{mpsc, oneshot}; use futures::{ - pending, poll, select, + poll, select, future::BoxFuture, - stream::{self, FuturesUnordered}, + stream::{FuturesUnordered, Fuse}, Future, FutureExt, SinkExt, StreamExt, }; use futures_timer::Delay; -use streamunordered::{StreamYield, StreamUnordered}; +use oorandom::Rand32; use polkadot_primitives::v1::{Block, BlockNumber, Hash}; use client::{BlockImportNotification, BlockchainEvents, FinalityNotification}; @@ -83,19 +88,19 @@ use polkadot_subsystem::messages::{ }; pub use polkadot_subsystem::{ Subsystem, SubsystemContext, OverseerSignal, FromOverseer, SubsystemError, SubsystemResult, - SpawnedSubsystem, ActiveLeavesUpdate, - metrics::{self, prometheus}, + SpawnedSubsystem, ActiveLeavesUpdate, DummySubsystem, JaegerSpan, jaeger, }; +use polkadot_node_subsystem_util::{TimeoutExt, metrics::{self, prometheus}}; use polkadot_node_primitives::SpawnNamed; - // A capacity of bounded channels inside the overseer. const CHANNEL_CAPACITY: usize = 1024; // A graceful `Overseer` teardown time delay. const STOP_DELAY: u64 = 1; // Target for logs. const LOG_TARGET: &'static str = "overseer"; - +// Rate at which messages are timed. +const MESSAGE_TIMER_METRIC_CAPTURE_RATE: f64 = 0.005; /// A type of messages that are sent from [`Subsystem`] to [`Overseer`]. /// @@ -131,6 +136,7 @@ enum ToOverseer { /// This structure exists solely for the purposes of decoupling /// `Overseer` code from the client code and the necessity to call /// `HeaderBackend::block_number_from_id()`. +#[derive(Debug, Clone)] pub struct BlockInfo { /// hash of the block. pub hash: Hash, @@ -160,7 +166,7 @@ impl From> for BlockInfo { } } -/// Some event from outer world. +/// Some event from the outer world. enum Event { BlockImported(BlockInfo), BlockFinalized(BlockInfo), @@ -173,7 +179,7 @@ enum Event { enum ExternalRequest { WaitForActivation { hash: Hash, - response_channel: oneshot::Sender<()>, + response_channel: oneshot::Sender>, }, } @@ -187,18 +193,21 @@ pub struct OverseerHandler { impl OverseerHandler { /// Inform the `Overseer` that that some block was imported. - pub async fn block_imported(&mut self, block: BlockInfo) -> SubsystemResult<()> { - self.events_tx.send(Event::BlockImported(block)).await.map_err(Into::into) + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + pub async fn block_imported(&mut self, block: BlockInfo) { + self.send_and_log_error(Event::BlockImported(block)).await } /// Send some message to one of the `Subsystem`s. - pub async fn send_msg(&mut self, msg: AllMessages) -> SubsystemResult<()> { - self.events_tx.send(Event::MsgToSubsystem(msg)).await.map_err(Into::into) + #[tracing::instrument(level = "trace", skip(self, msg), fields(subsystem = LOG_TARGET))] + pub async fn send_msg(&mut self, msg: impl Into) { + self.send_and_log_error(Event::MsgToSubsystem(msg.into())).await } - /// Inform the `Overseer` that that some block was finalized. - pub async fn block_finalized(&mut self, block: BlockInfo) -> SubsystemResult<()> { - self.events_tx.send(Event::BlockFinalized(block)).await.map_err(Into::into) + /// Inform the `Overseer` that some block was finalized. + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + pub async fn block_finalized(&mut self, block: BlockInfo) { + self.send_and_log_error(Event::BlockFinalized(block)).await } /// Wait for a block with the given hash to be in the active-leaves set. @@ -208,16 +217,24 @@ impl OverseerHandler { /// Note that due the fact the overseer doesn't store the whole active-leaves set, only deltas, /// the response channel may never return if the hash was deactivated before this call. /// In this case, it's the caller's responsibility to ensure a timeout is set. - pub async fn wait_for_activation(&mut self, hash: Hash, response_channel: oneshot::Sender<()>) -> SubsystemResult<()> { - self.events_tx.send(Event::ExternalRequest(ExternalRequest::WaitForActivation { + #[tracing::instrument(level = "trace", skip(self, response_channel), fields(subsystem = LOG_TARGET))] + pub async fn wait_for_activation(&mut self, hash: Hash, response_channel: oneshot::Sender>) { + self.send_and_log_error(Event::ExternalRequest(ExternalRequest::WaitForActivation { hash, response_channel - })).await.map_err(Into::into) + })).await } /// Tell `Overseer` to shutdown. - pub async fn stop(&mut self) -> SubsystemResult<()> { - self.events_tx.send(Event::Stop).await.map_err(Into::into) + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + pub async fn stop(&mut self) { + self.send_and_log_error(Event::Stop).await + } + + async fn send_and_log_error(&mut self, event: Event) { + if self.events_tx.send(event).await.is_err() { + tracing::info!(target: LOG_TARGET, "Failed to send an event to Overseer"); + } } } @@ -229,7 +246,7 @@ impl OverseerHandler { pub async fn forward_events>( client: Arc

, mut handler: OverseerHandler, -) -> SubsystemResult<()> { +) { let mut finality = client.finality_notification_stream(); let mut imports = client.import_notification_stream(); @@ -238,7 +255,7 @@ pub async fn forward_events>( f = finality.next() => { match f { Some(block) => { - handler.block_finalized(block.into()).await?; + handler.block_finalized(block.into()).await; } None => break, } @@ -246,7 +263,7 @@ pub async fn forward_events>( i = imports.next() => { match i { Some(block) => { - handler.block_imported(block.into()).await?; + handler.block_imported(block.into()).await; } None => break, } @@ -254,8 +271,6 @@ pub async fn forward_events>( complete => break, } } - - Ok(()) } impl Debug for ToOverseer { @@ -275,6 +290,27 @@ impl Debug for ToOverseer { /// [`Subsystem`]: trait.Subsystem.html struct SubsystemInstance { tx: mpsc::Sender>, + name: &'static str, +} + +type MaybeTimer = Option; + +#[derive(Debug)] +struct MaybeTimed { + timer: MaybeTimer, + t: T, +} + +impl MaybeTimed { + fn into_inner(self) -> T { + self.t + } +} + +impl From for MaybeTimed { + fn from(t: T) -> Self { + Self { timer: None, t } + } } /// A context type that is given to the [`Subsystem`] upon spawning. @@ -287,7 +323,60 @@ struct SubsystemInstance { #[derive(Debug)] pub struct OverseerSubsystemContext{ rx: mpsc::Receiver>, - tx: mpsc::Sender, + tx: mpsc::UnboundedSender>, + metrics: Metrics, + rng: Rand32, + threshold: u32, +} + +impl OverseerSubsystemContext { + /// Create a new `OverseerSubsystemContext`. + /// + /// `increment` determines the initial increment of the internal RNG. + /// The internal RNG is used to determine which messages are timed. + /// + /// `capture_rate` determines what fraction of messages are timed. Its value is clamped + /// to the range `0.0..=1.0`. + fn new( + rx: mpsc::Receiver>, + tx: mpsc::UnboundedSender>, + metrics: Metrics, + increment: u64, + mut capture_rate: f64, + ) -> Self { + let rng = Rand32::new_inc(0, increment); + + if capture_rate < 0.0 { + capture_rate = 0.0; + } else if capture_rate > 1.0 { + capture_rate = 1.0; + } + let threshold = (capture_rate * u32::MAX as f64) as u32; + + OverseerSubsystemContext { rx, tx, metrics, rng, threshold } + } + + /// Create a new `OverseserSubsystemContext` with no metering. + /// + /// Intended for tests. + #[allow(unused)] + fn new_unmetered( + rx: mpsc::Receiver>, + tx: mpsc::UnboundedSender>, + ) -> Self { + let metrics = Metrics::default(); + OverseerSubsystemContext::new(rx, tx, metrics, 0, 0.0) + } + + fn maybe_timed(&mut self, t: T) -> MaybeTimed { + let timer = if self.rng.rand_u32() <= self.threshold { + self.metrics.time_message_hold() + } else { + None + }; + + MaybeTimed { timer, t } + } } #[async_trait::async_trait] @@ -303,36 +392,62 @@ impl SubsystemContext for OverseerSubsystemContext { } async fn recv(&mut self) -> SubsystemResult> { - self.rx.next().await.ok_or(SubsystemError) + self.rx.next().await + .ok_or(SubsystemError::Context( + "No more messages in rx queue to process" + .to_owned() + )) } async fn spawn(&mut self, name: &'static str, s: Pin + Send>>) -> SubsystemResult<()> { - self.tx.send(ToOverseer::SpawnJob { + self.send_timed(ToOverseer::SpawnJob { name, s, - }).await.map_err(Into::into) + }).map_err(|s| s.into_send_error().into()) } async fn spawn_blocking(&mut self, name: &'static str, s: Pin + Send>>) -> SubsystemResult<()> { - self.tx.send(ToOverseer::SpawnBlockingJob { + self.send_timed(ToOverseer::SpawnBlockingJob { name, s, - }).await.map_err(Into::into) + }).map_err(|s| s.into_send_error().into()) } - async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()> { - self.tx.send(ToOverseer::SubsystemMessage(msg)).await.map_err(Into::into) + async fn send_message(&mut self, msg: AllMessages) { + self.send_and_log_error(ToOverseer::SubsystemMessage(msg)) } - async fn send_messages(&mut self, msgs: T) -> SubsystemResult<()> + async fn send_messages(&mut self, msgs: T) where T: IntoIterator + Send, T::IntoIter: Send { - let mut msgs = stream::iter(msgs.into_iter().map(ToOverseer::SubsystemMessage).map(Ok)); - self.tx.send_all(&mut msgs).await.map_err(Into::into) + for msg in msgs { + self.send_and_log_error(ToOverseer::SubsystemMessage(msg)); + } + } +} + +impl OverseerSubsystemContext { + fn send_and_log_error(&mut self, msg: ToOverseer) { + if self.send_timed(msg).is_err() { + tracing::debug!( + target: LOG_TARGET, + msg_type = std::any::type_name::(), + "Failed to send a message to Overseer", + ); + } + } + + fn send_timed(&mut self, msg: ToOverseer) -> Result< + (), + mpsc::TrySendError>, + > + { + let msg = self.maybe_timed(msg); + self.tx.unbounded_send(msg) } } @@ -347,8 +462,51 @@ struct OverseenSubsystem { instance: Option>, } +impl OverseenSubsystem { + /// Send a message to the wrapped subsystem. + /// + /// If the inner `instance` is `None`, nothing is happening. + async fn send_message(&mut self, msg: M) -> SubsystemResult<()> { + const MESSAGE_TIMEOUT: Duration = Duration::from_secs(10); + + if let Some(ref mut instance) = self.instance { + match instance.tx.send( + FromOverseer::Communication { msg } + ).timeout(MESSAGE_TIMEOUT).await + { + None => { + tracing::error!(target: LOG_TARGET, "Subsystem {} appears unresponsive.", instance.name); + Err(SubsystemError::SubsystemStalled(instance.name)) + } + Some(res) => res.map_err(Into::into), + } + } else { + Ok(()) + } + } + + /// Send a signal to the wrapped subsystem. + /// + /// If the inner `instance` is `None`, nothing is happening. + async fn send_signal(&mut self, signal: OverseerSignal) -> SubsystemResult<()> { + const SIGNAL_TIMEOUT: Duration = Duration::from_secs(10); + + if let Some(ref mut instance) = self.instance { + match instance.tx.send(FromOverseer::Signal(signal)).timeout(SIGNAL_TIMEOUT).await { + None => { + tracing::error!(target: LOG_TARGET, "Subsystem {} appears unresponsive.", instance.name); + Err(SubsystemError::SubsystemStalled(instance.name)) + } + Some(res) => res.map_err(Into::into), + } + } else { + Ok(()) + } + } +} + /// The `Overseer` itself. -pub struct Overseer { +pub struct Overseer { /// A candidate validation subsystem. candidate_validation_subsystem: OverseenSubsystem, @@ -398,16 +556,19 @@ pub struct Overseer { s: S, /// Here we keep handles to spawned subsystems to be notified when they terminate. - running_subsystems: FuturesUnordered>, + running_subsystems: FuturesUnordered>>, - /// Gather running subsystms' outbound streams into one. - running_subsystems_rx: StreamUnordered>, + /// Gather running subsystems' outbound streams into one. + to_overseer_rx: Fuse>>, /// Events that are sent to the overseer from the outside world events_rx: mpsc::Receiver, /// External listeners waiting for a hash to be in the active-leave set. - activation_external_listeners: HashMap>>, + activation_external_listeners: HashMap>>>, + + /// Stores the [`JaegerSpan`] per active leaf. + span_per_active_leaf: HashMap>, /// A set of leaves that `Overseer` starts working with. /// @@ -429,10 +590,10 @@ pub struct Overseer { /// Each [`Subsystem`] is supposed to implement some interface that is generic over /// message type that is specific to this [`Subsystem`]. At the moment not all /// subsystems are implemented and the rest can be mocked with the [`DummySubsystem`]. -/// -/// [`Subsystem`]: trait.Subsystem.html -/// [`DummySubsystem`]: struct.DummySubsystem.html -pub struct AllSubsystems { +pub struct AllSubsystems< + CV = (), CB = (), CS = (), SD = (), AD = (), BS = (), BD = (), P = (), + PoVD = (), RA = (), AS = (), NB = (), CA = (), CG = (), CP = () +> { /// A candidate validation subsystem. pub candidate_validation: CV, /// A candidate backing subsystem. @@ -465,11 +626,425 @@ pub struct AllSubsystems + AllSubsystems +{ + /// Create a new instance of [`AllSubsystems`]. + /// + /// Each subsystem is set to [`DummySystem`]. + /// + ///# Note + /// + /// Because of a bug in rustc it is required that when calling this function, + /// you provide a "random" type for the first generic parameter: + /// + /// ``` + /// polkadot_overseer::AllSubsystems::<()>::dummy(); + /// ``` + pub fn dummy() -> AllSubsystems< + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem, + DummySubsystem + > { + AllSubsystems { + candidate_validation: DummySubsystem, + candidate_backing: DummySubsystem, + candidate_selection: DummySubsystem, + statement_distribution: DummySubsystem, + availability_distribution: DummySubsystem, + bitfield_signing: DummySubsystem, + bitfield_distribution: DummySubsystem, + provisioner: DummySubsystem, + pov_distribution: DummySubsystem, + runtime_api: DummySubsystem, + availability_store: DummySubsystem, + network_bridge: DummySubsystem, + chain_api: DummySubsystem, + collation_generation: DummySubsystem, + collator_protocol: DummySubsystem, + } + } + + /// Replace the `candidate_validation` instance in `self`. + pub fn replace_candidate_validation( + self, + candidate_validation: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `candidate_backing` instance in `self`. + pub fn replace_candidate_backing( + self, + candidate_backing: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `candidate_selection` instance in `self`. + pub fn replace_candidate_selection( + self, + candidate_selection: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `statement_distribution` instance in `self`. + pub fn replace_statement_distribution( + self, + statement_distribution: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `availability_distribution` instance in `self`. + pub fn replace_availability_distribution( + self, + availability_distribution: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `bitfield_signing` instance in `self`. + pub fn replace_bitfield_signing( + self, + bitfield_signing: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `bitfield_distribution` instance in `self`. + pub fn replace_bitfield_distribution( + self, + bitfield_distribution: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `provisioner` instance in `self`. + pub fn replace_provisioner( + self, + provisioner: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `pov_distribution` instance in `self`. + pub fn replace_pov_distribution( + self, + pov_distribution: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `runtime_api` instance in `self`. + pub fn replace_runtime_api( + self, + runtime_api: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `availability_store` instance in `self`. + pub fn replace_availability_store( + self, + availability_store: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `network_bridge` instance in `self`. + pub fn replace_network_bridge( + self, + network_bridge: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `chain_api` instance in `self`. + pub fn replace_chain_api( + self, + chain_api: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api, + collation_generation: self.collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `collation_generation` instance in `self`. + pub fn replace_collation_generation( + self, + collation_generation: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation, + collator_protocol: self.collator_protocol, + } + } + + /// Replace the `collator_protocol` instance in `self`. + pub fn replace_collator_protocol( + self, + collator_protocol: NEW, + ) -> AllSubsystems { + AllSubsystems { + candidate_validation: self.candidate_validation, + candidate_backing: self.candidate_backing, + candidate_selection: self.candidate_selection, + statement_distribution: self.statement_distribution, + availability_distribution: self.availability_distribution, + bitfield_signing: self.bitfield_signing, + bitfield_distribution: self.bitfield_distribution, + provisioner: self.provisioner, + pov_distribution: self.pov_distribution, + runtime_api: self.runtime_api, + availability_store: self.availability_store, + network_bridge: self.network_bridge, + chain_api: self.chain_api, + collation_generation: self.collation_generation, + collator_protocol, + } + } +} + /// Overseer Prometheus metrics. #[derive(Clone)] struct MetricsInner { activated_heads_total: prometheus::Counter, deactivated_heads_total: prometheus::Counter, + messages_relayed_total: prometheus::Counter, + message_relay_timing: prometheus::Histogram, } #[derive(Default, Clone)] @@ -487,6 +1062,17 @@ impl Metrics { metrics.deactivated_heads_total.inc(); } } + + fn on_message_relayed(&self) { + if let Some(metrics) = &self.0 { + metrics.messages_relayed_total.inc(); + } + } + + /// Provide a timer for the duration between receiving a message and passing it to `route_message` + fn time_message_hold(&self) -> MaybeTimer { + self.0.as_ref().map(|metrics| metrics.message_relay_timing.start_timer()) + } } impl metrics::Metrics for Metrics { @@ -506,16 +1092,51 @@ impl metrics::Metrics for Metrics { )?, registry, )?, + messages_relayed_total: prometheus::register( + prometheus::Counter::new( + "parachain_messages_relayed_total", + "Number of messages relayed by Overseer." + )?, + registry, + )?, + message_relay_timing: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts { + common_opts: prometheus::Opts::new( + "overseer_messages_relay_timing", + "Time spent holding a message in the overseer before passing it to `route_message`", + ), + // guessing at the desired resolution, but we know that messages will time + // out after 0.5 seconds, so the bucket set below seems plausible: + // `0.0001 * (1.6 ^ 18) ~= 0.472`. Prometheus auto-generates a final bucket + // for all values between the final value and `+Inf`, so this should work. + // + // The documented legal range for the inputs are: + // + // - `> 0.0` + // - `> 1.0` + // - `! 0` + buckets: prometheus::exponential_buckets(0.0001, 1.6, 18).expect("inputs are within documented range; qed"), + } + )?, + registry, + )?, }; Ok(Metrics(Some(metrics))) } } +impl fmt::Debug for Metrics { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("Metrics {{...}}") + } +} + impl Overseer where S: SpawnNamed, { - /// Create a new intance of the `Overseer` with a fixed set of [`Subsystem`]s. + /// Create a new instance of the `Overseer` with a fixed set of [`Subsystem`]s. /// /// ```text /// +------------------------------------+ @@ -560,8 +1181,6 @@ where /// impl Subsystem for ValidationSubsystem /// where C: SubsystemContext /// { - /// type Metrics = (); - /// /// fn start( /// self, /// mut ctx: C, @@ -579,23 +1198,7 @@ where /// /// # fn main() { executor::block_on(async move { /// let spawner = sp_core::testing::TaskExecutor::new(); - /// let all_subsystems = AllSubsystems { - /// candidate_validation: ValidationSubsystem, - /// candidate_backing: DummySubsystem, - /// candidate_selection: DummySubsystem, - /// statement_distribution: DummySubsystem, - /// availability_distribution: DummySubsystem, - /// bitfield_signing: DummySubsystem, - /// bitfield_distribution: DummySubsystem, - /// provisioner: DummySubsystem, - /// pov_distribution: DummySubsystem, - /// runtime_api: DummySubsystem, - /// availability_store: DummySubsystem, - /// network_bridge: DummySubsystem, - /// chain_api: DummySubsystem, - /// collation_generation: DummySubsystem, - /// collator_protocol: DummySubsystem, - /// }; + /// let all_subsystems = AllSubsystems::<()>::dummy().replace_candidate_validation(ValidationSubsystem); /// let (overseer, _handler) = Overseer::new( /// vec![], /// all_subsystems, @@ -645,113 +1248,147 @@ where events_tx: events_tx.clone(), }; - let mut running_subsystems_rx = StreamUnordered::new(); + let metrics = ::register(prometheus_registry)?; + + let (to_overseer_tx, to_overseer_rx) = mpsc::unbounded(); let mut running_subsystems = FuturesUnordered::new(); + let mut seed = 0x533d; // arbitrary + let candidate_validation_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.candidate_validation, + &metrics, + &mut seed, )?; let candidate_backing_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.candidate_backing, + &metrics, + &mut seed, )?; let candidate_selection_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.candidate_selection, + &metrics, + &mut seed, )?; let statement_distribution_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.statement_distribution, + &metrics, + &mut seed, )?; let availability_distribution_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.availability_distribution, + &metrics, + &mut seed, )?; let bitfield_signing_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.bitfield_signing, + &metrics, + &mut seed, )?; let bitfield_distribution_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.bitfield_distribution, + &metrics, + &mut seed, )?; let provisioner_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.provisioner, + &metrics, + &mut seed, )?; let pov_distribution_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.pov_distribution, + &metrics, + &mut seed, )?; let runtime_api_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.runtime_api, + &metrics, + &mut seed, )?; let availability_store_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.availability_store, + &metrics, + &mut seed, )?; let network_bridge_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.network_bridge, + &metrics, + &mut seed, )?; let chain_api_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.chain_api, + &metrics, + &mut seed, )?; let collation_generation_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.collation_generation, + &metrics, + &mut seed, )?; let collator_protocol_subsystem = spawn( &mut s, &mut running_subsystems, - &mut running_subsystems_rx, + to_overseer_tx.clone(), all_subsystems.collator_protocol, + &metrics, + &mut seed, )?; let leaves = leaves @@ -760,8 +1397,6 @@ where .collect(); let active_leaves = HashMap::new(); - - let metrics = ::register(prometheus_registry); let activation_external_listeners = HashMap::new(); let this = Self { @@ -782,12 +1417,13 @@ where collator_protocol_subsystem, s, running_subsystems, - running_subsystems_rx, + to_overseer_rx: to_overseer_rx.fuse(), events_rx, activation_external_listeners, leaves, active_leaves, metrics, + span_per_active_leaf: Default::default(), }; Ok((this, handler)) @@ -795,65 +1431,21 @@ where // Stop the overseer. async fn stop(mut self) { - if let Some(ref mut s) = self.candidate_validation_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.candidate_backing_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.candidate_selection_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.statement_distribution_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.availability_distribution_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.bitfield_signing_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.bitfield_distribution_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.provisioner_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.pov_distribution_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.runtime_api_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.availability_store_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.network_bridge_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.chain_api_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.collator_protocol_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } - - if let Some(ref mut s) = self.collation_generation_subsystem.instance { - let _ = s.tx.send(FromOverseer::Signal(OverseerSignal::Conclude)).await; - } + let _ = self.candidate_validation_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.candidate_backing_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.candidate_selection_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.statement_distribution_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.availability_distribution_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.bitfield_signing_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.bitfield_distribution_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.provisioner_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.pov_distribution_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.runtime_api_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.availability_store_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.network_bridge_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.chain_api_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.collator_protocol_subsystem.send_signal(OverseerSignal::Conclude).await; + let _ = self.collation_generation_subsystem.send_signal(OverseerSignal::Conclude).await; let mut stop_delay = Delay::new(Duration::from_secs(STOP_DELAY)).fuse(); @@ -871,95 +1463,111 @@ where } /// Run the `Overseer`. + #[tracing::instrument(skip(self), fields(subsystem = LOG_TARGET))] pub async fn run(mut self) -> SubsystemResult<()> { - let leaves = std::mem::take(&mut self.leaves); let mut update = ActiveLeavesUpdate::default(); - for (hash, number) in leaves.into_iter() { - update.activated.push(hash); - self.active_leaves.insert(hash, number); - self.on_head_activated(&hash); + for (hash, number) in std::mem::take(&mut self.leaves) { + let _ = self.active_leaves.insert(hash, number); + let span = self.on_head_activated(&hash, None); + update.activated.push((hash, span)); } - self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await?; + if !update.is_empty() { + self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await?; + } loop { - while let Poll::Ready(Some(msg)) = poll!(&mut self.events_rx.next()) { - match msg { - Event::MsgToSubsystem(msg) => { - self.route_message(msg).await; - } - Event::Stop => { - self.stop().await; - return Ok(()); - } - Event::BlockImported(block) => { - self.block_imported(block).await?; - } - Event::BlockFinalized(block) => { - self.block_finalized(block).await?; - } - Event::ExternalRequest(request) => { - self.handle_external_request(request); - } - } - } - - while let Poll::Ready(Some((StreamYield::Item(msg), _))) = poll!( - &mut self.running_subsystems_rx.next() - ) { - match msg { - ToOverseer::SubsystemMessage(msg) => self.route_message(msg).await, - ToOverseer::SpawnJob { name, s } => { - self.spawn_job(name, s); + select! { + msg = self.events_rx.next().fuse() => { + let msg = if let Some(msg) = msg { + msg + } else { + continue + }; + + match msg { + Event::MsgToSubsystem(msg) => { + self.route_message(msg.into()).await?; + } + Event::Stop => { + self.stop().await; + return Ok(()); + } + Event::BlockImported(block) => { + self.block_imported(block).await?; + } + Event::BlockFinalized(block) => { + self.block_finalized(block).await?; + } + Event::ExternalRequest(request) => { + self.handle_external_request(request); + } } - ToOverseer::SpawnBlockingJob { name, s } => { - self.spawn_blocking_job(name, s); + }, + msg = self.to_overseer_rx.next() => { + let MaybeTimed { timer, t: msg } = match msg { + Some(m) => m, + None => { + // This is a fused stream so we will shut down after receiving all + // shutdown notifications. + continue + } + }; + + match msg { + ToOverseer::SubsystemMessage(msg) => { + let msg = MaybeTimed { timer, t: msg }; + self.route_message(msg).await? + }, + ToOverseer::SpawnJob { name, s } => { + self.spawn_job(name, s); + } + ToOverseer::SpawnBlockingJob { name, s } => { + self.spawn_blocking_job(name, s); + } } - } - } - - // Some subsystem exited? It's time to panic. - if let Poll::Ready(Some(finished)) = poll!(self.running_subsystems.next()) { - log::error!(target: LOG_TARGET, "Subsystem finished unexpectedly {:?}", finished); - self.stop().await; - return Err(SubsystemError); + }, + res = self.running_subsystems.next().fuse() => { + let finished = if let Some(finished) = res { + finished + } else { + continue + }; + + tracing::error!(target: LOG_TARGET, subsystem = ?finished, "subsystem finished unexpectedly"); + self.stop().await; + return finished; + }, } - - // Looks like nothing is left to be polled, let's take a break. - pending!(); } } + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] async fn block_imported(&mut self, block: BlockInfo) -> SubsystemResult<()> { - let mut update = ActiveLeavesUpdate::default(); - - if let Some(number) = self.active_leaves.remove(&block.parent_hash) { - if let Some(expected_parent_number) = block.number.checked_sub(1) { - debug_assert_eq!(expected_parent_number, number); - } - update.deactivated.push(block.parent_hash); - self.on_head_deactivated(&block.parent_hash); - } - match self.active_leaves.entry(block.hash) { - hash_map::Entry::Vacant(entry) => { - update.activated.push(block.hash); - entry.insert(block.number); - self.on_head_activated(&block.hash); - }, + hash_map::Entry::Vacant(entry) => entry.insert(block.number), hash_map::Entry::Occupied(entry) => { debug_assert_eq!(*entry.get(), block.number); + return Ok(()); } + }; + + let span = self.on_head_activated(&block.hash, Some(block.parent_hash)); + let mut update = ActiveLeavesUpdate::start_work(block.hash, span); + + if let Some(number) = self.active_leaves.remove(&block.parent_hash) { + debug_assert_eq!(block.number.saturating_sub(1), number); + update.deactivated.push(block.parent_hash); + self.on_head_deactivated(&block.parent_hash); } self.clean_up_external_listeners(); - self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await?; - - Ok(()) + self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await } + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] async fn block_finalized(&mut self, block: BlockInfo) -> SubsystemResult<()> { let mut update = ActiveLeavesUpdate::default(); @@ -976,175 +1584,123 @@ where self.on_head_deactivated(deactivated) } - self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await?; + self.broadcast_signal(OverseerSignal::BlockFinalized(block.hash, block.number)).await?; - self.broadcast_signal(OverseerSignal::BlockFinalized(block.hash)).await?; + // If there are no leaves being deactivated, we don't need to send an update. + // + // Our peers will be informed about our finalized block the next time we activating/deactivating some leaf. + if !update.is_empty() { + self.broadcast_signal(OverseerSignal::ActiveLeaves(update)).await?; + } Ok(()) } + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] async fn broadcast_signal(&mut self, signal: OverseerSignal) -> SubsystemResult<()> { - if let Some(ref mut s) = self.candidate_validation_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.candidate_backing_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.candidate_selection_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.statement_distribution_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.availability_distribution_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.bitfield_distribution_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.bitfield_signing_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.provisioner_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.pov_distribution_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.runtime_api_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.availability_store_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.network_bridge_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.chain_api_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.collator_protocol_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } - - if let Some(ref mut s) = self.collation_generation_subsystem.instance { - s.tx.send(FromOverseer::Signal(signal.clone())).await?; - } + self.candidate_validation_subsystem.send_signal(signal.clone()).await?; + self.candidate_backing_subsystem.send_signal(signal.clone()).await?; + self.candidate_selection_subsystem.send_signal(signal.clone()).await?; + self.statement_distribution_subsystem.send_signal(signal.clone()).await?; + self.availability_distribution_subsystem.send_signal(signal.clone()).await?; + self.bitfield_signing_subsystem.send_signal(signal.clone()).await?; + self.bitfield_distribution_subsystem.send_signal(signal.clone()).await?; + self.provisioner_subsystem.send_signal(signal.clone()).await?; + self.pov_distribution_subsystem.send_signal(signal.clone()).await?; + self.runtime_api_subsystem.send_signal(signal.clone()).await?; + self.availability_store_subsystem.send_signal(signal.clone()).await?; + self.network_bridge_subsystem.send_signal(signal.clone()).await?; + self.chain_api_subsystem.send_signal(signal.clone()).await?; + self.collator_protocol_subsystem.send_signal(signal.clone()).await?; + self.collation_generation_subsystem.send_signal(signal).await?; Ok(()) } - async fn route_message(&mut self, msg: AllMessages) { + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + async fn route_message(&mut self, msg: MaybeTimed) -> SubsystemResult<()> { + let msg = msg.into_inner(); + self.metrics.on_message_relayed(); match msg { AllMessages::CandidateValidation(msg) => { - if let Some(ref mut s) = self.candidate_validation_subsystem.instance { - let _= s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.candidate_validation_subsystem.send_message(msg).await?; + }, AllMessages::CandidateBacking(msg) => { - if let Some(ref mut s) = self.candidate_backing_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.candidate_backing_subsystem.send_message(msg).await?; + }, AllMessages::CandidateSelection(msg) => { - if let Some(ref mut s) = self.candidate_selection_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.candidate_selection_subsystem.send_message(msg).await?; + }, AllMessages::StatementDistribution(msg) => { - if let Some(ref mut s) = self.statement_distribution_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.statement_distribution_subsystem.send_message(msg).await?; + }, AllMessages::AvailabilityDistribution(msg) => { - if let Some(ref mut s) = self.availability_distribution_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.availability_distribution_subsystem.send_message(msg).await?; + }, AllMessages::BitfieldDistribution(msg) => { - if let Some(ref mut s) = self.bitfield_distribution_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.bitfield_distribution_subsystem.send_message(msg).await?; + }, AllMessages::BitfieldSigning(msg) => { - if let Some(ref mut s) = self.bitfield_signing_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication{ msg }).await; - } - } + self.bitfield_signing_subsystem.send_message(msg).await?; + }, AllMessages::Provisioner(msg) => { - if let Some(ref mut s) = self.provisioner_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.provisioner_subsystem.send_message(msg).await?; + }, AllMessages::PoVDistribution(msg) => { - if let Some(ref mut s) = self.pov_distribution_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.pov_distribution_subsystem.send_message(msg).await?; + }, AllMessages::RuntimeApi(msg) => { - if let Some(ref mut s) = self.runtime_api_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.runtime_api_subsystem.send_message(msg).await?; + }, AllMessages::AvailabilityStore(msg) => { - if let Some(ref mut s) = self.availability_store_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.availability_store_subsystem.send_message(msg).await?; + }, AllMessages::NetworkBridge(msg) => { - if let Some(ref mut s) = self.network_bridge_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.network_bridge_subsystem.send_message(msg).await?; + }, AllMessages::ChainApi(msg) => { - if let Some(ref mut s) = self.chain_api_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.chain_api_subsystem.send_message(msg).await?; + }, AllMessages::CollationGeneration(msg) => { - if let Some(ref mut s) = self.collation_generation_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.collation_generation_subsystem.send_message(msg).await?; + }, AllMessages::CollatorProtocol(msg) => { - if let Some(ref mut s) = self.collator_protocol_subsystem.instance { - let _ = s.tx.send(FromOverseer::Communication { msg }).await; - } - } + self.collator_protocol_subsystem.send_message(msg).await?; + }, } + + Ok(()) } - fn on_head_activated(&mut self, hash: &Hash) { + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] + fn on_head_activated(&mut self, hash: &Hash, parent_hash: Option) -> Arc { self.metrics.on_head_activated(); if let Some(listeners) = self.activation_external_listeners.remove(hash) { for listener in listeners { // it's fine if the listener is no longer interested - let _ = listener.send(()); + let _ = listener.send(Ok(())); } } + + let mut span = jaeger::hash_span(hash, "leaf-activated"); + + if let Some(parent_span) = parent_hash.and_then(|h| self.span_per_active_leaf.get(&h)) { + span.add_follows_from(&*parent_span); + } + + let span = Arc::new(span); + self.span_per_active_leaf.insert(*hash, span.clone()); + span } + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] fn on_head_deactivated(&mut self, hash: &Hash) { self.metrics.on_head_deactivated(); - if let Some(listeners) = self.activation_external_listeners.remove(hash) { - // clean up and signal to listeners the block is deactivated - drop(listeners); - } + self.activation_external_listeners.remove(hash); + self.span_per_active_leaf.remove(hash); } + #[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))] fn clean_up_external_listeners(&mut self) { self.activation_external_listeners.retain(|_, v| { // remove dead listeners @@ -1153,12 +1709,13 @@ where }) } + #[tracing::instrument(level = "trace", skip(self, request), fields(subsystem = LOG_TARGET))] fn handle_external_request(&mut self, request: ExternalRequest) { match request { ExternalRequest::WaitForActivation { hash, response_channel } => { if self.active_leaves.get(&hash).is_some() { // it's fine if the listener is no longer interested - let _ = response_channel.send(()); + let _ = response_channel.send(Ok(())); } else { self.activation_external_listeners.entry(hash).or_default().push(response_channel); } @@ -1177,29 +1734,43 @@ where fn spawn( spawner: &mut S, - futures: &mut FuturesUnordered>, - streams: &mut StreamUnordered>, + futures: &mut FuturesUnordered>>, + to_overseer: mpsc::UnboundedSender>, s: impl Subsystem>, + metrics: &Metrics, + seed: &mut u64, ) -> SubsystemResult> { let (to_tx, to_rx) = mpsc::channel(CHANNEL_CAPACITY); - let (from_tx, from_rx) = mpsc::channel(CHANNEL_CAPACITY); - let ctx = OverseerSubsystemContext { rx: to_rx, tx: from_tx }; + let ctx = OverseerSubsystemContext::new( + to_rx, + to_overseer, + metrics.clone(), + *seed, + MESSAGE_TIMER_METRIC_CAPTURE_RATE, + ); let SpawnedSubsystem { future, name } = s.start(ctx); + // increment the seed now that it's been used, so the next context will have its own distinct RNG + *seed += 1; + let (tx, rx) = oneshot::channel(); let fut = Box::pin(async move { - future.await; + if let Err(e) = future.await { + tracing::error!(subsystem=name, err = ?e, "subsystem exited with error"); + } else { + tracing::debug!(subsystem=name, "subsystem exited without an error"); + } let _ = tx.send(()); }); spawner.spawn(name, fut); - streams.push(from_rx); - futures.push(Box::pin(rx.map(|_| ()))); + futures.push(Box::pin(rx.map(|e| { tracing::warn!(err = ?e, "dropping error"); Ok(()) }))); let instance = Some(SubsystemInstance { tx: to_tx, + name, }); Ok(OverseenSubsystem { @@ -1211,11 +1782,11 @@ fn spawn( #[cfg(test)] mod tests { use std::sync::atomic; - use futures::{executor, pin_mut, select, channel::mpsc, FutureExt}; + use std::collections::HashMap; + use futures::{executor, pin_mut, select, channel::mpsc, FutureExt, pending}; - use polkadot_primitives::v1::{BlockData, CollatorPair, PoV}; - use polkadot_subsystem::DummySubsystem; - use polkadot_subsystem::messages::RuntimeApiRequest; + use polkadot_primitives::v1::{BlockData, CollatorPair, PoV, CandidateHash}; + use polkadot_subsystem::{messages::RuntimeApiRequest, JaegerSpan}; use polkadot_node_primitives::{Collation, CollationGenerationConfig}; use polkadot_node_network_protocol::{PeerId, ReputationChange, NetworkBridgeEvent}; @@ -1223,14 +1794,11 @@ mod tests { use super::*; - struct TestSubsystem1(mpsc::Sender); impl Subsystem for TestSubsystem1 where C: SubsystemContext { - type Metrics = (); - fn start(self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0; SpawnedSubsystem { @@ -1244,8 +1812,8 @@ mod tests { i += 1; continue; } - Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return, - Err(_) => return, + Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return Ok(()), + Err(_) => return Ok(()), _ => (), } } @@ -1259,8 +1827,6 @@ mod tests { impl Subsystem for TestSubsystem2 where C: SubsystemContext { - type Metrics = (); - fn start(self, mut ctx: C) -> SpawnedSubsystem { let sender = self.0.clone(); SpawnedSubsystem { @@ -1281,7 +1847,7 @@ mod tests { tx, ) ) - ).await.unwrap(); + ).await; c += 1; continue; } @@ -1292,28 +1858,29 @@ mod tests { Ok(Some(_)) => { continue; } - Err(_) => return, + Err(_) => return Ok(()), _ => (), } pending!(); } + + Ok(()) }), } } } - struct TestSubsystem4; + struct ReturnOnStart; - impl Subsystem for TestSubsystem4 + impl Subsystem for ReturnOnStart where C: SubsystemContext { - type Metrics = (); - fn start(self, mut _ctx: C) -> SpawnedSubsystem { SpawnedSubsystem { name: "test-subsystem-4", future: Box::pin(async move { // Do nothing and exit. + Ok(()) }), } } @@ -1326,26 +1893,13 @@ mod tests { let spawner = sp_core::testing::TaskExecutor::new(); executor::block_on(async move { - let (s1_tx, mut s1_rx) = mpsc::channel(64); - let (s2_tx, mut s2_rx) = mpsc::channel(64); + let (s1_tx, mut s1_rx) = mpsc::channel::(64); + let (s2_tx, mut s2_rx) = mpsc::channel::(64); + + let all_subsystems = AllSubsystems::<()>::dummy() + .replace_candidate_validation(TestSubsystem1(s1_tx)) + .replace_candidate_backing(TestSubsystem2(s2_tx)); - let all_subsystems = AllSubsystems { - candidate_validation: TestSubsystem1(s1_tx), - candidate_backing: TestSubsystem2(s2_tx), - candidate_selection: DummySubsystem, - statement_distribution: DummySubsystem, - availability_distribution: DummySubsystem, - bitfield_signing: DummySubsystem, - bitfield_distribution: DummySubsystem, - provisioner: DummySubsystem, - pov_distribution: DummySubsystem, - runtime_api: DummySubsystem, - availability_store: DummySubsystem, - network_bridge: DummySubsystem, - chain_api: DummySubsystem, - collation_generation: DummySubsystem, - collator_protocol: DummySubsystem, - }; let (overseer, mut handler) = Overseer::new( vec![], all_subsystems, @@ -1361,13 +1915,13 @@ mod tests { loop { select! { - a = overseer_fut => break, + _ = overseer_fut => break, s1_next = s1_rx.next() => { match s1_next { Some(msg) => { s1_results.push(msg); if s1_results.len() == 10 { - handler.stop().await.unwrap(); + handler.stop().await; } } None => break, @@ -1375,7 +1929,7 @@ mod tests { }, s2_next = s2_rx.next() => { match s2_next { - Some(msg) => s2_results.push(s2_next), + Some(_) => s2_results.push(s2_next), None => break, } }, @@ -1413,23 +1967,7 @@ mod tests { number: 3, }; - let all_subsystems = AllSubsystems { - collation_generation: DummySubsystem, - candidate_validation: DummySubsystem, - candidate_backing: DummySubsystem, - candidate_selection: DummySubsystem, - collator_protocol: DummySubsystem, - statement_distribution: DummySubsystem, - availability_distribution: DummySubsystem, - bitfield_signing: DummySubsystem, - bitfield_distribution: DummySubsystem, - provisioner: DummySubsystem, - pov_distribution: DummySubsystem, - runtime_api: DummySubsystem, - availability_store: DummySubsystem, - network_bridge: DummySubsystem, - chain_api: DummySubsystem, - }; + let all_subsystems = AllSubsystems::<()>::dummy(); let registry = prometheus::Registry::new(); let (overseer, mut handler) = Overseer::new( vec![first_block], @@ -1441,70 +1979,58 @@ mod tests { pin_mut!(overseer_fut); - handler.block_imported(second_block).await.unwrap(); - handler.block_imported(third_block).await.unwrap(); - handler.stop().await.unwrap(); + handler.block_imported(second_block).await; + handler.block_imported(third_block).await; + handler.send_msg(AllMessages::CandidateValidation(test_candidate_validation_msg())).await; + handler.stop().await; select! { res = overseer_fut => { assert!(res.is_ok()); - let (activated, deactivated) = extract_metrics(®istry); - assert_eq!(activated, 3); - assert_eq!(deactivated, 2); + let metrics = extract_metrics(®istry); + assert_eq!(metrics["activated"], 3); + assert_eq!(metrics["deactivated"], 2); + assert_eq!(metrics["relayed"], 1); }, complete => (), } }); } - fn extract_metrics(registry: &prometheus::Registry) -> (u64, u64) { + fn extract_metrics(registry: &prometheus::Registry) -> HashMap<&'static str, u64> { let gather = registry.gather(); - assert_eq!(gather[0].get_name(), "parachain_activated_heads_total"); - assert_eq!(gather[1].get_name(), "parachain_deactivated_heads_total"); - let activated = gather[0].get_metric()[0].get_counter().get_value() as u64; - let deactivated = gather[1].get_metric()[0].get_counter().get_value() as u64; - (activated, deactivated) + assert_eq!(gather[0].get_name(), "overseer_messages_relay_timing"); + assert_eq!(gather[1].get_name(), "parachain_activated_heads_total"); + assert_eq!(gather[2].get_name(), "parachain_deactivated_heads_total"); + assert_eq!(gather[3].get_name(), "parachain_messages_relayed_total"); + let activated = gather[1].get_metric()[0].get_counter().get_value() as u64; + let deactivated = gather[2].get_metric()[0].get_counter().get_value() as u64; + let relayed = gather[3].get_metric()[0].get_counter().get_value() as u64; + let mut result = HashMap::new(); + result.insert("activated", activated); + result.insert("deactivated", deactivated); + result.insert("relayed", relayed); + result } // Spawn a subsystem that immediately exits. // - // Should immediately conclude the overseer itself with an error. + // Should immediately conclude the overseer itself. #[test] - fn overseer_panics_on_subsystem_exit() { + fn overseer_ends_on_subsystem_exit() { let spawner = sp_core::testing::TaskExecutor::new(); executor::block_on(async move { - let (s1_tx, _) = mpsc::channel(64); - let all_subsystems = AllSubsystems { - candidate_validation: TestSubsystem1(s1_tx), - candidate_backing: TestSubsystem4, - candidate_selection: DummySubsystem, - statement_distribution: DummySubsystem, - availability_distribution: DummySubsystem, - bitfield_signing: DummySubsystem, - bitfield_distribution: DummySubsystem, - provisioner: DummySubsystem, - pov_distribution: DummySubsystem, - runtime_api: DummySubsystem, - availability_store: DummySubsystem, - network_bridge: DummySubsystem, - chain_api: DummySubsystem, - collation_generation: DummySubsystem, - collator_protocol: DummySubsystem, - }; + let all_subsystems = AllSubsystems::<()>::dummy() + .replace_candidate_backing(ReturnOnStart); let (overseer, _handle) = Overseer::new( vec![], all_subsystems, None, spawner, ).unwrap(); - let overseer_fut = overseer.run().fuse(); - pin_mut!(overseer_fut); - select! { - res = overseer_fut => assert!(res.is_err()), - complete => (), - } + overseer.run().await.unwrap(); }) } @@ -1513,8 +2039,6 @@ mod tests { impl Subsystem for TestSubsystem5 where C: SubsystemContext { - type Metrics = (); - fn start(self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0.clone(); @@ -1529,11 +2053,13 @@ mod tests { continue; }, Ok(Some(_)) => continue, - Err(_) => return, + Err(_) => break, _ => (), } pending!(); } + + Ok(()) }), } } @@ -1544,8 +2070,6 @@ mod tests { impl Subsystem for TestSubsystem6 where C: SubsystemContext { - type Metrics = (); - fn start(self, mut ctx: C) -> SpawnedSubsystem { let mut sender = self.0.clone(); @@ -1560,11 +2084,13 @@ mod tests { continue; }, Ok(Some(_)) => continue, - Err(_) => return, + Err(_) => break, _ => (), } pending!(); } + + Ok(()) }), } } @@ -1599,23 +2125,9 @@ mod tests { let (tx_5, mut rx_5) = mpsc::channel(64); let (tx_6, mut rx_6) = mpsc::channel(64); - let all_subsystems = AllSubsystems { - candidate_validation: TestSubsystem5(tx_5), - candidate_backing: TestSubsystem6(tx_6), - candidate_selection: DummySubsystem, - statement_distribution: DummySubsystem, - availability_distribution: DummySubsystem, - bitfield_signing: DummySubsystem, - bitfield_distribution: DummySubsystem, - provisioner: DummySubsystem, - pov_distribution: DummySubsystem, - runtime_api: DummySubsystem, - availability_store: DummySubsystem, - network_bridge: DummySubsystem, - chain_api: DummySubsystem, - collation_generation: DummySubsystem, - collator_protocol: DummySubsystem, - }; + let all_subsystems = AllSubsystems::<()>::dummy() + .replace_candidate_validation(TestSubsystem5(tx_5)) + .replace_candidate_backing(TestSubsystem6(tx_6)); let (overseer, mut handler) = Overseer::new( vec![first_block], all_subsystems, @@ -1629,17 +2141,20 @@ mod tests { let mut ss5_results = Vec::new(); let mut ss6_results = Vec::new(); - handler.block_imported(second_block).await.unwrap(); - handler.block_imported(third_block).await.unwrap(); + handler.block_imported(second_block).await; + handler.block_imported(third_block).await; let expected_heartbeats = vec![ - OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(first_block_hash)), + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work( + first_block_hash, + Arc::new(JaegerSpan::Disabled), + )), OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { - activated: [second_block_hash].as_ref().into(), + activated: [(second_block_hash, Arc::new(JaegerSpan::Disabled))].as_ref().into(), deactivated: [first_block_hash].as_ref().into(), }), OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { - activated: [third_block_hash].as_ref().into(), + activated: [(third_block_hash, Arc::new(JaegerSpan::Disabled))].as_ref().into(), deactivated: [second_block_hash].as_ref().into(), }), ]; @@ -1665,7 +2180,7 @@ mod tests { if ss5_results.len() == expected_heartbeats.len() && ss6_results.len() == expected_heartbeats.len() { - handler.stop().await.unwrap(); + handler.stop().await; } } @@ -1704,23 +2219,10 @@ mod tests { let (tx_5, mut rx_5) = mpsc::channel(64); let (tx_6, mut rx_6) = mpsc::channel(64); - let all_subsystems = AllSubsystems { - candidate_validation: TestSubsystem5(tx_5), - candidate_backing: TestSubsystem6(tx_6), - candidate_selection: DummySubsystem, - statement_distribution: DummySubsystem, - availability_distribution: DummySubsystem, - bitfield_signing: DummySubsystem, - bitfield_distribution: DummySubsystem, - provisioner: DummySubsystem, - pov_distribution: DummySubsystem, - runtime_api: DummySubsystem, - availability_store: DummySubsystem, - network_bridge: DummySubsystem, - chain_api: DummySubsystem, - collation_generation: DummySubsystem, - collator_protocol: DummySubsystem, - }; + let all_subsystems = AllSubsystems::<()>::dummy() + .replace_candidate_validation(TestSubsystem5(tx_5)) + .replace_candidate_backing(TestSubsystem6(tx_6)); + // start with two forks of different height. let (overseer, mut handler) = Overseer::new( vec![first_block, second_block], @@ -1736,18 +2238,21 @@ mod tests { let mut ss6_results = Vec::new(); // this should stop work on both forks we started with earlier. - handler.block_finalized(third_block).await.unwrap(); + handler.block_finalized(third_block).await; let expected_heartbeats = vec![ OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { - activated: [first_block_hash, second_block_hash].as_ref().into(), + activated: [ + (first_block_hash, Arc::new(JaegerSpan::Disabled)), + (second_block_hash, Arc::new(JaegerSpan::Disabled)), + ].as_ref().into(), ..Default::default() }), OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { deactivated: [first_block_hash, second_block_hash].as_ref().into(), ..Default::default() }), - OverseerSignal::BlockFinalized(third_block_hash), + OverseerSignal::BlockFinalized(third_block_hash, 3), ]; loop { @@ -1769,9 +2274,8 @@ mod tests { complete => break, } - if ss5_results.len() == expected_heartbeats.len() && - ss6_results.len() == expected_heartbeats.len() { - handler.stop().await.unwrap(); + if ss5_results.len() == expected_heartbeats.len() && ss6_results.len() == expected_heartbeats.len() { + handler.stop().await; } } @@ -1787,6 +2291,79 @@ mod tests { }); } + #[test] + fn do_not_send_empty_leaves_update_on_block_finalization() { + let spawner = sp_core::testing::TaskExecutor::new(); + + executor::block_on(async move { + let imported_block = BlockInfo { + hash: Hash::random(), + parent_hash: Hash::random(), + number: 1, + }; + + let finalized_block = BlockInfo { + hash: Hash::random(), + parent_hash: Hash::random(), + number: 1, + }; + + let (tx_5, mut rx_5) = mpsc::channel(64); + + let all_subsystems = AllSubsystems::<()>::dummy() + .replace_candidate_backing(TestSubsystem6(tx_5)); + + let (overseer, mut handler) = Overseer::new( + Vec::new(), + all_subsystems, + None, + spawner, + ).unwrap(); + + let overseer_fut = overseer.run().fuse(); + pin_mut!(overseer_fut); + + let mut ss5_results = Vec::new(); + + handler.block_finalized(finalized_block.clone()).await; + handler.block_imported(imported_block.clone()).await; + + let expected_heartbeats = vec![ + OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: [ + (imported_block.hash, Arc::new(JaegerSpan::Disabled)), + ].as_ref().into(), + ..Default::default() + }), + OverseerSignal::BlockFinalized(finalized_block.hash, 1), + ]; + + loop { + select! { + res = overseer_fut => { + assert!(res.is_ok()); + break; + }, + res = rx_5.next() => { + if let Some(res) = dbg!(res) { + ss5_results.push(res); + } + } + } + + if ss5_results.len() == expected_heartbeats.len() { + handler.stop().await; + } + } + + assert_eq!(ss5_results.len(), expected_heartbeats.len()); + + for expected in expected_heartbeats { + assert!(ss5_results.contains(&expected)); + } + }); + } + #[derive(Clone)] struct CounterSubsystem { stop_signals_received: Arc, @@ -1813,8 +2390,6 @@ mod tests { C: SubsystemContext, M: Send, { - type Metrics = (); - fn start(self, mut ctx: C) -> SpawnedSubsystem { SpawnedSubsystem { name: "counter-subsystem", @@ -1838,6 +2413,8 @@ mod tests { } pending!(); } + + Ok(()) }), } } @@ -1851,7 +2428,7 @@ mod tests { fn test_candidate_backing_msg() -> CandidateBackingMessage { let (sender, _) = oneshot::channel(); - CandidateBackingMessage::GetBackedCandidates(Default::default(), sender) + CandidateBackingMessage::GetBackedCandidates(Default::default(), Vec::new(), sender) } fn test_candidate_selection_msg() -> CandidateSelectionMessage { @@ -1866,14 +2443,14 @@ mod tests { fn test_collator_generation_msg() -> CollationGenerationMessage { CollationGenerationMessage::Initialize(CollationGenerationConfig { key: CollatorPair::generate().0, - collator: Box::new(|_| Box::new(TestCollator)), + collator: Box::new(|_, _| TestCollator.boxed()), para_id: Default::default(), }) } struct TestCollator; impl Future for TestCollator { - type Output = Collation; + type Output = Option; fn poll(self: Pin<&mut Self>, _cx: &mut futures::task::Context) -> Poll { panic!("at the Disco") @@ -1918,7 +2495,7 @@ mod tests { fn test_availability_store_msg() -> AvailabilityStoreMessage { let (sender, _) = oneshot::channel(); - AvailabilityStoreMessage::QueryAvailableData(Default::default(), sender) + AvailabilityStoreMessage::QueryAvailableData(CandidateHash(Default::default()), sender) } fn test_network_bridge_msg() -> NetworkBridgeMessage { @@ -1973,28 +2550,28 @@ mod tests { hash: Default::default(), parent_hash: Default::default(), number: Default::default(), - }).await.unwrap(); + }).await; // send a msg to each subsystem // except for BitfieldSigning as the message is not instantiable - handler.send_msg(AllMessages::CandidateValidation(test_candidate_validation_msg())).await.unwrap(); - handler.send_msg(AllMessages::CandidateBacking(test_candidate_backing_msg())).await.unwrap(); - handler.send_msg(AllMessages::CandidateSelection(test_candidate_selection_msg())).await.unwrap(); - handler.send_msg(AllMessages::CollationGeneration(test_collator_generation_msg())).await.unwrap(); - handler.send_msg(AllMessages::CollatorProtocol(test_collator_protocol_msg())).await.unwrap(); - handler.send_msg(AllMessages::StatementDistribution(test_statement_distribution_msg())).await.unwrap(); - handler.send_msg(AllMessages::AvailabilityDistribution(test_availability_distribution_msg())).await.unwrap(); - // handler.send_msg(AllMessages::BitfieldSigning(test_bitfield_signing_msg())).await.unwrap(); - handler.send_msg(AllMessages::BitfieldDistribution(test_bitfield_distribution_msg())).await.unwrap(); - handler.send_msg(AllMessages::Provisioner(test_provisioner_msg())).await.unwrap(); - handler.send_msg(AllMessages::PoVDistribution(test_pov_distribution_msg())).await.unwrap(); - handler.send_msg(AllMessages::RuntimeApi(test_runtime_api_msg())).await.unwrap(); - handler.send_msg(AllMessages::AvailabilityStore(test_availability_store_msg())).await.unwrap(); - handler.send_msg(AllMessages::NetworkBridge(test_network_bridge_msg())).await.unwrap(); - handler.send_msg(AllMessages::ChainApi(test_chain_api_msg())).await.unwrap(); + handler.send_msg(AllMessages::CandidateValidation(test_candidate_validation_msg())).await; + handler.send_msg(AllMessages::CandidateBacking(test_candidate_backing_msg())).await; + handler.send_msg(AllMessages::CandidateSelection(test_candidate_selection_msg())).await; + handler.send_msg(AllMessages::CollationGeneration(test_collator_generation_msg())).await; + handler.send_msg(AllMessages::CollatorProtocol(test_collator_protocol_msg())).await; + handler.send_msg(AllMessages::StatementDistribution(test_statement_distribution_msg())).await; + handler.send_msg(AllMessages::AvailabilityDistribution(test_availability_distribution_msg())).await; + // handler.send_msg(AllMessages::BitfieldSigning(test_bitfield_signing_msg())).await; + handler.send_msg(AllMessages::BitfieldDistribution(test_bitfield_distribution_msg())).await; + handler.send_msg(AllMessages::Provisioner(test_provisioner_msg())).await; + handler.send_msg(AllMessages::PoVDistribution(test_pov_distribution_msg())).await; + handler.send_msg(AllMessages::RuntimeApi(test_runtime_api_msg())).await; + handler.send_msg(AllMessages::AvailabilityStore(test_availability_store_msg())).await; + handler.send_msg(AllMessages::NetworkBridge(test_network_bridge_msg())).await; + handler.send_msg(AllMessages::ChainApi(test_chain_api_msg())).await; // send a stop signal to each subsystems - handler.stop().await.unwrap(); + handler.stop().await; select! { res = overseer_fut => { @@ -2002,7 +2579,7 @@ mod tests { assert_eq!(stop_signals_received.load(atomic::Ordering::SeqCst), NUM_SUBSYSTEMS); // x2 because of broadcast_signal on startup - assert_eq!(signals_received.load(atomic::Ordering::SeqCst), 2 * NUM_SUBSYSTEMS); + assert_eq!(signals_received.load(atomic::Ordering::SeqCst), NUM_SUBSYSTEMS); // -1 for BitfieldSigning assert_eq!(msgs_received.load(atomic::Ordering::SeqCst), NUM_SUBSYSTEMS - 1); diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index 81e2467b374fd0dbeac1715a6aea7a875e7969c4..888b13f0d324f48ec7a3d0ea3cbed851205d1c67 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -6,9 +6,10 @@ edition = "2018" description = "Primitives types for the Node-side" [dependencies] -futures = "0.3.5" +futures = "0.3.8" polkadot-primitives = { path = "../../primitives" } polkadot-statement-table = { path = "../../statement-table" } -parity-scale-codec = { version = "1.3.4", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-consensus-vrf = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/primitives/src/approval.rs b/node/primitives/src/approval.rs new file mode 100644 index 0000000000000000000000000000000000000000..32b4e5af70517a08b50b123f10c5a06354dbd9af --- /dev/null +++ b/node/primitives/src/approval.rs @@ -0,0 +1,105 @@ +// Copyright 2017-2020 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 . + +//! Types relevant for approval. + +pub use sp_consensus_vrf::schnorrkel::{VRFOutput, VRFProof}; + +use polkadot_primitives::v1::{ + CandidateHash, Hash, ValidatorIndex, Signed, ValidatorSignature, CoreIndex, +}; +use parity_scale_codec::{Encode, Decode}; + +/// Validators assigning to check a particular candidate are split up into tranches. +/// Earlier tranches of validators check first, with later tranches serving as backup. +pub type DelayTranche = u32; + +/// A static context used for all relay-vrf-modulo VRFs. +pub const RELAY_VRF_MODULO_CONTEXT: &str = "A&V MOD"; + +/// A static context used for all relay-vrf-delay VRFs. +pub const RELAY_VRF_DELAY_CONTEXT: &str = "A&V TRANCHE"; + +/// random bytes derived from the VRF submitted within the block by the +/// block author as a credential and used as input to approval assignment criteria. +#[derive(Debug, Clone, Encode, Decode)] +pub struct RelayVRF(pub [u8; 32]); + +/// Different kinds of input data or criteria that can prove a validator's assignment +/// to check a particular parachain. +#[derive(Debug, Clone, Encode, Decode)] +pub enum AssignmentCertKind { + /// An assignment story based on the VRF that authorized the relay-chain block where the + /// candidate was included combined with a sample number. + /// + /// The context used to produce bytes is [`RELAY_VRF_MODULO_CONTEXT`] + RelayVRFModulo { + /// The sample number used in this cert. + sample: u32, + }, + /// An assignment story based on the VRF that authorized the relay-chain block where the + /// candidate was included combined with the index of a particular core. + /// + /// The context is [`RELAY_VRF_DELAY_CONTEXT`] + RelayVRFDelay { + /// The core index chosen in this cert. + core_index: CoreIndex, + }, +} + +/// A certification of assignment. +#[derive(Debug, Clone, Encode, Decode)] +pub struct AssignmentCert { + /// The criterion which is claimed to be met by this cert. + pub kind: AssignmentCertKind, + /// The VRF showing the criterion is met. + pub vrf: (VRFOutput, VRFProof), +} + +/// An assignment crt which refers to the candidate under which the assignment is +/// relevant by block hash. +#[derive(Debug, Clone, Encode, Decode)] +pub struct IndirectAssignmentCert { + /// A block hash where the candidate appears. + pub block_hash: Hash, + /// The validator index. + pub validator: ValidatorIndex, + /// The cert itself. + pub cert: AssignmentCert, +} + +/// A vote of approval on a candidate. +#[derive(Debug, Clone, Encode, Decode)] +pub struct ApprovalVote(pub CandidateHash); + +/// An approval vote signed by some validator. +pub type SignedApprovalVote = Signed; + +/// A signed approval vote which references the candidate indirectly via the block. +/// +/// In practice, we have a look-up from block hash and candidate index to candidate hash, +/// so this can be transformed into a `SignedApprovalVote`. +#[derive(Debug, Clone, Encode, Decode)] +pub struct IndirectSignedApprovalVote { + /// A block hash where the candidate appears. + pub block_hash: Hash, + /// The index of the candidate in the list of candidates fully included as-of the block. + pub candidate_index: u32, + /// The validator index. + pub validator: ValidatorIndex, + /// The signature by the validator. + pub signature: ValidatorSignature, +} diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index df8bc22551da479cd8a285b9e7c8c9db0a0fb7a5..fa4fe750c9ca9a595f0d0723916462cce85af3eb 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -20,13 +20,15 @@ //! not shared between the node and the runtime. This crate builds on top of the primitives defined //! there. +#![deny(missing_docs)] + use futures::Future; use parity_scale_codec::{Decode, Encode}; use polkadot_primitives::v1::{ Hash, CommittedCandidateReceipt, CandidateReceipt, CompactStatement, EncodeAs, Signed, SigningContext, ValidatorIndex, ValidatorId, - UpwardMessage, Balance, ValidationCode, PersistedValidationData, ValidationData, - HeadData, PoV, CollatorPair, Id as ParaId, + UpwardMessage, ValidationCode, PersistedValidationData, ValidationData, + HeadData, PoV, CollatorPair, Id as ParaId, OutboundHrmpMessage, CandidateCommitments, CandidateHash, }; use polkadot_statement_table::{ generic::{ @@ -35,9 +37,12 @@ use polkadot_statement_table::{ }, v1::Misbehavior as TableMisbehavior, }; +use std::pin::Pin; pub use sp_core::traits::SpawnNamed; +pub mod approval; + /// A statement, where the candidate receipt is included in the `Seconded` variant. /// /// This is the committed candidate receipt instead of the bare candidate receipt. As such, @@ -51,13 +56,24 @@ pub enum Statement { Seconded(CommittedCandidateReceipt), /// A statement that a validator has deemed a candidate valid. #[codec(index = "2")] - Valid(Hash), + Valid(CandidateHash), /// A statement that a validator has deemed a candidate invalid. #[codec(index = "3")] - Invalid(Hash), + Invalid(CandidateHash), } impl Statement { + /// Get the candidate hash referenced by this statement. + /// + /// If this is a `Statement::Seconded`, this does hash the candidate receipt, which may be expensive + /// for large candidates. + pub fn candidate_hash(&self) -> CandidateHash { + match *self { + Statement::Valid(ref h) | Statement::Invalid(ref h) => *h, + Statement::Seconded(ref c) => c.hash(), + } + } + /// Transform this statement into its compact version, which references only the hash /// of the candidate. pub fn to_compact(&self) -> CompactStatement { @@ -113,26 +129,13 @@ pub struct FromTableMisbehavior { pub key: ValidatorId, } -/// Outputs of validating a candidate. -#[derive(Debug)] -pub struct ValidationOutputs { - /// The head-data produced by validation. - pub head_data: HeadData, - /// The persisted validation data. - pub validation_data: PersistedValidationData, - /// Upward messages to the relay chain. - pub upward_messages: Vec, - /// Fees paid to the validators of the relay-chain. - pub fees: Balance, - /// The new validation code submitted by the execution, if any. - pub new_validation_code: Option, -} - /// Candidate invalidity details #[derive(Debug)] pub enum InvalidCandidate { /// Failed to execute.`validate_block`. This includes function panicking. ExecutionError(String), + /// Validation outputs check doesn't pass. + InvalidOutputs, /// Execution timeout. Timeout, /// Validation input is over the limit. @@ -147,19 +150,14 @@ pub enum InvalidCandidate { HashMismatch, /// Bad collator signature. BadSignature, - /// Output code is too large - NewCodeTooLarge(u64), - /// Head-data is over the limit. - HeadDataTooLarge(u64), - /// Code upgrade triggered but not allowed. - CodeUpgradeNotAllowed, } /// Result of the validation of the candidate. #[derive(Debug)] pub enum ValidationResult { - /// Candidate is valid. The validation process yields these outputs. - Valid(ValidationOutputs), + /// Candidate is valid. The validation process yields these outputs and the persisted validation + /// data used to form inputs. + Valid(CandidateCommitments, PersistedValidationData), /// Candidate is invalid. Invalid(InvalidCandidate), } @@ -267,25 +265,40 @@ impl std::convert::TryFrom for MisbehaviorReport { /// - does not contain the erasure root; that's computed at the Polkadot level, not at Cumulus /// - contains a proof of validity. #[derive(Clone, Encode, Decode)] -pub struct Collation { - /// Fees paid from the chain to the relay chain validators. - pub fees: Balance, +pub struct Collation { /// Messages destined to be interpreted by the Relay chain itself. pub upward_messages: Vec, + /// The horizontal messages sent by the parachain. + pub horizontal_messages: Vec>, /// New validation code. pub new_validation_code: Option, /// The head-data produced as a result of execution. pub head_data: HeadData, - /// Proof that this block is valid. + /// Proof to verify the state transition of the parachain. pub proof_of_validity: PoV, + /// The number of messages processed from the DMQ. + pub processed_downward_messages: u32, + /// The mark which specifies the block number up to which all inbound HRMP messages are processed. + pub hrmp_watermark: BlockNumber, } +/// Collation function. +/// +/// Will be called with the hash of the relay chain block the parachain +/// block should be build on and the [`ValidationData`] that provides +/// information about the state of the parachain on the relay chain. +pub type CollatorFn = Box< + dyn Fn(Hash, &ValidationData) -> Pin> + Send>> + + Send + + Sync, +>; + /// Configuration for the collation generator pub struct CollationGenerationConfig { /// Collator's authentication key, so it can sign things. pub key: CollatorPair, - /// Collation function. - pub collator: Box Box + Unpin + Send> + Send + Sync>, + /// Collation function. See [`CollatorFn`] for more details. + pub collator: CollatorFn, /// The parachain that this collator collates for pub para_id: ParaId, } diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index cf2dc0549a20b2d7d7e93f71e5461162e79944dc..dbe56c08ccde6de0546657c6c47eda2f0727522d 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -1,70 +1,122 @@ [package] -name = "polkadot-service-new" +name = "polkadot-service" version = "0.8.3" authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = "0.9.0" -serde = { version = "1.0.102", features = ["derive"] } -lazy_static = "1.4.0" -log = "0.4.8" -futures = "0.3.4" -slog = "2.5.2" -hex-literal = "0.2.1" -polkadot-primitives = { path = "../../primitives" } -polkadot-runtime = { path = "../../runtime/polkadot" } -polkadot-overseer = { path = "../overseer" } -polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../subsystem" } -kusama-runtime = { path = "../../runtime/kusama" } -westend-runtime = { path = "../../runtime/westend" } -polkadot-rpc = { path = "../../rpc" } -polkadot-node-core-proposer = { path = "../core/proposer" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +# Substrate Client +sc-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } +babe = { package = "sc-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } +grandpa = { package = "sc-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } +sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-client-db = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-consensus-slots = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } +service = { package = "sc-service", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +telemetry = { package = "sc-telemetry", git = "https://github.com/paritytech/substrate", branch = "master" } + +# Substrate Primitives +sp-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } +babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } consensus_common = { package = "sp-consensus", git = "https://github.com/paritytech/substrate", branch = "master" } -grandpa = { package = "sc-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } grandpa_primitives = { package = "sp-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master" } -service = { package = "sc-service", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -telemetry = { package = "sc-telemetry", git = "https://github.com/paritytech/substrate", branch = "master" } -sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-offchain = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-session = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-storage = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } + +# Substrate Pallets pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master" } -authority-discovery = { package = "sc-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master" } -authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master" } -babe = { package = "sc-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } -babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master" } + +# Substrate Other +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master" } frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -codec = { package = "parity-scale-codec", version = "1.3.4" } -sp-session = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-offchain = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master" } prometheus-endpoint = { package = "substrate-prometheus-endpoint", git = "https://github.com/paritytech/substrate", branch = "master" } -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master" } + +# External Crates +futures = "0.3.8" +hex-literal = "0.3.1" +tracing = "0.1.22" +tracing-futures = "0.2.4" +serde = { version = "1.0.118", features = ["derive"] } +thiserror = "1.0.23" + +# Polkadot +polkadot-node-core-proposer = { path = "../core/proposer" } +polkadot-overseer = { path = "../overseer" } +polkadot-parachain = { path = "../../parachain" } +polkadot-primitives = { path = "../../primitives" } +polkadot-rpc = { path = "../../rpc" } +polkadot-subsystem = { package = "polkadot-node-subsystem", path = "../subsystem" } +polkadot-node-subsystem-util = { path = "../subsystem-util" } +polkadot-runtime-parachains = { path = "../../runtime/parachains" } + +# Polkadot Runtimes +polkadot-runtime = { path = "../../runtime/polkadot" } +kusama-runtime = { path = "../../runtime/kusama" } +westend-runtime = { path = "../../runtime/westend" } +rococo-runtime = { path = "../../runtime/rococo" } + +# Polkadot Subsystems +polkadot-availability-bitfield-distribution = { path = "../network/bitfield-distribution", optional = true } +polkadot-availability-distribution = { path = "../network/availability-distribution", optional = true } +polkadot-collator-protocol = { path = "../network/collator-protocol", optional = true } +polkadot-network-bridge = { path = "../network/bridge", optional = true } +polkadot-node-collation-generation = { path = "../collation-generation", optional = true } +polkadot-node-core-av-store = { path = "../core/av-store", optional = true } +polkadot-node-core-backing = { path = "../core/backing", optional = true } +polkadot-node-core-bitfield-signing = { path = "../core/bitfield-signing", optional = true } +polkadot-node-core-candidate-selection = { path = "../core/candidate-selection", optional = true } +polkadot-node-core-candidate-validation = { path = "../core/candidate-validation", optional = true } +polkadot-node-core-chain-api = { path = "../core/chain-api", optional = true } +polkadot-node-core-provisioner = { path = "../core/provisioner", optional = true } +polkadot-node-core-runtime-api = { path = "../core/runtime-api", optional = true } +polkadot-pov-distribution = { path = "../network/pov-distribution", optional = true } +polkadot-statement-distribution = { path = "../network/statement-distribution", optional = true } [dev-dependencies] -polkadot-test-runtime-client = { path = "../../runtime/test-runtime/client" } -sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -env_logger = "0.7.0" +polkadot-test-client = { path = "../test/client" } +env_logger = "0.8.2" [features] default = ["db", "full-node"] db = ["service/db"] +full-node = [ + "polkadot-node-core-av-store", +] runtime-benchmarks = ["polkadot-runtime/runtime-benchmarks", "kusama-runtime/runtime-benchmarks", "westend-runtime/runtime-benchmarks"] -full-node = [] +real-overseer = [ + "polkadot-availability-bitfield-distribution", + "polkadot-availability-distribution", + "polkadot-collator-protocol", + "polkadot-network-bridge", + "polkadot-node-collation-generation", + "polkadot-node-core-backing", + "polkadot-node-core-bitfield-signing", + "polkadot-node-core-candidate-selection", + "polkadot-node-core-candidate-validation", + "polkadot-node-core-chain-api", + "polkadot-node-core-provisioner", + "polkadot-node-core-runtime-api", + "polkadot-pov-distribution", + "polkadot-statement-distribution", +] diff --git a/node/service/res/.gitignore b/node/service/res/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..11a43e289a21092f1b8779f1dccd315d80dafc17 --- /dev/null +++ b/node/service/res/.gitignore @@ -0,0 +1 @@ +!/*.json diff --git a/service/res/kusama.json b/node/service/res/kusama.json similarity index 99% rename from service/res/kusama.json rename to node/service/res/kusama.json index 34c2180184264a7635ef3d4a1aa5c18b99aa7a32..ba13740f7293ece5c62adef44581a5cb273eb7a2 100644 --- a/service/res/kusama.json +++ b/node/service/res/kusama.json @@ -8,6 +8,12 @@ "/dns/p2p.cc3-3.kusama.network/tcp/30100/p2p/12D3KooWEGHw84b4hfvXEfyq4XWEmWCbRGuHMHQMpby4BAtZ4xJf", "/dns/p2p.cc3-4.kusama.network/tcp/30100/p2p/12D3KooWF9KDPRMN8WpeyXhEeURZGP8Dmo7go1tDqi7hTYpxV9uW", "/dns/p2p.cc3-5.kusama.network/tcp/30100/p2p/12D3KooWDiwMeqzvgWNreS9sV1HW3pZv1PA7QGA7HUCo7FzN5gcA", + "/dns/p2p.0.kusama.network/tcp/30333/p2p/12D3KooWJDohybWd7FvRmyeGjgi56yy36mRWLHmgRprFdUadUt6b", + "/dns/p2p.1.kusama.network/tcp/30333/p2p/12D3KooWC7dnTvDY97afoLrvQSBrh7dDFEkWniTwyxAsBjfpaZk6", + "/dns/p2p.2.kusama.network/tcp/30333/p2p/12D3KooWGGK6Mj1pWF1bk4R1HjBQ4E7bgkfSJ5gmEfVRuwRZapT5", + "/dns/p2p.3.kusama.network/tcp/30333/p2p/12D3KooWRp4qgusMiUobJ9Uw1XAwtsokqx9YwgHDv5wQXjxqETji", + "/dns/p2p.4.kusama.network/tcp/30333/p2p/12D3KooWMVXPbqWR1erNKRSWDVPjcAQ9XtxqLTVzV4ccox9Y8KNL", + "/dns/p2p.5.kusama.network/tcp/30333/p2p/12D3KooWBsJKGJFuv83ixryzMsUS53A8JzEVeTA8PGi4U6T2dnif", "/dns/kusama-bootnode-0.paritytech.net/tcp/30333/p2p/12D3KooWSueCPH3puP2PcvqPJdNaDNF3jMZjtJtDiSy35pWrbt5h", "/dns/kusama-bootnode-0.paritytech.net/tcp/30334/ws/p2p/12D3KooWSueCPH3puP2PcvqPJdNaDNF3jMZjtJtDiSy35pWrbt5h", "/dns/kusama-bootnode-1.paritytech.net/tcp/30333/p2p/12D3KooWQKqane1SqWJNWMQkbia9qiMWXkcHtAdfW5eVF8hbwEDw" diff --git a/service/res/polkadot.json b/node/service/res/polkadot.json similarity index 99% rename from service/res/polkadot.json rename to node/service/res/polkadot.json index 9d6742d5cedd6a14b3256da07880b1c6cebe48c2..fd8d989d7a3846fcc26922abb3fa3f44b2ef7cbf 100644 --- a/service/res/polkadot.json +++ b/node/service/res/polkadot.json @@ -9,6 +9,12 @@ "/dns/p2p.cc1-3.polkadot.network/tcp/30100/p2p/12D3KooWJ4eyPowiVcPU46pXuE2cDsiAmuBKXnFcFPapm4xKFdMJ", "/dns/p2p.cc1-4.polkadot.network/tcp/30100/p2p/12D3KooWNMUcqwSj38oEq1zHeGnWKmMvrCFnpMftw7JzjAtRj2rU", "/dns/p2p.cc1-5.polkadot.network/tcp/30100/p2p/12D3KooWDs6LnpmWDWgZyGtcLVr3E75CoBxzg1YZUPL5Bb1zz6fM", + "/dns/p2p.0.polkadot.network/tcp/30333/p2p/12D3KooWHsvEicXjWWraktbZ4MQBizuyADQtuEGr3NbDvtm5rFA5", + "/dns/p2p.1.polkadot.network/tcp/30333/p2p/12D3KooWQz2q2UWVCiy9cFX1hHYEmhSKQB2hjEZCccScHLGUPjcc", + "/dns/p2p.2.polkadot.network/tcp/30333/p2p/12D3KooWNHxjYbDLLbDNZ2tq1kXgif5MSiLTUWJKcDdedKu4KaG8", + "/dns/p2p.3.polkadot.network/tcp/30333/p2p/12D3KooWGJQysxrQcSvUWWNw88RkqYvJhH3ZcDpWJ8zrXKhLP5Vr", + "/dns/p2p.4.polkadot.network/tcp/30333/p2p/12D3KooWKer8bYqpYjwurVABu13mkELpX2X7mSpEicpjShLeg7D6", + "/dns/p2p.5.polkadot.network/tcp/30333/p2p/12D3KooWSRjL9LcEQd5u2fQTbyLxTEHq1tUFgQ6amXSp8Eu7TfKP", "/dns/cc1-0.parity.tech/tcp/30333/p2p/12D3KooWSz8r2WyCdsfWHgPyvD8GKQdJ1UAiRmrcrs8sQB3fe2KU", "/dns/cc1-1.parity.tech/tcp/30333/p2p/12D3KooWFN2mhgpkJsDBuNuE5427AcDrsib8EoqGMZmkxWwx3Md4" ], @@ -21,8 +27,8 @@ "protocolId": "dot", "properties": { "ss58Format": 0, - "tokenDecimals": 12, - "tokenSymbol": "DOT (old)" + "tokenDecimals": 10, + "tokenSymbol": "DOT" }, "forkBlocks": null, "badBlocks": null, diff --git a/node/service/res/rococo.json b/node/service/res/rococo.json new file mode 100644 index 0000000000000000000000000000000000000000..94030229be6e8dcc712085c8fba1d316942aea7e --- /dev/null +++ b/node/service/res/rococo.json @@ -0,0 +1,163 @@ +{ + "name": "Rococo", + "id": "rococo_v1", + "chainType": "Live", + "bootNodes": [ + "/ip4/34.90.151.124/tcp/30333/p2p/12D3KooWF7BUbG5ErMZ47ZdarRwtpZamgcZqxwpnFzkhjc1spHnP", + "/ip4/34.90.137.14/tcp/30333/p2p/12D3KooWLcpkpvjr5ccgtUdTSYtNDjEdsDcPNrt2Rb7yXuAf7bUE", + "/ip4/35.204.67.254/tcp/30333/p2p/12D3KooWGjEEDmNbBkXLM1uKMseK9iYD3osKA4JGdGKMZDCusjd6", + "/ip4/34.90.121.39/tcp/30333/p2p/12D3KooWBhkZQydNHDR3XSehnrfj1KNFCdpwgDrYpX54FrUR1FRS", + "/ip4/34.91.145.35/tcp/30333/p2p/12D3KooWBuLAMevZexnFKCgTyoz3AnHQn98D9cfe1Mg3kPoCjkwf", + "/ip4/34.91.77.80/tcp/30333/p2p/12D3KooWA5BAM71y9NtV5NH6EjANgYKRZ8jNLJ5z8GJ5RPdjt63n", + "/ip4/34.91.84.25/tcp/30333/p2p/12D3KooWSV4VqhBHZKKBsZKmVU462qRW9PmXTSuYvuajt1P93djA", + "/ip4/34.91.97.19/tcp/30333/p2p/12D3KooWD6wC88atMMyVeP6ZKg9sK7QmUL8x8m1RxMW8rhv2vWyg" + ], + "telemetryEndpoints": [ + [ + "/dns/telemetry.polkadot.io/tcp/443/x-parity-wss/%2Fsubmit%2F", + 0 + ] + ], + "protocolId": "rococo", + "properties": { + "ss58Format": 42, + "tokenDecimals": 12, + "tokenSymbol": "ROC" + }, + "forkBlocks": null, + "badBlocks": null, + "consensusEngine": null, + "lightSyncState": null, + "genesis": { + "raw": { + "top": { + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195068dec3fce5ade0966261626580da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0x5f3e4907f716ac89b6347d15ececedca138e71612491192d68deab7e6f563fe1": "0x00000000", + "0x509fc563e49ed9cb767129896846f57f878d434d6125b40443fe11fd292d13a4": "0x00000800", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f6584bfaf470c1b26175646980f6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x0000362b4c8ee30d0000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ed0b865484219eb06173676e80244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xf0c365c3cf59d671eb72da0e7a4113c4878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509df5f4072c4244956261626580764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500d1064d79ff558056772616e800e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503c75eb9438a505fc6261626580a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x2062475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfaa076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed3586975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef7430e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477bf49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022afcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee81668bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80df6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f34992ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6fe1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2aee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a040436be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe218e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b752496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b166c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c817c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac0116c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb53102ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5bc4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff351efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c4c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04afa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a004bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11ffab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab474ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dccda6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa834992156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", + "0xd84ad3579da5beed16cea616d20c3c89878d434d6125b40443fe11fd292d13a4": "0x00000800", + "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00", + "0x5f3e4907f716ac89b6347d15ececedca308ce9615de0775a82f8a94dc3d285a1": "0x03", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d7ce35a3ce71c3d76175646980160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000", + "0x2371e21684d2fae99bcb4d579242f74a8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", + "0x5f9cc45b7a00c5899361e1c6099678dc878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503d7dc9205a149f6a6175646980306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9935ae9d4cb148940af99a366d100d5af02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864": "0x000000000100000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ab7b30d24546522861756469804e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x20a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35010000000000000038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f0100000000000000d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a0100000000000000764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe2101000000000000007c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd808130100000000000000bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b0100000000000000720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed783720100000000000000da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa83490100000000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb319b9aeb2f5add22992ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f": "0xe1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2aee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950438ac98f6d864839696d6f6e80d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0x3a636f6465": "0x0061736d0100000001f9023560037f7f7f017f60027f7f017f60017f0060027f7f0060057f7f7f7f7f0060027f7f017e60047f7f7f7f0060037f7f7f0060017f017e60017e0060017e017e60027e7e0060037f7e7e0060017e017f60027f7e017f60037f7e7f017f6000017f60037f7f7e017e60000060017f017f60047f7e7e7e017f60027f7e017e6000017e60037e7e7f017e60047f7f7f7f017f60027e7f017f60057f7f7f7f7f017f60037e7e7f017f60047f7f7f7e0060047f7f7e7e0060047e7e7e7e017f60067f7f7f7f7f7f0060067f7f7f7e7e7f0060067f7f7e7f7f7f0060047f7f7f7f017e60057f7f7f7e7e0060087f7f7f7f7f7f7f7f0060077f7f7f7e7f7f7f0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f0060077f7f7e7e7e7f7f0060077f7e7e7e7e7e7e0060037e7f7f017f60067f7f7e7e7f7f0060047f7e7f7f0060047e7f7e7f0060037e7e7f0060027f7e0060057f7e7e7f7f0060037f7e7e017f60047f7e7e7f0060057f7e7e7e7e0060067f7e7e7e7e7f0002bf0c2803656e76066d656d6f727902001303656e761d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f31000903656e761c6578745f6d6973635f7072696e745f6e756d5f76657273696f6e5f31000903656e761c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f31000903656e76226578745f6d6973635f72756e74696d655f76657273696f6e5f76657273696f6e5f31000a03656e76206578745f6f6666636861696e5f696e6465785f7365745f76657273696f6e5f31000b03656e76196578745f6c6f6767696e675f6c6f675f76657273696f6e5f31000c03656e762a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f31000d03656e76256578745f63727970746f5f656432353531395f67656e65726174655f76657273696f6e5f31000e03656e76236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f31000f03656e76286578745f63727970746f5f66696e6973685f62617463685f7665726966795f76657273696f6e5f31001003656e76376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f31000503656e76256578745f63727970746f5f737232353531395f67656e65726174655f76657273696f6e5f31000e03656e76286578745f63727970746f5f737232353531395f7075626c69635f6b6579735f76657273696f6e5f31000803656e76216578745f63727970746f5f737232353531395f7369676e5f76657273696f6e5f31001103656e76236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f32000f03656e76276578745f63727970746f5f73746172745f62617463685f7665726966795f76657273696f6e5f31001203656e76206578745f68617368696e675f626c616b65325f3132385f76657273696f6e5f31000d03656e76206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f31000d03656e761e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f31000d03656e761d6578745f68617368696e675f74776f785f36345f76657273696f6e5f31000d03656e761c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31000203656e761e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f31001303656e76236578745f6f6666636861696e5f69735f76616c696461746f725f76657273696f6e5f31001003656e76346578745f6f6666636861696e5f6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365745f76657273696f6e5f31001403656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f6765745f76657273696f6e5f31001503656e76286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f7365745f76657273696f6e5f31000c03656e76246578745f6f6666636861696e5f6e6574776f726b5f73746174655f76657273696f6e5f31001603656e76226578745f6f6666636861696e5f72616e646f6d5f736565645f76657273696f6e5f31001003656e76296578745f6f6666636861696e5f7375626d69745f7472616e73616374696f6e5f76657273696f6e5f31000a03656e761c6578745f73746f726167655f617070656e645f76657273696f6e5f31000b03656e76226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f31000a03656e761b6578745f73746f726167655f636c6561725f76657273696f6e5f31000903656e76226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f31000903656e761c6578745f73746f726167655f6578697374735f76657273696f6e5f31000d03656e76196578745f73746f726167655f6765745f76657273696f6e5f31000a03656e761e6578745f73746f726167655f6e6578745f6b65795f76657273696f6e5f31000a03656e761a6578745f73746f726167655f726561645f76657273696f6e5f31001703656e761a6578745f73746f726167655f726f6f745f76657273696f6e5f31001603656e76196578745f73746f726167655f7365745f76657273696f6e5f31000b03ab08a90813030301020218030703031313020000131312121207030007040001010301030301190202081a1807000401010113130107070101070101001a01010001010000010001011b010301130707030303070307030303030103010301040302010302070701041c0403030107030303010103070307020107030303030207030303000701011d07030203030307070301030303030307030302120202030300070707070703030707030701020207040307040301070603070203070307021e07060101020107070707070707070707070707070706030403030201031302030303030303030101060601060602030707030201020303030307030703031a1f0303061207020202020202020202020101010312121212121212070702020303020303020707061302010303071d0307030703070c132001030203020207030307030202060607020706031803010707030302070302130207020203070604080303070603072102030306020306031803121202011f1f041f0703070607100703070703030303030303030303030203031803070722070303030702030203030303030303030307010702070707030307020507050702020303030303030703030303030303030303020303030303030303030303030303030303030303030303030303030307131303022307030302030403120707070703020307070203070702070303071d070307030303241e1d061d1f0103060203060303030303030303030303070703070702070307030812120706030703030702040202030302070303030703030307030703030307070303070703030303070307030307030703070303070703030307030307030707030307070303070707030302030303030303180701030303030101010103030303030303030505030312120210020505030505050303030303030305050525051003030106260503050205030307030303050703020505270105050505050302020303050205050305030705010506050505050305020507070503020505280202020302020302062912030400020202020207070103020202020307030703030303010204010401010303030202020202010701020301032a2b07020c072c01020302020303030310100202020c07030303020303010703020302030201030301020703030107070303011d030301030303020202020202030203020406010602040707032d0202020303030606070307000303060006032c0303030303030303030303030303030303030302030203030202032e010102020303020303030602020203032f030304030303020303030203020202030301030202030303030303020303030207022f03030204040202060702030707020203030203022f020302030302030303020202020307031d0603300301030702130703010303021301010301030703010101020202010103030331323333000000003233340407017001e601e6010619037f01418080c0000b7f0041e0d2c8000b7f0041e0d2c8000b07e40a28195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000c436f72655f76657273696f6e00b90512436f72655f657865637574655f626c6f636b00ba0515436f72655f696e697469616c697a655f626c6f636b00c205114d657461646174615f6d6574616461746100c3051c426c6f636b4275696c6465725f6170706c795f65787472696e73696300c5051b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00c60520426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300c7051c426c6f636b4275696c6465725f636865636b5f696e686572656e747300cf0518426c6f636b4275696c6465725f72616e646f6d5f7365656400d0052b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e00d105214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657200d3051850617261636861696e486f73745f76616c696461746f727300da051e50617261636861696e486f73745f76616c696461746f725f67726f75707300dc052050617261636861696e486f73745f617661696c6162696c6974795f636f72657300de052250617261636861696e486f73745f66756c6c5f76616c69646174696f6e5f6461746100e5052750617261636861696e486f73745f7065727369737465645f76616c69646174696f6e5f6461746100e9052650617261636861696e486f73745f636865636b5f76616c69646174696f6e5f6f75747075747300ea052550617261636861696e486f73745f73657373696f6e5f696e6465785f666f725f6368696c6400ed051d50617261636861696e486f73745f76616c69646174696f6e5f636f646500ee052850617261636861696e486f73745f686973746f726963616c5f76616c69646174696f6e5f636f646500ef052c50617261636861696e486f73745f63616e6469646174655f70656e64696e675f617661696c6162696c69747900f0051e50617261636861696e486f73745f63616e6469646174655f6576656e747300f1051a50617261636861696e486f73745f73657373696f6e5f696e666f00f7051a50617261636861696e486f73745f646d715f636f6e74656e747300f9052c50617261636861696e486f73745f696e626f756e645f68726d705f6368616e6e656c735f636f6e74656e747300fa051e4772616e6470614170695f6772616e6470615f617574686f72697469657300fc05384772616e6470614170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e73696300ff05274772616e6470614170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f6600810615426162654170695f636f6e66696775726174696f6e0083061b426162654170695f63757272656e745f65706f63685f737461727400840624426162654170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f6600850635426162654170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e73696300860621417574686f72697479446973636f766572794170695f617574686f7269746965730088062153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b657973008a061f53657373696f6e4b6579735f6465636f64655f73657373696f6e5f6b657973008d061d4163636f756e744e6f6e63654170695f6163636f756e745f6e6f6e6365009006205472616e73616374696f6e5061796d656e744170695f71756572795f696e666f0091060a5f5f646174615f656e6403010b5f5f686561705f62617365030209b703010041010be50148455d52b30853548101688a016aea01b5016d9802d401d701d901e701e80180029f0680088108ad059501b804ae05d3069c01d7059001b906ec058006f106b0056bbb06bc065e4b4142434c5f6162636465a701a9017d7f8001870185018601aa015b5ac603c201f2079f029d029c029a02b402b502b602ee07ed07aa02f507fb07cc07cb07cf07be019406930695069d089c08ab029e088b088a08ac028e089008920894088b078a078d07dc03db03ad02ee03a6049902ae02e004df04af02e304d607d507b002e607c206c106b102c306d706d606d4068608b2028308ad06ac06ab069708c2038208c101e807c607c507c2079f059c079b079a0788078707df06de06b302e006c403ef07c303d703d903ed03e204eb03ea03de03e703e803e503e403e203f007e103df03dd03f503f403f303f203f103f003ef03a805e104af05a005ae08d70796069706b608d8069d078c07dd04a807a9079e07a007a5079007a107a407a607a707c707ce07cd07d107d007d807ea07e907f407f307f107f807f707f6078708ca07d001eb07c9078d088c088f089308960895089a08990898089f08b408bb08bc08ba08c108c0080ae0d867a908b80402067f017e230041b0036b220124002001200041880210c9082201200141a8036a36028c022001200141a8036a3602880220014190026a200141086a22021028200141b0026a200141f8006a2203102802400240024020014190026a200141b0026a412010cc08450d00200141146a2802002204450d002001410c6a2802002100200441246c21040340024020002d00004101470d00024041a3b2c8002000460d00200041016a28000041c28289aa04470d010b200041086a28020021052001200041106a280200360294022001200536029002200141b0026a20014190026a102920012903b0024203510d0020014184016a2802002204450d0220012802c002210620012903b8022107200141fc006a2802002100200441246c21040340024020002d00004101470d00024041a3b2c8002000460d00200041016a28000041c28289aa04470d010b200041086a28020021052001200041106a280200360294022001200536029002200141b0026a20014190026a102920012903b0024203510d0020012903002007520d04200720012903b802520d04200620012802c002470d04200141b0026a200241f00010c9081a2001200141e8016a22003602a003200141b0026a2000102a450d05200141b0026a200341f00010c9081a200120003602a003200141b0026a2000102a21000c060b200041246a21002004415c6a22040d000c030b0b200041246a21002004415c6a22040d000b0b2001410c6a102b0b200141fc006a102b410021000b200141b0036a240020000bde0601057f230041206b2202240020024100360208200242013703000240412010322203450d002002422037021420022003360210200241106a41004120102f20022802102204200228021822056a22032001290010370000200341086a200141186a290000370000200341106a200141206a290000370000200341186a200141286a2900003700002002200541206a2203360218200220022802082003102f2002280200200228020822056a2004200310c9081a2002200520036a220536020802402002280214450d002004102c0b02400240024002402001280200220341c000490d00200341808001490d012003418080808004490d02200220054101102f200228020020022802086a41033a00002002200228020841016a2204360208200220044104102f200228020020022802086a2003360000200228020841046a21040c030b200220054101102f2002280200200228020822046a20034102743a0000200441016a21040c020b200220054102102f2002280200200228020822046a20034102744101723b0000200441026a21040c010b200220054104102f200228020020022802086a2003410274410272360000200228020841046a21040b20022004360208412010322203450d002002422037021420022003360210200241106a41004120102f20022802102205200228021822066a22032001290030370000200341086a200141386a290000370000200341106a200141c0006a290000370000200341186a200141c8006a2900003700002002200641206a2203360218200220042003102f2002280200200228020822046a2005200310c9081a2002200420036a36020802402002280214450d002005102c0b412010322203450d002002422037021420022003360210200241106a41004120102f20022802102204200228021822056a22032001290050370000200341086a200141d8006a290000370000200341106a200141e0006a290000370000200341186a200141e8006a2900003700002002200541206a2203360218200220022802082003102f2002280200200228020822056a2004200310c9081a2002200520036a36020802402002280214450d002004102c0b2002200141046a10aa05200020022802002002280208109a0102402002280204450d002002280200102c0b200241206a24000f0b1039000bc81303067f017e067f230041d0036b2202240002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a3602002005417f6a0e03010203040b200042033703000c040b024020064104490d002004280001210720012003417b6a22053602042001200441056a36020020054108490d00200429000521082001200341736a220936020420012004410d6a36020041002105200241003a0028200341726a21030240034020092005460d01200241086a20056a200420056a2206410d6a2d00003a00002001200336020420012006410e6a3602002002200541016a22063a00282003417f6a21032006210520064120470d000b20024190036a41086a2204200241086a41086a29030037030020024190036a41106a2203200241086a41106a29030037030020024190036a41186a2209200241086a41186a2903003703002002200229030837039003410121050240200641ff01714120490d00200241f0026a41186a2009290300370300200241f0026a41106a2003290300370300200241f0026a41086a200429030037030020022002290390033703f002410021050b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b00220050d01200241f0016a41086a2205200241b0026a41086a290300370300200241f0016a41106a2204200241b0026a41106a290300370300200241f0016a41186a2203200241b0026a41186a290300370300200220022903b0023703f001200241086a200110980720022d00084101460d01200241a8016a2201200241c1006a290000370300200241a0016a2206200241396a29000037030020024198016a2209200241316a29000037030020024190016a220a200241296a290000370300200241f0006a41186a220b200241216a290000370300200241f0006a41106a220c200241196a290000370300200241f0006a41086a220d200241116a290000370300200241d0016a41086a220e2005290300370300200241d0016a41106a22052004290300370300200241d0016a41186a2204200329030037030020022002290009370370200220022903f0013703d001200241b0016a41186a22032004290300370300200241b0016a41106a22042005290300370300200241b0016a41086a2205200e290300370300200220022903d0013703b001200041106a20073602002000200837030820004200370300200020022903b0013702142000411c6a2005290300370200200041246a20042903003702002000412c6a2003290300370200200020022903703702342000413c6a200d290300370200200041c4006a200c290300370200200041cc006a200b290300370200200041d4006a200a290300370200200041dc006a2009290300370200200041e4006a2006290300370200200041ec006a20012903003702000c050b0240200541ff0171450d00200241003a00280b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b0020b200042033703000c030b024020064104490d002004280001210620012003417b6a22053602042001200441056a36020020054108490d0020004201370300200429000521082001200341736a36020420012004410d6a360200200041106a200636020020002008370308200041146a200241086a41e40010c9081a0c030b200042033703000c020b024020064104490d002004280001210720012003417b6a22053602042001200441056a36020020054108490d00200429000521082001200341736a220936020420012004410d6a36020041002105200241003a0028200341726a21030240034020092005460d01200241086a20056a200420056a2206410d6a2d00003a00002001200336020420012006410e6a3602002002200541016a22063a00282003417f6a21032006210520064120470d000b20024190036a41086a2204200241086a41086a29030037030020024190036a41106a2203200241086a41106a29030037030020024190036a41186a2209200241086a41186a2903003703002002200229030837039003410121050240200641ff01714120490d00200241f0026a41186a2009290300370300200241f0026a41106a2003290300370300200241f0026a41086a200429030037030020022002290390033703f002410021050b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b00220050d01200241f0016a41086a2205200241b0026a41086a290300370300200241f0016a41106a2204200241b0026a41106a290300370300200241f0016a41186a2203200241b0026a41186a290300370300200220022903b0023703f001200241086a200110980720022d00084101460d01200241a8016a2201200241c1006a290000370300200241a0016a2206200241396a29000037030020024198016a2209200241316a29000037030020024190016a220a200241296a290000370300200241f0006a41186a220b200241216a290000370300200241f0006a41106a220c200241196a290000370300200241f0006a41086a220d200241116a290000370300200241d0016a41086a220e2005290300370300200241d0016a41106a22052004290300370300200241d0016a41186a2204200329030037030020022002290009370370200220022903f0013703d001200241b0016a41186a22032004290300370300200241b0016a41106a22042005290300370300200241b0016a41086a2205200e290300370300200220022903d0013703b001200041106a20073602002000200837030820004202370300200020022903b0013702142000411c6a2005290300370200200041246a20042903003702002000412c6a2003290300370200200020022903703702342000413c6a200d290300370200200041c4006a200c290300370200200041cc006a200b290300370200200041d4006a200a290300370200200041dc006a2009290300370200200041e4006a2006290300370200200041ec006a20012903003702000c030b0240200541ff0171450d00200241003a00280b200241b0026a41086a200241f0026a41086a290300370300200241b0026a41106a200241f0026a41106a290300370300200241b0026a41186a200241f0026a41186a290300370300200220022903f0023703b0020b200042033703000c010b200042033703000b200241d0036a24000bd70c04047f037e0d7f057e230041a0036b220224000240024002402000410c6a220328020022040d00200241d8016a411f6a200241e0026a411f6a280000360000200241d8016a41186a200241e0026a41186a290300370300200241d8016a41106a200241e0026a41106a290300370300200241d8016a41086a200241e0026a41086a290300370300200220022903e0023703d8010c010b20032004417f6a2204360200200241e0026a411f6a22052000280204200441246c6a220341206a280000360000200241e0026a41186a2204200341196a290000370300200241e0026a41086a200341096a2900002206370300200241e0026a41106a200341116a29000022073703002002200329000122083703e00220032d00002109200241d8016a411f6a22032005280000360000200241d8016a41186a22052004290300370300200241d8016a41106a22042007370300200241d8016a41086a220a2006370300200220083703d80120094106460d00200241b0016a411f6a220b2003280000360000200241b0016a41186a22032005290300370300200241b0016a41106a20042903002206370300200241b0016a41086a200a290300220737030020024188016a41096a200737000020024188016a41116a200637000020024188016a41196a200329030037000020024188016a41206a200b280000360000200220022903d80122063703b0012002200637008901200220093a0088010240024002400240024002400240024002400240024020094103470d0020024188016a41017228000041c28289aa04470d0820024198016a280200210520024190016a280200210a41002103200241003a0098020240034020052003460d01200241d8016a20036a200a20036a2d00003a00002002200341016a22043a00980220042103200441c000470d000b200241e0026a41386a2203200241d8016a41386a2205290300370300200241e0026a41306a220a200241d8016a41306a220b290300370300200241e0026a41286a220c200241d8016a41286a220d290300370300200241e0026a41206a220e200241d8016a41206a220f290300370300200241e0026a41186a2210200241d8016a41186a2211290300370300200241e0026a41106a2212200241d8016a41106a2213290300370300200241e0026a41086a2214200241d8016a41086a2215290300370300200220022903d8013703e002200441ff017141c000490d01200241a0026a41386a20032903002206370300200241a0026a41306a200a2903002207370300200241a0026a41286a200c2903002208370300200241a0026a41206a200e2903002216370300200241a0026a41186a20102903002217370300200241c8006a41086a22032014290300370300200241c8006a41106a22042012290300370300200241c8006a41186a220a2017370300200241c8006a41206a220c2016370300200241c8006a41286a220e2008370300200241c8006a41306a22102007370300200241c8006a41386a22122006370300200220022903e002370348200520122903002206370300200b20102903002207370300200d200e2903002208370300200f200c29030022163703002011200a290300221737030020132004290300221837030020152003290300221937030020022002290348221a3703d801200241086a41386a2006370300200241086a41306a2007370300200241086a41286a2008370300200241086a41206a2016370300200241086a41186a2017370300200241086a41106a2018370300200241086a41086a20193703002002201a37030820090e050602030406050b200341ff0171450d00200241003a0098020b20090e050a0506070a080b20024194016a280200450d0320024190016a280200102c0c030b20024194016a280200450d0220024190016a280200102c0c020b20024194016a280200450d0120024190016a280200102c0c010b20024190016a280200450d00200228028c01102c0b200241d8016a20001028200241086a200241d8016a41202001102d0d040c050b20024194016a280200450d0420024190016a280200102c0c040b20024194016a280200450d0320024190016a280200102c0c030b20024194016a280200450d0220024190016a280200102c0c020b20024190016a280200450d01200228028c01102c0c010b200041046a102b410121030c010b200041046a102b410021030b200241a0036a240020030bcb0101027f024020002802082201450d0020002802002102200141246c210103400240024002400240024020022d00000e050400010204030b2002410c6a280200450d03200241086a280200102c0c030b2002410c6a280200450d02200241086a280200102c0c020b2002410c6a280200450d01200241086a280200102c0c010b200241086a280200450d00200241046a280200102c0b200241246a21022001415c6a22010d000b0b024020002802042202450d0020002802002201450d00200241246c450d002001102c0b0b0600200010340b150020002002ad4220862001ad842003100e4101460bc50302027f017e20004201370200200041086a22024100360200024002400240024020012802000e03000102030b200041004101102f2000280200200228020022036a41013a00002002200341016a3602002000200141046a1030200020022802004120102f2000280200200228020022036a2200200141106a2900003700002002200341206a360200200041086a200141186a290000370000200041106a200141206a290000370000200041186a200141286a2900003700000f0b200041004101102f2000280200200228020022036a41023a00002002200341016a220336020020012802042101200020034104102f2000280200200228020022006a20013600002002200041046a3602000f0b200041004101102f2000280200200228020022036a41033a00002002200341016a2203360200200020034101102f2000280200200228020022036a41013a00002002200341016a2203360200200141086a2903002104200020034108102f2000280200200228020022036a20043700002002200341086a2203360200200141106a2903002104200020034108102f2000280200200228020022036a20043700002002200341086a3602002000200141186a2d000010310b0b9a0101017f0240200041046a280200220320016b20024f0d000240024002400240200120026a22022001490d00200341017422012002200120024b1b22014108200141084b1b210102402003450d0020014100480d0120002802002202450d0220022003200110352202450d030c040b200141004e0d010b103b000b2001103222020d010b1039000b20002002360200200041046a20013602000b0bd30102037f017e20012802002102200020012802082201108f0102402001450d002002200141286c6a2103200041086a220128020021040340200020044120102f200028020020012802006a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a2900003700002001200128020041206a2204360200200241206a2903002105200020044108102f200028020020012802006a20053700002001200128020041086a22043602002003200241286a2202470d000b0b0ba301000240024002400240200141ff01710e03000102030b2000200041086a22012802004101102f200028020020012802006a41003a00002001200128020041016a3602000f0b2000200041086a22012802004101102f200028020020012802006a41013a00002001200128020041016a3602000f0b2000200041086a22012802004101102f200028020020012802006a41023a00002001200128020041016a3602000b0b0600200010330b0700200010b2080b0700200010b1080b0a0020002001200210360b2a01017f0240200210b2082203450d002003200020022001200120024b1b10c9081a200010b1080b20030b0600200010380b1d01017f0240200010b2082201450d0020014100200010cb081a0b20010b0500103a000b1700410141bcb5c800410741c4b5c800412210820100000b110041e8c4c8004111418080c000103c000b4701017f230041206b22032400200341146a4100360200200341c4b5c800360210200342013702042003200136021c200320003602182003200341186a360200200320021046000be00201067f230041206b2202240020012802002103024002402001280204220441037422050d00410021060c010b200341046a2107410021060340200728020020066a2106200741086a2107200541786a22050d000b0b0240024002400240024002400240200141146a2802000d00200621070c010b2004450d02410021054101210402402006410f4b0d00200341046a280200450d020b200620066a22072006490d010b2007417f4c0d02024020070d0041002105410121040c010b20072105200710322204450d030b20004100360208200020043602002000200536020420022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41bc80c000200241086a103e0d03200241206a24000f0b4100410041ac80c000103f000b103b000b1039000b41d480c0004133200241086a418881c000419881c0001040000b9006010a7f230041306b22032400200341246a2001360200200341033a00282003428080808080043703082003200036022020034100360218200341003602100240024002400240024020022802082204450d0020022802002105200228020422062002410c6a2802002207200720064b1b2208450d01200020052802002005280204200128020c1100000d03200541086a2100200241146a28020021092002280210210a2008210b034020032004411c6a2d00003a00282003200441046a290200422089370308200441186a28020021024100210741002101024002400240200441146a2802000e03010002010b024020022009490d002002200941d887c000103f000b2002410374210c41002101200a200c6a220c2802044101470d01200c28020028020021020b410121010b2003200236021420032001360210200441106a28020021020240024002402004410c6a2802000e03010002010b024020022009490d002002200941d887c000103f000b20024103742101200a20016a22012802044101470d01200128020028020021020b410121070b2003200236021c2003200736021802402004280200220220094f0d00200a20024103746a2202280200200341086a20022802041101000d05200b417f6a220b450d04200441206a2104200041046a210220002802002101200041086a2100200328022020012002280200200328022428020c110000450d010c050b0b2002200941e887c000103f000b2002280200210520022802042206200241146a2802002204200420064b1b2208450d0020022802102104200020052802002005280204200128020c1100000d02200541086a21002008210203402004280200200341086a200441046a2802001101000d032002417f6a2202450d02200441086a2104200041046a210120002802002107200041086a2100200328022020072001280200200328022428020c110000450d000c030b0b410021080b0240200620084d0d002003280220200520084103746a22042802002004280204200328022428020c1100000d010b410021040c010b410121040b200341306a240020040b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41023602002003420237020c200341cc83c000360208200341023602242003200341206a360218200320033602282003200341046a360220200341086a20021046000b7e01017f230041c0006b220524002005200136020c2005200036020820052003360214200520023602102005412c6a41023602002005413c6a41033602002005420237021c200541e0b3c800360218200541043602342005200541306a3602282005200541106a3602382005200541086a360230200541186a20041046000be00101037f024002402000280200220041046a2802002203200041086a28020022046b2002490d00200028020021030c010b024002400240200420026a22052004490d00200341017422042005200420054b1b22044108200441084b1b210402402003450d0020044100480d0120002802002205450d02200520032004103521030c030b200441004e0d010b103b000b2004103221030b02402003450d0020002003360200200041046a2004360200200041086a28020021040c010b1039000b200320046a2001200210c9081a200041086a2200200028020020026a36020041000bf50401047f230041106b22022400200028020021000240024002400240024002400240024002400240024002402001418001490d002002410036020c2001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c060b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c050b024020002802082203200041046a280200460d00200028020021040c040b200341016a22042003490d05200341017422052004200520044b1b22044108200441084b1b210502402003450d0020054100480d0620002802002204450d02200420032005103521040c030b20054100480d050c010b20022001413f71418001723a000d2002200141067641c001723a000c410221010c030b2005103221040b2004450d0520002004360200200041046a2005360200200028020821030b200420036a20013a00002000200028020841016a3602080c060b0240200041046a2802002204200041086a28020022036b2001490d00200028020021040c050b200320016a22052003490d00200441017422032005200320054b1b22034108200341084b1b210302402004450d0020034100480d0120002802002205450d02200520042003103521040c030b200341004e0d010b103b000b2003103221040b2004450d0020002004360200200041046a2003360200200041086a28020021030c010b1039000b200420036a2002410c6a200110c9081a200041086a2200200028020020016a3602000b200241106a240041000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41bc80c000200241086a103e2101200241206a240020010b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41023602002002420337020c200241bc82c000360208200241023602242002200241206a3602182002200241046a36022820022002360220200241086a41d482c0001046000b0b002000350200200110490b3401017f230041106b220224002002200136020c20022000360208200241dc83c000360204200241c4b5c8003602002002104a000b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41023602002002420337020c2002419083c000360208200241023602242002200241206a3602182002200241046a36022820022002360220200241086a41a883c0001046000b0d0020002802001a037f0c000b0bd20203027f017e037f230041306b22022400412721030240024020004290ce005a0d00200021040c010b412721030340200241096a20036a2205417c6a20004290ce0080220442f0b17f7e20007ca7220641ffff037141e4006e2207410174419e84c0006a2f00003b00002005417e6a2007419c7f6c20066a41ffff0371410174419e84c0006a2f00003b00002003417c6a2103200042ffc1d72f5621052004210020050d000b0b02402004a7220541e3004c0d00200241096a2003417e6a22036a2004a7220641ffff037141e4006e2205419c7f6c20066a41ffff0371410174419e84c0006a2f00003b00000b024002402005410a480d00200241096a2003417e6a22036a2005410174419e84c0006a2f00003b00000c010b200241096a2003417f6a22036a200541306a3a00000b200141c4b5c8004100200241096a20036a412720036b104d2103200241306a240020030b6f01017f230041c0006b220124002001200036020c200141346a410136020020014201370224200141b4b5c8003602202001410536023c2001200141386a36023020012001410c6a360238200141106a200141206a103d410141bcb5c80041072001280210200128021810820100000b02000b0d0042bdd594d9d4dea9e7d2000bef0501067f20002802002205410171220620046a21070240024020054104710d00410021010c010b4100210802402002450d00200221092001210a03402008200a2d000041c00171418001466a2108200a41016a210a2009417f6a22090d000b0b200720026a20086b21070b412b418080c40020061b21080240024020002802084101460d004101210a2000200820012002104e0d012000280218200320042000411c6a28020028020c110000210a0c010b02402000410c6a280200220920074b0d004101210a2000200820012002104e0d012000280218200320042000411c6a28020028020c1100000f0b024002400240024002402005410871450d00200028020421052000413036020420002d002021064101210a200041013a00202000200820012002104e0d054100210a200920076b22092102410120002d0020220820084103461b4103710e0403020102030b4100210a200920076b22092105024002400240410120002d0020220720074103461b4103710e0402010001020b2009410176210a200941016a41017621050c010b410021052009210a0b200a41016a210a0340200a417f6a220a450d0420002802182000280204200028021c280210110100450d000b41010f0b2009410176210a200941016a41017621020c010b410021022009210a0b200a41016a210a02400340200a417f6a220a450d0120002802182000280204200028021c280210110100450d000b41010f0b200028020421094101210a200028021820032004200028021c28020c1100000d01200241016a2108200028021c210220002802182101024003402008417f6a2208450d014101210a2001200920022802101101000d030c000b0b200020063a00202000200536020441000f0b200028020421094101210a2000200820012002104e0d00200028021820032004200028021c28020c1100000d00200541016a2108200028021c210220002802182100034002402008417f6a22080d0041000f0b4101210a200020092002280210110100450d000b0b200a0b5401017f024002402001418080c400460d0041012104200028021820012000411c6a2802002802101101000d010b024020020d0041000f0b2000280218200220032000411c6a28020028020c11000021040b20040b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41023602002003420237020c200341e885c000360208200341023602242003200341206a3602182003200341046a36022820032003360220200341086a20021046000b8d08010a7f200028021021030240024002400240200028020822044101460d0020034101460d012000280218200120022000411c6a28020028020c11000021030c030b20034101470d010b200120026a2105024002400240200041146a28020022060d0041002107200121080c010b41002107200121080340200520082203460d02200341016a2108024020032c00002209417f4a0d00200941ff017121090240024020082005470d004100210a2005210b0c010b20032d0001413f71210a200341026a2208210b0b200941e001490d0002400240200b2005470d004100210c2005210b0c010b200b2d0000413f71210c200b41016a2208210b0b200941f001490d0002400240200b2005470d004100210b0c010b200b41016a2108200b2d0000413f71210b0b200a410c742009411274418080f0007172200c41067472200b72418080c400460d030b200820036b20076a21072006417f6a22060d000b0b20052008460d00024020082c00002203417f4a0d0002400240200841016a2005470d0041002108200521060c010b200841026a210620082d0001413f7141067421080b200341ff017141e001490d000240024020062005470d0041002106200521090c010b200641016a210920062d0000413f7121060b200341ff017141f001490d00200341ff01712103200620087221080240024020092005470d00410021050c010b20092d0000413f7121050b20084106742003411274418080f0007172200572418080c400460d010b024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b20044101460d002000280218200120022000411c6a28020028020c1100000f0b0240024002402002450d004100210820022107200121030340200820032d000041c00171418001466a2108200341016a21032007417f6a22070d000b200220086b200028020c22054f0d014100210820022107200121030340200820032d000041c00171418001466a2108200341016a21032007417f6a22070d000c030b0b41002108200028020c22050d010b2000280218200120022000411c6a28020028020c1100000f0b41002103200820026b20056a22052107024002400240410020002d0020220820084103461b4103710e0402010001020b20054101762103200541016a41017621070c010b41002107200521030b200341016a2103024003402003417f6a2203450d0120002802182000280204200028021c280210110100450d000b41010f0b2000280204210841012103200028021820012002200028021c28020c1100000d00200741016a2103200028021c210720002802182100034002402003417f6a22030d0041000f0b200020082007280210110100450d000b41010f0b20030be00801067f230041f0006b220524002005200336020c20052002360208410121062001210702402001418102490d00410020016b2108418002210903400240200920014f0d0041002106200020096a2c000041bf7f4c0d00200921070c020b2009417f6a21074100210620094101460d01200820096a210a20072109200a4101470d000b0b200520073602142005200036021020054100410520061b36021c200541c4b5c80041aa86c00020061b3602180240024002400240200220014b22060d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b20052002360220024002402002450d0020022001470d010b200221060c030b200141016a210903400240200220014f0d00200020026a2c00004140480d00200541246a2109200221060c050b2002417f6a210620024101460d03200920024621032006210220030d030c000b0b20052002200320061b360228200541306a41146a4103360200200541c8006a41146a4104360200200541d4006a410436020020054203370234200541b086c0003602302005410236024c2005200541c8006a3602402005200541186a3602582005200541106a3602502005200541286a360248200541306a20041046000b200541e4006a4104360200200541c8006a41146a4104360200200541d4006a4102360200200541306a41146a410436020020054204370234200541c886c0003602302005410236024c2005200541c8006a3602402005200541186a3602602005200541106a36025820052005410c6a3602502005200541086a360248200541306a20041046000b200541246a21090b024020062001460d00410121030240024002400240200020066a22072c00002202417f4a0d0041002103200020016a220121000240200741016a2001460d00200741026a210020072d0001413f7121030b2002411f712107200241ff017141df014b0d01200320074106747221020c020b2005200241ff0171360224200541286a21010c020b410021082001210a024020002001460d00200041016a210a20002d0000413f7121080b200820034106747221030240200241ff017141f0014f0d0020032007410c747221020c010b410021020240200a2001460d00200a2d0000413f7121020b20034106742007411274418080f00071722002722202418080c400460d020b2005200236022441012103200541286a21012002418001490d00410221032002418010490d0041034104200241808004491b21030b200520063602282005200320066a36022c200541306a41146a4105360200200541ec006a4104360200200541e4006a4104360200200541c8006a41146a4106360200200541d4006a410736020020054205370234200541e886c00036023020052001360258200520093602502005410236024c2005200541c8006a3602402005200541186a3602682005200541106a3602602005200541206a360248200541306a20041046000b41ecd0c800412b2004103c000b100020012000280200200028020410500b800101037f230041206b22022400024002402000280200200110570d002001411c6a2802002103200128021821042002411c6a4100360200200241c4b5c8003602182002420137020c200241d087c00036020820042003200241086a103e450d010b200241206a240041010f0b2000280204200110572101200241206a240020010ba60403037f017e017f410121020240200128021841272001411c6a2802002802101101000d0041f4002103410221040240024002400240024002402000280200220041776a0e1f05010303000303030303030303030303030303030303030303040303030304020b41f2002103410221040c040b41ee002103410221040c030b200041dc00460d010b02400240024020001055450d00200041017267410276410773ad4280808080d0008421050c010b024020001056450d00410121040c020b200041017267410276410773ad4280808080d0008421050b410321040b200021030c010b20002103410221040b03402004210641dc002100410121024101210402400240024002400240024020060e0402010500020b02400240024002402005422088a741ff01710e06050302010006050b200542ffffffff8f608342808080803084210541f50021000c060b200542ffffffff8f608342808080802084210541fb0021000c050b413041d70020032005a72204410274411c7176410f712200410a491b20006a210002402004450d002005427f7c42ffffffff0f832005428080808070838421050c050b200542ffffffff8f60834280808080108421050c040b200542ffffffff8f6083210541fd0021000c030b41002104200321000c030b20012802184127200128021c2802101101000f0b200542ffffffff8f60834280808080c0008421050b410321040b20012802182000200128021c280210110100450d000b0b20020ba60301047f0240024002404100410f200041a49a04491b2201200141086a2201200141027441ac94c0006a280200410b742000410b7422014b1b2202200241046a2202200241027441ac94c0006a280200410b7420014b1b2202200241026a2202200241027441ac94c0006a280200410b7420014b1b2202200241016a2202200241027441ac94c0006a280200410b7420014b1b220241027441ac94c0006a280200410b74220320014620032001496a20026a2201411e4b0d0041b105210402402001411e460d00200141027441b094c0006a28020041157621040b4100210202402001417f6a220320014b0d002003411f4f0d03200341027441ac94c0006a28020041ffffff007121020b02402004200141027441ac94c0006a280200411576220141016a460d00200020026b2102200141b105200141b1054b1b21032004417f6a210441002100034020032001460d032000200141b895c0006a2d00006a220020024b0d012004200141016a2201470d000b200421010b20014101710f0b2001411f41ec9ac000103f000b200341b10541fc9ac000103f000b2003411f41a895c000103f000be20601077f0240024002400240024002400240024002400240200041808004490d00200041808008490d0141002101200041b5d9736a41b5db2b490d08200041e28b746a41e20b490d082000419fa8746a419f18490d08200041dee2746a410e490d08200041feffff0071419ef00a460d08200041a2b2756a4122490d08200041cb91756a410b490d08200041f08338490f0b20004180fe0371410876210241e988c000210341002104200041ff017121050340200341026a2106200420032d000122016a2107024020032d000022032002460d00200320024b0d082007210420062103200641bb89c000470d010c080b20072004490d02200741a2024b0d03200441cc89c0006a2103024003402001450d012001417f6a210120032d00002104200341016a210320042005470d000b410021010c090b2007210420062103200641bb89c000470d000c070b0b20004180fe0371410876210241b48ec000210341002104200041ff017121050340200341026a2106200420032d000122016a2107024020032d000022032002460d00200320024b0d062007210420062103200641808fc000470d010c060b20072004490d03200741af014b0d04200441808fc0006a2103024003402001450d012001417f6a210120032d00002104200341016a210320042005470d000b410021010c080b2007210420062103200641808fc000470d000c050b0b2004200741bc89c0001059000b200741a20241bc89c000104f000b2004200741bc89c0001059000b200741af0141bc89c000104f000b200041ffff0371210541af90c00021034101210102400340200341016a21000240024020032d0000220441187441187522074100480d00200021030c010b200041d293c000460d02200741ff007141087420032d0001722104200341026a21030b200520046b22054100480d0320014101732101200341d293c000470d000c030b0b41ecd0c800412b41a48ec000103c000b200041ffff0371210541ee8bc0002103410121010340200341016a21000240024020032d0000220441187441187522074100480d00200021030c010b200041a38ec000460d03200741ff007141087420032d0001722104200341026a21030b200520046b22054100480d0120014101732101200341a38ec000470d000b0b20014101710f0b41ecd0c800412b41a48ec000103c000ba50201037f23004180016b2202240002400240024002400240200128020022034110710d0020034120710d012000ad2001104921000c020b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d02200141a888c0004102200220036a4180016a410020036b104d21000c010b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d02200141a888c0004102200220036a4180016a410020036b104d21000b20024180016a240020000f0b2000418001419888c0001058000b2000418001419888c0001058000b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41023602002003420237020c200341ac88c000360208200341023602242003200341206a3602182003200341046a36022820032003360220200341086a20021046000b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41023602002003420237020c200341f893c000360208200341023602242003200341206a3602182003200341046a36022820032003360220200341086a20021046000b1c00200128021841ec9bc000410b2001411c6a28020028020c1100000b1c00200128021841f79bc000410e2001411c6a28020028020c1100000b5b01017f230041306b220324002003200136020c20032000360208200341246a410136020020034201370214200341b4b5c8003602102003410436022c2003200341286a3602202003200341086a360228200341106a20021046000b140020002802002001200028020428020c1101000b1500200120002802002200280200200028020410500bf305010a7f230041206b220324000240024020020d00410021040c010b024002400340024020002802082d0000450d00200028020041c19cc0004104200028020428020c1100000d030b2003410a3602182003428a808080103703102003200236020c41002105200341003602082003200236020420032001360200200221060240024002400340200120056a210720032d001821080240024002400240200641074b0d002006450d01200220056b2109410021040340200720046a2d00002008460d042009200441016a2204470d000c020b0b024002400240410020076b4103712209450d00410021040340200720046a2d00002008460d062009200441016a2204470d000b2009200641786a220a4b0d020c010b200641786a210a410021090b200841818284086c210402400340200720096a220b41046a280200200473220c417f73200c41fffdfb776a71200b280200200473220b417f73200b41fffdfb776a7172418081828478710d01200941086a2209200a4d0d000b0b200920064b0d050b20062009460d00200620096b210b2001200920056a6a2107410021040340200720046a2d00002008460d02200b200441016a2204470d000b0b200320023602080c040b200920046a21040b2003200520046a220441016a2205360208024002402005450d0020022005490d00200120046a2d000020032d0018460d010b20022005490d03200220056b21060c010b0b200028020841013a0000200441016a21040c020b2009200641889dc0001058000b200028020841003a0000200221040b20002802042109200028020021080240024002402004450d0020022004460d000240200220044d0d00200120046a22072c000041bf7f4a0d020b200120024100200441c89cc0001051000b200820012004200928020c1100000d040c010b200820012004200928020c1100000d0320072c000041bf7f4c0d020b200120046a2101200220046b22020d000b410021040c020b200120022004200241d89cc0001051000b410121040b200341206a240020040bbb0302047f027e230041c0006b2205240041012106024020002d00040d0020002d000521070240200028020022082d00004104710d0041012106200828021841bb9dc00041b89dc000200741ff017122071b4102410320071b2008411c6a28020028020c1100000d014101210620002802002208280218200120022008411c6a28020028020c1100000d01410121062000280200220828021841f0b3c80041022008411c6a28020028020c1100000d0120032000280200200428020c11010021060c010b0240200741ff01710d0041012106200828021841bd9dc00041032008411c6a28020028020c1100000d01200028020021080b41012106200541013a0017200541346a41c09dc000360200200520082902183703082005200541176a360210200829020821092008290210210a200520082d00203a00382005200a37032820052009370320200520082902003703182005200541086a360230200541086a20012002105f0d00200541086a41f0b3c8004102105f0d002003200541186a200428020c1101000d00200528023041d89dc0004102200528023428020c11000021060b200041013a0005200020063a0004200541c0006a240020000b850201027f230041106b220224002002410036020c02400240024002402001418001490d002001418010490d012002410c6a21032001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c2002410c6a2103410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c2002410c6a2103410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b200020032001105f2101200241106a240020010b6001017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41dc9dc000200241086a103e2101200241206a240020010b0d00200028020020012002105f0b8c0201027f230041106b22022400200028020021002002410036020c02400240024002402001418001490d002001418010490d012002410c6a21032001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c2002410c6a2103410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c2002410c6a2103410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b200020032001105f2101200241106a240020010b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41dc9dc000200241086a103e2101200241206a240020010bd30202047f027e230041c0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d0041012104200628021841bb9dc00041f79dc00020051b4102410120051b2006411c6a28020028020c1100000d0120012000280200200228020c11010021040c010b024020050d0041012104200628021841f89dc00041022006411c6a28020028020c1100000d01200028020021060b41012104200341013a0017200341346a41c09dc000360200200320062902183703082003200341176a3602102006290208210720062902102108200320062d00203a00382003200837032820032007370320200320062902003703182003200341086a3602302001200341186a200228020c1101000d00200328023041d89dc0004102200328023428020c11000021040b200020043a00082000200028020441016a360204200341c0006a240020000bd40202037f027e230041c0006b2203240041012104024020002d00040d0020002d000521040240200028020022052d00004104710d000240200441ff0171450d0041012104200528021841bb9dc00041022005411c6a28020028020c1100000d02200028020021050b20012005200228020c11010021040c010b0240200441ff01710d0041012104200528021841fb9dc00041012005411c6a28020028020c1100000d01200028020021050b41012104200341013a0017200341346a41c09dc000360200200320052902183703082003200341176a3602102005290208210620052902102107200320052d00203a00382003200737032820032006370320200320052902003703182003200341086a3602302001200341186a200228020c1101000d00200328023041d89dc0004102200328023428020c11000021040b200041013a0005200020043a0004200341c0006a240020000b6401027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a103e2100200241206a240020000bd008020b7f017e4101210302400240200228021841222002411c6a2802002802101101000d000240024020010d00410021040c010b200020016a21054100210420002106200021074100210802400340200641016a210902400240024020062c0000220a417f4a0d000240024020092005470d004100210b200521060c010b20062d0001413f71210b200641026a220921060b200a411f7121030240200a41ff0171220a41df014b0d00200b200341067472210b0c020b0240024020062005470d004100210c2005210d0c010b20062d0000413f71210c200641016a2209210d0b200c200b41067472210b0240200a41f0014f0d00200b2003410c7472210b0c020b02400240200d2005470d004100210a200921060c010b200d41016a2106200d2d0000413f71210a0b200b4106742003411274418080f0007172200a72220b418080c400470d020c040b200a41ff0171210b0b200921060b4102210941f400210d02400240024002400240024002400240200b41776a0e1f06010303000303030303030303030303030303030303030303040303030304020b41f200210d0c050b41ee00210d0c040b200b41dc00460d010b0240200b10550d00200b10560d040b200b41017267410276410773ad4280808080d00084210e410321090c010b0b200b210d0b0240024020082004490d0002402004450d0020042001460d00200420014f0d01200020046a2c000041bf7f4c0d010b02402008450d0020082001460d00200820014f0d01200020086a2c000041bf7f4c0d010b2002280218200020046a200820046b200228021c28020c110000450d0141010f0b200020012004200841909ec0001051000b03402009210a4101210341dc00210441012109024002400240024002400240200a0e0402010500020b0240024002400240200e422088a741ff01710e06050302010006050b200e42ffffffff8f608342808080803084210e4103210941f50021040c070b200e42ffffffff8f608342808080802084210e4103210941fb0021040c060b413041d700200d200ea72209410274411c7176410f712204410a491b20046a210402402009450d00200e427f7c42ffffffff0f83200e4280808080708384210e0c050b200e42ffffffff8f608342808080801084210e0c040b200e42ffffffff8f6083210e4103210941fd0021040c040b41002109200d21040c030b410121090240200b418001490d0041022109200b418010490d0041034104200b41808004491b21090b200920086a21040c040b200e42ffffffff8f60834280808080c00084210e0b410321090b20022802182004200228021c280210110100450d000c050b0b200820076b20066a21082006210720052006470d000b0b2004450d0020042001460d00200420014f0d02200020046a2c000041bf7f4c0d020b410121032002280218200020046a200120046b200228021c28020c1100000d0020022802184122200228021c2802101101000f0b20030f0b200020012004200141809ec0001051000b870101027f23004180016b2202240020002d00002103410021000340200220006a41ff006a20034101714130723a00002000417f6a2100200341017641ff007122030d000b024020004180016a2203418101490d002003418001419888c0001058000b200141a09ec0004102200220006a4180016a410020006b104d210020024180016a240020000b900101037f23004180016b2202240020002802002103410021000340200220006a41ff006a2003410f712204413072200441376a2004410a491b3a00002000417f6a2100200341047622030d000b024020004180016a2203418101490d002003418001419888c0001058000b200141a888c0004102200220006a4180016a410020006b104d210020024180016a240020000ba50303047f027e027f230041d0006b220324000240024020004290ce005441002001501b450d002000a72104412721050c010b41272105200341206a21060340200341186a200020014290ce00420010c808200341086a200329031822072006290300220842f0b17f427f10ce08200341296a20056a2204417c6a200329030820007ca7220941ffff037141e4006e220a410174419e84c0006a2f00003b00002004417e6a200a419c7f6c20096a41ffff0371410174419e84c0006a2f00003b0000200042ffc1d72f56210420014200522109200150210a2005417c6a2105200721002008210120042009200a1b0d000b2007a721040b02400240200441e3004a0d00200421090c010b200341296a2005417e6a22056a200441ffff037141e4006e2209419c7f6c20046a41ffff0371410174419e84c0006a2f00003b00000b024002402009410a480d00200341296a2005417e6a22056a2009410174419e84c0006a2f00003b00000c010b200341296a2005417f6a22056a200941306a3a00000b200241c4b5c8004100200341296a20056a412720056b104d2105200341d0006a240020050b1c00200128021841a4afc00041052001411c6a28020028020c1100000bcf0401067e2000420037001720002001290320220242338842137e2001290300220342ffffffffffffff03837c220442137c4233882001290308220542ffffffffffffff038320034233887c22037c4233882001290310220642ffffffffffffff038320054233887c22057c4233882001290318220742ffffffffffffff038320064233887c22067c423388200242ffffffffffffff038320074233887c22077c42338842137e20047c22023c0000200020024228883c0005200020024220883c0004200020024218883c0003200020024210883c0002200020024208883c00012000200242338820037c22044225883c000b20002004421d883c000a200020044215883c000920002004420d883c0008200020044205883c00072000200442338820057c2203422a883c0012200020034222883c001120002003421a883c0010200020034212883c000f20002003420a883c000e200020034202883c000d2000200442ffffffffffffff038322044203862002423088420783843c00062000200342338820067c2202421f883c0017200020024227883c0018200020024217883c001620002002420f883c0015200020024207883c00142000200342ffffffffffffff038322054206862004422d88843c000c2000200242338820077c22034204883c001a20002003420c883c001b200020034214883c001c20002003421c883c001d200020034224883c001e2000200242ffffffffffffff038322024201862005423288843c00132000200342ffffffffffffff03832203422c883c001f200020034204862002422f88843c00190b7101027f230041c0006b2202240020022000106e200241206a2001106e41002101410121000340200241206a20016a2d0000200220016a2d0000732203410020036b72417f734180017141077610702000712100200141016a22014120470d000b200010702101200241c0006a240020010b1501017f230041106b220120003a000f20012d000f0bd00702017f147e230041f0016b2203240020012903202104200129031821052001290310210620012903082107200129030021080340200341b0016a200842002008420010ce0820034180016a20074200200442137e2209420010ce08200341c0006a200542137e220a42002006420010ce08200341e0016a200a42002005420010ce08200341f0006a200842002007420010ce08200341306a200642002009420010ce08200341e0006a200742002007420010ce08200341206a200842002006420010ce08200341d0016a200a42002004420010ce08200341c0016a200942002004420010ce08200341a0016a200842002005420010ce08200341106a200742002006420010ce082003200642002006420010ce0820034190016a200842002004420010ce08200341d0006a200742002005420010ce08200329039001220b20032903507c2206420186220c20032903007c220720032903a001220d20032903107c2208420186220e20032903c0017c22042003290320220f20032903d0017c2205420186221020032903607c22092003290370221120032903307c220a420186221220032903e0017c2213200329038001221420032903407c2215420186221620032903b0017c221742338820034180016a41086a290300200341c0006a41086a2903007c2015201454ad7c4201862015423f8884200341b0016a41086a2903007c2017201654ad7c420d86847c2215423388200341f0006a41086a290300200341306a41086a2903007c200a201154ad7c420186200a423f8884200341e0016a41086a2903007c2013201254ad7c2015201354ad7c420d86847c220a423388200341206a41086a290300200341d0016a41086a2903007c2005200f54ad7c4201862005423f8884200341e0006a41086a2903007c2009201054ad7c200a200954ad7c420d86847c2205423388200341a0016a41086a290300200341106a41086a2903007c2008200d54ad7c4201862008423f8884200341c0016a41086a2903007c2004200e54ad7c2005200454ad7c420d86847c220442338820034190016a41086a290300200341d0006a41086a2903007c2006200b54ad7c4201862006423f8884200341086a2903007c2007200c54ad7c2004200754ad7c420d868442137e201742ffffffffffffff03837c220642ffffffffffffff038321082006423388201542ffffffffffffff03837c2107200442ffffffffffffff03832104200542ffffffffffffff03832105200a42ffffffffffffff038321062002417f6a22020d000b2000200437032020002005370318200020063703102000200737030820002008370300200341f0016a24000bbbd40103017f297e037f230041d0c1006b22032400200341a8c1006a200241011071200341a0386a20022903002204420020032903a8412205420010ce08200341b0396a20032903c841220642002002290308220742137e2208420010ce08200341f0396a20032903c041220942002002290310220a42137e220b420010ce08200341b03a6a20032903b841220c42002002290318220d42137e220e420010ce08200341f03a6a20032903b041220f42002002290320221042137e2211420010ce08200341f0386a200f42002004420010ce08200341b0386a200542002007420010ce08200341c0396a20064200200b420010ce08200341803a6a20094200200e420010ce08200341c03a6a200c42002011420010ce0820034180396a200c42002004420010ce08200341803b6a200f42002007420010ce08200341c0386a20054200200a420010ce08200341d0396a20064200200e420010ce08200341903a6a200942002011420010ce0820034190396a200942002004420010ce08200341d03a6a200c42002007420010ce08200341903b6a200f4200200a420010ce08200341d0386a20054200200d420010ce08200341e0396a200642002011420010ce08200341a0396a200642002004420010ce08200341a03a6a200942002007420010ce08200341e03a6a200c4200200a420010ce08200341a03b6a200f4200200d420010ce08200341e0386a200542002010420010ce08200320032903d039221220032903c0387c220520032903903a7c22062003290380397c220920032903803b7c220c20032903c039221320032903b0387c220f20032903803a7c221420032903c03a7c221520032903f0387c221620032903b039221720032903a0387c221820032903f0397c221920032903b03a7c221a20032903f03a7c221b423388200341b0396a41086a290300200341a0386a41086a2903007c2018201754ad7c200341f0396a41086a2903007c2019201854ad7c200341b03a6a41086a2903007c201a201954ad7c200341f03a6a41086a2903007c201b201a54ad7c420d86847c2219423388200341c0396a41086a290300200341b0386a41086a2903007c200f201354ad7c200341803a6a41086a2903007c2014200f54ad7c200341c03a6a41086a2903007c2015201454ad7c200341f0386a41086a2903007c2016201554ad7c2019201654ad7c420d86847c220f42ffffffffffffff038322143703c03b200320032903e039221720032903d0387c22152003290390397c221620032903d03a7c221a20032903903b7c2213200f423388200341d0396a41086a290300200341c0386a41086a2903007c2005201254ad7c200341903a6a41086a2903007c2006200554ad7c20034180396a41086a2903007c2009200654ad7c200341803b6a41086a2903007c200c200954ad7c200f200c54ad7c420d86847c220542ffffffffffffff038322183703c83b200320032903a039221220032903e0387c220620032903a03a7c220920032903e03a7c220c20032903a03b7c220f2005423388200341e0396a41086a290300200341d0386a41086a2903007c2015201754ad7c20034190396a41086a2903007c2016201554ad7c200341d03a6a41086a2903007c201a201654ad7c200341903b6a41086a2903007c2013201a54ad7c2005201354ad7c420d86847c220542ffffffffffffff0383221a3703d03b20032005423388200341a0396a41086a290300200341e0386a41086a2903007c2006201254ad7c200341a03a6a41086a2903007c2009200654ad7c200341e03a6a41086a2903007c200c200954ad7c200341a03b6a41086a2903007c200f200c54ad7c2005200f54ad7c420d868442137e201b42ffffffffffffff03837c220542ffffffffffffff0383220c3703b03b20032005423388201942ffffffffffffff03837c220f3703b83b200341a8c1006a200341b03b6a4101107120034190356a20032903a841220542002004420010ce08200341e0356a20032903c841220642002008420010ce08200341b0366a20032903c04122094200200b420010ce0820034180376a20032903b84122154200200e420010ce08200341d0376a20032903b041221642002011420010ce08200341e0376a201642002004420010ce08200341a0356a200542002007420010ce08200341f0356a20064200200b420010ce08200341c0366a20094200200e420010ce0820034190376a201542002011420010ce08200341a0376a201542002004420010ce08200341f0376a201642002007420010ce08200341b0356a20054200200a420010ce0820034180366a20064200200e420010ce08200341d0366a200942002011420010ce08200341e0366a200942002004420010ce08200341b0376a201542002007420010ce0820034180386a20164200200a420010ce08200341c0356a20054200200d420010ce0820034190366a200642002011420010ce08200341a0366a200642002004420010ce08200341f0366a200942002007420010ce08200341c0376a20154200200a420010ce0820034190386a20164200200d420010ce08200341d0356a200542002010420010ce08200341800d6a200c420020012903002211420010ce0820034190346a200f42137e42002001290320220e420010ce08200341d0336a200129031822054200201442137e220b420010ce0820034190336a200129031022064200201842137e2216420010ce08200341c0326a200129030822094200201a42137e2215420010ce08200341f00c6a20094200200c420010ce0820034180356a200f42002011420010ce0820034180346a200e4200200b420010ce08200341c0336a200542002016420010ce0820034180336a200642002015420010ce08200341e00c6a200c42002006420010ce08200341b0326a200f42002009420010ce08200341f0346a201142002014420010ce08200341f0336a200e42002016420010ce08200341b0336a200542002015420010ce08200341800c6a200c42002005420010ce08200341f0326a200f42002006420010ce08200341a0326a200942002014420010ce08200341e0346a201142002018420010ce08200341e0336a20154200200e420010ce08200341a00b6a200c4200200e420010ce08200341a0336a200f42002005420010ce08200341e0326a200642002014420010ce0820034190326a200942002018420010ce08200341d0346a201a42002011420010ce0820034180306a20032903a036221c20032903d0357c220c20032903f0367c220f20032903c0377c22142003290390387c2215200329039036221d20032903c0357c221620032903e0367c220b20032903b0377c22182003290380387c2219200329038036221e20032903b0357c221a20032903d0367c221b20032903a0377c221320032903f0377c220820032903f035221f20032903a0357c221220032903c0367c22172003290390377c222020032903e0377c222120032903e03522222003290390357c222320032903b0367c22242003290380377c222520032903d0377c2226423388200341e0356a41086a29030020034190356a41086a2903007c2023202254ad7c200341b0366a41086a2903007c2024202354ad7c20034180376a41086a2903007c2025202454ad7c200341d0376a41086a2903007c2026202554ad7c420d86847c2223423388200341f0356a41086a290300200341a0356a41086a2903007c2012201f54ad7c200341c0366a41086a2903007c2017201254ad7c20034190376a41086a2903007c2020201754ad7c200341e0376a41086a2903007c2021202054ad7c2023202154ad7c420d86847c221242338820034180366a41086a290300200341b0356a41086a2903007c201a201e54ad7c200341d0366a41086a2903007c201b201a54ad7c200341a0376a41086a2903007c2013201b54ad7c200341f0376a41086a2903007c2008201354ad7c2012200854ad7c420d86847c221a42338820034190366a41086a290300200341c0356a41086a2903007c2016201d54ad7c200341e0366a41086a2903007c200b201654ad7c200341b0376a41086a2903007c2018200b54ad7c20034180386a41086a2903007c2019201854ad7c201a201954ad7c420d86847c2216423388200341a0366a41086a290300200341d0356a41086a2903007c200c201c54ad7c200341f0366a41086a2903007c200f200c54ad7c200341c0376a41086a2903007c2014200f54ad7c20034190386a41086a2903007c2015201454ad7c2016201554ad7c420d868442137e202642ffffffffffffff03837c220f42ffffffffffffff0383220c42002011420010ce08200341d0306a200f423388202342ffffffffffffff03837c220f42137e4200200e420010ce08200341f0306a201242ffffffffffffff0383221442137e221942002005420010ce08200341a0316a201a42ffffffffffffff0383220b42137e221842002006420010ce08200341e0316a201642ffffffffffffff0383221642137e221542002009420010ce08200341f02f6a200c42002009420010ce08200341c0306a200f42002011420010ce08200341e0306a20194200200e420010ce0820034190316a201842002005420010ce08200341d0316a201542002006420010ce08200341e02f6a200c42002006420010ce08200341b0306a200f42002009420010ce08200341c0346a201442002011420010ce0820034180316a20184200200e420010ce08200341c0316a201542002005420010ce08200341d02f6a200c42002005420010ce08200341a0306a200f42002006420010ce0820034180326a201442002009420010ce08200341b0346a200b42002011420010ce08200341b0316a20154200200e420010ce08200341c02f6a200c4200200e420010ce0820034190306a200f42002005420010ce08200341d0326a201442002006420010ce08200341f0316a200b42002009420010ce08200341a0346a201642002011420010ce082003200329038031221220032903c0347c220f20032903c0317c221420032903e02f7c221520032903b0307c2216200329039031221720032903e0307c220c20032903d0317c220b20032903f02f7c221820032903c0307c221920032903a031222020032903f0307c221a20032903e0317c221b2003290380307c221320032903d0307c2208423388200341a0316a41086a290300200341f0306a41086a2903007c201a202054ad7c200341e0316a41086a2903007c201b201a54ad7c20034180306a41086a2903007c2013201b54ad7c200341d0306a41086a2903007c2008201354ad7c420d86847c221a42338820034190316a41086a290300200341e0306a41086a2903007c200c201754ad7c200341d0316a41086a2903007c200b200c54ad7c200341f02f6a41086a2903007c2018200b54ad7c200341c0306a41086a2903007c2019201854ad7c201a201954ad7c420d86847c220b42ffffffffffffff0383220c3703e83b200320032903b03422172003290380327c221820032903b0317c221920032903d02f7c221b20032903a0307c2213200b42338820034180316a41086a290300200341c0346a41086a2903007c200f201254ad7c200341c0316a41086a2903007c2014200f54ad7c200341e02f6a41086a2903007c2015201454ad7c200341b0306a41086a2903007c2016201554ad7c200b201654ad7c420d86847c221442ffffffffffffff0383220f3703f03b200320032903f031222020032903d0327c221520032903a0347c221620032903c02f7c220b2003290390307c22122014423388200341b0346a41086a29030020034180326a41086a2903007c2018201754ad7c200341b0316a41086a2903007c2019201854ad7c200341d02f6a41086a2903007c201b201954ad7c200341a0306a41086a2903007c2013201b54ad7c2014201354ad7c420d86847c221842ffffffffffffff038322143703f83b20032018423388200341f0316a41086a290300200341d0326a41086a2903007c2015202054ad7c200341a0346a41086a2903007c2016201554ad7c200341c02f6a41086a2903007c200b201654ad7c20034190306a41086a2903007c2012200b54ad7c2018201254ad7c420d868442137e200842ffffffffffffff03837c221642ffffffffffffff038322153703d83b20032016423388201a42ffffffffffffff03837c22163703e03b200341803c6a200341d83b6a41011071200341a8c1006a200341803c6a41011071200341a83c6a200341a8c1006a41011071200341b02f6a20032903a83c220b42002015420010ce08200341b02c6a2014420020032903b03c221842137e420010ce08200341902d6a200f420020032903b83c221942137e2208420010ce08200341f02d6a200c420020032903c03c221b42137e2213420010ce08200341d02e6a2016420020032903c83c221242137e221a420010ce08200341a02f6a20164200200b420010ce08200341f02c6a201542002018420010ce08200341802d6a201442002008420010ce08200341e02d6a200f42002013420010ce08200341c02e6a200c4200201a420010ce08200341902f6a200c4200200b420010ce08200341e02c6a201642002018420010ce08200341c02d6a201542002019420010ce08200341d02d6a201442002013420010ce08200341b02e6a200f4200201a420010ce08200341802f6a200f4200200b420010ce08200341d02c6a200c42002018420010ce08200341b02d6a201642002019420010ce08200341902e6a20154200201b420010ce08200341a02e6a20144200201a420010ce08200341f02e6a20144200200b420010ce08200341c02c6a200f42002018420010ce08200341a02d6a200c42002019420010ce08200341802e6a20164200201b420010ce08200341e02e6a201542002012420010ce08200341e0296a20032903f02e222720032903e02e7c220b20032903c02c7c221820032903a02d7c221920032903802e7c221a20032903a02e222820032903902e7c221b20032903802f7c221320032903d02c7c220820032903b02d7c221220032903d02d222920032903c02d7c221720032903b02e7c222020032903902f7c222120032903e02c7c222320032903802d222a20032903f02c7c222420032903e02d7c222520032903c02e7c222620032903a02f7c221c20032903b02c222b20032903b02f7c221d20032903902d7c221e20032903f02d7c221f20032903d02e7c2222423388200341b02c6a41086a290300200341b02f6a41086a2903007c201d202b54ad7c200341902d6a41086a2903007c201e201d54ad7c200341f02d6a41086a2903007c201f201e54ad7c200341d02e6a41086a2903007c2022201f54ad7c420d86847c221d423388200341802d6a41086a290300200341f02c6a41086a2903007c2024202a54ad7c200341e02d6a41086a2903007c2025202454ad7c200341c02e6a41086a2903007c2026202554ad7c200341a02f6a41086a2903007c201c202654ad7c201d201c54ad7c420d86847c2224423388200341d02d6a41086a290300200341c02d6a41086a2903007c2017202954ad7c200341b02e6a41086a2903007c2020201754ad7c200341902f6a41086a2903007c2021202054ad7c200341e02c6a41086a2903007c2023202154ad7c2024202354ad7c420d86847c2217423388200341a02e6a41086a290300200341902e6a41086a2903007c201b202854ad7c200341802f6a41086a2903007c2013201b54ad7c200341d02c6a41086a2903007c2008201354ad7c200341b02d6a41086a2903007c2012200854ad7c2017201254ad7c420d86847c221b423388200341f02e6a41086a290300200341e02e6a41086a2903007c200b202754ad7c200341c02c6a41086a2903007c2018200b54ad7c200341a02d6a41086a2903007c2019201854ad7c200341802e6a41086a2903007c201a201954ad7c201b201a54ad7c420d868442137e202242ffffffffffffff03837c221842ffffffffffffff0383220b420020032903803c2213420010ce08200341b02a6a2018423388201d42ffffffffffffff03837c221842137e420020032903a03c2208420010ce08200341d02a6a202442ffffffffffffff0383221942137e2224420020032903983c2212420010ce08200341802b6a201742ffffffffffffff0383221a42137e2223420020032903903c2217420010ce08200341c02b6a201b42ffffffffffffff0383221b42137e2221420020032903883c2220420010ce08200341d0296a200b42002020420010ce08200341a02a6a201842002013420010ce08200341c02a6a202442002008420010ce08200341f02a6a202342002012420010ce08200341b02b6a202142002017420010ce08200341c0296a200b42002017420010ce08200341902a6a201842002020420010ce08200341d02b6a201942002013420010ce08200341e02a6a202342002008420010ce08200341a02b6a202142002012420010ce08200341b0296a200b42002012420010ce08200341802a6a201842002017420010ce08200341e02b6a201942002020420010ce08200341802c6a201a42002013420010ce08200341902b6a202142002008420010ce08200341a0296a200b42002008420010ce08200341f0296a201842002012420010ce08200341f02b6a201942002017420010ce08200341902c6a201a42002020420010ce08200341a02c6a201b42002013420010ce08200320032903e02a221e20032903d02b7c221320032903a02b7c220820032903c0297c221220032903902a7c221720032903f02a221f20032903c02a7c222020032903b02b7c222120032903d0297c222320032903a02a7c222420032903802b222220032903d02a7c222520032903c02b7c222620032903e0297c221c20032903b02a7c221d423388200341802b6a41086a290300200341d02a6a41086a2903007c2025202254ad7c200341c02b6a41086a2903007c2026202554ad7c200341e0296a41086a2903007c201c202654ad7c200341b02a6a41086a2903007c201d201c54ad7c420d86847c2225423388200341f02a6a41086a290300200341c02a6a41086a2903007c2020201f54ad7c200341b02b6a41086a2903007c2021202054ad7c200341d0296a41086a2903007c2023202154ad7c200341a02a6a41086a2903007c2024202354ad7c2025202454ad7c420d86847c222042ffffffffffffff03833703e03c200320032903802c221c20032903e02b7c222120032903902b7c222320032903b0297c222420032903802a7c22262020423388200341e02a6a41086a290300200341d02b6a41086a2903007c2013201e54ad7c200341a02b6a41086a2903007c2008201354ad7c200341c0296a41086a2903007c2012200854ad7c200341902a6a41086a2903007c2017201254ad7c2020201754ad7c420d86847c221342ffffffffffffff03833703e83c200320032903902c221e20032903f02b7c220820032903a02c7c221220032903a0297c221720032903f0297c22202013423388200341802c6a41086a290300200341e02b6a41086a2903007c2021201c54ad7c200341902b6a41086a2903007c2023202154ad7c200341b0296a41086a2903007c2024202354ad7c200341802a6a41086a2903007c2026202454ad7c2013202654ad7c420d86847c221342ffffffffffffff03833703f03c20032013423388200341902c6a41086a290300200341f02b6a41086a2903007c2008201e54ad7c200341a02c6a41086a2903007c2012200854ad7c200341a0296a41086a2903007c2017201254ad7c200341f0296a41086a2903007c2020201754ad7c2013202054ad7c420d868442137e201d42ffffffffffffff03837c221342ffffffffffffff03833703d03c20032013423388202542ffffffffffffff03837c3703d83c200341f83c6a200341d03c6a4101107120034190296a200b420020032903f83c2213420010ce0820034190266a201b420020032903803d220842137e420010ce08200341f0266a20032903883d221242137e22234200201a420010ce08200341d0276a20032903903d222042137e222142002019420010ce08200341b0286a2018420020032903983d222442137e2217420010ce0820034180296a201842002013420010ce08200341d0266a200b42002008420010ce08200341e0266a201b42002023420010ce08200341c0276a20214200201a420010ce08200341a0286a201742002019420010ce08200341f0286a201342002019420010ce08200341c0266a201842002008420010ce08200341a0276a200b42002012420010ce08200341b0276a20214200201b420010ce0820034190286a20174200201a420010ce08200341e0286a20134200201a420010ce08200341b0266a200842002019420010ce0820034190276a201842002012420010ce08200341f0276a200b42002020420010ce0820034180286a20174200201b420010ce08200341d0286a20134200201b420010ce08200341a0266a20084200201a420010ce0820034180276a201242002019420010ce08200341e0276a201842002020420010ce08200341c0286a200b42002024420010ce082003200329039028222520032903b0277c220b20032903f0287c221820032903a0277c221a20032903c0267c221b20032903c027222420032903e0267c221920032903a0287c221320032903d0267c22082003290380297c221220032903f02622262003290390267c221720032903d0277c22202003290390297c222120032903b0287c2223423388200341f0266a41086a29030020034190266a41086a2903007c2017202654ad7c200341d0276a41086a2903007c2020201754ad7c20034190296a41086a2903007c2021202054ad7c200341b0286a41086a2903007c2023202154ad7c420d86847c2220423388200341c0276a41086a290300200341e0266a41086a2903007c2019202454ad7c200341a0286a41086a2903007c2013201954ad7c200341d0266a41086a2903007c2008201354ad7c20034180296a41086a2903007c2012200854ad7c2020201254ad7c420d86847c221342ffffffffffffff038322193703b03d2003200329038028222620032903b0267c220820032903e0287c221220032903f0277c22212003290390277c2224201342338820034190286a41086a290300200341b0276a41086a2903007c200b202554ad7c200341f0286a41086a2903007c2018200b54ad7c200341a0276a41086a2903007c201a201854ad7c200341c0266a41086a2903007c201b201a54ad7c2013201b54ad7c420d86847c220b42ffffffffffffff038322173703b83d2003200329038027222520032903a0267c221820032903d0287c221a20032903c0287c221b20032903e0277c2213200b42338820034180286a41086a290300200341b0266a41086a2903007c2008202654ad7c200341e0286a41086a2903007c2012200854ad7c200341f0276a41086a2903007c2021201254ad7c20034190276a41086a2903007c2024202154ad7c200b202454ad7c420d86847c220b42ffffffffffffff038322213703c03d2003200b42338820034180276a41086a290300200341a0266a41086a2903007c2018202554ad7c200341d0286a41086a2903007c201a201854ad7c200341c0286a41086a2903007c201b201a54ad7c200341e0276a41086a2903007c2013201b54ad7c200b201354ad7c420d868442137e202342ffffffffffffff03837c221842ffffffffffffff0383220b3703a03d20032018423388202042ffffffffffffff03837c22183703a83d200341c83d6a200341a03d6a41051071200341c0236a200b420020032903c83d221a420010ce08200341c0246a201842137e420020032903e83d221b420010ce0820034180256a201942137e2224420020032903e03d2213420010ce08200341c0256a201742137e2223420020032903d83d2208420010ce0820034180266a202142137e2220420020032903d03d2212420010ce08200341b0236a200b42002012420010ce0820034180246a20184200201a420010ce08200341b0246a20244200201b420010ce08200341f0246a202342002013420010ce08200341b0256a202042002008420010ce08200341a0236a200b42002008420010ce08200341f0256a201842002012420010ce08200341f0236a20194200201a420010ce08200341a0246a20234200201b420010ce08200341e0246a202042002013420010ce0820034190236a200b42002013420010ce08200341a0256a201842002008420010ce08200341e0256a201942002012420010ce08200341e0236a20174200201a420010ce0820034190246a20204200201b420010ce0820034180236a200b4200201b420010ce08200341d0246a201842002013420010ce0820034190256a201942002008420010ce08200341d0256a201742002012420010ce08200341d0236a20214200201a420010ce08200320032903a024222420032903f0237c220b20032903e0247c221820032903a0237c221a20032903f0257c221b20032903f024222520032903b0247c221920032903b0257c221320032903b0237c22082003290380247c221220032903c02522262003290380257c22172003290380267c222020032903c0237c222120032903c0247c2223423388200341c0256a41086a29030020034180256a41086a2903007c2017202654ad7c20034180266a41086a2903007c2020201754ad7c200341c0236a41086a2903007c2021202054ad7c200341c0246a41086a2903007c2023202154ad7c420d86847c2217423388200341f0246a41086a290300200341b0246a41086a2903007c2019202554ad7c200341b0256a41086a2903007c2013201954ad7c200341b0236a41086a2903007c2008201354ad7c20034180246a41086a2903007c2012200854ad7c2017201254ad7c420d86847c221342ffffffffffffff038322193703803e200320032903e023222520032903e0257c22082003290390247c22122003290390237c222020032903a0257c22212013423388200341a0246a41086a290300200341f0236a41086a2903007c200b202454ad7c200341e0246a41086a2903007c2018200b54ad7c200341a0236a41086a2903007c201a201854ad7c200341f0256a41086a2903007c201b201a54ad7c2013201b54ad7c420d86847c220b42ffffffffffffff0383221b3703883e200320032903d025221c2003290390257c221820032903d0237c221a2003290380237c221320032903d0247c2224200b423388200341e0236a41086a290300200341e0256a41086a2903007c2008202554ad7c20034190246a41086a2903007c2012200854ad7c20034190236a41086a2903007c2020201254ad7c200341a0256a41086a2903007c2021202054ad7c200b202154ad7c420d86847c220b42ffffffffffffff038322263703903e2003200b423388200341d0256a41086a29030020034190256a41086a2903007c2018201c54ad7c200341d0236a41086a2903007c201a201854ad7c20034180236a41086a2903007c2013201a54ad7c200341d0246a41086a2903007c2024201354ad7c200b202454ad7c420d868442137e202342ffffffffffffff03837c221842ffffffffffffff0383220b3703f03d20032018423388201742ffffffffffffff03837c22183703f83d200341983e6a200341f03d6a410a1071200341b0206a200b420020032903983e2208420010ce0820034180216a201842137e2228420020032903b83e2212420010ce08200341d0216a201942137e221c420020032903b03e2217420010ce08200341a0226a201b42137e2213420020032903a83e2220420010ce08200341f0226a202642137e221a420020032903a03e2221420010ce08200341e0226a200b42002021420010ce08200341a0206a201842002008420010ce08200341f0206a201c42002012420010ce08200341c0216a201342002017420010ce0820034190226a201a42002020420010ce0820034180226a200b42002020420010ce08200341d0226a201842002021420010ce0820034190206a201942002008420010ce08200341e0206a201342002012420010ce08200341b0216a201a42002017420010ce08200341a0216a200b42002017420010ce08200341f0216a201842002020420010ce08200341c0226a201942002021420010ce0820034180206a201b42002008420010ce08200341d0206a201a42002012420010ce08200341c0206a200b42002012420010ce0820034190216a201842002017420010ce08200341e0216a201942002020420010ce08200341b0226a201b42002021420010ce08200341f01f6a202642002008420010ce08200320032903e02022292003290390207c220820032903b0217c22122003290380227c222020032903d0227c222120032903c021222720032903f0207c22172003290390227c222320032903e0227c222420032903a0207c222520032903a022222a20032903d0217c221d20032903f0227c221e20032903b0207c221f2003290380217c2222423388200341a0226a41086a290300200341d0216a41086a2903007c201d202a54ad7c200341f0226a41086a2903007c201e201d54ad7c200341b0206a41086a2903007c201f201e54ad7c20034180216a41086a2903007c2022201f54ad7c420d86847c221e423388200341c0216a41086a290300200341f0206a41086a2903007c2017202754ad7c20034190226a41086a2903007c2023201754ad7c200341e0226a41086a2903007c2024202354ad7c200341a0206a41086a2903007c2025202454ad7c201e202554ad7c420d86847c222342ffffffffffffff038322173703d03e2003200329038020222a20032903c0227c222420032903d0207c222520032903a0217c221f20032903f0217c22272023423388200341e0206a41086a29030020034190206a41086a2903007c2008202954ad7c200341b0216a41086a2903007c2012200854ad7c20034180226a41086a2903007c2020201254ad7c200341d0226a41086a2903007c2021202054ad7c2023202154ad7c420d86847c220842ffffffffffffff0383221d3703d83e200320032903b022222920032903e0217c221220032903f01f7c222020032903c0207c22212003290390217c2223200842338820034180206a41086a290300200341c0226a41086a2903007c2024202a54ad7c200341d0206a41086a2903007c2025202454ad7c200341a0216a41086a2903007c201f202554ad7c200341f0216a41086a2903007c2027201f54ad7c2008202754ad7c420d86847c220842ffffffffffffff0383221f3703e03e20032008423388200341b0226a41086a290300200341e0216a41086a2903007c2012202954ad7c200341f01f6a41086a2903007c2020201254ad7c200341c0206a41086a2903007c2021202054ad7c20034190216a41086a2903007c2023202154ad7c2008202354ad7c420d868442137e202242ffffffffffffff03837c221242ffffffffffffff038322083703c03e20032012423388201e42ffffffffffffff03837c22123703c83e200341e83e6a200341c03e6a41141071200341a01d6a2008420020032903e83e2220420010ce08200341f01d6a201242137e420020032903883f2221420010ce08200341c01e6a201742137e2227420020032903803f2223420010ce08200341901f6a201d42137e2222420020032903f83e2224420010ce08200341e01f6a201f42137e221e420020032903f03e2225420010ce08200341d01f6a200842002025420010ce08200341901d6a201242002020420010ce08200341e01d6a202742002021420010ce08200341b01e6a202242002023420010ce08200341801f6a201e42002024420010ce08200341f01e6a200842002024420010ce08200341c01f6a201242002025420010ce08200341801d6a201742002020420010ce08200341d01d6a202242002021420010ce08200341a01e6a201e42002023420010ce08200341901e6a200842002023420010ce08200341e01e6a201242002024420010ce08200341b01f6a201742002025420010ce08200341f01c6a201d42002020420010ce08200341c01d6a201e42002021420010ce08200341b01d6a200842002021420010ce08200341801e6a201242002023420010ce08200341d01e6a201742002024420010ce08200341a01f6a201d42002025420010ce08200341e01c6a201f42002020420010ce08200320032903d01d222720032903801d7c220820032903a01e7c221220032903f01e7c221720032903c01f7c222020032903b01e222920032903e01d7c222120032903801f7c222320032903d01f7c222420032903901d7c222520032903901f222a20032903c01e7c221d20032903e01f7c221e20032903a01d7c221f20032903f01d7c2222423388200341901f6a41086a290300200341c01e6a41086a2903007c201d202a54ad7c200341e01f6a41086a2903007c201e201d54ad7c200341a01d6a41086a2903007c201f201e54ad7c200341f01d6a41086a2903007c2022201f54ad7c420d86847c221d423388200341b01e6a41086a290300200341e01d6a41086a2903007c2021202954ad7c200341801f6a41086a2903007c2023202154ad7c200341d01f6a41086a2903007c2024202354ad7c200341901d6a41086a2903007c2025202454ad7c201d202554ad7c420d86847c222142ffffffffffffff03833703a03f200320032903f01c221f20032903b01f7c222320032903c01d7c222420032903901e7c222520032903e01e7c221e2021423388200341d01d6a41086a290300200341801d6a41086a2903007c2008202754ad7c200341a01e6a41086a2903007c2012200854ad7c200341f01e6a41086a2903007c2017201254ad7c200341c01f6a41086a2903007c2020201754ad7c2021202054ad7c420d86847c220842ffffffffffffff03833703a83f200320032903a01f222720032903d01e7c221220032903e01c7c221720032903b01d7c222020032903801e7c22212008423388200341f01c6a41086a290300200341b01f6a41086a2903007c2023201f54ad7c200341c01d6a41086a2903007c2024202354ad7c200341901e6a41086a2903007c2025202454ad7c200341e01e6a41086a2903007c201e202554ad7c2008201e54ad7c420d86847c220842ffffffffffffff03833703b03f20032008423388200341a01f6a41086a290300200341d01e6a41086a2903007c2012202754ad7c200341e01c6a41086a2903007c2017201254ad7c200341b01d6a41086a2903007c2020201754ad7c200341801e6a41086a2903007c2021202054ad7c2008202154ad7c420d868442137e202242ffffffffffffff03837c220842ffffffffffffff03833703903f20032008423388201d42ffffffffffffff03837c3703983f200341b83f6a200341903f6a410a1071200341901a6a200b420020032903b83f2208420010ce08200341e01a6a2028420020032903d83f2212420010ce08200341b01b6a20032903d03f22174200201c420010ce08200341801c6a20032903c83f222042002013420010ce08200341d01c6a20032903c03f22214200201a420010ce08200341c01c6a20214200200b420010ce08200341801a6a201842002008420010ce08200341d01a6a20124200201c420010ce08200341a01b6a201742002013420010ce08200341f01b6a20204200201a420010ce08200341e01b6a20204200200b420010ce08200341b01c6a202142002018420010ce08200341f0196a200842002019420010ce08200341c01a6a201242002013420010ce08200341901b6a20174200201a420010ce08200341801b6a20174200200b420010ce08200341d01b6a202042002018420010ce08200341a01c6a202142002019420010ce08200341e0196a20084200201b420010ce08200341b01a6a20124200201a420010ce08200341a01a6a20124200200b420010ce08200341f01a6a201742002018420010ce08200341c01b6a202042002019420010ce08200341901c6a20214200201b420010ce08200341d0196a200842002026420010ce08200320032903c01a222420032903f0197c220b20032903901b7c221820032903e01b7c221a20032903b01c7c221b20032903801a222520032903d01a7c221920032903a01b7c221320032903f01b7c220820032903c01c7c221220032903b01b222620032903901a7c221720032903e01a7c222020032903801c7c222120032903d01c7c2223423388200341b01b6a41086a290300200341901a6a41086a2903007c2017202654ad7c200341e01a6a41086a2903007c2020201754ad7c200341801c6a41086a2903007c2021202054ad7c200341d01c6a41086a2903007c2023202154ad7c420d86847c2217423388200341801a6a41086a290300200341d01a6a41086a2903007c2019202554ad7c200341a01b6a41086a2903007c2013201954ad7c200341f01b6a41086a2903007c2008201354ad7c200341c01c6a41086a2903007c2012200854ad7c2017201254ad7c420d86847c221342ffffffffffffff038322193703f03f200320032903b01a222520032903e0197c220820032903801b7c221220032903d01b7c222020032903a01c7c22212013423388200341c01a6a41086a290300200341f0196a41086a2903007c200b202454ad7c200341901b6a41086a2903007c2018200b54ad7c200341e01b6a41086a2903007c201a201854ad7c200341b01c6a41086a2903007c201b201a54ad7c2013201b54ad7c420d86847c220b42ffffffffffffff0383221b3703f83f200320032903a01a221c20032903d0197c221820032903f01a7c221a20032903c01b7c221320032903901c7c2224200b423388200341b01a6a41086a290300200341e0196a41086a2903007c2008202554ad7c200341801b6a41086a2903007c2012200854ad7c200341d01b6a41086a2903007c2020201254ad7c200341a01c6a41086a2903007c2021202054ad7c200b202154ad7c420d86847c220b42ffffffffffffff03832226370380402003200b423388200341a01a6a41086a290300200341d0196a41086a2903007c2018201c54ad7c200341f01a6a41086a2903007c201a201854ad7c200341c01b6a41086a2903007c2013201a54ad7c200341901c6a41086a2903007c2024201354ad7c200b202454ad7c420d868442137e202342ffffffffffffff03837c221842ffffffffffffff0383220b3703e03f20032018423388201742ffffffffffffff03837c22183703e83f20034188c0006a200341e03f6a4132107120034180176a200b42002003290388402208420010ce08200341d0176a201842137e2228420020032903a8402212420010ce08200341a0186a201942137e221c420020032903a0402217420010ce08200341f0186a201b42137e221342002003290398402220420010ce08200341c0196a202642137e221a42002003290390402221420010ce08200341b0196a200b42002021420010ce08200341f0166a201842002008420010ce08200341c0176a201c42002012420010ce0820034190186a201342002017420010ce08200341e0186a201a42002020420010ce08200341d0186a200b42002020420010ce08200341a0196a201842002021420010ce08200341e0166a201942002008420010ce08200341b0176a201342002012420010ce0820034180186a201a42002017420010ce08200341f0176a200b42002017420010ce08200341c0186a201842002020420010ce0820034190196a202142002019420010ce08200341d0166a201b42002008420010ce08200341a0176a201a42002012420010ce0820034190176a200b42002012420010ce08200341e0176a201842002017420010ce08200341b0186a201942002020420010ce0820034180196a201b42002021420010ce08200341c0166a202642002008420010ce08200320032903b017222920032903e0167c22082003290380187c221220032903d0187c222020032903a0197c2221200329039018222720032903c0177c221720032903e0187c222320032903b0197c222420032903f0167c222520032903f018222a20032903a0187c221d20032903c0197c221e2003290380177c221f20032903d0177c2222423388200341f0186a41086a290300200341a0186a41086a2903007c201d202a54ad7c200341c0196a41086a2903007c201e201d54ad7c20034180176a41086a2903007c201f201e54ad7c200341d0176a41086a2903007c2022201f54ad7c420d86847c221e42338820034190186a41086a290300200341c0176a41086a2903007c2017202754ad7c200341e0186a41086a2903007c2023201754ad7c200341b0196a41086a2903007c2024202354ad7c200341f0166a41086a2903007c2025202454ad7c201e202554ad7c420d86847c222342ffffffffffffff038322173703c040200320032903d016222a2003290390197c222420032903a0177c222520032903f0177c221f20032903c0187c22272023423388200341b0176a41086a290300200341e0166a41086a2903007c2008202954ad7c20034180186a41086a2903007c2012200854ad7c200341d0186a41086a2903007c2020201254ad7c200341a0196a41086a2903007c2021202054ad7c2023202154ad7c420d86847c220842ffffffffffffff0383221d3703c8402003200329038019222920032903b0187c221220032903c0167c22202003290390177c222120032903e0177c22232008423388200341d0166a41086a29030020034190196a41086a2903007c2024202a54ad7c200341a0176a41086a2903007c2025202454ad7c200341f0176a41086a2903007c201f202554ad7c200341c0186a41086a2903007c2027201f54ad7c2008202754ad7c420d86847c220842ffffffffffffff0383221f3703d0402003200842338820034180196a41086a290300200341b0186a41086a2903007c2012202954ad7c200341c0166a41086a2903007c2020201254ad7c20034190176a41086a2903007c2021202054ad7c200341e0176a41086a2903007c2023202154ad7c2008202354ad7c420d868442137e202242ffffffffffffff03837c221242ffffffffffffff038322083703b04020032012423388201e42ffffffffffffff03837c22123703b840200341d8c0006a200341b0c0006a41e4001071200341f0136a2008420020032903d8402220420010ce08200341c0146a201242137e420020032903f8402221420010ce0820034190156a201742137e2227420020032903f0402223420010ce08200341e0156a201d42137e2222420020032903e8402224420010ce08200341b0166a201f42137e221e420020032903e0402225420010ce08200341a0166a200842002025420010ce08200341e0136a201242002020420010ce08200341b0146a202742002021420010ce0820034180156a202242002023420010ce08200341d0156a201e42002024420010ce08200341c0156a200842002024420010ce0820034190166a201242002025420010ce08200341d0136a201742002020420010ce08200341a0146a202242002021420010ce08200341f0146a201e42002023420010ce08200341e0146a200842002023420010ce08200341b0156a201242002024420010ce0820034180166a201742002025420010ce08200341c0136a201d42002020420010ce0820034190146a201e42002021420010ce0820034180146a200842002021420010ce08200341d0146a201242002023420010ce08200341a0156a201742002024420010ce08200341f0156a201d42002025420010ce08200341b0136a201f42002020420010ce08200320032903a014222720032903d0137c220820032903f0147c221220032903c0157c22172003290390167c2220200329038015222920032903b0147c222120032903d0157c222320032903a0167c222420032903e0137c222520032903e015222a2003290390157c221d20032903b0167c221e20032903f0137c221f20032903c0147c2222423388200341e0156a41086a29030020034190156a41086a2903007c201d202a54ad7c200341b0166a41086a2903007c201e201d54ad7c200341f0136a41086a2903007c201f201e54ad7c200341c0146a41086a2903007c2022201f54ad7c420d86847c221d42338820034180156a41086a290300200341b0146a41086a2903007c2021202954ad7c200341d0156a41086a2903007c2023202154ad7c200341a0166a41086a2903007c2024202354ad7c200341e0136a41086a2903007c2025202454ad7c201d202554ad7c420d86847c222142ffffffffffffff038337039041200320032903c013221f2003290380167c22232003290390147c222420032903e0147c222520032903b0157c221e2021423388200341a0146a41086a290300200341d0136a41086a2903007c2008202754ad7c200341f0146a41086a2903007c2012200854ad7c200341c0156a41086a2903007c2017201254ad7c20034190166a41086a2903007c2020201754ad7c2021202054ad7c420d86847c220842ffffffffffffff038337039841200320032903f015222720032903a0157c221220032903b0137c22172003290380147c222020032903d0147c22212008423388200341c0136a41086a29030020034180166a41086a2903007c2023201f54ad7c20034190146a41086a2903007c2024202354ad7c200341e0146a41086a2903007c2025202454ad7c200341b0156a41086a2903007c201e202554ad7c2008201e54ad7c420d86847c220842ffffffffffffff03833703a04120032008423388200341f0156a41086a290300200341a0156a41086a2903007c2012202754ad7c200341b0136a41086a2903007c2017201254ad7c20034180146a41086a2903007c2020201754ad7c200341d0146a41086a2903007c2021202054ad7c2008202154ad7c420d868442137e202242ffffffffffffff03837c220842ffffffffffffff03833703804120032008423388201d42ffffffffffffff03837c37038841200341a8c1006a20034180c1006a41321071200341a0106a20032903a84122084200200b420010ce08200341f0106a20032903c841221242002028420010ce08200341c0116a20032903c04122174200201c420010ce0820034190126a20032903b841222042002013420010ce08200341e0126a20032903b04122214200201a420010ce08200341f0126a20214200200b420010ce08200341b0106a200842002018420010ce0820034180116a20124200201c420010ce08200341d0116a201742002013420010ce08200341a0126a20204200201a420010ce08200341b0126a20204200200b420010ce0820034180136a202142002018420010ce08200341c0106a200842002019420010ce0820034190116a201242002013420010ce08200341e0116a20174200201a420010ce08200341f0116a20174200200b420010ce08200341c0126a202042002018420010ce0820034190136a202142002019420010ce08200341d0106a20084200201b420010ce08200341a0116a20124200201a420010ce08200341b0116a20124200200b420010ce0820034180126a201742002018420010ce08200341d0126a202042002019420010ce08200341a0136a20214200201b420010ce08200341e0106a200842002026420010ce082003200329039011222420032903c0107c220b20032903e0117c221820032903b0127c22192003290380137c221a200329038011222520032903b0107c221b20032903d0117c221320032903a0127c220820032903f0127c221220032903f010222620032903a0107c221720032903c0117c22202003290390127c222120032903e0127c2223423388200341f0106a41086a290300200341a0106a41086a2903007c2017202654ad7c200341c0116a41086a2903007c2020201754ad7c20034190126a41086a2903007c2021202054ad7c200341e0126a41086a2903007c2023202154ad7c420d86847c221742338820034180116a41086a290300200341b0106a41086a2903007c201b202554ad7c200341d0116a41086a2903007c2013201b54ad7c200341a0126a41086a2903007c2008201354ad7c200341f0126a41086a2903007c2012200854ad7c2017201254ad7c420d86847c221b42ffffffffffffff038337039041200320032903a011222120032903d0107c221320032903f0117c220820032903c0127c22122003290390137c2220201b42338820034190116a41086a290300200341c0106a41086a2903007c200b202454ad7c200341e0116a41086a2903007c2018200b54ad7c200341b0126a41086a2903007c2019201854ad7c20034180136a41086a2903007c201a201954ad7c201b201a54ad7c420d86847c220b42ffffffffffffff038337039841200320032903b011222420032903e0107c22182003290380127c221920032903d0127c221a20032903a0137c221b200b423388200341a0116a41086a290300200341d0106a41086a2903007c2013202154ad7c200341f0116a41086a2903007c2008201354ad7c200341c0126a41086a2903007c2012200854ad7c20034190136a41086a2903007c2020201254ad7c200b202054ad7c420d86847c220b42ffffffffffffff03833703a0412003200b423388200341b0116a41086a290300200341e0106a41086a2903007c2018202454ad7c20034180126a41086a2903007c2019201854ad7c200341d0126a41086a2903007c201a201954ad7c200341a0136a41086a2903007c201b201a54ad7c200b201b54ad7c420d868442137e202342ffffffffffffff03837c220b42ffffffffffffff0383370380412003200b423388201742ffffffffffffff03837c37038841200341a8c1006a20034180c1006a41021071200341900d6a2015420020032903a841220b420010ce0820034190106a2014420020032903b041221842137e420010ce08200341c00f6a200f420020032903b841221942137e2208420010ce08200341f00e6a200c420020032903c041221b42137e2213420010ce08200341a00e6a2016420020032903c841221242137e221a420010ce08200341a00d6a20164200200b420010ce0820034180106a201542002018420010ce08200341b00f6a201442002008420010ce08200341e00e6a200f42002013420010ce08200341900e6a200c4200201a420010ce08200341b00d6a200c4200200b420010ce08200341f00f6a201642002018420010ce08200341a00f6a201542002019420010ce08200341d00e6a201442002013420010ce08200341800e6a200f4200201a420010ce08200341c00d6a200f4200200b420010ce08200341e00f6a200c42002018420010ce08200341900f6a201642002019420010ce08200341c00e6a20154200201b420010ce08200341f00d6a20144200201a420010ce08200341d00d6a20144200200b420010ce08200341d00f6a200f42002018420010ce08200341800f6a200c42002019420010ce08200341b00e6a20164200201b420010ce08200341e00d6a201542002012420010ce08200341f0096a20032903d00f221c20032903800f7c220c20032903d00d7c220f20032903e00d7c221420032903b00e7c221520032903c00d221d20032903e00f7c221620032903f00d7c220b20032903c00e7c221820032903900f7c221920032903800e221e20032903b00d7c221a20032903d00e7c221b20032903a00f7c221320032903f00f7c220820032903e00e221f20032903900e7c221220032903b00f7c22172003290380107c222020032903a00d7c222120032903c00f222220032903f00e7c22232003290390107c222420032903900d7c222520032903a00e7c2226423388200341c00f6a41086a290300200341f00e6a41086a2903007c2023202254ad7c20034190106a41086a2903007c2024202354ad7c200341900d6a41086a2903007c2025202454ad7c200341a00e6a41086a2903007c2026202554ad7c420d86847c2223423388200341e00e6a41086a290300200341900e6a41086a2903007c2012201f54ad7c200341b00f6a41086a2903007c2017201254ad7c20034180106a41086a2903007c2020201754ad7c200341a00d6a41086a2903007c2021202054ad7c2023202154ad7c420d86847c2212423388200341800e6a41086a290300200341b00d6a41086a2903007c201a201e54ad7c200341d00e6a41086a2903007c201b201a54ad7c200341a00f6a41086a2903007c2013201b54ad7c200341f00f6a41086a2903007c2008201354ad7c2012200854ad7c420d86847c221a423388200341c00d6a41086a290300200341e00f6a41086a2903007c2016201d54ad7c200341f00d6a41086a2903007c200b201654ad7c200341c00e6a41086a2903007c2018200b54ad7c200341900f6a41086a2903007c2019201854ad7c201a201954ad7c420d86847c2218423388200341d00f6a41086a290300200341800f6a41086a2903007c200c201c54ad7c200341d00d6a41086a2903007c200f200c54ad7c200341e00d6a41086a2903007c2014200f54ad7c200341b00e6a41086a2903007c2015201454ad7c2018201554ad7c420d868442137e202642ffffffffffffff03837c222742ffffffffffffff0383220c420020032903e032222820032903d0347c220f20032903a00b7c22142003290390327c221520032903a0337c221620032903e033222920032903e0347c220b20032903800c7c221920032903a0327c221b20032903f0327c221320032903f033222a20032903f0347c220820032903b0337c221720032903e00c7c222020032903b0327c222120032903c033222b2003290380347c22242003290380337c222520032903f00c7c22262003290380357c221c200329039033222c20032903d0337c221d20032903800d7c221e20032903c0327c221f2003290390347c222242338820034190336a41086a290300200341d0336a41086a2903007c201d202c54ad7c200341800d6a41086a2903007c201e201d54ad7c200341c0326a41086a2903007c201f201e54ad7c20034190346a41086a2903007c2022201f54ad7c420d86847c221d423388200341c0336a41086a29030020034180346a41086a2903007c2024202b54ad7c20034180336a41086a2903007c2025202454ad7c200341f00c6a41086a2903007c2026202554ad7c20034180356a41086a2903007c201c202654ad7c201d201c54ad7c420d86847c2224423388200341f0336a41086a290300200341f0346a41086a2903007c2008202a54ad7c200341b0336a41086a2903007c2017200854ad7c200341e00c6a41086a2903007c2020201754ad7c200341b0326a41086a2903007c2021202054ad7c2024202154ad7c420d86847c2208423388200341e0336a41086a290300200341e0346a41086a2903007c200b202954ad7c200341800c6a41086a2903007c2019200b54ad7c200341a0326a41086a2903007c201b201954ad7c200341f0326a41086a2903007c2013201b54ad7c2008201354ad7c420d86847c220b423388200341e0326a41086a290300200341d0346a41086a2903007c200f202854ad7c200341a00b6a41086a2903007c2014200f54ad7c20034190326a41086a2903007c2015201454ad7c200341a0336a41086a2903007c2016201554ad7c200b201654ad7c420d868442137e202242ffffffffffffff03837c221742ffffffffffffff0383220f420010ce08200341900b6a200b42ffffffffffffff0383221442002027423388202342ffffffffffffff03837c221542137e420010ce08200341f00b6a200842ffffffffffffff038322164200201242ffffffffffffff0383221942137e2208420010ce08200341d00c6a202442ffffffffffffff0383220b4200201a42ffffffffffffff0383221b42137e2213420010ce08200341c00a6a201842ffffffffffffff0383221242137e221a42002017423388201d42ffffffffffffff03837c2218420010ce08200341b00a6a200c42002018420010ce08200341e0096a20154200200f420010ce08200341800b6a201442002008420010ce08200341e00b6a201642002013420010ce08200341c00c6a200b4200201a420010ce08200341b00c6a200b4200200c420010ce08200341a00a6a201542002018420010ce08200341d0096a20194200200f420010ce08200341f00a6a201442002013420010ce08200341d00b6a20164200201a420010ce08200341c00b6a20164200200c420010ce08200341a00c6a200b42002015420010ce08200341900a6a201942002018420010ce08200341c0096a201b4200200f420010ce08200341e00a6a20144200201a420010ce08200341d00a6a20144200200c420010ce08200341b00b6a201642002015420010ce08200341900c6a200b42002019420010ce08200341800a6a201b42002018420010ce08200341b0096a20124200200f420010ce08200320032903f00a221220032903d0097c220c20032903d00b7c220f20032903b00c7c221420032903a00a7c221520032903e00b221720032903800b7c221620032903c00c7c220b20032903b00a7c221820032903e0097c221920032903d00c222020032903f00b7c221a20032903c00a7c221b20032903f0097c221320032903900b7c2208423388200341d00c6a41086a290300200341f00b6a41086a2903007c201a202054ad7c200341c00a6a41086a2903007c201b201a54ad7c200341f0096a41086a2903007c2013201b54ad7c200341900b6a41086a2903007c2008201354ad7c221b420d86847c221a423388200341e00b6a41086a290300200341800b6a41086a2903007c2016201754ad7c200341c00c6a41086a2903007c200b201654ad7c200341b00a6a41086a2903007c2018200b54ad7c200341e0096a41086a2903007c2019201854ad7c201b4233887c201a201954ad7c2213420d86847c221642ffffffffffffff03833703e840200320032903c009221720032903900a7c220b20032903e00a7c221820032903c00b7c221920032903a00c7c221b2016423388200341f00a6a41086a290300200341d0096a41086a2903007c200c201254ad7c200341d00b6a41086a2903007c200f200c54ad7c200341b00c6a41086a2903007c2014200f54ad7c200341a00a6a41086a2903007c2015201454ad7c20134233887c2016201554ad7c2213420d86847c220c42ffffffffffffff03833703f040200320032903800a221220032903900c7c220f20032903b0097c221420032903d00a7c221520032903b00b7c2216200c423388200341c0096a41086a290300200341900a6a41086a2903007c200b201754ad7c200341e00a6a41086a2903007c2018200b54ad7c200341c00b6a41086a2903007c2019201854ad7c200341a00c6a41086a2903007c201b201954ad7c20134233887c200c201b54ad7c220b420d86847c220c42ffffffffffffff03833703f8402003200c423388200341800a6a41086a290300200341900c6a41086a2903007c200f201254ad7c200341b0096a41086a2903007c2014200f54ad7c200341d00a6a41086a2903007c2015201454ad7c200341b00b6a41086a2903007c2016201554ad7c200b4233887c200c201654ad7c420d868442137e200842ffffffffffffff03837c220c42ffffffffffffff03833703d8402003200c423388201a42ffffffffffffff03837c3703e040200341a8c1006a200341d8c0006a41011071200341a0066a20032903a841220c42002004420010ce08200341a0096a20032903b041220f42137e42002010420010ce08200341d0086a20032903b841221442137e22184200200d420010ce0820034180086a20032903c041221642137e220b4200200a420010ce08200341b0076a20032903c841221942137e221542002007420010ce08200341b0066a200c42002007420010ce0820034190096a200f42002004420010ce08200341c0086a201842002010420010ce08200341f0076a200b4200200d420010ce08200341a0076a20154200200a420010ce08200341c0066a200c4200200a420010ce0820034180096a200f42002007420010ce08200341b0086a201442002004420010ce08200341e0076a200b42002010420010ce0820034190076a20154200200d420010ce08200341d0066a200c4200200d420010ce08200341f0086a200f4200200a420010ce08200341a0086a201442002007420010ce08200341d0076a201642002004420010ce0820034180076a201542002010420010ce08200341e0066a200c42002010420010ce08200341e0086a200f4200200d420010ce0820034190086a20144200200a420010ce08200341c0076a201642002007420010ce08200341f0066a201942002004420010ce08200320032903b00822102003290380097c220420032903e0077c22072003290390077c220a20032903c0067c220c20032903c008221a2003290390097c220f20032903f0077c221420032903a0077c221520032903b0067c221620032903d008221b20032903a0097c220b2003290380087c220d20032903a0067c221820032903b0077c2219423388200341d0086a41086a290300200341a0096a41086a2903007c200b201b54ad7c20034180086a41086a2903007c200d200b54ad7c200341a0066a41086a2903007c2018200d54ad7c200341b0076a41086a2903007c2019201854ad7c420d86847c220b423388200341c0086a41086a29030020034190096a41086a2903007c200f201a54ad7c200341f0076a41086a2903007c2014200f54ad7c200341a0076a41086a2903007c2015201454ad7c200341b0066a41086a2903007c2016201554ad7c200b201654ad7c420d86847c220f42ffffffffffffff038337039041200320032903a008221820032903f0087c221420032903d0077c22152003290380077c221620032903d0067c220d200f423388200341b0086a41086a29030020034180096a41086a2903007c2004201054ad7c200341e0076a41086a2903007c2007200454ad7c20034190076a41086a2903007c200a200754ad7c200341c0066a41086a2903007c200c200a54ad7c200f200c54ad7c420d86847c220442ffffffffffffff0383370398412003200329039008221020032903e0087c220720032903c0077c220a20032903f0067c220c20032903e0067c220f2004423388200341a0086a41086a290300200341f0086a41086a2903007c2014201854ad7c200341d0076a41086a2903007c2015201454ad7c20034180076a41086a2903007c2016201554ad7c200341d0066a41086a2903007c200d201654ad7c2004200d54ad7c420d86847c220442ffffffffffffff03833703a0412003200442338820034190086a41086a290300200341e0086a41086a2903007c2007201054ad7c200341c0076a41086a2903007c200a200754ad7c200341f0066a41086a2903007c200c200a54ad7c200341e0066a41086a2903007c200f200c54ad7c2004200f54ad7c420d868442137e201942ffffffffffffff03837c220442ffffffffffffff03833703804120032004423388200b42ffffffffffffff03837c37038841200341b0c0006a20034180c1006a106e20034188c0006a2001106e410021024101212d034020034188c0006a20026a2d0000200341b0c0006a20026a2d000073222e4100202e6b72417f73418001714107761070202d71212d200241016a22024120470d000b202d1070212f200341a8c1006a41086a42f0ffffffffffff3f200141086a2903007d220442ffffffffffffff038342d0fdffffffffff3f20012903007d22074233887c370300200341a8c1006a41106a42f0ffffffffffff3f200141106a2903007d220a42ffffffffffffff038320044233887c370300200341a8c1006a41186a42f0ffffffffffff3f200141186a2903007d220442ffffffffffffff0383200a4233887c370300200341a8c1006a41206a42f0ffffffffffff3f200141206a2903007d220a42ffffffffffffff038320044233887c3703002003200a42338842137e200742ffffffffffffff03837c3703a841200341b0c0006a20034180c1006a106e20034188c0006a200341a8c1006a106e410021024101212d034020034188c0006a20026a2d0000200341b0c0006a20026a2d000073222e4100202e6b72417f73418001714107761070202d71212d200241016a22024120470d000b200341a0046a42f0ffffffffffff3f200e7d220742338842137e42d0fdffffffffff3f20117d220e42ffffffffffffff03837c2204420042b0c1bad0f4e48603420010ce08200341d0036a42f0ffffffffffff3f20057d220a423388200742ffffffffffffff03837c2207420042a7a7fbf49beaf607420010ce08200341f0046a42f0ffffffffffff3f20067d2211423388200a42ffffffffffffff03837c220a420042a0d69f90da80b1cb00420010ce08200341c0056a42f0ffffffffffff3f20097d2205423388201142ffffffffffffff03837c2211420042badf96dcb5c3bac700420010ce0820034190066a200542ffffffffffffff0383200e4233887c220e420042a7ecfac2b5f7ea19420010ce0820034180066a200e420042b0c1bad0f4e48603420010ce0820034190046a20044200429db1bce4dfb435420010ce08200341c0036a2007420042a0d69f90da80b1cb00420010ce08200341e0046a200a420042badf96dcb5c3bac700420010ce08200341b0056a2011420042a7ecfac2b5f7ea19420010ce08200341a0056a2011420042b0c1bad0f4e48603420010ce08200341f0056a200e4200429db1bce4dfb435420010ce0820034180046a2004420042e098f4e5e9ebfb03420010ce08200341b0036a2007420042badf96dcb5c3bac700420010ce08200341d0046a200a420042a7ecfac2b5f7ea19420010ce08200341c0046a200a420042b0c1bad0f4e48603420010ce0820034190056a20114200429db1bce4dfb435420010ce08200341e0056a200e420042e098f4e5e9ebfb03420010ce08200341f0036a20044200429e9981b4dab2e103420010ce08200341a0036a2007420042a7ecfac2b5f7ea19420010ce0820034190036a2007420042b0c1bad0f4e48603420010ce08200341b0046a200a4200429db1bce4dfb435420010ce0820034180056a2011420042e098f4e5e9ebfb03420010ce08200341d0056a200e4200429e9981b4dab2e103420010ce08200341e0036a20044200429df893c0a486ae01420010ce08200341c0036a41086a290300211820034190046a41086a290300211920032903c00321042003290390042109200341e0046a41086a290300211020032903e004210c200341b0056a41086a290300211a20032903b005210f20034180066a41086a290300211b2003290380062114200341d0036a41086a2903002113200341a0046a41086a290300210820032903d003210720032903a0042115200341f0046a41086a290300211220032903f0042116200341c0056a41086a290300211720032903c005210b20034190066a41086a2903002120200329039006210d20032903b003210a200329038004211120032903d004210e20032903a005210520032903f0052106202d10702101200320062005200e200a20117c22117c220e7c22057c22062014200f200c200420097c22097c220c7c220f7c2214200d200b2016200720157c22157c22167c220b7c220d423388202020172012201320087c2015200754ad7c7c2016201554ad7c7c200b201654ad7c7c200d200b54ad7c2215420d86847c2207423388201b201a2010201820197c2009200454ad7c7c200c200954ad7c7c200f200c54ad7c7c2014200f54ad7c20154233887c2007201454ad7c2215420d86847c220442ffffffffffffff03833703b841200320032903a003221620032903f0037c220920032903c0047c220c2003290390057c220f20032903e0057c22142004423388200341b0036a41086a29030020034180046a41086a2903007c2011200a54ad7c200341d0046a41086a2903007c200e201154ad7c200341a0056a41086a2903007c2005200e54ad7c200341f0056a41086a2903007c2006200554ad7c20154233887c2004200654ad7c2206420d86847c220442ffffffffffffff03833703c0412003200329039003221520032903e0037c220a20032903b0047c22112003290380057c220e20032903d0057c22052004423388200341a0036a41086a290300200341f0036a41086a2903007c2009201654ad7c200341c0046a41086a2903007c200c200954ad7c20034190056a41086a2903007c200f200c54ad7c200341e0056a41086a2903007c2014200f54ad7c20064233887c2004201454ad7c2206420d86847c220442ffffffffffffff03833703c8412003200442338820034190036a41086a290300200341e0036a41086a2903007c200a201554ad7c200341b0046a41086a2903007c2011200a54ad7c20034180056a41086a2903007c200e201154ad7c200341d0056a41086a2903007c2005200e54ad7c20064233887c2004200554ad7c420d868442137e200d42ffffffffffffff03837c220442ffffffffffffff03833703a84120032004423388200742ffffffffffffff03837c3703b041200341b0c0006a20034180c1006a106e20034188c0006a200341a8c1006a106e410021024101212d034020034188c0006a20026a2d0000200341b0c0006a20026a2d000073222e4100202e6b72417f73418001714107761070202d71212d200241016a22024120470d000b202d1070210220034180036a20032903d8402204420042b0c1bad0f4e48603420010ce08200320032903e040220742137e4200429df893c0a486ae01420010ce08200341e0006a20032903e840220a42137e22064200429e9981b4dab2e103420010ce08200341c0016a20032903f040220e42137e2205420042e098f4e5e9ebfb03420010ce08200341a0026a20032903f840220942137e22114200429db1bce4dfb435420010ce08200341f0026a20044200429db1bce4dfb435420010ce08200341c0006a2007420042b0c1bad0f4e48603420010ce08200341d0006a20064200429df893c0a486ae01420010ce08200341b0016a20054200429e9981b4dab2e103420010ce0820034190026a2011420042e098f4e5e9ebfb03420010ce08200341e0026a2004420042e098f4e5e9ebfb03420010ce08200341306a20074200429db1bce4dfb435420010ce0820034190016a200a420042b0c1bad0f4e48603420010ce08200341a0016a20054200429df893c0a486ae01420010ce0820034180026a20114200429e9981b4dab2e103420010ce08200341d0026a20044200429e9981b4dab2e103420010ce08200341206a2007420042e098f4e5e9ebfb03420010ce0820034180016a200a4200429db1bce4dfb435420010ce08200341e0016a200e420042b0c1bad0f4e48603420010ce08200341f0016a20114200429df893c0a486ae01420010ce08200341c0026a20044200429df893c0a486ae01420010ce08200341106a20074200429e9981b4dab2e103420010ce08200341f0006a200a420042e098f4e5e9ebfb03420010ce08200341d0016a200e4200429db1bce4dfb435420010ce08200341b0026a2009420042b0c1bad0f4e48603420010ce082003200420042003290370220820032903107c220720032903d0017c220a20032903b0027c221120032903c0027c220e200329038001221220032903207c220520032903e0017c220620032903f0017c220920032903d0027c220c200329039001221720032903307c220f20032903a0017c22142003290380027c221520032903e0027c22162003290350222020032903407c220b20032903b0017c220d2003290390027c221820032903f0027c22192003290360222120032903007c221020032903c0017c221a2003290380037c221b20032903a0027c2213423388200341e0006a41086a290300200341086a2903007c2010202154ad7c200341c0016a41086a2903007c201a201054ad7c20034180036a41086a2903007c201b201a54ad7c200341a0026a41086a2903007c2013201b54ad7c420d86847c2210423388200341d0006a41086a290300200341c0006a41086a2903007c200b202054ad7c200341b0016a41086a2903007c200d200b54ad7c20034190026a41086a2903007c2018200d54ad7c200341f0026a41086a2903007c2019201854ad7c2010201954ad7c420d86847c220b42338820034190016a41086a290300200341306a41086a2903007c200f201754ad7c200341a0016a41086a2903007c2014200f54ad7c20034180026a41086a2903007c2015201454ad7c200341e0026a41086a2903007c2016201554ad7c200b201654ad7c420d86847c220f42338820034180016a41086a290300200341206a41086a2903007c2005201254ad7c200341e0016a41086a2903007c2006200554ad7c200341f0016a41086a2903007c2009200654ad7c200341d0026a41086a2903007c200c200954ad7c200f200c54ad7c420d86847c2205423388200341f0006a41086a290300200341106a41086a2903007c2007200854ad7c200341d0016a41086a2903007c200a200754ad7c200341b0026a41086a2903007c2011200a54ad7c200341c0026a41086a2903007c200e201154ad7c2005200e54ad7c420d868442137e201342ffffffffffffff03837c221142ffffffffffffff038385420020022001721070ad42ff01837d22078385220a3703d84020032011423388201042ffffffffffffff03837c20032903e04022048520078320048522113703e0402003200542ffffffffffffff038320032903f840220485200783200485220e3703f8402003200f42ffffffffffffff038320032903f04022048520078320048522053703f0402003200b42ffffffffffffff038320032903e84022048520078320048522073703e84020034188c0006a200341d8c0006a106e200342f0ffffffffffff3f200e7d220642ffffffffffffff038342f0ffffffffffff3f20057d22094233887c200e85420020032d0088404101711070ad42ff01837d220483200e853703f8402003200942ffffffffffffff038342f0ffffffffffff3f20077d220e4233887c2005852004832005853703f0402003200e42ffffffffffffff038342f0ffffffffffff3f20117d220e4233887c2007852004832007853703e8402003200e42ffffffffffffff038342d0fdffffffffff3f200a7d22074233887c2011852004832011853703e0402003200642338842137e200742ffffffffffffff03837c200a85200483200a853703d84020002001202f7210703a0000200020032903d840370308200041106a20032903e040370300200041186a20032903e840370300200041206a20032903f040370300200041286a20032903f840370300200341d0c1006a24000bd003011a7e200131001221022001310011210320013100102104200131000f2105200131000d2106200131000e2107200131001f2108200131001e2109200131001d210a200131001c210b200131001b210c200131001a210d200131000c210e200131000b210f200131000a21102001310009211120013100072112200131000821132001310019211420013100182115200131001721162001310016211720013100132118200131001421192001310015211a200020013500002001310004422086842001310005422886842001310006221b4230868442ffffffffffffff038337030020002018201942088684201a4210868420174218868420164220868420154228868420144230868442018842ffffffffffffff03833703182000201b201242088684201342108684201142188684201042208684200f42288684200e4230868442038842ffffffffffffff038337030820002015201442088684200d42108684200c42188684200b42208684200a42288684200942308684200842388684420c8842ffffffffffffff03833703202000200e20064208868420074210868420054218868420044220868420034228868420024230868420184238868442068842ffffffffffffff03833703100ba5990104017f237e057f0d7e230041f02b6b22022400200242003703e028200242013703d828200242003703e828200242003703f028200242003703f828200241c82a6a200141011071200241c8256a20022903c82a2203420042b0c1bad0f4e48603420010ce08200241c8286a20022903d02a220442137e4200429df893c0a486ae01420010ce08200241f8276a20022903d82a220542137e22064200429e9981b4dab2e103420010ce08200241a8276a20022903e02a220742137e2208420042e098f4e5e9ebfb03420010ce08200241d8266a20022903e82a220942137e220a4200429db1bce4dfb435420010ce08200241d8256a20034200429db1bce4dfb435420010ce08200241b8286a2004420042b0c1bad0f4e48603420010ce08200241e8276a20064200429df893c0a486ae01420010ce0820024198276a20084200429e9981b4dab2e103420010ce08200241c8266a200a420042e098f4e5e9ebfb03420010ce08200241e8256a2003420042e098f4e5e9ebfb03420010ce08200241a8286a20044200429db1bce4dfb435420010ce08200241d8276a2005420042b0c1bad0f4e48603420010ce0820024188276a20084200429df893c0a486ae01420010ce08200241b8266a200a4200429e9981b4dab2e103420010ce08200241f8256a20034200429e9981b4dab2e103420010ce0820024198286a2004420042e098f4e5e9ebfb03420010ce08200241c8276a20054200429db1bce4dfb435420010ce08200241f8266a2007420042b0c1bad0f4e48603420010ce08200241a8266a200a4200429df893c0a486ae01420010ce0820024188266a20034200429df893c0a486ae01420010ce0820024188286a20044200429e9981b4dab2e103420010ce08200241b8276a2005420042e098f4e5e9ebfb03420010ce08200241e8266a20074200429db1bce4dfb435420010ce0820024198266a2009420042b0c1bad0f4e48603420010ce08200241b81d6a200229038826220b2002290398267c22032002290388287c220420022903b8277c220520022903e8267c220a20022903a826220c20022903f8267c220720022903f8257c22082002290398287c220620022903c8277c2209200229038827220d20022903d8277c220e20022903b8267c220f20022903e8257c221020022903a8287c221120022903e827221220022903b8287c22132002290398277c221420022903c8267c221520022903d8257c221620022903c828221720022903c8257c221820022903f8277c221920022903a8277c221a20022903d8267c221b423388200241c8286a41086a290300200241c8256a41086a2903007c2018201754ad7c200241f8276a41086a2903007c2019201854ad7c200241a8276a41086a2903007c201a201954ad7c200241d8266a41086a2903007c201b201a54ad7c420d86847c2218423388200241e8276a41086a290300200241b8286a41086a2903007c2013201254ad7c20024198276a41086a2903007c2014201354ad7c200241c8266a41086a2903007c2015201454ad7c200241d8256a41086a2903007c2016201554ad7c2018201654ad7c420d86847c221342338820024188276a41086a290300200241d8276a41086a2903007c200e200d54ad7c200241b8266a41086a2903007c200f200e54ad7c200241e8256a41086a2903007c2010200f54ad7c200241a8286a41086a2903007c2011201054ad7c2013201154ad7c420d86847c220e423388200241a8266a41086a290300200241f8266a41086a2903007c2007200c54ad7c200241f8256a41086a2903007c2008200754ad7c20024198286a41086a2903007c2006200854ad7c200241c8276a41086a2903007c2009200654ad7c200e200954ad7c420d86847c220742338820024188266a41086a29030020024198266a41086a2903007c2003200b54ad7c20024188286a41086a2903007c2004200354ad7c200241b8276a41086a2903007c2005200454ad7c200241e8266a41086a2903007c200a200554ad7c2007200a54ad7c420d868442137e201b42ffffffffffffff03837c220442ffffffffffffff0383220320022903d8287c2208420042f682ffa299b88202420010ce08200241d81c6a200742ffffffffffffff0383220720022903f8287c2206420042ddf396f0fbf7b9c300420010ce08200241e81c6a200e42ffffffffffffff0383220a20022903f0287c2209420042ccf7d9e9fbcee010420010ce0820024188236a201342ffffffffffffff0383220520022903e8287c220e4200428df582a3b0868004420010ce08200241e8216a2004423388201842ffffffffffffff03837c220420022903e0287c220f4200429aebd0c282f1c201420010ce08200241f8216a200f420042f682ffa299b88202420010ce08200241c81d6a2008420042cff887b5bcb5c603420010ce08200241c81c6a2006420042ccf7d9e9fbcee010420010ce08200241f81c6a20094200428df582a3b0868004420010ce0820024198236a200e4200429aebd0c282f1c201420010ce08200241a8236a200e420042f682ffa299b88202420010ce0820024188226a200f420042cff887b5bcb5c603420010ce08200241d81d6a2008420042848dc885f9eff000420010ce08200241b81c6a20064200428df582a3b0868004420010ce08200241881d6a20094200429aebd0c282f1c201420010ce08200241981d6a2009420042f682ffa299b88202420010ce08200241b8236a200e420042cff887b5bcb5c603420010ce0820024198226a200f420042848dc885f9eff000420010ce08200241e81d6a2008420042dfddd7d2ccf91a420010ce08200241a81c6a20064200429aebd0c282f1c201420010ce08200241981c6a2006420042f682ffa299b88202420010ce08200241a81d6a2009420042cff887b5bcb5c603420010ce08200241c8236a200e420042848dc885f9eff000420010ce08200241a8226a200f420042dfddd7d2ccf91a420010ce08200241f81d6a2008420042bed6acd4f2a00a420010ce08200220022903b81c221920022903d81d7c220820022903881d7c220620022903a8237c22092002290388227c220e20022903c81c221a20022903c81d7c220f20022903f81c7c22102002290398237c221120022903f8217c221320022903d81c221b20022903b81d7c221420022903e81c7c22152002290388237c221620022903e8217c2218423388200241d81c6a41086a290300200241b81d6a41086a2903007c2014201b54ad7c200241e81c6a41086a2903007c2015201454ad7c20024188236a41086a2903007c2016201554ad7c200241e8216a41086a2903007c2018201654ad7c420d86847c2214423388200241c81c6a41086a290300200241c81d6a41086a2903007c200f201a54ad7c200241f81c6a41086a2903007c2010200f54ad7c20024198236a41086a2903007c2011201054ad7c200241f8216a41086a2903007c2013201154ad7c2014201354ad7c420d86847c220f42ffffffffffffff038337039029200220022903a81c221620022903e81d7c221020022903981d7c221120022903b8237c22132002290398227c2215200f423388200241b81c6a41086a290300200241d81d6a41086a2903007c2008201954ad7c200241881d6a41086a2903007c2006200854ad7c200241a8236a41086a2903007c2009200654ad7c20024188226a41086a2903007c200e200954ad7c200f200e54ad7c420d86847c220842ffffffffffffff038337039829200220022903981c221920022903f81d7c220620022903a81d7c220920022903c8237c220e20022903a8227c220f2008423388200241a81c6a41086a290300200241e81d6a41086a2903007c2010201654ad7c200241981d6a41086a2903007c2011201054ad7c200241b8236a41086a2903007c2013201154ad7c20024198226a41086a2903007c2015201354ad7c2008201554ad7c420d86847c220842ffffffffffffff03833703a02920022008423388200241981c6a41086a290300200241f81d6a41086a2903007c2006201954ad7c200241a81d6a41086a2903007c2009200654ad7c200241c8236a41086a2903007c200e200954ad7c200241a8226a41086a2903007c200f200e54ad7c2008200f54ad7c420d868442137e201842ffffffffffffff03837c220842ffffffffffffff03833703802920022008423388201442ffffffffffffff03837c37038829200241d8216a2003420042a3f1e59aa1b9d301420010ce08200241f8226a200442137e221c420042ffed8af7ec86c802420010ce08200241e8236a200542137e2210420042bbf9809de6b8ce03420010ce0820024198246a200a42137e2211420042a9808780a6f4f902420010ce08200241d8246a200742137e2208420042bdddd5d88385ea00420010ce08200241c8216a2003420042bdddd5d88385ea00420010ce08200241e8226a2004420042a3f1e59aa1b9d301420010ce08200241d8236a2010420042ffed8af7ec86c802420010ce0820024188246a2011420042bbf9809de6b8ce03420010ce08200241c8246a2008420042a9808780a6f4f902420010ce08200241b8216a2003420042a9808780a6f4f902420010ce08200241d8226a2004420042bdddd5d88385ea00420010ce08200241e8246a2005420042a3f1e59aa1b9d301420010ce08200241f8236a2011420042ffed8af7ec86c802420010ce08200241b8246a2008420042bbf9809de6b8ce03420010ce08200241a8216a2003420042bbf9809de6b8ce03420010ce08200241c8226a2004420042a9808780a6f4f902420010ce08200241f8246a2005420042bdddd5d88385ea00420010ce0820024198256a200a420042a3f1e59aa1b9d301420010ce08200241a8246a2008420042ffed8af7ec86c802420010ce08200241d8206a2003420042ffed8af7ec86c802420010ce08200241b8226a2004420042bbf9809de6b8ce03420010ce0820024188256a2005420042a9808780a6f4f902420010ce08200241a8256a200a420042bdddd5d88385ea00420010ce08200241b8256a2007420042a3f1e59aa1b9d301420010ce08200241881e6a200342a3f1e59aa1b9d3017c2206420042efffffffffffffc30020022903d820221d20022903b8257c220920022903b8227c220e2002290388257c220f20022903a8257c221320022903a824221e2002290398257c221420022903a8217c221520022903c8227c221620022903f8247c221820022903f823221f20022903e8247c221920022903b8247c221a20022903b8217c221b20022903d8227c220b20022903d823222020022903e8227c220c2002290388247c220d20022903c8247c221220022903c8217c221720022903f822222120022903d8217c222220022903e8237c22232002290398247c222420022903d8247c2225423388200241f8226a41086a290300200241d8216a41086a2903007c2022202154ad7c200241e8236a41086a2903007c2023202254ad7c20024198246a41086a2903007c2024202354ad7c200241d8246a41086a2903007c2025202454ad7c420d86847c2222423388200241d8236a41086a290300200241e8226a41086a2903007c200c202054ad7c20024188246a41086a2903007c200d200c54ad7c200241c8246a41086a2903007c2012200d54ad7c200241c8216a41086a2903007c2017201254ad7c2022201754ad7c420d86847c220c423388200241f8236a41086a290300200241e8246a41086a2903007c2019201f54ad7c200241b8246a41086a2903007c201a201954ad7c200241b8216a41086a2903007c201b201a54ad7c200241d8226a41086a2903007c200b201b54ad7c200c200b54ad7c420d86847c2219423388200241a8246a41086a29030020024198256a41086a2903007c2014201e54ad7c200241a8216a41086a2903007c2015201454ad7c200241c8226a41086a2903007c2016201554ad7c200241f8246a41086a2903007c2018201654ad7c2019201854ad7c420d86847c221442ffffffffffffff03837d221542338842137e42bcfdffffffffffc3002014423388200241d8206a41086a290300200241b8256a41086a2903007c2009201d54ad7c200241b8226a41086a2903007c200e200954ad7c20024188256a41086a2903007c200f200e54ad7c200241a8256a41086a2903007c2013200f54ad7c2014201354ad7c420d868442137e202542ffffffffffffff03837c221342ffffffffffffff03837d221642ffffffffffffff03837c2209420010ce08200241881f6a201542ffffffffffffff038342efffffffffffffc300201942ffffffffffffff03837d220f4233887c220e4200201c4287f0dc94c6dfde0f7c420010ce0820024198216a200f42ffffffffffffff038342efffffffffffffc300200c42ffffffffffffff03837d22144233887c220f42002010428b868581d2a18c387c2215420010ce08200241c8206a201442ffffffffffffff038342efffffffffffffc3002013423388202242ffffffffffffff03837c7d22134233887c22104200201142e18392a796b7d2c4007c2214420010ce0820024188206a201342ffffffffffffff038320164233887c22114200200842eda9ced69582d9307c2208420010ce08200241981e6a201142002006420010ce08200241c81f6a20094200200442bdddd5d88385ea007c2213420010ce08200241f81e6a200e42002015420010ce0820024188216a200f42002014420010ce08200241b8206a201042002008420010ce08200241a81e6a201042002006420010ce08200241f81f6a201142002013420010ce08200241b81f6a20094200200542a9808780a6f4f9027c2215420010ce08200241e81e6a200e42002014420010ce08200241f8206a200f42002008420010ce08200241b81e6a200f42002006420010ce08200241a8206a201042002013420010ce08200241e81f6a201142002015420010ce08200241a81f6a20094200200a42bbf9809de6b8ce037c2214420010ce08200241d81e6a200e42002008420010ce08200241c81e6a200e42002006420010ce08200241e8206a200f42002013420010ce0820024198206a201042002015420010ce08200241d81f6a201142002014420010ce08200241981f6a20094200200742ffed8af7ec86c8027c420010ce08200220022903e81e221920022903b81f7c220820022903f8207c220620022903a81e7c220920022903f81f7c220e20022903f81e221a20022903c81f7c220f2002290388217c221020022903b8207c221120022903981e7c221320022903881f221b20022903881e7c22142002290398217c221520022903c8207c22162002290388207c2218423388200241881f6a41086a290300200241881e6a41086a2903007c2014201b54ad7c20024198216a41086a2903007c2015201454ad7c200241c8206a41086a2903007c2016201554ad7c20024188206a41086a2903007c2018201654ad7c420d86847c2214423388200241f81e6a41086a290300200241c81f6a41086a2903007c200f201a54ad7c20024188216a41086a2903007c2010200f54ad7c200241b8206a41086a2903007c2011201054ad7c200241981e6a41086a2903007c2013201154ad7c2014201354ad7c420d86847c220f42ffffffffffffff03833703e029200220022903d81e221620022903a81f7c221020022903b81e7c221120022903a8207c221320022903e81f7c2215200f423388200241e81e6a41086a290300200241b81f6a41086a2903007c2008201954ad7c200241f8206a41086a2903007c2006200854ad7c200241a81e6a41086a2903007c2009200654ad7c200241f81f6a41086a2903007c200e200954ad7c200f200e54ad7c420d86847c220842ffffffffffffff03833703e829200220022903c81e221920022903981f7c220620022903e8207c22092002290398207c220e20022903d81f7c220f2008423388200241d81e6a41086a290300200241a81f6a41086a2903007c2010201654ad7c200241b81e6a41086a2903007c2011201054ad7c200241a8206a41086a2903007c2013201154ad7c200241e81f6a41086a2903007c2015201354ad7c2008201554ad7c420d86847c220842ffffffffffffff03833703f02920022008423388200241c81e6a41086a290300200241981f6a41086a2903007c2006201954ad7c200241e8206a41086a2903007c2009200654ad7c20024198206a41086a2903007c200e200954ad7c200241d81f6a41086a2903007c200f200e54ad7c2008200f54ad7c420d868442137e201842ffffffffffffff03837c220842ffffffffffffff03833703d02920022008423388201442ffffffffffffff03837c3703d829200241c82a6a20024180296a200241d0296a107220022d00c82a2126200241a02a6a41206a2227200241f02a6a2903002208370300200241a02a6a41186a2228200241c82a6a41206a2903002206370300200241a02a6a41106a2229200241c82a6a41186a2903002209370300200241a02a6a41086a222a200241c82a6a41106a290300220e370300200220022903d02a220f3703a02a20024188196a200129030022104200200f420010ce08200241881c6a200842002001290308221142137e420010ce08200241b81b6a200642002001290310221342137e2218420010ce08200241e81a6a200942002001290318221542137e2216420010ce08200241981a6a200e42002001290320221942137e2214420010ce0820024198196a200e42002010420010ce08200241f81b6a200f42002011420010ce08200241a81b6a200842002018420010ce08200241d81a6a200642002016420010ce08200241881a6a200942002014420010ce08200241a8196a200942002010420010ce08200241e81b6a200e42002011420010ce08200241981b6a200f42002013420010ce08200241c81a6a200842002016420010ce08200241f8196a200642002014420010ce08200241b8196a200642002010420010ce08200241d81b6a200942002011420010ce08200241881b6a200e42002013420010ce08200241b81a6a200f42002015420010ce08200241e8196a200842002014420010ce08200241c8196a200842002010420010ce08200241c81b6a200642002011420010ce08200241f81a6a200942002013420010ce08200241a81a6a200e42002015420010ce08200241d8196a200f42002019420010ce08200220022903c819222220022903d8197c220820022903c81b7c220620022903f81a7c220920022903a81a7c220e20022903e819222320022903b81a7c220f20022903b8197c221020022903d81b7c221120022903881b7c221320022903c81a222420022903981b7c221420022903f8197c221520022903a8197c221620022903e81b7c221820022903a81b222520022903f81b7c221920022903d81a7c221a20022903881a7c221b2002290398197c220b20022903881c221c2002290388197c220c20022903b81b7c220d20022903e81a7c221220022903981a7c2217423388200241881c6a41086a29030020024188196a41086a2903007c200c201c54ad7c200241b81b6a41086a2903007c200d200c54ad7c200241e81a6a41086a2903007c2012200d54ad7c200241981a6a41086a2903007c2017201254ad7c420d86847c220c423388200241a81b6a41086a290300200241f81b6a41086a2903007c2019202554ad7c200241d81a6a41086a2903007c201a201954ad7c200241881a6a41086a2903007c201b201a54ad7c20024198196a41086a2903007c200b201b54ad7c200c200b54ad7c420d86847c2219423388200241c81a6a41086a290300200241981b6a41086a2903007c2014202454ad7c200241f8196a41086a2903007c2015201454ad7c200241a8196a41086a2903007c2016201554ad7c200241e81b6a41086a2903007c2018201654ad7c2019201854ad7c420d86847c2214423388200241e8196a41086a290300200241b81a6a41086a2903007c200f202354ad7c200241b8196a41086a2903007c2010200f54ad7c200241d81b6a41086a2903007c2011201054ad7c200241881b6a41086a2903007c2013201154ad7c2014201354ad7c420d86847c220f423388200241c8196a41086a290300200241d8196a41086a2903007c2008202254ad7c200241c81b6a41086a2903007c2006200854ad7c200241f81a6a41086a2903007c2009200654ad7c200241a81a6a41086a2903007c200e200954ad7c200f200e54ad7c420d868442137e201742ffffffffffffff03837c220842ffffffffffffff03833703f82a20022008423388200c42ffffffffffffff03837c22063703802b2002200f42ffffffffffffff038322093703982b2002201442ffffffffffffff0383220e3703902b2002201942ffffffffffffff0383220f3703882b200241c82a6a200241f82a6a106e20022d00c82a4101711070417f73410171107021012002200642f0ffffffffffff3f20067d221142ffffffffffffff038342d0fdffffffffff3f20022903f82a22107d22134233887c8542002001ad42ff01837d22088320068522063703802b2002200942f0ffffffffffff3f20097d221442ffffffffffffff038342f0ffffffffffff3f200e7d22154233887c8520088320098522093703982b2002200f42f0ffffffffffff3f200f7d221642ffffffffffffff038320114233887c85200883200f85220f3703882b200220102010201442338842137e201342ffffffffffffff03837c852008838522103703f82a2002200e201542ffffffffffffff038320164233887c85200883200e85220e3703902b2026417f73410171220110702126202a202a290300221120068542002026ad42ff01837d220883201185370300202920292903002206200f85200883200685370300202820282903002206200e85200883200685370300202720272903002206200985200883200685370300200220022903a02a22062010852008832006853703a02a200110702101200241c80f6a200720022903f8287d42f0ffffffffffff3f7c221142338842137e200320022903d8287d42d0fdffffffffff3f7c220942ffffffffffffff03837c22084200200342ecffffffffffff038542002001ad42ff01837d22038342ecffffffffffff03852206420010ce08200241880d6a200742ffffffffffffff038520038342ffffffffffffff038522074200200420022903e0287d42f0ffffffffffff3f7c220f42ffffffffffffff038320094233887c220942137e420010ce08200241d80d6a200a42ffffffffffffff038520038342ffffffffffffff0385220e4200200520022903e8287d42f0ffffffffffff3f7c221042ffffffffffffff0383200f4233887c220f42137e2213420010ce08200241a80e6a200542ffffffffffffff038520038342ffffffffffffff038522054200200a20022903f0287d42f0ffffffffffff3f7c221442ffffffffffffff038320104233887c220a42137e2210420010ce08200241f80e6a200442ffffffffffffff038520038342ffffffffffffff038522034200201142ffffffffffffff038320144233887c221142137e2204420010ce08200241e80e6a200342002008420010ce08200241b80f6a200642002009420010ce08200241f80c6a200742002013420010ce08200241c80d6a200e42002010420010ce08200241980e6a200542002004420010ce08200241880e6a200542002008420010ce08200241d80e6a200342002009420010ce08200241a80f6a20064200200f420010ce08200241e80c6a200742002010420010ce08200241b80d6a200e42002004420010ce08200241a80d6a200e42002008420010ce08200241f80d6a200542002009420010ce08200241c80e6a20034200200f420010ce08200241980f6a20064200200a420010ce08200241880c6a200742002004420010ce08200241a80b6a200742002008420010ce08200241980d6a200e42002009420010ce08200241e80d6a20054200200f420010ce08200241b80e6a20034200200a420010ce08200241880f6a200642002011420010ce08200241f8096a20022903a80b220b20022903880f7c220320022903980d7c220420022903e80d7c220520022903b80e7c220a20022903880c220c20022903980f7c220720022903a80d7c220820022903f80d7c220620022903c80e7c220920022903e80c220d20022903a80f7c220e20022903b80d7c220f20022903880e7c221020022903d80e7c221120022903f80c221220022903b80f7c221320022903c80d7c221420022903980e7c221520022903e80e7c221620022903880d221720022903c80f7c221820022903d80d7c221920022903a80e7c221a20022903f80e7c221b423388200241880d6a41086a290300200241c80f6a41086a2903007c2018201754ad7c200241d80d6a41086a2903007c2019201854ad7c200241a80e6a41086a2903007c201a201954ad7c200241f80e6a41086a2903007c201b201a54ad7c420d86847c2218423388200241f80c6a41086a290300200241b80f6a41086a2903007c2013201254ad7c200241c80d6a41086a2903007c2014201354ad7c200241980e6a41086a2903007c2015201454ad7c200241e80e6a41086a2903007c2016201554ad7c2018201654ad7c420d86847c2213423388200241e80c6a41086a290300200241a80f6a41086a2903007c200e200d54ad7c200241b80d6a41086a2903007c200f200e54ad7c200241880e6a41086a2903007c2010200f54ad7c200241d80e6a41086a2903007c2011201054ad7c2013201154ad7c420d86847c220e423388200241880c6a41086a290300200241980f6a41086a2903007c2007200c54ad7c200241a80d6a41086a2903007c2008200754ad7c200241f80d6a41086a2903007c2006200854ad7c200241c80e6a41086a2903007c2009200654ad7c200e200954ad7c420d86847c2207423388200241a80b6a41086a290300200241880f6a41086a2903007c2003200b54ad7c200241980d6a41086a2903007c2004200354ad7c200241e80d6a41086a2903007c2005200454ad7c200241b80e6a41086a2903007c200a200554ad7c2007200a54ad7c420d868442137e201b42ffffffffffffff03837c220842ffffffffffffff03832203420042a09ab5a7a4d5d602420010ce08200241980b6a200742ffffffffffffff03832204420042efabafe6f7c88835420010ce08200241f80b6a200e42ffffffffffffff03832205420042f8fb9b94e0ed8617420010ce08200241d80c6a201342ffffffffffffff0383220a4200428b83d98ea38bdb0a420010ce08200241c80a6a2008423388201842ffffffffffffff03837c2207420042e6c09290d28a8b35420010ce08200241b80a6a2007420042a09ab5a7a4d5d602420010ce08200241e8096a2003420042b5cccc99bcc0e502420010ce08200241880b6a2004420042f8fb9b94e0ed8617420010ce08200241e80b6a20054200428b83d98ea38bdb0a420010ce08200241c80c6a200a420042e6c09290d28a8b35420010ce08200241b80c6a200a420042a09ab5a7a4d5d602420010ce08200241a80a6a2007420042b5cccc99bcc0e502420010ce08200241d8096a2003420042a8f2a9fabaa79b01420010ce08200241f80a6a20044200428b83d98ea38bdb0a420010ce08200241d80b6a2005420042e6c09290d28a8b35420010ce08200241c80b6a2005420042a09ab5a7a4d5d602420010ce08200241a80c6a200a420042b5cccc99bcc0e502420010ce08200241980a6a2007420042a8f2a9fabaa79b01420010ce08200241c8096a2003420042a9afa6f3e694c800420010ce08200241e80a6a2004420042e6c09290d28a8b35420010ce08200241d80a6a2004420042a09ab5a7a4d5d602420010ce08200241b80b6a2005420042b5cccc99bcc0e502420010ce08200241980c6a200a420042a8f2a9fabaa79b01420010ce08200241880a6a2007420042a9afa6f3e694c800420010ce08200241b8096a2003420042c2cdbdbdb3d1e502420010ce0820022903f029210f20022903e829210e20022903e029210520022903d829210320022903d0292104200241a02b6a200241a02a6a41011071200241c82b6a41106a220120292903002207370300200241c82b6a41086a202a290300220a200a7c220a3703002001200720077c2207370300200241c82b6a41186a2028290300220820087c2208370300200241c82b6a41206a2027290300220620067c2206370300200220022903a02a220920097c22093703c82b200241c8176a200442002009420010ce08200241b8176a20064200200342137e420010ce08200241c8166a20084200200542137e2213420010ce0820024188186a20074200200e42137e2211420010ce08200241b8166a200a4200200f42137e2210420010ce08200241c8186a200a42002004420010ce08200241d8176a200942002003420010ce08200241a8176a200642002013420010ce08200241d8166a200842002011420010ce08200241a8166a200742002010420010ce0820024198186a200742002004420010ce08200241d8186a200a42002003420010ce08200241e8176a200942002005420010ce0820024198176a200642002011420010ce0820024198166a200842002010420010ce08200241e8166a200842002004420010ce08200241a8186a200742002003420010ce08200241e8186a200a42002005420010ce08200241f8176a20094200200e420010ce08200241e8146a200642002010420010ce0820024188176a200642002004420010ce08200241f8166a200842002003420010ce08200241b8186a200742002005420010ce08200241f8186a200a4200200e420010ce08200241b8136a20094200200f420010ce08200241e8066a20022903d80a222220022903b8097c220a20022903b80b7c220720022903980c7c220820022903880a7c220620022903e80a222320022903c8097c220920022903c80b7c221020022903a80c7c221120022903980a7c221320022903f80a222420022903d8097c221420022903d80b7c221520022903b80c7c221620022903a80a7c221820022903880b222520022903e8097c221920022903e80b7c221a20022903c80c7c221b20022903b80a7c220b20022903980b221c20022903f8097c220c20022903f80b7c220d20022903d80c7c221220022903c80a7c2217423388200241980b6a41086a290300200241f8096a41086a2903007c200c201c54ad7c200241f80b6a41086a2903007c200d200c54ad7c200241d80c6a41086a2903007c2012200d54ad7c200241c80a6a41086a2903007c2017201254ad7c420d86847c220c423388200241880b6a41086a290300200241e8096a41086a2903007c2019202554ad7c200241e80b6a41086a2903007c201a201954ad7c200241c80c6a41086a2903007c201b201a54ad7c200241b80a6a41086a2903007c200b201b54ad7c200c200b54ad7c420d86847c2219423388200241f80a6a41086a290300200241d8096a41086a2903007c2014202454ad7c200241d80b6a41086a2903007c2015201454ad7c200241b80c6a41086a2903007c2016201554ad7c200241a80a6a41086a2903007c2018201654ad7c2019201854ad7c420d86847c2214423388200241e80a6a41086a290300200241c8096a41086a2903007c2009202354ad7c200241c80b6a41086a2903007c2010200954ad7c200241a80c6a41086a2903007c2011201054ad7c200241980a6a41086a2903007c2013201154ad7c2014201354ad7c420d86847c220942ffffffffffffff0383200f7d42f0ffffffffffff3f7c220f42338842137e2009423388200241d80a6a41086a290300200241b8096a41086a2903007c200a202254ad7c200241b80b6a41086a2903007c2007200a54ad7c200241980c6a41086a2903007c2008200754ad7c200241880a6a41086a2903007c2006200854ad7c2009200654ad7c420d868442137e201742ffffffffffffff03837c220742ffffffffffffff038320047d42d0fdffffffffff3f7c220842ffffffffffffff03837c22044200429bdceccb84d4fd03420010ce08200241b8076a200f42ffffffffffffff0383201442ffffffffffffff0383200e7d42f0ffffffffffff3f7c22064233887c220a420042969988cadca7b00e420010ce08200241a8096a200642ffffffffffffff0383201942ffffffffffffff038320057d42f0ffffffffffff3f7c22064233887c2205420042a88c8b81f5cabeca00420010ce08200241d8086a200642ffffffffffffff03832007423388200c42ffffffffffffff03837c20037d42f0ffffffffffff3f7c22074233887c2203420042c8ee859b8cd29829420010ce0820024188086a200742ffffffffffffff038320084233887c2207420042dcd78e98b19df320420010ce08200241f8076a20074200429bdceccb84d4fd03420010ce08200241d8066a2004420042d2dfded4f0ede000420010ce08200241a8076a200a420042a88c8b81f5cabeca00420010ce0820024198096a2005420042c8ee859b8cd29829420010ce08200241c8086a2003420042dcd78e98b19df320420010ce08200241b8086a20034200429bdceccb84d4fd03420010ce08200241e8076a2007420042d2dfded4f0ede000420010ce08200241c8066a2004420042b8ecf9b5ffe8f503420010ce0820024198076a200a420042c8ee859b8cd29829420010ce0820024188096a2005420042dcd78e98b19df320420010ce08200241f8086a20054200429bdceccb84d4fd03420010ce08200241a8086a2003420042d2dfded4f0ede000420010ce08200241d8076a2007420042b8ecf9b5ffe8f503420010ce0820024198056a200442004298c9f9f3f9c09502420010ce0820024188076a200a420042dcd78e98b19df320420010ce08200241f8066a200a4200429bdceccb84d4fd03420010ce08200241e8086a2005420042d2dfded4f0ede000420010ce0820024198086a2003420042b8ecf9b5ffe8f503420010ce08200241c8076a200742004298c9f9f3f9c09502420010ce08200241e8036a2004420042b4f0cadfb1d2dd01420010ce0820022903b82b212320022903b02b212420022903a82b212520022903c02b211c20022903a02b211d200242003703d02a200242013703c82a200242003703d82a200242003703e02a200242003703e82a200220022903a02b42017c22033703c82a200220022903a82b22043703d02a200220022903b02b22103703d82a200220022903b82b22153703e02a200241e8106a20034200200229038817221720022903b8137c220520022903f8167c220a20022903b8187c220720022903f8187c220820022903e814222220022903f8177c220620022903e8167c220920022903a8187c220e20022903e8187c220f200229039817221e20022903e8177c22112002290398167c22132002290398187c221420022903d8187c221620022903a817221f20022903d8177c221820022903d8167c221920022903a8167c221a20022903c8187c221b20022903b817222020022903c8177c220b20022903c8167c220c2002290388187c220d20022903b8167c2212423388200241b8176a41086a290300200241c8176a41086a2903007c200b202054ad7c200241c8166a41086a2903007c200c200b54ad7c20024188186a41086a2903007c200d200c54ad7c200241b8166a41086a2903007c2012200d54ad7c420d86847c220b423388200241a8176a41086a290300200241d8176a41086a2903007c2018201f54ad7c200241d8166a41086a2903007c2019201854ad7c200241a8166a41086a2903007c201a201954ad7c200241c8186a41086a2903007c201b201a54ad7c200b201b54ad7c420d86847c221942338820024198176a41086a290300200241e8176a41086a2903007c2011201e54ad7c20024198166a41086a2903007c2013201154ad7c20024198186a41086a2903007c2014201354ad7c200241d8186a41086a2903007c2016201454ad7c2019201654ad7c420d86847c2211423388200241e8146a41086a290300200241f8176a41086a2903007c2006202254ad7c200241e8166a41086a2903007c2009200654ad7c200241a8186a41086a2903007c200e200954ad7c200241e8186a41086a2903007c200f200e54ad7c2011200f54ad7c420d86847c220642338820024188176a41086a290300200241b8136a41086a2903007c2005201754ad7c200241f8166a41086a2903007c200a200554ad7c200241b8186a41086a2903007c2007200a54ad7c200241f8186a41086a2903007c2008200754ad7c2006200854ad7c420d868442137e201242ffffffffffffff03837c220942ffffffffffffff03832205420010ce08200241a8136a200642ffffffffffffff0383220a4200200442137e222b420010ce08200241d8146a201142ffffffffffffff038322074200201042137e2218420010ce0820024188166a201942ffffffffffffff038322084200201542137e2216420010ce0820024188126a2009423388200b42ffffffffffffff03837c2206420020022903c02b221a42137e2211420010ce08200241f8116a200642002003420010ce08200241d8106a200542002004420010ce0820024198136a200a42002018420010ce08200241c8146a200742002016420010ce08200241f8156a200842002011420010ce08200241e8156a200842002003420010ce08200241e8116a200642002004420010ce08200241c8106a200542002010420010ce0820024188136a200a42002016420010ce08200241b8146a200742002011420010ce08200241a8146a200742002003420010ce08200241d8156a200842002004420010ce08200241d8116a200642002010420010ce08200241b8106a200542002015420010ce08200241f8126a200a42002011420010ce08200241e8126a200a42002003420010ce0820024198146a200742002004420010ce08200241c8156a200842002010420010ce08200241c8116a200642002015420010ce08200241a8106a20054200201a420010ce082000200229038813222c20022903c8107c221b20022903b8147c220b20022903e8157c220c20022903e8117c220d200229039813222220022903d8107c220920022903c8147c220e20022903f8157c220f20022903f8117c221320022903a813221e20022903e8107c221420022903d8147c22192002290388167c22122002290388127c2217423388200241a8136a41086a290300200241e8106a41086a2903007c2014201e54ad7c200241d8146a41086a2903007c2019201454ad7c20024188166a41086a2903007c2012201954ad7c20024188126a41086a2903007c2017201254ad7c420d86847c221242338820024198136a41086a290300200241d8106a41086a2903007c2009202254ad7c200241c8146a41086a2903007c200e200954ad7c200241f8156a41086a2903007c200f200e54ad7c200241f8116a41086a2903007c2013200f54ad7c2012201354ad7c420d86847c222242ffffffffffffff038337031020024198106a42f0ffffffffffff3f201c7d221442338842137e42d1fdffffffffff3f201d7d220e42ffffffffffffff03837c220942002005420010ce08200241d8126a200a420042f0ffffffffffff3f20257d220f42ffffffffffffff0383200e4233887c220e42137e420010ce0820024188146a2007420042f0ffffffffffff3f20247d221342ffffffffffffff0383200f4233887c220f42137e2224420010ce08200241b8156a2008420042f0ffffffffffff3f20237d221942ffffffffffffff038320134233887c221342137e2223420010ce08200241b8116a20064200201442ffffffffffffff038320194233887c221442137e2219420010ce08200241a8116a200642002009420010ce0820024188106a20054200200e420010ce08200241c8126a200a42002024420010ce08200241f8136a200742002023420010ce08200241a8156a200842002019420010ce0820024198156a200842002009420010ce0820024198116a20064200200e420010ce08200241f80f6a20054200200f420010ce08200241b8126a200a42002023420010ce08200241e8136a200742002019420010ce08200241d8136a200742002009420010ce0820024188156a20084200200e420010ce0820024188116a20064200200f420010ce08200241e80f6a200542002013420010ce08200241a8126a200a42002019420010ce0820004190016a20022903a812222d20022903e80f7c221920022903d8137c22232002290388157c22242002290388117c222520022903b812222e20022903f80f7c221c20022903e8137c221d2002290398157c221e2002290398117c221f20022903c812222f2002290388107c222020022903f8137c222120022903a8157c223020022903a8117c223120022903d81222322002290398107c22332002290388147c223420022903b8157c223520022903b8117c2236423388200241d8126a41086a29030020024198106a41086a2903007c2033203254ad7c20024188146a41086a2903007c2034203354ad7c200241b8156a41086a2903007c2035203454ad7c200241b8116a41086a2903007c2036203554ad7c420d86847c2233423388200241c8126a41086a29030020024188106a41086a2903007c2020202f54ad7c200241f8136a41086a2903007c2021202054ad7c200241a8156a41086a2903007c2030202154ad7c200241a8116a41086a2903007c2031203054ad7c2033203154ad7c420d86847c2220423388200241b8126a41086a290300200241f80f6a41086a2903007c201c202e54ad7c200241e8136a41086a2903007c201d201c54ad7c20024198156a41086a2903007c201e201d54ad7c20024198116a41086a2903007c201f201e54ad7c2020201f54ad7c420d86847c221c42ffffffffffffff0383370300200020022903f812223020022903b8107c221d20022903a8147c221e20022903d8157c221f20022903d8117c2221202242338820024188136a41086a290300200241c8106a41086a2903007c201b202c54ad7c200241b8146a41086a2903007c200b201b54ad7c200241e8156a41086a2903007c200c200b54ad7c200241e8116a41086a2903007c200d200c54ad7c2022200d54ad7c420d86847c221b42ffffffffffffff038337031820024198126a200a42002009420010ce08200241c8136a20074200200e420010ce08200241f8146a20084200200f420010ce08200241f8106a200642002013420010ce08200241d80f6a200542002014420010ce0820004198016a200229039812222c20022903d80f7c220b20022903c8137c220c20022903f8147c220d20022903f8107c2222201c423388200241a8126a41086a290300200241e80f6a41086a2903007c2019202d54ad7c200241d8136a41086a2903007c2023201954ad7c20024188156a41086a2903007c2024202354ad7c20024188116a41086a2903007c2025202454ad7c201c202554ad7c420d86847c222342ffffffffffffff0383370300200020022903e812221920022903a8107c22052002290398147c220a20022903c8157c220720022903c8117c2208201b423388200241f8126a41086a290300200241b8106a41086a2903007c201d203054ad7c200241a8146a41086a2903007c201e201d54ad7c200241d8156a41086a2903007c201f201e54ad7c200241d8116a41086a2903007c2021201f54ad7c201b202154ad7c420d86847c220642ffffffffffffff038337032020002006423388200241e8126a41086a290300200241a8106a41086a2903007c2005201954ad7c20024198146a41086a2903007c200a200554ad7c200241c8156a41086a2903007c2007200a54ad7c200241c8116a41086a2903007c2008200754ad7c2006200854ad7c420d868442137e201742ffffffffffffff03837c220542ffffffffffffff038337030020002005423388201242ffffffffffffff03837c370308200241d8016a20022903f806222d20022903e8037c220520022903e8087c220a2002290398087c220720022903c8077c2208200229038807222e2002290398057c220620022903f8087c221920022903a8087c221b20022903d8077c2212200229039807222f20022903c8067c22172002290388097c222420022903b8087c222520022903e8077c221c20022903a807223220022903d8067c221d2002290398097c221e20022903c8087c221f20022903f8077c222120022903b807223720022903e8067c223020022903a8097c223120022903d8087c22342002290388087c2235423388200241b8076a41086a290300200241e8066a41086a2903007c2030203754ad7c200241a8096a41086a2903007c2031203054ad7c200241d8086a41086a2903007c2034203154ad7c20024188086a41086a2903007c2035203454ad7c420d86847c2230423388200241a8076a41086a290300200241d8066a41086a2903007c201d203254ad7c20024198096a41086a2903007c201e201d54ad7c200241c8086a41086a2903007c201f201e54ad7c200241f8076a41086a2903007c2021201f54ad7c2030202154ad7c420d86847c221d42338820024198076a41086a290300200241c8066a41086a2903007c2017202f54ad7c20024188096a41086a2903007c2024201754ad7c200241b8086a41086a2903007c2025202454ad7c200241e8076a41086a2903007c201c202554ad7c201d201c54ad7c420d86847c221742338820024188076a41086a29030020024198056a41086a2903007c2006202e54ad7c200241f8086a41086a2903007c2019200654ad7c200241a8086a41086a2903007c201b201954ad7c200241d8076a41086a2903007c2012201b54ad7c2017201254ad7c420d86847c2206423388200241f8066a41086a290300200241e8036a41086a2903007c2005202d54ad7c200241e8086a41086a2903007c200a200554ad7c20024198086a41086a2903007c2007200a54ad7c200241c8076a41086a2903007c2008200754ad7c2006200854ad7c420d868442137e203542ffffffffffffff03837c220a42ffffffffffffff0383220542002009420010ce08200241f8026a20144200200a423388203042ffffffffffffff03837c220a42137e420010ce08200241b8056a20134200201d42ffffffffffffff0383220742137e2212420010ce0820024198046a200f4200201742ffffffffffffff0383220842137e221b420010ce08200241386a200e4200200642ffffffffffffff0383220642137e2219420010ce08200241c8016a200e42002005420010ce08200241e8026a20094200200a420010ce08200241a8056a201442002012420010ce0820024188046a20134200201b420010ce08200241286a200f42002019420010ce08200241b8016a200f42002005420010ce08200241d8026a200e4200200a420010ce08200241c8056a200942002007420010ce08200241f8036a20144200201b420010ce08200241186a201342002019420010ce08200241a8016a201342002005420010ce08200241c8026a200f4200200a420010ce08200241d8056a200e42002007420010ce08200241a8046a200942002008420010ce08200241086a201442002019420010ce0820024198016a201442002005420010ce08200241b8026a20134200200a420010ce08200241e8056a200f42002007420010ce08200241b8046a200e42002008420010ce0820024188036a200942002006420010ce0820024188016a200342002005420010ce0820024198036a20064200202b420010ce08200241c8046a200842002018420010ce08200241f8056a200742002016420010ce08200241a8026a200a42002011420010ce0820024198026a200a42002003420010ce08200241f8006a200542002004420010ce08200241a8036a200642002018420010ce08200241d8046a200842002016420010ce0820024188066a200742002011420010ce0820024198066a200742002003420010ce0820024188026a200a42002004420010ce08200241e8006a200542002010420010ce08200241b8036a200642002016420010ce08200241e8046a200842002011420010ce08200241f8046a200842002003420010ce08200241a8066a200742002004420010ce08200241f8016a200a42002010420010ce08200241d8006a200542002015420010ce08200241c8036a200642002011420010ce08200241d8036a200642002003420010ce0820024188056a200842002004420010ce08200241b8066a200742002010420010ce08200241e8016a200a42002015420010ce08200241c8006a20054200201a420010ce0820004188016a202042ffffffffffffff03833703002000202342338820024198126a41086a290300200241d80f6a41086a2903007c200b202c54ad7c200241c8136a41086a2903007c200c200b54ad7c200241f8146a41086a2903007c200d200c54ad7c200241f8106a41086a2903007c2022200d54ad7c2023202254ad7c420d868442137e203642ffffffffffffff03837c220342ffffffffffffff038337037820004180016a2003423388203342ffffffffffffff03837c370300200041e0006a20022903b803221b20022903687c220320022903e8047c22042002290398067c22052002290388027c220a20022903a803221320022903787c220720022903d8047c22082002290388067c22062002290398027c220920022903980322142002290388017c220e20022903c8047c220f20022903f8057c221020022903a8027c221142338820024198036a41086a29030020024188016a41086a2903007c200e201454ad7c200241c8046a41086a2903007c200f200e54ad7c200241f8056a41086a2903007c2010200f54ad7c200241a8026a41086a2903007c2011201054ad7c420d86847c220e423388200241a8036a41086a290300200241f8006a41086a2903007c2007201354ad7c200241d8046a41086a2903007c2008200754ad7c20024188066a41086a2903007c2006200854ad7c20024198026a41086a2903007c2009200654ad7c200e200954ad7c420d86847c220742ffffffffffffff0383370300200041386a20022903f803220b20022903c8057c220820022903187c220620022903b8017c220920022903d8027c220f20022903a805220c20022903e8027c22102002290388047c221320022903287c221420022903c8017c221520022903f802220d20022903d8017c221620022903b8057c22182002290398047c221920022903387c221a423388200241f8026a41086a290300200241d8016a41086a2903007c2016200d54ad7c200241b8056a41086a2903007c2018201654ad7c20024198046a41086a2903007c2019201854ad7c200241386a41086a2903007c201a201954ad7c420d86847c2216423388200241a8056a41086a290300200241e8026a41086a2903007c2010200c54ad7c20024188046a41086a2903007c2013201054ad7c200241286a41086a2903007c2014201354ad7c200241c8016a41086a2903007c2015201454ad7c2016201554ad7c420d86847c221042ffffffffffffff0383370300200041e8006a20022903c803221920022903587c221320022903f8047c221420022903a8067c221520022903f8017c22182007423388200241b8036a41086a290300200241e8006a41086a2903007c2003201b54ad7c200241e8046a41086a2903007c2004200354ad7c20024198066a41086a2903007c2005200454ad7c20024188026a41086a2903007c200a200554ad7c2007200a54ad7c420d86847c220342ffffffffffffff0383370300200041c0006a2002290308221b20022903a8047c220420022903a8017c220520022903c8027c220a20022903d8057c22072010423388200241f8036a41086a290300200241c8056a41086a2903007c2008200b54ad7c200241186a41086a2903007c2006200854ad7c200241b8016a41086a2903007c2009200654ad7c200241d8026a41086a2903007c200f200954ad7c2010200f54ad7c420d86847c220842ffffffffffffff0383370300200041f0006a20022903d803220b20022903487c22062002290388057c220920022903b8067c220f20022903e8017c22102003423388200241c8036a41086a290300200241d8006a41086a2903007c2013201954ad7c200241f8046a41086a2903007c2014201354ad7c200241a8066a41086a2903007c2015201454ad7c200241f8016a41086a2903007c2018201554ad7c2003201854ad7c420d86847c220342ffffffffffffff0383370300200041c8006a20022903980122192002290388037c221320022903b8027c221420022903e8057c221520022903b8047c22182008423388200241086a41086a290300200241a8046a41086a2903007c2004201b54ad7c200241a8016a41086a2903007c2005200454ad7c200241c8026a41086a2903007c200a200554ad7c200241d8056a41086a2903007c2007200a54ad7c2008200754ad7c420d86847c220442ffffffffffffff038337030020002003423388200241d8036a41086a290300200241c8006a41086a2903007c2006200b54ad7c20024188056a41086a2903007c2009200654ad7c200241b8066a41086a2903007c200f200954ad7c200241e8016a41086a2903007c2010200f54ad7c2003201054ad7c420d868442137e201142ffffffffffffff03837c220342ffffffffffffff0383370350200041d8006a2003423388200e42ffffffffffffff03837c3703002000200442338820024198016a41086a29030020024188036a41086a2903007c2013201954ad7c200241b8026a41086a2903007c2014201354ad7c200241e8056a41086a2903007c2015201454ad7c200241b8046a41086a2903007c2018201554ad7c2004201854ad7c420d868442137e201a42ffffffffffffff03837c220342ffffffffffffff0383370328200041306a2003423388201642ffffffffffffff03837c370300200241f02b6a24000bd32004047f017e027f1c7e23004190066b2202240002400240024020012c001f4100480d0020024180056a41186a2203200141186a29000037030020024180056a41106a2204200141106a29000037030020024180056a41086a2205200141086a29000037030020022001290000220637038005200220022d009f0541ff00713a009f05200241c0056a41186a22074200370300200241c0056a41106a22084200370300200241c0056a41086a220142003703002002200231008205421086200231008105420886200642ff0183848422063703c005200220023100830542188620068422063703c005200220023100840542208620068422063703c005200220023100850542288620068422063703c005200220023100860542308620068422063703c00520022002310087054238862006843703c005200120012903002005310000842206370300200120023100890542088620068422063703002001200231008a0542108620068422063703002001200231008b0542188620068422063703002001200231008c0542208620068422063703002001200231008d0542288620068422063703002001200231008e0542308620068422063703002001200231008f0542388620068437030020082008290300200431000084220637030020082002310091054208862006842206370300200820023100920542108620068422063703002008200231009305421886200684220637030020082002310094054220862006842206370300200820023100950542288620068422063703002008200231009605423086200684220637030020082002310097054238862006842209370300200720072903002003310000842206370300200720023100990542088620068422063703002007200231009a0542108620068422063703002007200231009b0542188620068422063703002007200231009c0542208620068422063703002007200231009d0542288620068422063703002007200231009e0542308620068422063703002007200231009f05423886200684220a37030020024180036a20022903c005220b42ffffffffffffff07832206420042edcd87b9d697d207420010ce08200241c0026a2006420042dac89fe3dad6ee01420010ce0820024180026a2001290300220c420c864280e0ffffffffff0783200b42348884220b420042edcd87b9d697d207420010ce08200241b0026a20064200429bcad7d9feffff07420010ce08200241c0016a200b420042dac89fe3dad6ee01420010ce08200241d0036a200942188642808080f8ffffff0783200c42288884220c420042edcd87b9d697d207420010ce08200241a0026a2006420042ffffffffffffff07420010ce0820024180016a200b4200429bcad7d9feffff07420010ce08200241c0036a200c420042dac89fe3dad6ee01420010ce08200241a0046a200a422486428080808080feff07832009421c88842209420042edcd87b9d697d207420010ce0820024190026a2006420042ffffffffffff03420010ce08200241c0006a200b420042ffffffffffffff07420010ce08200241b0036a200c4200429bcad7d9feffff07420010ce0820024190046a2009420042dac89fe3dad6ee01420010ce08200241f0046a200a4210882206420042edcd87b9d697d207420010ce082002200b420042ffffffffffff03420010ce08200241a0036a200c420042ffffffffffffff07420010ce0820024180046a20094200429bcad7d9feffff07420010ce08200241e0046a2006420042dac89fe3dad6ee01420010ce0820024190036a200c420042ffffffffffff03420010ce08200241f0036a2009420042ffffffffffffff07420010ce08200241d0046a20064200429bcad7d9feffff07420010ce08200241e0036a2009420042ffffffffffff03420010ce08200241c0046a2006420042ffffffffffffff07420010ce08200241b0046a2006420042ffffffffffff03420010ce08200241f0026a200229038003220b429bfcd192b1b4c7027e42ffffffffffffff07832206420042eda7d7e7a5e39801420010ce08200241e0026a200642004281cbb5cef7c5fa06420010ce08200241f0016a200229038002220d20022903c0027c220c200b20022903f00222097c220b423488200241f0026a41086a29030020024180036a41086a2903007c200b200954ad7c220e420c86847c220920022903e0027c220a429bfcd192b1b4c7027e42ffffffffffffff0783220b420042eda7d7e7a5e39801420010ce08200241d0026a2006420042f9bdd300420010ce08200241e0016a200b42004281cbb5cef7c5fa06420010ce08200241b0016a20022903c001220f20022903b0027c221020022903d0037c221120022903d0027c221220022903e0017c221320022903f0012214200a7c2215423488200241f0016a41086a29030020024180026a41086a290300200241c0026a41086a2903007c200c200d54ad7c200e4234887c2009200c54ad7c200241e0026a41086a2903007c200a200954ad7c7c2015201454ad7c2216420c86847c2209429bfcd192b1b4c7027e42ffffffffffffff0783220c420042eda7d7e7a5e39801420010ce08200241d0016a200b420042f9bdd300420010ce08200241a0016a200c42004281cbb5cef7c5fa06420010ce08200241f0006a200229038001221720022903a0027c220a20022903c0037c220d20022903a0047c220e20022903d0017c221420022903a0017c221520022903b001221820097c2219423488200241b0016a41086a290300200241c0016a41086a290300200241b0026a41086a2903007c2010200f54ad7c200241d0036a41086a2903007c2011201054ad7c200241d0026a41086a2903007c2012201154ad7c200241e0016a41086a2903007c2013201254ad7c20164234887c2009201354ad7c7c2019201854ad7c221a420c86847c2210429bfcd192b1b4c7027e42ffffffffffffff07832209420042eda7d7e7a5e39801420010ce0820024190016a200c420042f9bdd300420010ce08200241e0006a200942004281cbb5cef7c5fa06420010ce08200241306a2002290340221b2002290390027c221120022903b0037c22122002290390047c221320022903f0047c220f2006422c867c22162002290390017c221820022903607c22192002290370221c20107c221d423488200241f0006a41086a29030020024180016a41086a290300200241a0026a41086a2903007c200a201754ad7c200241c0036a41086a2903007c200d200a54ad7c200241a0046a41086a2903007c200e200d54ad7c200241d0016a41086a2903007c2014200e54ad7c200241a0016a41086a2903007c2015201454ad7c201a4234887c2010201554ad7c7c201d201c54ad7c221e420c86847c2210429bfcd192b1b4c7027e42ffffffffffffff0783220a420042eda7d7e7a5e39801420010ce08200241d0006a2009420042f9bdd300420010ce08200241206a200a42004281cbb5cef7c5fa06420010ce08200241106a200a420042f9bdd300420010ce08200120022903f003221f2002290390037c220d20022903d0047c220e200c422c867c221420022903107c221520022903a003222020022903007c22172002290380047c221a20022903e0047c221c200b422c867c221d20022903507c222120022903207c22222002290330222320107c2224423488200241306a41086a290300200241c0006a41086a29030020024190026a41086a2903007c2011201b54ad7c200241b0036a41086a2903007c2012201154ad7c20024190046a41086a2903007c2013201254ad7c200241f0046a41086a2903007c200f201354ad7c20064214887c2016200f54ad7c20024190016a41086a2903007c2018201654ad7c200241e0006a41086a2903007c2019201854ad7c201e4234887c2010201954ad7c7c2024202354ad7c2210420c86847c2206423488200241a0036a41086a290300200241086a2903007c2017202054ad7c20024180046a41086a2903007c201a201754ad7c200241e0046a41086a2903007c201c201a54ad7c200b4214887c201d201c54ad7c200241d0006a41086a2903007c2021201d54ad7c200241206a41086a2903007c2022202154ad7c20104234887c2006202254ad7c2212420c86847c220b42ffffffffffffff0783200642ffffffffffffff07834293d8a898da9ce77e7c2206423f877c42ffb4cab188ba85797c221342ffffffffffffff0783200642ffffffffffffff0783200a422c86220f20022903b0047c220620022903c004221620022903e0037c22102009422c867c2211200b423488200241f0036a41086a29030020024190036a41086a2903007c200d201f54ad7c200241d0046a41086a2903007c200e200d54ad7c200c4214887c2014200e54ad7c200241106a41086a2903007c2015201454ad7c20124234887c200b201554ad7c220c420c86847c220b423488200241c0046a41086a290300200241e0036a41086a2903007c2010201654ad7c20094214887c2011201054ad7c200c4234887c200b201154ad7c2209420c86847c220c423488200a421488200241b0046a41086a2903007c2006200f54ad7c20094234887c200c200654ad7c420c8684200c42ffffffffffffff0783200b42ffffffffffffff07832013423f877c4287c2ac7f7c220c423f877c2209423f877c428080808080807c7c2210423f87220a42eda7d7e7a5e39801837c22064234887c200a4281cbb5cef7c5fa06837c220b42ffffffffffffff078322113703002008200c42ffffffffffffff0783200b4234887c200a42f9bdd300837c220c42ffffffffffffff078322123703002007200942ffffffffffffff0783200c4234887c220942ffffffffffffff07832213370300200241e0056a201042ffffffffffffff078320094234887c200a4280808080808004837c220a42ffffffffffffff07833703002002200642ffffffffffffff078322103703c0052002200a4228883c00bf052002200a4220883c00be052002200a4218883c00bd052002200a4210883c00bc052002200a4208883c00bb052002200a3c00ba0520022009422c883c00b905200220094224883c00b80520022009421c883c00b705200220094214883c00b60520022009420c883c00b505200220094204883c00b405200220134204862012423088843c00b3052002200c4228883c00b2052002200c4220883c00b1052002200c4218883c00b0052002200c4210883c00af052002200c4208883c00ae052002200c3c00ad052002200b422c883c00ac052002200b4224883c00ab052002200b421c883c00aa052002200b4214883c00a9052002200b420c883c00a8052002200b4204883c00a705200220114204862010423088843c00a605200220064228883c00a505200220064220883c00a405200220064218883c00a305200220064210883c00a205200220064208883c00a105200220063c00a0052006a72108200241a0056a410172210341002101410121070340200820024180056a20016a2d0000732208410020086b72417f7341800171410776107020077121072001411f460d02200320016a2d00002108200141016a21010c000b0b200041003a00000c010b4100210102402007107041ff01714101470d002000200229038005370001200041196a20024198056a290300370000200041116a20024190056a290300370000200041096a20024188056a290300370000410121010b200020013a00000b20024190066a24000bf61001087f230041c0006b2203240020012002107702402001450d002000200141f0006c6a2104200241086a210103402000220528020421062005280208220720021077200220012802002007102f200228020020012802006a2006200710c9081a2001200720012802006a2207360200200528020c2106200220074101102f200228020020012802006a21070240024020064102470d00200741003a00002001200128020041016a3602000c010b200741013a00002001200128020041016a3602000240200528020c4101470d00200528021421062005280218220720021077200220012802002007102f200228020020012802006a2006200710c9081a2001200720012802006a360200200528022021070240200528021c4101470d0020072005280228200210780c020b2007200541246a280200200210780c010b200341206a2005280210110200200328022421062003280228220720021077200220012802002007102f200228020020012802006a2006200710c9081a2001200720012802006a360200200328023021080240200328022c4101460d0020082003280234200210780c010b2008200328023820021078024020032802382207450d00200741d8006c21094100210603400240200820066a220741346a280200450d002007413c6a280200450d00200741386a280200102c0b0240200741c4006a280200450d00200741cc006a28020041ffffffff0171450d00200741c8006a280200102c0b2009200641d8006a2206470d000b0b20032802342207450d00200741d8006c450d002008102c0b200528022c2107200220012802004101102f200228020020012802006a21060240024020074102470d00200641003a00002001200128020041016a3602000c010b200641013a00002001200128020041016a3602000240200528022c4101470d002005280230210620052802382207200210772007450d012007412c6c21082006411c6a21070340200741686a28020021092007416c6a280200220620021077200220012802002006102f200228020020012802006a2009200610c9081a2001200620012802006a3602002002200741706a107920022007107a2007412c6a2107200841546a22080d000c020b0b200341186a200528023011020020032802182106200328021c2207200210772007450d002007412c6c21082006411c6a21070340200741686a28020021092007416c6a280200220620021077200220012802002006102f200228020020012802006a2009200610c9081a2001200620012802006a3602002002200741706a107920022007107a2007412c6a2107200841546a22080d000b0b200528023c2107200220012802004101102f200228020020012802006a21060240024020074102470d00200641003a00002001200128020041016a3602000c010b200641013a00002001200128020041016a3602000240200528023c4101470d002005280240210620052802482207200210772007450d012007412c6c21082006411c6a21070340200741686a28020021092007416c6a280200220620021077200220012802002006102f200228020020012802006a2009200610c9081a2001200620012802006a3602002002200741706a107a20022007107a2007412c6a2107200841546a22080d000c020b0b200341106a20052802401102002003280210210620032802142207200210772007450d002007412c6c21082006411c6a21070340200741686a28020021092007416c6a280200220620021077200220012802002006102f200228020020012802006a2009200610c9081a2001200620012802006a3602002002200741706a107a20022007107a2007412c6a2107200841546a22080d000b0b02400240200528024c4101470d002005280250210020052802582207200210772007450d01200741386c210a410021080340200020086a220741046a2802002109200741086a280200220620021077200220012802002006102f200228020020012802006a2009200610c9081a2001200620012802006a360200200741106a2802002109200741146a280200220620021077200220012802002006102f200228020020012802006a2009200610c9081a2001200620012802006a3602002002200741186a107b2002200741286a107a200a200841386a2208470d000c020b0b200341086a200528025011020020032802082100200328020c2207200210772007450d00200741386c210a410021080340200020086a220741046a2802002109200741086a280200220620021077200220012802002006102f200228020020012802006a2009200610c9081a2001200620012802006a360200200741106a2802002109200741146a280200220620021077200220012802002006102f200228020020012802006a2009200610c9081a2001200620012802006a3602002002200741186a107b2002200741286a107a200a200841386a2208470d000b0b200541f0006a210002400240200528025c4101470d002005280260210620052802682207200210772007450d012007411c6c2108200641086a210703402007417c6a28020021092007280200220620021077200220012802002006102f200228020020012802006a2009200610c9081a2001200620012802006a3602002002200741046a107a2007411c6a2107200841646a22080d000c020b0b200320052802601102002003280200210620032802042207200210772007450d002007411c6c2108200641086a210703402007417c6a28020021092007280200220620021077200220012802002006102f200228020020012802006a2009200610c9081a2001200620012802006a3602002002200741046a107a2007411c6a2107200841646a22080d000b0b20052d006c2107200220012802004101102f200228020020012802006a20073a00002001200128020041016a36020020002004470d000b0b200341c0006a24000b960201027f024002400240200041c000490d00200041808001490d012000418080808004490d022001200141086a22022802004101102f200128020020022802006a41033a00002002200228020041016a2203360200200120034104102f200128020020022802006a20003600002002200228020041046a3602000f0b2001200141086a22022802004101102f200128020020022802006a20004102743a00002002200228020041016a3602000f0b2001200141086a22022802004102102f200128020020022802006a20004102744101723b00002002200228020041026a3602000f0b2001200141086a22022802004104102f200128020020022802006a20004102744102723600002002200228020041046a3602000bb90601057f20012002107702402001450d00200141d8006c2103410021040340200020046a220541046a2802002106200541086a2802002207200210772002200241086a22012802002007102f200228020020012802006a2006200710c9081a2001200720012802006a2207360200200541d4006a2d00002106200220074101102f200228020020012802006a20064101463a00002001200128020041016a220736020002400240024002402005410c6a2d00000e03000102030b200220074101102f200228020020012802006a41003a00002001200128020041016a360200200541146a2802002106200541186a280200220720021077200220012802002007102f200228020020012802006a2006200710c9081a2001200720012802006a3602000c020b200220074101102f200228020020012802006a41013a00002001200128020041016a36020020022005410d6a2d0000107c200541146a2802002106200541186a280200220720021077200220012802002007102f200228020020012802006a2006200710c9081a2001200720012802006a360200200541206a2802002106200541246a280200220720021077200220012802002007102f200228020020012802006a2006200710c9081a2001200720012802006a22073602002005410e6a2d00002106200220074101102f200228020020012802006a20063a00002001200128020041016a3602000c010b200220074101102f200228020020012802006a41023a00002001200128020041016a36020020022005410d6a2d0000107c200541146a2802002106200541186a280200220720021077200220012802002007102f200228020020012802006a2006200710c9081a2001200720012802006a360200200541206a2802002106200541246a280200220720021077200220012802002007102f200228020020012802006a2006200710c9081a2001200720012802006a3602002005412c6a2802002106200541306a280200220720021077200220012802002007102f200228020020012802006a2006200710c9081a2001200720012802006a36020020022005410e6a2d0000107c0b2002200541346a107b2002200541c4006a107a2003200441d8006a2204470d000b0b0b990301047f200128020421020240024020012802004101470d002001410c6a2802002201200010772001450d01200141186c2103200241146a2102200041086a21010340200241706a2802002104200241746a280200220520001077200020012802002005102f200028020020012802006a2004200510c9081a2001200520012802006a3602002002417c6a28020021042002280200220520001077200020012802002005102f200028020020012802006a2004200510c9081a2001200520012802006a360200200241186a2102200341686a22030d000c020b0b200141086a2802002201200010772001450d00200141186c2103200241146a2102200041086a21010340200241706a2802002104200241746a280200220520001077200020012802002005102f200028020020012802006a2004200510c9081a2001200520012802006a3602002002417c6a28020021042002280200220520001077200020012802002005102f200028020020012802006a2004200510c9081a2001200520012802006a360200200241186a2102200341686a22030d000b0b0b830201047f200128020421020240024020012802004101470d002001410c6a28020022012000107720014103742201450d01200220016a2103034020022802002104200241046a2802002201200010772000200041086a22052802002001102f200028020020052802006a2004200110c9081a2005200120052802006a360200200241086a22022003470d000c020b0b200141086a28020022012000107720014103742201450d00200220016a2103034020022802002104200241046a2802002201200010772000200041086a22052802002001102f200028020020052802006a2004200110c9081a2005200120052802006a360200200241086a22022003470d000b0b0bce0101037f230041106b220224000240024020012802004101470d00200128020421032001410c6a2802002201200010772000200041086a22042802002001102f200028020020042802006a2003200110c9081a2004200120042802006a3602000c010b20022001280204200141086a28020028020c1103002002280200210320022802082201200010772000200041086a22042802002001102f200028020020042802006a2003200110c9081a2004200120042802006a3602002002280204450d002003102c0b200241106a24000beb020002400240024002400240024002400240200141ff01710e0700010203040506070b2000200041086a22012802004101102f200028020020012802006a41003a00002001200128020041016a3602000f0b2000200041086a22012802004101102f200028020020012802006a41013a00002001200128020041016a3602000f0b2000200041086a22012802004101102f200028020020012802006a41023a00002001200128020041016a3602000f0b2000200041086a22012802004101102f200028020020012802006a41033a00002001200128020041016a3602000f0b2000200041086a22012802004101102f200028020020012802006a41043a00002001200128020041016a3602000f0b2000200041086a22012802004101102f200028020020012802006a41053a00002001200128020041016a3602000f0b2000200041086a22012802004101102f200028020020012802006a41063a00002001200128020041016a3602000b0b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41a49ec000200241086a103e2101200241206a240020010ba504010a7f20004201370200200041086a41003602002001410c6a28020021022001280208210320012802042104024002400240200128020022050d00200220036b410020031b21010c010b200420056b2106024020030d00200621010c010b2006200220036b6a220120064f0d000240024020042005460d00200541016a21010c010b2003450d0220022003460d024100210120032105200341016a21030b200041086a2107200041046a2108410121094100210a41002106034020052d0000210b02402006200a470d000240024020010d00200220036b410020031b21050c010b200420016b21052003450d00417f2005200220036b6a220920092005491b21050b2000200a417f200541016a220920092005491b102f200028020021090b200920066a200b3a00002007200641016a2206360200024002400240024020010d002001210b0c010b20012004470d014100210b0b2003450d0420032002460d0420032105200341016a21030c010b200141016a210b200121050b2008280200210a200b21010c000b0b200041002001102f2000280200200041086a28020022066a210102402005450d0020042005460d002004200620056b6a21060340200120052d00003a0000200141016a21012004200541016a2205470d000b0b02402003450d0020022003460d00200620036b21050340200120032d00003a0000200141016a21012002200341016a2203470d000b200220056a21060b200041086a20063602000b0b040041010bea0101027f230041c0006b2202240020024100360210200242013703082002410836021c20022001410c6a3602202002200241206a3602182002200241086a3602242002413c6a41013602002002420137022c200241b4b5c8003602282002200241186a360238200241246a41a49ec000200241286a103e1a41052103024002400240024002402001280200417f6a0e050001020304000b410121030c030b410221030c020b410321030c010b410421030b2003200141046a280200200141086a280200200228020820022802101082010240200228020c450d002002280208102c0b200241c0006a24000b6901037f230041206b220224002001411c6a280200210320012802182104200241086a41106a2000280200220141106a290200370300200241086a41086a200141086a2902003703002002200129020037030820042003200241086a103e2101200241206a240020010b5601017f4104210502400240024002400240200041ff0171417f6a0e050001020304000b410021050c030b410121050c020b410221050c010b410321050b20052002ad4220862001ad842004ad4220862003ad8410050b9f0904017f017e017f087e230041b0046b22022400200141bc016a350200210320012802b8012104200241c0016a200141b80110c9081a024002400240200241e8016a2903004201510d0020022903c80121050c010b200241f0016a290300220620022903c8012205560d010b200521060b200220063703c801024002400240200241a0026a2903004201510d0020022903c80121050c010b200241a8026a290300220620022903c8012205560d010b200521060b200220063703c801024002400240200241d8026a2903004201510d0020022903c80121050c010b200241e0026a290300220620022903c8012205560d010b200521060b200220063703c80102402004450d002006428094ebdc038020037e2006428094ebdc038220037e2206428094ebdc038042ffffffff0f2006428080808080c0b2cd3b541b2006428094ebdc03824280cab5ee0156ad7c42ffffffff0f837c21060240200241d8016a2903004201510d00200241e0016a42004200200241f0016a290300220320067d220520052003561b220320022903d0017d220520052003561b3703002002200241e8016a2903003703d8010b024020024190026a2903004201510d0020024198026a42004200200241a8026a290300220320067d220520052003561b220320024188026a2903007d220520052003561b3703002002200241a0026a290300370390020b200241c8026a2903004201510d00200241d0026a42004200200241e0026a290300220320067d220620062003561b2206200241c0026a2903007d220320032006561b3703002002200241d8026a2903003703c8020b200241f8026a200241c0016a41b80110c9081a02400240200229038003220620022903f8022203200241f8036a29030022077c580d002006420020024198046a290300220520024190046a2903005022011b540d00427e200241a8046a290300427f7c200241a0046a290300501b2007540d0020024188046a29030022085020024180046a2903002209420052710d00420020082009501b4200427f200520011b220520077d220820082005561b560d0020062003200241c0036a29030022097c580d0020064200200241e0036a2903002208200241f8026a41e0006a2903005022011b540d00427e200241f0036a290300427f7c200241e8036a290300501b2009540d00200241d0036a290300220a50200241c8036a290300220b420052710d004200200a200b501b4200427f200820011b220820097d220a200a2008561b560d0020062003200229038803220a7c580d0020064200200241a8036a290300220b200241a0036a2903005022011b540d00427e200241b8036a290300427f7c200241b0036a290300501b200a540d0020024198036a29030022065020024190036a290300220c420052710d0042002006200c501b4200427f200b20011b2206200a7d220b200b2006561b560d002006502006200a5620062003567172450d00200850200820095620082003567172450d002005502005200756200520035671720d010b200241013a00024188a1c00041e000200241026a4198a0c00041e8a1c0001040000b2000200241086a200241f8026a41b80110c90841b80110c9081a200241b0046a24000ba90803197e017f147e20002903c0012101200029039801210220002903702103200029034821042000290320210520002903b8012106200029039001210720002903682108200029034021092000290318210a20002903b001210b200029038801210c2000290360210d2000290338210e2000290310210f20002903a8012110200029038001211120002903582112200029033021132000290308211420002903a00121152000290378211620002903502117200029032821182000290300211941c07e211a0340200b200c200d200e200f85858585221b4201892015201620172018201985858585221c85221d201385211e20012006200720082009200a85858585221f201c42018985221c85212020012002200320042005858585852221420189201b85221b2009854237892222201f4201892010201120122013201485858585220985221f200f85423e892223427f8583201d201085420289222485210120222021200942018985220f20168542298922212003201c854227892225427f8583852110201b2006854238892226201f200c85420f892227427f8583201d201285420a89222885210c2028200f2018854224892229427f85832005201c85421b89222a852116200f2015854212892215201f200e85420689222b201d201485420189222c427f85838521032002201c85420889222d201b200885421989222e427f8583202b8521122004201c85421489221c201b200a85421c89220a427f8583201f200b85423d89220e852104200a200e427f8583201d201185422d89221d852109200f2017854203892214200e201d427f858385210e201d2014427f8583201c852113200a2014201c427f8583852118201b200785421589221d200f201985221c2020420e89221b427f858385210a201b201d427f8583201f200d85422b89221f85210f201d201f427f8583201e422c89221d852114201a41c8a3c0006a290300201c201f201d427f85838585211920262029202a427f858385221f2102201d201c427f8583201b85221d2105202120232024427f858385221c2106202a2026427f8583202785221b2107202c2015427f8583202d852226210820242021427f85832025852224210b202e2015202d427f8583852221210d202920272028427f8583852227211120252022427f858320238522222115202e202b427f8583202c8522232117201a41086a221a0d000b200020223703a00120002016370378200020233703502000201837032820002019370300200020103703a8012000202737038001200020123703582000201337033020002014370308200020243703b0012000200c37038801200020213703602000200e3703382000200f3703102000201c3703b8012000201b3703900120002026370368200020093703402000200a370318200020013703c0012000201f3703980120002003370370200020043703482000201d3703200b040041000b02000b02000be31901037f230041a0026b22032400200341086a41126a410041b60110cb081a200341166a4100280086a440360100200341002f00fca3403b010c200341002800f8a340360208200341002900fea34037010e200341086a1084012000200341086a41c80110c908220041003a00ca01200041003b01c801200041124100108901024020002d00c801220441c7014b0d00200020046a220420042d000041cd00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200441c8014f0d010b200020046a220420042d000041e500733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041f200733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041ec00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041e900733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041ee00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d00004120733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d000041f600733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d00004131733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d0000412e733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220441a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200441c7014b0d010b200020046a220420042d00004130733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000108401200041003b01c8010b20032002360204200041124100108901024020002d00c801220441c8014f0d00200020046a220420042d000041e400733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200541c8014f0d010b2000200441ff01716a220420042d000041ef00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000041ed00733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d0000412d733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000041f300733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000041e500733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200541c7014b0d010b200041ca016a21052000200441ff01716a220420042d000041f000733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010b200341123a00d701024020052d00004112460d00200341f0016a41146a4109360200200341f0016a410c6a410a36020020032005360288022003200341d7016a36028c02200341086a41146a4102360200200341086a410c6a410236020020034190026a410c6a410b3602002003410a3602f40120034184a5c0003602102003410236020c200341f4a4c0003602082003410b3602940220032005360290022003200341086a3602800220032003418c026a3602f801200320034188026a3602f001200320034190026a3602182003200341d7016a36029802200341d8016a41146a4103360200200342033702dc01200341c0bbc4003602d8012003200341f0016a3602e801200341d8016a41c4a5c0001046000b0240200441ff0171220541c7014b0d00200020056a220420042d000020032d0004733a0000200020002d00c80141016a22043a00c80102400240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200441ff017141c8014f0d010b2000200441ff01716a220420042d000020032d0005733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000020032d0006733a0000200020002d00c80141016a22043a00c80102400240200441ff0171220541a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010c010b200541c7014b0d010b2000200441ff01716a220420042d000020032d0007733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000108401200041003b01c8010b200041024100108901024002402002450d0020002d00c80121040340200441ff0171220441c7014b0d02200020046a220420042d000020012d0000733a0000200020002d00c80141016a22043a00c8010240200441ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002104200041003b01c8010b200141016a21012002417f6a22020d000b0b200341a0026a24000f0b200441c801418ca4c000103f000b200441ff017141c801418ca4c000103f000b200441ff017141c801418ca4c000103f000b200441c801418ca4c000103f000bbb0701027f230041f0006b22032400200320013a000b02400240024002400240024002400240024020020d002003200141087122023a000c20020d03200020013a00ca0120002d00c9012104200020002d00c801220241016a3a00c901200320013a0059200320043a0058200241c7014b0d02200020026a220120012d000020032d0058733a0000200020002d00c80141016a22023a00c801200241ff0171220141a601470d01200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002102200041003b01c8010c050b20002d00ca01200141ff0171470d030c050b200141c801490d030b200241ff017141c801418ca4c000103f000b200341386a41146a4109360200200341c4006a410a360200200341206a41146a410336020020032003410c6a360254200341a789c500360210200341d8006a41146a410036020020034203370224200341c0bbc4003602202003410a36023c200341c4b5c8003602682003420137025c200341d4a5c0003602582003200341386a3602302003200341d8006a3602482003200341106a3602402003200341d4006a360238200341206a41dca5c0001046000b200341386a41146a4109360200200341386a410c6a410a3602002003200041ca016a220036020c20032003410b6a360254200341d8006a41146a4102360200200341d8006a410c6a4102360200200341106a410c6a410b3602002003410a36023c20034184a5c0003602602003410236025c200341f4a4c0003602582003410b360214200320003602102003200341d8006a3602482003200341d4006a36024020032003410c6a3602382003200341106a36026820032003410b6a360218200341206a41146a410336020020034203370224200341c0bbc4003602202003200341386a360230200341206a41c4a5c0001046000b2000200241ff01716a220120012d000020032d0059733a0000200020002d00c80141016a22013a00c8010240200141ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002101200041003b01c8010b20032d000b412471450d00200141ff01712201450d00200141c7014b0d01200020016a220120012d000020002d00c901733a000020002d00c80141016a41ff0171220141c8014f0d02200020016a220120012d00004104733a0000200020002d00a701418001733a00a7012000108401200041003b01c8010b200341f0006a24000f0b200141c80141eca5c000103f000b200141c80141fca5c000103f000bc40201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff01832001104921000c020b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d02200141a888c0004102200220006a4180016a410020006b104d21000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d02200141a888c0004102200220006a4180016a410020006b104d21000b20024180016a240020000f0b2004418001419888c0001058000b2004418001419888c0001058000b8c0901027f230041f0006b2205240020052004360208200041124100108901024002400240024002402002450d0020002d00c80121060340200641ff0171220641c7014b0d02200020066a220620062d000020012d0000733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002106200041003b01c8010b200141016a21012002417f6a22020d000b0b200541123a000f20002d00ca014112470d0120002d00c801220641c7014b0d03200020066a220620062d000020052d0008733a0000200020002d00c80141016a22063a00c8010240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002106200041003b01c8010c030b200141c801490d020c030b200641c801418ca4c000103f000b200541286a41146a4109360200200541286a410c6a410a3602002005200041ca016a220036024020052005410f6a360244200541c8006a41146a4102360200200541c8006a410c6a4102360200200541e0006a410c6a410b3602002005410a36022c20054184a5c0003602502005410236024c200541f4a4c0003602482005410b360264200520003602602005200541c8006a3602382005200541c4006a3602302005200541c0006a3602282005200541e0006a36025820052005410f6a360268200541106a41146a410336020020054203370214200541c0bbc4003602102005200541286a360220200541106a41c4a5c0001046000b2000200641ff01716a220620062d000020052d0009733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000a733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000b733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000108401200041003b01c8010b200041024100108901024002402004450d0020002d00c80121060340200641ff0171220641c7014b0d02200020066a220620062d000020032d0000733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002106200041003b01c8010b200341016a21032004417f6a22040d000b0b200541f0006a24000f0b200641c801418ca4c000103f000b200641ff017141c801418ca4c000103f000bd40f01027f230041f0006b220424002004200337030020044108360208200041124100108901024002400240024002402002450d0020002d00c80121050340200541ff0171220541c7014b0d02200020056a220520052d000020012d0000733a0000200020002d00c80141016a22053a00c8010240200541ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002105200041003b01c8010b200141016a21012002417f6a22020d000b0b200441123a000f20002d00ca014112470d0120002d00c801220541c7014b0d03200020056a220520052d000020042d0008733a0000200020002d00c80141016a22053a00c8010240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002105200041003b01c8010c030b200141c801490d020c030b200541c801418ca4c000103f000b200441286a41146a4109360200200441286a410c6a410a3602002004200041ca016a220036024020042004410f6a360244200441c8006a41146a4102360200200441c8006a410c6a4102360200200441e0006a410c6a410b3602002004410a36022c20044184a5c0003602502004410236024c200441f4a4c0003602482004410b360264200420003602602004200441c8006a3602382004200441c4006a3602302004200441c0006a3602282004200441e0006a36025820042004410f6a360268200441106a41146a410336020020044203370214200441c0bbc4003602102004200441286a360220200441106a41c4a5c0001046000b2000200541ff01716a220520052d000020042d0009733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d000a733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d000b733a0000200020002d00c80141016a22053a00c8010240200541ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000108401200041003b01c8010b200041024100108901024020002d00c801220541c8014f0d00200020056a220520052d000020042d0000733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002105200041003b01c8010c010b200141c8014f0d010b2000200541ff01716a220520052d000020042d0001733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0002733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0003733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0004733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0005733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0006733a0000200020002d00c80141016a22053a00c80102400240200541ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002105200041003b01c8010c010b200141c7014b0d010b2000200541ff01716a220520052d000020042d0007733a0000200020002d00c80141016a22053a00c8010240200541ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000108401200041003b01c8010b200441f0006a24000f0b200541ff017141c801418ca4c000103f000b200541ff017141c801418ca4c000103f000bae0901027f230041f0006b2205240020052004360208200041124100108901024002400240024002402002450d0020002d00c80121060340200641ff0171220641c7014b0d02200020066a220620062d000020012d0000733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002106200041003b01c8010b200141016a21012002417f6a22020d000b0b200541123a000f20002d00ca014112470d0120002d00c801220641c7014b0d03200020066a220620062d000020052d0008733a0000200020002d00c80141016a22063a00c8010240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002106200041003b01c8010c030b200141c801490d020c030b200641c801418ca4c000103f000b200541286a41146a4109360200200541286a410c6a410a3602002005200041ca016a220036024020052005410f6a360244200541c8006a41146a4102360200200541c8006a410c6a4102360200200541e0006a410c6a410b3602002005410a36022c20054184a5c0003602502005410236024c200541f4a4c0003602482005410b360264200520003602602005200541c8006a3602382005200541c4006a3602302005200541c0006a3602282005200541e0006a36025820052005410f6a360268200541106a41146a410336020020054203370214200541c0bbc4003602102005200541286a360220200541106a41c4a5c0001046000b2000200641ff01716a220620062d000020052d0009733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000a733a0000200020002d00c80141016a22063a00c80102400240200641ff0171220141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002106200041003b01c8010c010b200141c7014b0d010b2000200641ff01716a220620062d000020052d000b733a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a7012000108401200041003b01c8010b20004107410010890102402004450d0020002d00c8012106024002400340200641ff0171220641c7014b0d012003200020066a2d00003a000020002d00c801220641c7014b0d02200020066a41003a0000200020002d00c80141016a22063a00c8010240200641ff017141a601470d00200020002d00a60120002d00c901733a00a601200020002d00a701418401733a00a701200010840141002106200041003b01c8010b200341016a21032004417f6a22040d000c030b0b200641c80141fca6c000103f000b200641c801418ca7c000103f000b200541f0006a24000f0b200641ff017141c801418ca4c000103f000bee0201027f02400240024020002f0100220241c000490d00200241808001490d012001200141086a22032802004104102f200128020020032802006a20024102744102723600002003200328020041046a22023602000c020b2001200141086a22032802004101102f200128020020032802006a20024102743a00002003200328020041016a22023602000c010b2001200141086a22032802004102102f200128020020032802006a20024102744101723b00002003200328020041026a22023602000b0240024020002f0102220041c000490d00200041808001490d01200120024104102f2001280200200141086a22012802006a20004102744102723600002001200128020041046a3602000f0b200120024101102f2001280200200141086a22012802006a20004102743a00002001200128020041016a3602000f0b200120024102102f2001280200200141086a22012802006a20004102744101723b00002001200128020041026a3602000b960201027f024002400240200141c000490d00200141808001490d012001418080808004490d022000200041086a22022802004101102f200028020020022802006a41033a00002002200228020041016a2203360200200020034104102f200028020020022802006a20013600002002200228020041046a3602000f0b2000200041086a22022802004101102f200028020020022802006a20014102743a00002002200228020041016a3602000f0b2000200041086a22022802004102102f200028020020022802006a20014102744101723b00002002200228020041026a3602000f0b2000200041086a22022802004104102f200028020020022802006a20014102744102723600002002200228020041046a3602000b1c00200128021841d8bdc800410f2001411c6a28020028020c1100000b900201057f024002400240024002400240200041086a28020022032001490d002003200041046a280200470d03200341016a22042003490d05200341017422052004200520044b1b22044104200441044b1b220620066a22042006490d0520044100480d05200420064f41017421070240024002402000280200410020031b22060d002004450d010c040b20050d0120040d030b200721060c030b200620052004103522060d020c040b200120031044000b200410322206450d020b20002006360200200041046a20044101763602000b200028020020014101746a220441026a2004200320016b41017410ca081a200420023b0100200041086a200341016a3602000f0b2007450d001039000b103b000bb26d0b0b7f017e0e7f037e047f017e047f017e037f017e017f2000420137020041002102200041086a41003602000240024002400240200128020822030d0041042104410021050c010b20034104200341044b1b220641ffffffff017122072006470d01200641037422084100480d0120012802002105200820072006464102742008103222061b2109024020060d002009450d020c030b200520034103746a2107200341037441786a410376210a2006200820061b22042103034020052802002106200341046a200541046a2f01003b010020032006360200200341086a2103200541086a22052007470d000b200a41016a2105200941037621020b20002005108f0102402005450d002005410374210620042105034002400240024002402005280200220341c000490d00200341808001490d012003418080808004490d022000200041086a22032802004101102f200028020020032802006a41033a00002003200328020041016a220736020020052802002108200020074104102f200028020020032802006a20083600002003200328020041046a22073602000c030b2000200041086a22082802004101102f200028020020082802006a20034102743a00002008200828020041016a22073602000c020b2000200041086a22082802004102102f200028020020082802006a20034102744101723b00002008200828020041026a22073602000c010b2000200041086a22082802004104102f200028020020082802006a20034102744102723600002008200828020041046a22073602000b024002400240200541046a2f0100220341c000490d00200341808001490d01200020074104102f2000280200200041086a22072802006a20034102744102723600002007200728020041046a3602000c020b200020074101102f2000280200200041086a22072802006a20034102743a00002007200728020041016a3602000c010b200020074102102f2000280200200041086a22072802006a20034102744101723b00002007200728020041026a3602000b200541086a2105200641786a22060d000b0b02400240200141146a28020022030d004104210b4100210c410021050c010b20034104200341044b1bad420c7e220d422088a722060d01200da722074100480d01200128020c210520072006454102742007103222081b2109024020080d0020090d030c020b20052003410c6c6a21062003410c6c41746a410c6e210a2008200720081b220b2103034020032005290200370200200341086a200541086a2f01003b01002003410c6a21032005410c6a22052006470d000b200a41016a21052009410c6e210c0b20002005108f0102402005450d002005410c6c2107200041086a2105200b21030340200341046a210802400240024002402003280200220641c000490d00200641808001490d012006418080808004490d02200020052802004101102f200028020020052802006a41033a00002005200528020041016a220636020020032802002109200020064104102f200028020020052802006a20093600002005200528020041046a3602000c030b200020052802004101102f200028020020052802006a20064102743a00002005200528020041016a3602000c020b200020052802004102102f200028020020052802006a20064102744101723b00002005200528020041026a3602000c010b200020052802004104102f200028020020052802006a20064102744102723600002005200528020041046a3602000b20082000108e01024002400240200341086a2f0100220641c000490d00200641808001490d01200020052802004104102f200028020020052802006a20064102744102723600002005200528020041046a3602000c020b200020052802004101102f200028020020052802006a20064102743a00002005200528020041016a3602000c010b200020052802004102102f200028020020052802006a20064102744101723b00002005200528020041026a3602000b2003410c6a2103200741746a22070d000b0b4104210e02400240200141206a28020022030d004100210f410021050c010b20034104200341044b1b220641ffffffff007122082006470d01200641047422074100480d0120012802182105200720082006464102742007103222081b2109024020080d0020090d030c020b200520034104746a2106200341047441706a410476210a2008200720081b220e21030340200320052802003602002003410c6a2005410c6a2f01003b0100200341046a200541046a290200370200200341106a2103200541106a22052006470d000b200a41016a21052009410476210f0b20002005108f0102402005450d0020054104742107200041086a2105200e2103034002400240024002402003280200220641c000490d00200641808001490d012006418080808004490d02200020052802004101102f200028020020052802006a41033a00002005200528020041016a220636020020032802002108200020064104102f200028020020052802006a20083600002005200528020041046a3602000c030b200020052802004101102f200028020020052802006a20064102743a00002005200528020041016a3602000c020b200020052802004102102f200028020020052802006a20064102744101723b00002005200528020041026a3602000c010b200020052802004104102f200028020020052802006a20064102744102723600002005200528020041046a3602000b200341046a2000108e01200341086a2000108e010240024002402003410c6a2f0100220641c000490d00200641808001490d01200020052802004104102f200028020020052802006a20064102744102723600002005200528020041046a3602000c020b200020052802004101102f200028020020052802006a20064102743a00002005200528020041016a3602000c010b200020052802004102102f200028020020052802006a20064102744101723b00002005200528020041026a3602000b200341106a2103200741706a22070d000b0b024002402001412c6a28020022030d004104211041002111410021050c010b20034104200341044b1bad42147e220d422088a722060d01200da722074100480d012001280224210520072006454102742007103222081b2109024020080d0020090d030c020b2005200341146c6a2106200341146c416c6a41146e210a2008200720081b22102103034020032005280200360200200341106a200541106a2f01003b01002003410c6a2005410c6a280200360200200341046a200541046a290200370200200341146a2103200541146a22052006470d000b200a41016a2105200941146e21110b20002005108f0102402005450d00200541146c2107200041086a210520102103034002400240024002402003280200220641c000490d00200641808001490d012006418080808004490d02200020052802004101102f200028020020052802006a41033a00002005200528020041016a220636020020032802002108200020064104102f200028020020052802006a20083600002005200528020041046a3602000c030b200020052802004101102f200028020020052802006a20064102743a00002005200528020041016a3602000c020b200020052802004102102f200028020020052802006a20064102744101723b00002005200528020041026a3602000c010b200020052802004104102f200028020020052802006a20064102744102723600002005200528020041046a3602000b200341046a2000108e01200341086a2000108e012003410c6a2000108e01024002400240200341106a2f0100220641c000490d00200641808001490d01200020052802004104102f200028020020052802006a20064102744102723600002005200528020041046a3602000c020b200020052802004101102f200028020020052802006a20064102743a00002005200528020041016a3602000c010b200020052802004102102f200028020020052802006a20064102744101723b00002005200528020041026a3602000b200341146a21032007416c6a22070d000b0b02400240200141386a28020022030d004104210a41002112410021050c010b20034104200341044b1bad42187e220d422088a722060d01200da722074100480d012001280230210520072006454102742007103222081b2109024020080d0020090d030c020b2005200341186c6a2106200341186c41686a41186e21132008200720081b220a2103034020032005280200360200200341146a200541146a2f01003b01002003410c6a2005410c6a290200370200200341046a200541046a290200370200200341186a2103200541186a22052006470d000b201341016a2105200941186e21120b20002005108f0102402005450d00200541186c210841002106200041086a210503400240024002400240200a20066a2203280200220741c000490d00200741808001490d012007418080808004490d02200020052802004101102f200028020020052802006a41033a00002005200528020041016a220736020020032802002109200020074104102f200028020020052802006a20093600002005200528020041046a3602000c030b200020052802004101102f200028020020052802006a20074102743a00002005200528020041016a3602000c020b200020052802004102102f200028020020052802006a20074102744101723b00002005200528020041026a3602000c010b200020052802004104102f200028020020052802006a20074102744102723600002005200528020041046a3602000b200341046a2000108e01200341086a2000108e012003410c6a2000108e01200341106a2000108e01024002400240200341146a2f0100220341c000490d00200341808001490d01200020052802004104102f200028020020052802006a20034102744102723600002005200528020041046a3602000c020b200020052802004101102f200028020020052802006a20034102743a00002005200528020041016a3602000c010b200020052802004102102f200028020020052802006a20034102744101723b00002005200528020041026a3602000b2008200641186a2206470d000b0b02400240200141c4006a28020022030d004104211341002114410021050c010b20034104200341044b1bad421c7e220d422088a722060d01200da722074100480d01200128023c210520072006454102742007103222081b2109024020080d0020090d030c020b20052003411c6c6a21062003411c6c41646a411c6e21152008200720081b22132103034020032005280200360200200341186a200541186a2f01003b0100200341146a200541146a2802003602002003410c6a2005410c6a290200370200200341046a200541046a2902003702002003411c6a21032005411c6a22052006470d000b201541016a21052009411c6e21140b20002005108f0102402005450d002005411c6c210841002106200041086a210503400240024002400240201320066a2203280200220741c000490d00200741808001490d012007418080808004490d02200020052802004101102f200028020020052802006a41033a00002005200528020041016a220736020020032802002109200020074104102f200028020020052802006a20093600002005200528020041046a3602000c030b200020052802004101102f200028020020052802006a20074102743a00002005200528020041016a3602000c020b200020052802004102102f200028020020052802006a20074102744101723b00002005200528020041026a3602000c010b200020052802004104102f200028020020052802006a20074102744102723600002005200528020041046a3602000b200341046a2000108e01200341086a2000108e012003410c6a2000108e01200341106a2000108e01200341146a2000108e01024002400240200341186a2f0100220341c000490d00200341808001490d01200020052802004104102f200028020020052802006a20034102744102723600002005200528020041046a3602000c020b200020052802004101102f200028020020052802006a20034102743a00002005200528020041016a3602000c010b200020052802004102102f200028020020052802006a20034102744101723b00002005200528020041026a3602000b20082006411c6a2206470d000b0b02400240200141d0006a28020022030d004104210841002116410021050c010b20034104200341044b1b220641ffffff3f7122082006470d01200641057422074100480d0120012802482105200720082006464102742007103222081b2109024020080d0020090d030c020b200520034105746a2106200341057441606a41057621152008200720081b220821030340200320052802003602002003411c6a2005411c6a2f01003b0100200341146a200541146a2902003702002003410c6a2005410c6a290200370200200341046a200541046a290200370200200341206a2103200541206a22052006470d000b201541016a2105200941057621160b20002005108f0102402005450d002005410574210941002106200041086a210503400240024002400240200820066a2203280200220741c000490d00200741808001490d012007418080808004490d02200020052802004101102f200028020020052802006a41033a00002005200528020041016a220736020020032802002115200020074104102f200028020020052802006a20153600002005200528020041046a3602000c030b200020052802004101102f200028020020052802006a20074102743a00002005200528020041016a3602000c020b200020052802004102102f200028020020052802006a20074102744101723b00002005200528020041026a3602000c010b200020052802004104102f200028020020052802006a20074102744102723600002005200528020041046a3602000b200341046a2000108e01200341086a2000108e012003410c6a2000108e01200341106a2000108e01200341146a2000108e01200341186a2000108e010240024002402003411c6a2f0100220341c000490d00200341808001490d01200020052802004104102f200028020020052802006a20034102744102723600002005200528020041046a3602000c020b200020052802004101102f200028020020052802006a20034102743a00002005200528020041016a3602000c010b200020052802004102102f200028020020052802006a20034102744101723b00002005200528020041026a3602000b2009200641206a2206470d000b0b02400240200141dc006a28020022030d004104211541002117410021050c010b20034104200341044b1bad42247e220d422088a722060d01200da722074100480d012001280254210520072006454102742007103222091b2118024020090d0020180d030c020b2005200341246c6a2106200341246c415c6a41246e21192009200720091b22152103034020032005280200360200200341206a200541206a2f01003b01002003411c6a2005411c6a280200360200200341146a200541146a2902003702002003410c6a2005410c6a290200370200200341046a200541046a290200370200200341246a2103200541246a22052006470d000b201941016a2105201841246e21170b20002005108f0102402005450d00200541246c210941002106200041086a210303400240024002400240201520066a2205280200220741c000490d00200741808001490d012007418080808004490d02200020032802004101102f200028020020032802006a41033a00002003200328020041016a220736020020052802002118200020074104102f200028020020032802006a20183600002003200328020041046a3602000c030b200020032802004101102f200028020020032802006a20074102743a00002003200328020041016a3602000c020b200020032802004102102f200028020020032802006a20074102744101723b00002003200328020041026a3602000c010b200020032802004104102f200028020020032802006a20074102744102723600002003200328020041046a3602000b200541046a2000108e01200541086a2000108e012005410c6a2000108e01200541106a2000108e01200541146a2000108e01200541186a2000108e012005411c6a2000108e01024002400240200541206a2f0100220541c000490d00200541808001490d01200020032802004104102f200028020020032802006a20054102744102723600002003200328020041046a3602000c020b200020032802004101102f200028020020032802006a20054102743a00002003200328020041016a3602000c010b200020032802004102102f200028020020032802006a20054102744101723b00002003200328020041026a3602000b2009200641246a2206470d000b0b02400240200141e8006a28020022030d00410421184100211a410021050c010b20034104200341044b1bad42287e220d422088a722060d01200da722074100480d012001280260210520072006454102742007103222091b2119024020090d0020190d030c020b2005200341286c6a2106200341286c41586a41286e211b2009200720091b221821030340200541046a290200210d2005410c6a290200211c200541146a290200211d2005411c6a290200211e20032005280200360200200341246a200541246a2f01003b01002003411c6a201e370200200341146a201d3702002003410c6a201c370200200341046a200d370200200341286a2103200541286a22052006470d000b201b41016a2105201941286e211a0b20002005108f0102402005450d00200541286c210941002106200041086a210303400240024002400240201820066a2205280200220741c000490d00200741808001490d012007418080808004490d02200020032802004101102f200028020020032802006a41033a00002003200328020041016a220736020020052802002119200020074104102f200028020020032802006a20193600002003200328020041046a3602000c030b200020032802004101102f200028020020032802006a20074102743a00002003200328020041016a3602000c020b200020032802004102102f200028020020032802006a20074102744101723b00002003200328020041026a3602000c010b200020032802004104102f200028020020032802006a20074102744102723600002003200328020041046a3602000b200541046a2000108e01200541086a2000108e012005410c6a2000108e01200541106a2000108e01200541146a2000108e01200541186a2000108e012005411c6a2000108e01200541206a2000108e01024002400240200541246a2f0100220541c000490d00200541808001490d01200020032802004104102f200028020020032802006a20054102744102723600002003200328020041046a3602000c020b200020032802004101102f200028020020032802006a20054102743a00002003200328020041016a3602000c010b200020032802004102102f200028020020032802006a20054102744101723b00002003200328020041026a3602000b2009200641286a2206470d000b0b02400240200141f4006a28020022030d00410421194100211f410021050c010b20034104200341044b1bad422c7e220d422088a722070d01200da722064100480d01200128026c210520062007454102742006103222091b211b024020090d00201b0d030c020b20052003412c6c6a21072003412c6c41546a412c6e21202009200620091b221921030340200541046a290200210d2005410c6a290200211c200541146a290200211d2005411c6a290200211e200541246a280200210620032005280200360200200341286a200541286a2f01003b0100200341246a20063602002003411c6a201e370200200341146a201d3702002003410c6a201c370200200341046a200d3702002003412c6a21032005412c6a22052007470d000b202041016a2105201b412c6e211f0b20002005108f0102402005450d002005412c6c210941002106200041086a210303400240024002400240201920066a2205280200220741c000490d00200741808001490d012007418080808004490d02200020032802004101102f200028020020032802006a41033a00002003200328020041016a22073602002005280200211b200020074104102f200028020020032802006a201b3600002003200328020041046a3602000c030b200020032802004101102f200028020020032802006a20074102743a00002003200328020041016a3602000c020b200020032802004102102f200028020020032802006a20074102744101723b00002003200328020041026a3602000c010b200020032802004104102f200028020020032802006a20074102744102723600002003200328020041046a3602000b200541046a2000108e01200541086a2000108e012005410c6a2000108e01200541106a2000108e01200541146a2000108e01200541186a2000108e012005411c6a2000108e01200541206a2000108e01200541246a2000108e01024002400240200541286a2f0100220541c000490d00200541808001490d01200020032802004104102f200028020020032802006a20054102744102723600002003200328020041046a3602000c020b200020032802004101102f200028020020032802006a20054102743a00002003200328020041016a3602000c010b200020032802004102102f200028020020032802006a20054102744101723b00002003200328020041026a3602000b20092006412c6a2206470d000b0b0240024020014180016a28020022030d004104211b41002121410021050c010b20034104200341044b1bad42307e220d422088a722070d01200da722064100480d012001280278210520062007454102742006103222091b2120024020090d0020200d030c020b2005200341306c6a2107200341306c41506a41306e21222009200620091b221b21030340200541046a290200210d2005410c6a290200211c200541146a290200211d2005411c6a290200211e200541246a2902002123200528020021062003412c6a2005412c6a2f01003b0100200341246a20233702002003411c6a201e370200200341146a201d3702002003410c6a201c370200200341046a200d37020020032006360200200341306a2103200541306a22052007470d000b202241016a2105202041306e21210b20002005108f0102402005450d00200541306c210941002106200041086a210303400240024002400240201b20066a2205280200220741c000490d00200741808001490d012007418080808004490d02200020032802004101102f200028020020032802006a41033a00002003200328020041016a220736020020052802002120200020074104102f200028020020032802006a20203600002003200328020041046a3602000c030b200020032802004101102f200028020020032802006a20074102743a00002003200328020041016a3602000c020b200020032802004102102f200028020020032802006a20074102744101723b00002003200328020041026a3602000c010b200020032802004104102f200028020020032802006a20074102744102723600002003200328020041046a3602000b200541046a2000108e01200541086a2000108e012005410c6a2000108e01200541106a2000108e01200541146a2000108e01200541186a2000108e012005411c6a2000108e01200541206a2000108e01200541246a2000108e01200541286a2000108e010240024002402005412c6a2f0100220541c000490d00200541808001490d01200020032802004104102f200028020020032802006a20054102744102723600002003200328020041046a3602000c020b200020032802004101102f200028020020032802006a20054102743a00002003200328020041016a3602000c010b200020032802004102102f200028020020032802006a20054102744101723b00002003200328020041026a3602000b2009200641306a2206470d000b0b024002402001418c016a28020022030d004104212041002124410021050c010b20034104200341044b1bad42347e220d422088a722070d01200da722064100480d01200128028401210520062007454102742006103222071b2122024020070d0020220d030c020b2005200341346c6a2109200341346c414c6a41346e21252007200620071b222021030340200541046a290200210d2005410c6a290200211c200541146a290200211d2005411c6a290200211e200541246a29020021232005412c6a280200210620052802002107200341306a200541306a2f01003b01002003412c6a2006360200200341246a20233702002003411c6a201e370200200341146a201d3702002003410c6a201c370200200341046a200d37020020032007360200200341346a2103200541346a22052009470d000b202541016a2105202241346e21240b20002005108f0102402005450d00200541346c210941002106200041086a210303400240024002400240202020066a2205280200220741c000490d00200741808001490d012007418080808004490d02200020032802004101102f200028020020032802006a41033a00002003200328020041016a220736020020052802002122200020074104102f200028020020032802006a20223600002003200328020041046a3602000c030b200020032802004101102f200028020020032802006a20074102743a00002003200328020041016a3602000c020b200020032802004102102f200028020020032802006a20074102744101723b00002003200328020041026a3602000c010b200020032802004104102f200028020020032802006a20074102744102723600002003200328020041046a3602000b200541046a2000108e01200541086a2000108e012005410c6a2000108e01200541106a2000108e01200541146a2000108e01200541186a2000108e012005411c6a2000108e01200541206a2000108e01200541246a2000108e01200541286a2000108e012005412c6a2000108e01024002400240200541306a2f0100220541c000490d00200541808001490d01200020032802004104102f200028020020032802006a20054102744102723600002003200328020041046a3602000c020b200020032802004101102f200028020020032802006a20054102743a00002003200328020041016a3602000c010b200020032802004102102f200028020020032802006a20054102744101723b00002003200328020041026a3602000b2009200641346a2206470d000b0b0240024020014198016a28020022030d004104212241002126410021050c010b20034104200341044b1bad42387e220d422088a722070d01200da722064100480d01200128029001210520062007454102742006103222091b2125024020090d0020250d030c020b2005200341386c6a2107200341386c41486a41386e21272009200620091b222221030340200541046a290200210d2005410c6a290200211c200541146a290200211d2005411c6a290200211e200541246a29020021232005412c6a290200212820052802002106200341346a200541346a2f01003b01002003412c6a2028370200200341246a20233702002003411c6a201e370200200341146a201d3702002003410c6a201c370200200341046a200d37020020032006360200200341386a2103200541386a22052007470d000b202741016a2105202541386e21260b20002005108f0102402005450d00200541386c210941002106200041086a210303400240024002400240202220066a2205280200220741c000490d00200741808001490d012007418080808004490d02200020032802004101102f200028020020032802006a41033a00002003200328020041016a220736020020052802002125200020074104102f200028020020032802006a20253600002003200328020041046a3602000c030b200020032802004101102f200028020020032802006a20074102743a00002003200328020041016a3602000c020b200020032802004102102f200028020020032802006a20074102744101723b00002003200328020041026a3602000c010b200020032802004104102f200028020020032802006a20074102744102723600002003200328020041046a3602000b200541046a2000108e01200541086a2000108e012005410c6a2000108e01200541106a2000108e01200541146a2000108e01200541186a2000108e012005411c6a2000108e01200541206a2000108e01200541246a2000108e01200541286a2000108e012005412c6a2000108e01200541306a2000108e01024002400240200541346a2f0100220541c000490d00200541808001490d01200020032802004104102f200028020020032802006a20054102744102723600002003200328020041046a3602000c020b200020032802004101102f200028020020032802006a20054102743a00002003200328020041016a3602000c010b200020032802004102102f200028020020032802006a20054102744101723b00002003200328020041026a3602000b2009200641386a2206470d000b0b02400240200141a4016a28020022030d004104212541002129410021050c010b20034104200341044b1bad423c7e220d422088a722070d01200da722064100480d01200128029c01210520062007454102742006103222071b2127024020070d0020270d030c020b20052003413c6c6a21092003413c6c41446a413c6e212a2007200620071b222521030340200541046a290200210d2005410c6a290200211c200541146a290200211d2005411c6a290200211e200541246a29020021232005412c6a2902002128200541346a280200210620052802002107200341386a200541386a2f01003b0100200341346a20063602002003412c6a2028370200200341246a20233702002003411c6a201e370200200341146a201d3702002003410c6a201c370200200341046a200d370200200320073602002003413c6a21032005413c6a22052009470d000b202a41016a21052027413c6e21290b20002005108f0102402005450d002005413c6c210941002106200041086a210303400240024002400240202520066a2205280200220741c000490d00200741808001490d012007418080808004490d02200020032802004101102f200028020020032802006a41033a00002003200328020041016a220736020020052802002127200020074104102f200028020020032802006a20273600002003200328020041046a3602000c030b200020032802004101102f200028020020032802006a20074102743a00002003200328020041016a3602000c020b200020032802004102102f200028020020032802006a20074102744101723b00002003200328020041026a3602000c010b200020032802004104102f200028020020032802006a20074102744102723600002003200328020041046a3602000b200541046a2000108e01200541086a2000108e012005410c6a2000108e01200541106a2000108e01200541146a2000108e01200541186a2000108e012005411c6a2000108e01200541206a2000108e01200541246a2000108e01200541286a2000108e012005412c6a2000108e01200541306a2000108e01200541346a2000108e01024002400240200541386a2f0100220541c000490d00200541808001490d01200020032802004104102f200028020020032802006a20054102744102723600002003200328020041046a3602000c020b200020032802004101102f200028020020032802006a20054102743a00002003200328020041016a3602000c010b200020032802004102102f200028020020032802006a20054102744101723b00002003200328020041026a3602000b20092006413c6a2206470d000b0b02400240200141b0016a28020022030d00410421094100212b410021050c010b20034104200341044b1b220641ffffff1f7122072006470d01200641067422094100480d0120012802a8012105200920072006464102742009103222061b2127024020060d0020270d030c020b200520034106746a2107200341067441406a410676212a2006200920061b220921030340200541046a290200210d2005410c6a290200211c200541146a290200211d2005411c6a290200211e200541246a29020021232005412c6a2902002128200541346a290200212c200528020021062003413c6a2005413c6a2f01003b0100200341346a202c3702002003412c6a2028370200200341246a20233702002003411c6a201e370200200341146a201d3702002003410c6a201c370200200341046a200d37020020032006360200200341c0006a2103200541c0006a22052007470d000b202a41016a21052027410676212b0b20002005108f0102402005450d002005410674212741002106200041086a210303400240024002400240200920066a2205280200220741c000490d00200741808001490d012007418080808004490d02200020032802004101102f200028020020032802006a41033a00002003200328020041016a22073602002005280200212a200020074104102f200028020020032802006a202a3600002003200328020041046a3602000c030b200020032802004101102f200028020020032802006a20074102743a00002003200328020041016a3602000c020b200020032802004102102f200028020020032802006a20074102744101723b00002003200328020041026a3602000c010b200020032802004104102f200028020020032802006a20074102744102723600002003200328020041046a3602000b200541046a2000108e01200541086a2000108e012005410c6a2000108e01200541106a2000108e01200541146a2000108e01200541186a2000108e012005411c6a2000108e01200541206a2000108e01200541246a2000108e01200541286a2000108e012005412c6a2000108e01200541306a2000108e01200541346a2000108e01200541386a2000108e010240024002402005413c6a2f0100220541c000490d00200541808001490d01200020032802004104102f200028020020032802006a20054102744102723600002003200328020041046a3602000c020b200020032802004101102f200028020020032802006a20054102743a00002003200328020041016a3602000c010b200020032802004102102f200028020020032802006a20054102744101723b00002003200328020041026a3602000b2027200641c0006a2206470d000b0b02400240200141bc016a28020022030d00410421014100212d410021050c010b20034104200341044b1bad42c4007e220d422088a722070d01200da722064100480d0120012802b401210520062007454102742006103222071b212a024020070d00202a0d030c020b2005200341c4006c6a2127200341c4006c41bc7f6a41c4006e212d2007200620071b220121030340200541046a290200210d2005410c6a290200211c200541146a290200211d2005411c6a290200211e200541246a29020021232005412c6a2902002128200541346a290200212c2005413c6a280200210620052802002107200341c0006a200541c0006a2f01003b01002003413c6a2006360200200341346a202c3702002003412c6a2028370200200341246a20233702002003411c6a201e370200200341146a201d3702002003410c6a201c370200200341046a200d37020020032007360200200341c4006a2103200541c4006a22052027470d000b202d41016a2105202a41c4006e212d0b20002005108f0102402005450d00200541c4006c212741002106200041086a210303400240024002400240200120066a2205280200220741c000490d00200741808001490d012007418080808004490d02200020032802004101102f200028020020032802006a41033a00002003200328020041016a22073602002005280200212a200020074104102f200028020020032802006a202a3600002003200328020041046a3602000c030b200020032802004101102f200028020020032802006a20074102743a00002003200328020041016a3602000c020b200020032802004102102f200028020020032802006a20074102744101723b00002003200328020041026a3602000c010b200020032802004104102f200028020020032802006a20074102744102723600002003200328020041046a3602000b200541046a2000108e01200541086a2000108e012005410c6a2000108e01200541106a2000108e01200541146a2000108e01200541186a2000108e012005411c6a2000108e01200541206a2000108e01200541246a2000108e01200541286a2000108e012005412c6a2000108e01200541306a2000108e01200541346a2000108e01200541386a2000108e012005413c6a2000108e01024002400240200541c0006a2f0100220541c000490d00200541808001490d01200020032802004104102f200028020020032802006a20054102744102723600002003200328020041046a3602000c020b200020032802004101102f200028020020032802006a20054102743a00002003200328020041016a3602000c010b200020032802004102102f200028020020032802006a20054102744101723b00002003200328020041026a3602000b2027200641c4006a2206470d000b0b0240202d450d00202d41c4006c450d002001102c0b0240202b450d002009102c0b02402029450d002029413c6c450d002025102c0b02402026450d00202641386c450d002022102c0b02402024450d00202441346c450d002020102c0b02402021450d00202141306c450d00201b102c0b0240201f450d00201f412c6c450d002019102c0b0240201a450d00201a41286c450d002018102c0b02402017450d00201741246c450d002015102c0b02402016450d002008102c0b02402014450d002014411c6c450d002013102c0b02402012450d00201241186c450d00200a102c0b02402011450d00201141146c450d002010102c0b0240200f450d00200e102c0b0240200c450d00200c410c6c450d00200b102c0b02402002450d002004102c0b0f0b103b000b1039000bc5a90102127f017e02400240417f417f417f417f417f417f417f417f417f417f417f417f417f417f200141086a2802002202200141146a28020022036a220420042002491b2204200141206a28020022056a220620062004491b22042001412c6a28020022066a220720072004491b2204200141386a28020022086a220720072004491b2204200141c4006a28020022096a220720072004491b2204200141d0006a280200220a6a220720072004491b2204200141dc006a28020022076a220b200b2004491b2204200141e8006a280200220c6a220b200b2004491b2204200141f4006a280200220d6a220b200b2004491b220420014180016a280200220e6a220b200b2004491b22042001418c016a280200220f6a220b200b2004491b220420014198016a28020022106a220b200b2004491b2204200141a4016a28020022116a220b200b2004491b2204200141b0016a28020022126a220b200b2004491b220b200141bc016a2802002204720d00410021030c010b417f417f417f417f417f417f417f417f417f417f417f417f417f417f417f2002417f200320036a221320132003491b6a220320032002491b2203417f2005ad42037e2214a72014422088a71b6a220520052003491b2203417f2006410274200641ffffffff03712006471b6a220620062003491b2203417f2008ad42057e2214a72014422088a71b6a220620062003491b2203417f2009ad42067e2214a72014422088a71b6a220620062003491b2203417f200aad42077e2214a72014422088a71b6a220620062003491b2203417f2007410374200741ffffffff01712007471b6a220620062003491b2203417f200cad42097e2214a72014422088a71b6a220620062003491b2203417f200dad420a7e2214a72014422088a71b6a220620062003491b2203417f200ead420b7e2214a72014422088a71b6a220620062003491b2203417f200fad420c7e2214a72014422088a71b6a220620062003491b2203417f2010ad420d7e2214a72014422088a71b6a220620062003491b2203417f2011ad420e7e2214a72014422088a71b6a220620062003491b2203417f2012ad420f7e2214a72014422088a71b6a220620062003491b2203417f2004410474200441ffffffff00712004471b6a220620062003491b417f200b20046a22042004200b491b6e21030b02400240200320036a22042003490d002004417f4c0d000240024020040d004102210b0c010b20041032220b450d02200141086a28020021020b41002103200041003602082000200b3602002000200441017636020402402002450d002001280200220420024103746a21080340200441086a2105200441046a2f0100210741002104024002400240024020030e020201000b41002104034020042003410176220220046a2206200741ffff0371200b20064101746a2f0100491b2104200320026b220341014b0d000b0b200741ffff03712203200b20044101746a2f01002202460d012004200320024b6a21040b2000200420071091010b20052008460d01200028020821032000280200210b200521040c000b0b0240200141146a2802002204450d00200128020c22082004410c6c6a210903402000280200210620082f01042105410021040240024002400240200028020822030e020201000b4100210420032102034020042002410176220720046a220b200541ffff03712006200b4101746a2f0100491b2104200220076b220241014b0d000b0b200541ffff03712202200620044101746a2f01002207460d012004200220074b6a21040b20002004200510910120002802082103200028020021060b2008410c6a210520082f0108210b41002104024002400240024020030e020201000b41002104034020042003410176220220046a2207200b41ffff0371200620074101746a2f0100491b2104200320026b220341014b0d000b0b200b41ffff03712203200620044101746a2f01002202460d012004200320024b6a21040b20002004200b1091010b2005210820052009470d000b0b0240200141206a2802002204450d002001280218220820044104746a210903402000280200210320082f01042105410021020240024002400240200028020822040e020201000b4100210220042106034020022006410176220720026a220b200541ffff03712003200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200320024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082104200028020021030b20082f0108210541002102024002400240024020040e020201000b4100210220042106034020022006410176220720026a220b200541ffff03712003200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200320024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082104200028020021030b200841106a210520082f010c210b41002102024002400240024020040e020201000b41002102034020022004410176220620026a2207200b41ffff0371200320074101746a2f0100491b2102200420066b220441014b0d000b0b200b41ffff03712204200320024101746a2f01002203460d012002200420034b6a21020b20002002200b1091010b2005210820052009470d000b0b02402001412c6a2802002204450d0020012802242208200441146c6a210903402000280200210420082f01042105410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0108210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f010c210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b200841146a210520082f0110210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2005210820052009470d000b0b0240200141386a2802002204450d0020012802302208200441186c6a210903402000280200210420082f01042105410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0108210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f010c210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0110210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b200841186a210520082f0114210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2005210820052009470d000b0b0240200141c4006a2802002204450d00200128023c22082004411c6c6a210903402000280200210420082f01042105410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0108210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f010c210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0110210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0114210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b2008411c6a210520082f0118210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2005210820052009470d000b0b0240200141d0006a2802002204450d002001280248220820044105746a210903402000280200210420082f01042105410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0108210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f010c210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0110210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0114210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0118210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b200841206a210520082f011c210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2005210820052009470d000b0b0240200141dc006a2802002204450d0020012802542208200441246c6a210903402000280200210420082f01042105410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0108210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f010c210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0110210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0114210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f0118210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b20082f011c210541002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200541ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200541ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200510910120002802082103200028020021040b200841246a210520082f0120210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2005210820052009470d000b0b0240200141e8006a2802002204450d0020012802602205200441286c6a210903402000280200210420052f01042108410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0108210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f010c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0110210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0114210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0118210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f011c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0120210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b200541286a210820052f0124210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2008210520082009470d000b0b0240200141f4006a2802002204450d00200128026c22052004412c6c6a210903402000280200210420052f01042108410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0108210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f010c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0110210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0114210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0118210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f011c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0120210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0124210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b2005412c6a210820052f0128210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2008210520082009470d000b0b024020014180016a2802002204450d0020012802782205200441306c6a210903402000280200210420052f01042108410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0108210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f010c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0110210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0114210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0118210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f011c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0120210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0124210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0128210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b200541306a210820052f012c210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2008210520082009470d000b0b02402001418c016a2802002204450d002001280284012205200441346c6a210903402000280200210420052f01042108410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0108210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f010c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0110210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0114210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0118210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f011c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0120210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0124210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0128210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f012c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b200541346a210820052f0130210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2008210520082009470d000b0b024020014198016a2802002204450d002001280290012205200441386c6a210903402000280200210420052f01042108410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0108210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f010c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0110210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0114210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0118210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f011c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0120210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0124210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0128210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f012c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b20052f0130210841002102024002400240024020030e020201000b4100210220032106034020022006410176220720026a220b200841ffff03712004200b4101746a2f0100491b2102200620076b220641014b0d000b0b200841ffff03712206200420024101746a2f01002207460d012002200620074b6a21020b20002002200810910120002802082103200028020021040b200541386a210820052f0134210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2008210520082009470d000b0b0240200141a4016a2802002204450d00200128029c0122072004413c6c6a210903402000280200210420072f01042108410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0108210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f010c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0110210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0114210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0118210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f011c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0120210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0124210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0128210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f012c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0130210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0134210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b2007413c6a210520072f0138210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2005210720052009470d000b0b0240200141b0016a2802002204450d0020012802a801220720044106746a210903402000280200210420072f01042108410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0108210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f010c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0110210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0114210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0118210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f011c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0120210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0124210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0128210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f012c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0130210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0134210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0138210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b200741c0006a210520072f013c210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2005210720052009470d000b0b0240200141bc016a2802002204450d0020012802b4012207200441c4006c6a210103402000280200210420072f01042108410021020240024002400240200028020822030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0108210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f010c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0110210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0114210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0118210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f011c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0120210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0124210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0128210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f012c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0130210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0134210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f0138210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b20072f013c210841002102024002400240024020030e020201000b4100210220032106034020022006410176220b20026a2205200841ffff0371200420054101746a2f0100491b21022006200b6b220641014b0d000b0b200841ffff03712206200420024101746a2f0100220b460d0120022006200b4b6a21020b20002002200810910120002802082103200028020021040b200741c4006a210520072f0140210b41002102024002400240024020030e020201000b41002102034020022003410176220620026a2207200b41ffff0371200420074101746a2f0100491b2102200320066b220341014b0d000b0b200b41ffff03712203200420024101746a2f01002204460d012002200320044b6a21020b20002002200b1091010b2005210720052001470d000b0b0f0b103b000b1039000be70201027f4101210202402001280200220341c000490d0041022102200341808001490d00410441052003418080808004491b21020b0240200210322203450d002000200236020420002003360200200041086a220341003602000240024002402001280200220241c000490d00200241808001490d012002418080808004490d02200041004101102f2000280200200041086a220228020022036a41033a00002002200341016a220336020020012802002101200020034104102f2000280200200228020022006a20013600002002200041046a3602000f0b200041004101102f2000280200200328020022006a20024102743a00002003200041016a3602000f0b200041004102102f2000280200200041086a220028020022016a20024102744101723b00002000200141026a3602000f0b200041004104102f2000280200200041086a220028020022016a20024102744102723600002000200141046a3602000f0b1039000b1c00200128021841d8bdc800410f2001411c6a28020028020c1100000bb80201077f41002102024002400240200141016a2203200028020422044d0d000240200041146a22052802002201200041106a280200470d00200141016a22022001490d03200141017422062002200620024b1b22024104200241044b1b220241ffffffff037122072002470d03200241027422064100480d032007200246410274210702400240024002400240200028020c410020011b22020d002006450d010c030b200141027422080d0120060d020b200721020c020b200220082006103522020d010c040b200610322202450d030b2000200236020c200041106a20064102763602000b200028020c220241046a2002200141027410ca081a2002200320046b36020020002003360204410121022005200141016a3602002000200028020041016a3602000b20020f0b2007450d001039000b103b000bfe0101057f0240024020012802002202450d002001280204210303402002418c016a210420022f018a012105410021010240034020052001460d0141baaec0002004410810cc082206450d04200441086a2104200141016a21012006417f4a0d000b2001417f6a21050b2003450d012003417f6a2103200220054102746a41e4016a28020021020c000b0b200041003602042000410c6a4128360200200041086a41c2aec000360200200041013602000f0b0240200241046a2001410c6c6a22012802084108490d00200041086a2001280200290000370300200041003602000f0b20004201370300200041086a41eaaec000ad42808080809005843702000b9c0301037f02400240200241046a2203417f4c0d0002400240024002400240024020030d002000200336020420004101360200200041086a220341003602000c010b200310322204450d062000200336020420002004360200200041086a22034100360200200241c000490d01200241808001490d022002418080808004490d030b200041004101102f2000280200200041086a220528020022046a41033a00002005200441016a2204360200200020044104102f2000280200200528020022046a20023600002005200441046a22043602000c030b200041004101102f2000280200200041086a220528020022046a20024102743a00002005200441016a22043602000c020b200041004102102f2000280200200041086a220528020022046a20024102744101723b00002005200441026a22043602000c010b200041004104102f2000280200200041086a220528020022046a20024102744102723600002005200441046a22043602000b200020042002102f2000280200200328020022006a2001200210c9081a2003200020026a3602000f0b103b000b1039000b880501067f230041106b22022400200241003602082002420137030020012802002103200128020822042002107702402004450d0020032004410c6c6a2105034020032802002106200341086a280200220420021077200220022802082004102f2002280200200228020822076a2006200410c9081a2002200720046a3602082003410c6a22032005470d000b0b200128020c2103200141146a28020022042002107702402004450d00200320044104746a210520022802082104034020032802002106200220044104102f200228020020022802086a20063600002002200228020841046a360208200341046a28020021062003410c6a280200220420021077200220022802082004102f2002280200200228020822076a2006200410c9081a2002200720046a2204360208200341106a22032005470d000b0b20012802182103200220022802084101102f200228020020022802086a21040240024020030d00200441003a0000200228020841016a21030c010b200441013a00002002200228020841016a360208200141206a280200220420021077200220022802082004102f2002280200200228020822066a2003200410c9081a200620046a21030b20022003360208200128022421042001412c6a280200220320021077200220022802082003102f2002280200200228020822066a2004200310c9081a2002200620036a220336020820012802302104200220034104102f200228020020022802086a20043600002002200228020841046a220336020820012802342104200220034104102f200228020020022802086a20043600002002200228020841046a2203360208200020022802002003109a0102402002280204450d002002280200102c0b200241106a24000b4c0020002002ad4220862001ad8410112201290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002001102c0b940501047f230041a0036b22012400200141106a4200370300200141186a4200370300200141206a4200370300200141286a4200370300200120012903c801370308200142c0b2cd3b37039803200142c0b2cd3b37039003200142c0b2cd3b370388034100210241012103034020014188036a2104024002400240200241ff01710e03010002010b20014190036a21040c010b20014198036a21040b200442c0b2cd3b370300024020034103460d00200341bc9ec0006a2104200341016a210320042d000022024103470d010b0b200141d0026a4200370300200141c8026a200129038803370300200141c8016a41f8006a4200370300200141c8016a41f0006a4201370300200141c8016a41e8006a4200370300200141c8016a41e0006a420137030020014198026a420037030020014190026a20012903900337030020014188026a420037030020014180026a4201370300200141f8016a22034200370300200141f0016a22044201370300200141c8016a41186a420037030020012001290398033703d801200142003703d00120014280e497d0123703c801200141f8026a200141286a290300370300200141f0026a200141086a41186a290300370300200141e8026a200141186a290300370300200141e0026a200141106a290300370300200141d8026a20012903083703002004420137030020034280b0def7d32b3703002001410036028003200141086a200141c8016a41c00110c9081a200141086a41f8006a428090cad2c60e370300200141086a41f0006a4201370300200141086a41e8006a4280c0a8ca9a3a370300200141086a41e0006a4201370300200141c8016a200141086a41b80110c9081a200142818080808088debe01370380032000200141c8016a108301200141a0036a24000b0e002000280200350200200110490bd903020a7f017e230041306b22032400024002402002450d002000200028020c220441016a20027036020c200341086a41206a2205200141206a290200370300200341086a41186a2206200141186a290200370300200341086a41106a2207200141106a290200370300200341086a41086a2208200141086a29020037030020032001290200370308024020002802082201200041046a280200470d00024002400240200141016a22092001490d004101210a4100210b02402001410174220c2009200c20094b1b22094104200941044b1bad422c7e220d422088a70d00200da721024100210a4104210b0b200a0d0020024100480d002000280200410020011b22090d012002450d0220021032220b0d02200a450d050b103b000b02402001412c6c22010d002002450d0120021032220b0d010c040b2009200120021035220b450d030b2000200b360200200041046a2002412c6e360200200028020821010b20002802002001412c6c6a2201200329030837020020012004360228200141206a2005290300370200200141186a2006290300370200200141106a2007290300370200200141086a20082903003702002000200028020841016a360208200341306a24000f0b41b0afc000413941ecafc000103c000b1039000bbf2603047f077e247f230041b0026b220224000240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a3602042001200441016a36020020050e050102030406050b200042053703000c090b200042003703000c080b200241e0016a2001109f01024020022d00e0014109460d00200241a8016a41306a200241e0016a41306a2903002206370300200241a8016a41286a200241e0016a41286a2903002207370300200241a8016a41206a200241e0016a41206a2903002208370300200241a8016a41186a200241e0016a41186a2903002209370300200241a8016a41106a200241e0016a41106a290300220a370300200241a8016a41086a200241e0016a41086a290300220b370300200220022903e001220c3703a801200042013703002000200c370308200041106a200b370300200041186a200a370300200041206a2009370300200041286a2008370300200041306a2007370300200041386a2006370300200041c0006a200241a80110c9081a0c080b200042053703000c070b200241e0016a2001109f0120022d00e00122034109460d03200241ac026a41026a220d20022d00e3013a0000200220022f00e1013b01ac02200241e0016a41086a220e2802002104200241e0016a410c6a280200210f200241e0016a41106a22102903002106200241e0016a41186a22112802002112200241fc016a2802002113200241e0016a41206a22142802002115200241e0016a41246a2802002116200241e0016a41286a22172802002118200241e0016a412c6a2802002119200241e0016a41306a221a290300210720022802e4012105200241e0016a2001109f01024020022d00e0014109460d00200241a8016a41306a2201201a290300370300200241a8016a41286a221a2017290300370300200241a8016a41206a22172014290300370300200241a8016a41186a22142011290300370300200241a8016a41106a22112010290300370300200241a8016a41086a2210200e290300370300200241a8026a41026a220e200d2d00003a0000200220022903e0013703a801200220022f01ac023b01a802200020033a000820004202370300200041386a2007370300200041346a2019360200200041306a20183602002000412c6a2016360200200041286a2015360200200041246a2013360200200041206a2012360200200041186a2006370300200041146a200f360200200041106a20043602002000410c6a2005360200200020022f01a8023b00092000410b6a200e2d00003a0000200041c0006a20022903a801370300200041c8006a2010290300370300200041d0006a2011290300370300200041d8006a2014290300370300200041e0006a2017290300370300200041e8006a201a290300370300200041f0006a2001290300370300200041f8006a200241f00010c9081a0c070b2000420537030002400240024002402003417e6a0e060001020a0a030a0b20164101470d092018410020191b2201450d092019450d092001102c0c090b20054101470d0820044100200f1b2201450d08200f450d082001102c0c080b20124101470d072013410020151b2201450d072015450d072001102c0c070b2005410020041b2201450d062004450d062001102c0c060b20022001109f0120022d000022034109460d03200241a8026a41026a20022d00033a0000200220022f00013b01a802200241086a221228020021042002410c6a2216280200211a200241106a220f2903002106200241186a221528020021142002411c6a2219280200211b200241206a2213280200211c200241246a22182802002117200241286a220d280200211d2002412c6a220e280200211e200241306a221029030021072002280204210520022001109f010240024020022d000022114109460d00200241ac026a41026a20022d00033a0000200220022f00013b01ac02201228020021122016280200211f200f29030021082015280200210f201928020021202013280200211920182802002115200d2802002118200e2802002113201029030021092002280204211620022001109f0120022d00004109460d01200241e0016a41306a2201200241306a290300370300200241e0016a41286a220d200241286a290300370300200241e0016a41206a220e200241206a290300370300200241e0016a41186a2210200241186a290300370300200241e0016a41106a2221200241106a290300370300200241e0016a41086a2222200241086a290300370300200241a4026a41026a2223200241a8026a41026a2d00003a0000200220022903003703e001200220022f01a8023b01a402200241a0026a41026a2224200241ac026a41026a2d00003a0000200220022f01ac023b01a002200020033a000820004203370300200041c0006a20113a0000200041386a2007370300200041346a201e360200200041306a201d3602002000412c6a2017360200200041286a201c360200200041246a201b360200200041206a2014360200200041186a2006370300200041146a201a360200200041106a20043602002000410c6a2005360200200020022f01a4023b00092000410b6a20232d00003a0000200020022f01a0023b0041200041c3006a20242d00003a0000200041f0006a2009370300200041ec006a2013360200200041e8006a2018360200200041e4006a2015360200200041e0006a2019360200200041dc006a2020360200200041d8006a200f360200200041d0006a2008370300200041cc006a201f360200200041c8006a2012360200200041c4006a2016360200200041a8016a2001290300370300200041a0016a200d29030037030020004198016a200e29030037030020004190016a201029030037030020004188016a202129030037030020004180016a2022290300370300200041f8006a20022903e001370300200041e0016a200241a8016a41306a290300370300200041d8016a200241a8016a41286a290300370300200041d0016a200241a8016a41206a290300370300200041c8016a200241a8016a41186a290300370300200041c0016a200241a8016a41106a290300370300200041b8016a200241a8016a41086a290300370300200041b0016a20022903a8013703000c070b2000420537030002400240024002402003417e6a0e060001020a0a030a0b20174101470d09201d4100201e1b2201450d09201e450d092001102c0c090b20054101470d0820044100201a1b2201450d08201a450d082001102c0c080b20144101470d07201b4100201c1b2201450d07201c450d072001102c0c070b2005410020041b2201450d062004450d062001102c0c060b20004205370300024002400240024002402011417e6a0e06000102040403040b20154101470d032018410020131b2201450d032013450d032001102c0c030b20164101470d0220124100201f1b2201450d02201f450d022001102c0c020b200f4101470d012020410020191b2201450d012019450d012001102c0c010b2016410020121b2201450d002012450d002001102c0b02400240024002402003417e6a0e06000102090903090b20174101470d08201d4100201e1b2201450d08201e450d082001102c0c080b20054101470d0720044100201a1b2201450d07201a450d072001102c0c070b20144101470d06201b4100201c1b2201450d06201c450d062001102c0c060b2005410020041b2201450d052004450d052001102c0c050b200042053703000c040b20022001109f0120022d000022034109460d02200241a8026a41026a20022d00033a0000200220022f00013b01a802200241086a221228020021042002410c6a2216280200211a200241106a220f2903002106200241186a221528020021142002411c6a2219280200211b200241206a2213280200211c200241246a22182802002117200241286a220d280200211d2002412c6a220e280200211e200241306a221029030021072002280204210520022001109f0102400240024020022d000022114109460d00200241ac026a41026a20022d00033a0000200220022f00013b01ac02201228020021122016280200211f200f290300210820152802002115201928020021202013280200211320182802002119200d280200210d200e2802002118201029030021092002280204211620022001109f0120022d0000220f4109460d01200241a8016a41026a222520022d00033a0000200220022f00013b01a801200241086a2226280200210e2002410c6a2802002123200241106a2227290300210a200241186a222828020021212002411c6a2802002129200241206a222a2802002124200241246a2802002122200241286a222b280200212c2002412c6a280200212d200241306a222e290300210b2002280204211020022001109f0120022d00004109460d02200241e0016a41306a2201202e290300370300200241e0016a41286a222e202b290300370300200241e0016a41206a222b202a290300370300200241e0016a41186a222a2028290300370300200241e0016a41106a22282027290300370300200241e0016a41086a22272026290300370300200241a4026a41026a2226200241a8026a41026a2d00003a0000200220022903003703e001200220022f01a8023b01a402200241a0026a41026a222f200241ac026a41026a2d00003a0000200220022f01ac023b01a0022002419c026a41026a223020252d00003a0000200220022f01a8013b019c02200020033a000820004204370300200041c0006a20113a0000200041386a2007370300200041346a201e360200200041306a201d3602002000412c6a2017360200200041286a201c360200200041246a201b360200200041206a2014360200200041186a2006370300200041146a201a360200200041106a20043602002000410c6a2005360200200020022f01a4023b00092000410b6a20262d00003a0000200020022f01a0023b0041200041c3006a202f2d00003a0000200041f8006a200f3a0000200041f0006a2009370300200041ec006a2018360200200041e8006a200d360200200041e4006a2019360200200041e0006a2013360200200041dc006a2020360200200041d8006a2015360200200041d0006a2008370300200041cc006a201f360200200041c8006a2012360200200041c4006a2016360200200041fb006a20302d00003a0000200020022f019c023b0079200041a8016a200b370300200041a4016a202d360200200041a0016a202c3602002000419c016a202236020020004198016a202436020020004194016a202936020020004190016a202136020020004188016a200a37030020004184016a202336020020004180016a200e360200200041fc006a2010360200200041e0016a2001290300370300200041d8016a202e290300370300200041d0016a202b290300370300200041c8016a202a290300370300200041c0016a2028290300370300200041b8016a2027290300370300200041b0016a20022903e0013703000c060b2000420537030002400240024002402003417e6a0e06000102090903090b20174101470d08201d4100201e1b2201450d08201e450d082001102c0c080b20054101470d0720044100201a1b2201450d07201a450d072001102c0c070b20144101470d06201b4100201c1b2201450d06201c450d062001102c0c060b2005410020041b2201450d052004450d052001102c0c050b20004205370300024002400240024002402011417e6a0e06000102040403040b20194101470d03200d410020181b2201450d032018450d032001102c0c030b20164101470d0220124100201f1b2201450d02201f450d022001102c0c020b20154101470d012020410020131b2201450d012013450d012001102c0c010b2016410020121b2201450d002012450d002001102c0b02400240024002402003417e6a0e06000102080803080b20174101470d07201d4100201e1b2201450d07201e450d072001102c0c070b20054101470d0620044100201a1b2201450d06201a450d062001102c0c060b20144101470d05201b4100201c1b2201450d05201c450d052001102c0c050b2005410020041b2201450d042004450d042001102c0c040b2000420537030002400240024002400240200f417e6a0e06000102040403040b20224101470d03202c4100202d1b2201450d03202d450d032001102c0c030b20104101470d02200e410020231b2201450d022023450d022001102c0c020b20214101470d012029410020241b2201450d012024450d012001102c0c010b20104100200e1b2201450d00200e450d002001102c0b024002400240024002402011417e6a0e06000102040403040b20194101470d03200d410020181b2201450d032018450d032001102c0c030b20164101470d0220124100201f1b2201450d02201f450d022001102c0c020b20154101470d012020410020131b2201450d012013450d012001102c0c010b2016410020121b2201450d002012450d002001102c0b02400240024002402003417e6a0e06000102070703070b20174101470d06201d4100201e1b2201450d06201e450d062001102c0c060b20054101470d0520044100201a1b2201450d05201a450d052001102c0c050b20144101470d04201b4100201c1b2201450d04201c450d042001102c0c040b2005410020041b2201450d032004450d032001102c0c030b200042053703000c020b200042053703000c010b200042053703000b200241b0026a24000bc11a03097f047e017f230041a0026b2202240002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a36020020050e090102030405060708090a0b200041093a00000c0d0b200041003a00000c0c0b20022001108702024020022802000d0020022802042101200041013a0000200020022f00b0013b0001200041046a2001360200200041086a2002290378370300200041036a200241b2016a2d00003a0000200041106a200241f8006a41086a290300370300200041186a200241f8006a41106a290300370300200041206a200241f8006a41186a290300370300200041286a200241f8006a41206a290300370300200041306a200241f8006a41286a2903003703000c0c0b200041093a00000c0b0b02402006450d0020042d0001210520012003417e6a22033602042001200441026a360200410021044100210741002108024002400240024020050e0403000102040b200241f8006a2001108a0220022802782209450d0320024180016a280200210a200228027c21062001280204210341012107410121080c020b41002107410221080c010b41032108410021070b200241003a0098012003417f6a21030240024003402003417f460d01200241f8006a20046a200128020022052d00003a0000200120033602042001200541016a3602002002200441016a22053a0098012003417f6a21032005210420054120470d000b200241b0016a41086a2201200241f8006a41086a290300370300200241b0016a41106a2203200241f8006a41106a290300370300200241b0016a41186a2204200241f8006a41186a290300370300200220022903783703b001200541ff0171411f4d0d01200241306a41086a2001290300220b370300200241306a41106a2003290300220c370300200241306a41186a2004290300220d370300200220022903b001220e370330200041023a00002000200e370001200041096a200b370000200041116a200c370000200041196a200d370000200041306a200a3600002000412c6a2006360000200041286a2009360000200041246a2008360000200041216a20022f00753b0000200041236a200241f5006a41026a2d00003a00000c0d0b200441ff0171450d00200241003a0098010b200041093a00002007450d0b2009410020061b2201450d0b2006450d0b2001102c0c0b0b200041093a00000c0a0b024002402006450d0020042d0001210620012003417e6a3602042001200441026a3602004100210541002109024002400240024020060e0403000102040b200241b0016a2001108a0220022802b0012204450d03200241b8016a280200210720022802b401210341012105410121090c020b41002105410221090c010b41032109410021050b200241086a200110c1042002290308a70d012002290310210b200041033a0000200020022f00503b0001200041186a200b370300200041106a20073600002000410c6a2003360000200041086a2004360000200041046a2009360000200041206a2002290378370300200041036a200241d2006a2d00003a0000200041286a200241f8006a41086a290300370300200041306a200241f8006a41106a2903003703000c0b0b200041093a00000c0a0b200041093a00002005450d092004410020031b2201450d092003450d092001102c0c090b02402006450d0020042d0001210720012003417e6a22033602042001200441026a360200410021044100210a024002400240024020070e0403000102040b200241f8006a2001108a0220022802782206450d0320024180016a2802002109200228027c210520012802042103410121044101210a0c020b410021044102210a0c010b4103210a410021040b200241003a008c012003450d08200128020022072d0000210820012003417f6a220f360204200241013a008c012001200741016a360200200220083a0078200f0d060c070b200041093a00000c080b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200020053a0001200041053a0000200041026a20022901783701002000410a6a20024180016a290100370100200041126a20024188016a2901003701002000411a6a20024190016a290100370100200041226a20024198016a2901003701002000412a6a200241a0016a290100370100200041306a200241a6016a2901003701000c080b200041093a00000c070b200241186a200110f70302402002290318a70d00200241186a41106a290300210b2002290320210c200041063a0000200020022800b001360001200041086a200c370300200041186a2002290378370300200041106a200b370300200041046a200241b3016a280000360000200041206a200241f8006a41086a290300370300200041286a200241f8006a41106a290300370300200041306a200241f8006a41186a2903003703000c070b200041093a00000c060b200241d0006a2001108a0202402002280250450d00200241bb016a200241d0006a41086a280200360000200220022903503700b301200041073a0000200020022900b001370001200041086a200241b0016a41076a290000370000200041106a2002290378370300200041186a200241f8006a41086a290300370300200041206a200241f8006a41106a290300370300200041286a200241f8006a41186a290300370300200041306a200241f8006a41206a2903003703000c060b200041093a00000c050b200041083a00000c040b200041093a00000c030b200128020022072d0000210820012003417e6a220f3602042001200741016a360200200241023a008c01200220083a0079200f450d00200128020022072d0000210820012003417d6a220f3602042001200741016a360200200241033a008c01200220083a007a200f450d00200128020022072d0000210820012003417c6a220f3602042001200741016a360200200241043a008c01200220083a007b200f450d00200128020022072d0000210820012003417b6a220f3602042001200741016a360200200241053a008c01200220083a007c200f450d00200128020022072d0000210820012003417a6a220f3602042001200741016a360200200241063a008c01200220083a007d200f450d00200128020022072d000021082001200341796a220f3602042001200741016a360200200241073a008c01200220083a007e200f450d00200128020022072d000021082001200341786a220f3602042001200741016a360200200241083a008c01200220083a007f200f450d00200128020022072d000021082001200341776a220f3602042001200741016a360200200241093a008c01200220083a008001200f450d00200128020022072d000021082001200341766a220f3602042001200741016a3602002002410a3a008c01200220083a008101200f450d00200128020022072d000021082001200341756a220f3602042001200741016a3602002002410b3a008c01200220083a008201200f450d00200128020022072d000021082001200341746a220f3602042001200741016a3602002002410c3a008c01200220083a008301200f450d00200128020022072d000021082001200341736a220f3602042001200741016a3602002002410d3a008c01200220083a008401200f450d00200128020022072d000021082001200341726a220f3602042001200741016a3602002002410e3a008c01200220083a008501200f450d00200128020022072d000021082001200341716a220f3602042001200741016a3602002002410f3a008c01200220083a008601200f450d00200128020022072d000021082001200341706a220f3602042001200741016a360200200241103a008c01200220083a008701200f450d00200128020022072d0000210820012003416f6a220f3602042001200741016a360200200241113a008c01200220083a008801200f450d00200128020022072d0000210820012003416e6a220f3602042001200741016a360200200241123a008c01200220083a008901200f450d00200128020022072d0000210820012003416d6a220f3602042001200741016a360200200241133a008c01200220083a008a01200f450d00200128020022042d0000210720012003416c6a3602042001200441016a360200200241b0016a41086a2201200241f8006a41086a290300370300200220073a008b01200241b0016a41106a2203200241f8006a41106a280200360200200241143a008c01200220022903783703b001200241d0006a41106a22042003280200360200200241d0006a41086a22032001290300370300200220022903b001370350200041043a000020002002290350370001200041096a2003290300370000200041116a2004280200360000200041246a2009360000200041206a20053600002000411c6a2006360000200041186a200a360000200041156a20022f00753b0000200041176a200241f7006a2d00003a0000200041286a2002290330370300200041306a200241306a41086a2903003703000c020b200241003a008c010b200041093a00002004450d002006410020051b2201450d002005450d002001102c0b200241a0026a24000bc42603057f077e237f230041b0026b2202240002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020020060e050102030406050b200042053703000c090b200042003703000c080b200241e0016a200110a101024020022d00e0014109460d00200241a8016a41306a200241e0016a41306a2903002207370300200241a8016a41286a200241e0016a41286a2903002208370300200241a8016a41206a200241e0016a41206a2903002209370300200241a8016a41186a200241e0016a41186a290300220a370300200241a8016a41106a200241e0016a41106a290300220b370300200241a8016a41086a200241e0016a41086a290300220c370300200220022903e001220d3703a801200042013703002000200d370308200041106a200c370300200041186a200b370300200041206a200a370300200041286a2009370300200041306a2008370300200041386a2007370300200041c0006a200241a80110c9081a0c080b200042053703000c070b200241e0016a200110a10120022d00e00122034109460d03200241ac026a41026a220e20022d00e3013a0000200220022f00e1013b01ac02200241e0016a41086a220f2802002104200241e0016a410c6a2802002110200241e0016a41106a22112903002107200241e0016a41186a22122802002106200241fc016a2802002113200241e0016a41206a22142802002115200241e0016a41246a2802002116200241e0016a41286a22172802002118200241e0016a412c6a2802002119200241e0016a41306a221a290300210820022802e4012105200241e0016a200110a101024020022d00e0014109460d00200241a8016a41306a2201201a290300370300200241a8016a41286a221a2017290300370300200241a8016a41206a22172014290300370300200241a8016a41186a22142012290300370300200241a8016a41106a22122011290300370300200241a8016a41086a2211200f290300370300200241a8026a41026a220f200e2d00003a0000200220022903e0013703a801200220022f01ac023b01a802200020033a000820004202370300200041386a2008370300200041346a2019360200200041306a20183602002000412c6a2016360200200041286a2015360200200041246a2013360200200041206a2006360200200041186a2007370300200041146a2010360200200041106a20043602002000410c6a2005360200200020022f01a8023b00092000410b6a200f2d00003a0000200041c0006a20022903a801370300200041c8006a2011290300370300200041d0006a2012290300370300200041d8006a2014290300370300200041e0006a2017290300370300200041e8006a201a290300370300200041f0006a2001290300370300200041f8006a200241f00010c9081a0c070b2000420537030002400240024002402003417e6a0e060001020a0a030a0b20164101470d092018410020191b2200450d092019450d092000102c0c090b20054101470d082004410020101b2200450d082010450d082000102c0c080b20064101470d072013410020151b2200450d072015450d072000102c0c070b2005410020041b2200450d062004450d062000102c0c060b2002200110a10120022d000022034109460d03200241a8026a41026a20022d00033a0000200220022f00013b01a802200241086a220628020021042002410c6a2216280200211a200241106a22102903002107200241186a221528020021142002411c6a2219280200211b200241206a2213280200211c200241246a22182802002117200241286a220e280200211d2002412c6a220f280200211e200241306a22112903002108200228020421052002200110a1010240024020022d000022124109460d00200241ac026a41026a20022d00033a0000200220022f00013b01ac02200628020021062016280200211f2010290300210920152802002110201928020021202013280200211920182802002115200e2802002118200f28020021132011290300210a200228020421162002200110a10120022d00004109460d01200241e0016a41306a2201200241306a290300370300200241e0016a41286a220e200241286a290300370300200241e0016a41206a220f200241206a290300370300200241e0016a41186a2211200241186a290300370300200241e0016a41106a2221200241106a290300370300200241e0016a41086a2222200241086a290300370300200241a4026a41026a2223200241a8026a41026a2d00003a0000200220022903003703e001200220022f01a8023b01a402200241a0026a41026a2224200241ac026a41026a2d00003a0000200220022f01ac023b01a002200020033a000820004203370300200041c0006a20123a0000200041386a2008370300200041346a201e360200200041306a201d3602002000412c6a2017360200200041286a201c360200200041246a201b360200200041206a2014360200200041186a2007370300200041146a201a360200200041106a20043602002000410c6a2005360200200020022f01a4023b00092000410b6a20232d00003a0000200020022f01a0023b0041200041c3006a20242d00003a0000200041f0006a200a370300200041ec006a2013360200200041e8006a2018360200200041e4006a2015360200200041e0006a2019360200200041dc006a2020360200200041d8006a2010360200200041d0006a2009370300200041cc006a201f360200200041c8006a2006360200200041c4006a2016360200200041a8016a2001290300370300200041a0016a200e29030037030020004198016a200f29030037030020004190016a201129030037030020004188016a202129030037030020004180016a2022290300370300200041f8006a20022903e001370300200041e0016a200241a8016a41306a290300370300200041d8016a200241a8016a41286a290300370300200041d0016a200241a8016a41206a290300370300200041c8016a200241a8016a41186a290300370300200041c0016a200241a8016a41106a290300370300200041b8016a200241a8016a41086a290300370300200041b0016a20022903a8013703000c070b2000420537030002400240024002402003417e6a0e060001020a0a030a0b20174101470d09201d4100201e1b2200450d09201e450d092000102c0c090b20054101470d0820044100201a1b2200450d08201a450d082000102c0c080b20144101470d07201b4100201c1b2200450d07201c450d072000102c0c070b2005410020041b2200450d062004450d062000102c0c060b20004205370300024002400240024002402012417e6a0e06000102040403040b20154101470d032018410020131b2200450d032013450d032000102c0c030b20164101470d0220064100201f1b2200450d02201f450d022000102c0c020b20104101470d012020410020191b2200450d012019450d012000102c0c010b2016410020061b2200450d002006450d002000102c0b02400240024002402003417e6a0e06000102090903090b20174101470d08201d4100201e1b2200450d08201e450d082000102c0c080b20054101470d0720044100201a1b2200450d07201a450d072000102c0c070b20144101470d06201b4100201c1b2200450d06201c450d062000102c0c060b2005410020041b2200450d052004450d052000102c0c050b200042053703000c040b2002200110a10120022d000022034109460d02200241a8026a41026a20022d00033a0000200220022f00013b01a802200241086a220628020021042002410c6a2216280200211a200241106a22102903002107200241186a221528020021142002411c6a2219280200211b200241206a2213280200211c200241246a22182802002117200241286a220e280200211d2002412c6a220f280200211e200241306a22112903002108200228020421052002200110a10102400240024020022d000022124109460d00200241ac026a41026a20022d00033a0000200220022f00013b01ac02200628020021062016280200211f2010290300210920152802002115201928020021202013280200211320182802002119200e280200210e200f28020021182011290300210a200228020421162002200110a10120022d000022104109460d01200241a8016a41026a222520022d00033a0000200220022f00013b01a801200241086a2226280200210f2002410c6a2802002123200241106a2227290300210b200241186a222828020021212002411c6a2802002129200241206a222a2802002124200241246a2802002122200241286a222b280200212c2002412c6a280200212d200241306a222e290300210c200228020421112002200110a10120022d00004109460d02200241e0016a41306a2201202e290300370300200241e0016a41286a222e202b290300370300200241e0016a41206a222b202a290300370300200241e0016a41186a222a2028290300370300200241e0016a41106a22282027290300370300200241e0016a41086a22272026290300370300200241a4026a41026a2226200241a8026a41026a2d00003a0000200220022903003703e001200220022f01a8023b01a402200241a0026a41026a222f200241ac026a41026a2d00003a0000200220022f01ac023b01a0022002419c026a41026a223020252d00003a0000200220022f01a8013b019c02200020033a000820004204370300200041c0006a20123a0000200041386a2008370300200041346a201e360200200041306a201d3602002000412c6a2017360200200041286a201c360200200041246a201b360200200041206a2014360200200041186a2007370300200041146a201a360200200041106a20043602002000410c6a2005360200200020022f01a4023b00092000410b6a20262d00003a0000200020022f01a0023b0041200041c3006a202f2d00003a0000200041f8006a20103a0000200041f0006a200a370300200041ec006a2018360200200041e8006a200e360200200041e4006a2019360200200041e0006a2013360200200041dc006a2020360200200041d8006a2015360200200041d0006a2009370300200041cc006a201f360200200041c8006a2006360200200041c4006a2016360200200041fb006a20302d00003a0000200020022f019c023b0079200041a8016a200c370300200041a4016a202d360200200041a0016a202c3602002000419c016a202236020020004198016a202436020020004194016a202936020020004190016a202136020020004188016a200b37030020004184016a202336020020004180016a200f360200200041fc006a2011360200200041e0016a2001290300370300200041d8016a202e290300370300200041d0016a202b290300370300200041c8016a202a290300370300200041c0016a2028290300370300200041b8016a2027290300370300200041b0016a20022903e0013703000c060b2000420537030002400240024002402003417e6a0e06000102090903090b20174101470d08201d4100201e1b2200450d08201e450d082000102c0c080b20054101470d0720044100201a1b2200450d07201a450d072000102c0c070b20144101470d06201b4100201c1b2200450d06201c450d062000102c0c060b2005410020041b2200450d052004450d052000102c0c050b20004205370300024002400240024002402012417e6a0e06000102040403040b20194101470d03200e410020181b2200450d032018450d032000102c0c030b20164101470d0220064100201f1b2200450d02201f450d022000102c0c020b20154101470d012020410020131b2200450d012013450d012000102c0c010b2016410020061b2200450d002006450d002000102c0b02400240024002402003417e6a0e06000102080803080b20174101470d07201d4100201e1b2200450d07201e450d072000102c0c070b20054101470d0620044100201a1b2200450d06201a450d062000102c0c060b20144101470d05201b4100201c1b2200450d05201c450d052000102c0c050b2005410020041b2200450d042004450d042000102c0c040b20004205370300024002400240024002402010417e6a0e06000102040403040b20224101470d03202c4100202d1b2200450d03202d450d032000102c0c030b20114101470d02200f410020231b2200450d022023450d022000102c0c020b20214101470d012029410020241b2200450d012024450d012000102c0c010b20114100200f1b2200450d00200f450d002000102c0b024002400240024002402012417e6a0e06000102040403040b20194101470d03200e410020181b2200450d032018450d032000102c0c030b20164101470d0220064100201f1b2200450d02201f450d022000102c0c020b20154101470d012020410020131b2200450d012013450d012000102c0c010b2016410020061b2200450d002006450d002000102c0b02400240024002402003417e6a0e06000102070703070b20174101470d06201d4100201e1b2200450d06201e450d062000102c0c060b20054101470d0520044100201a1b2200450d05201a450d052000102c0c050b20144101470d04201b4100201c1b2200450d04201c450d042000102c0c040b2005410020041b2200450d032004450d032000102c0c030b200042053703000c020b200042053703000c010b200042053703000b200241b0026a24000b8c12020a7f027e230041b0026b22022400024002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020020060e090102030405060708090a0b200041093a00000c0a0b200041003a00000c090b2002200110b003024020022802000d0020022802042101200041013a0000200020022f00503b0001200041046a2001360200200041086a200229038801370300200041036a200241d2006a2d00003a0000200041106a20024188016a41086a290300370300200041186a20024188016a41106a290300370300200041206a20024188016a41186a290300370300200041286a20024188016a41206a290300370300200041306a20024188016a41286a2903003703000c090b200041093a00000c080b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602004100210341002107410021080240024002400240024020060e0404000102050b20024188016a200110c6042002280288012209450d0420024190016a280200210a200228028c01210b41012107410121080c030b410221080c010b410321080b410021070b200241003a00a80102400340200128020022042802042205450d0120024188016a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00a80120034120470d000b200241d0006a41186a20024188016a41186a290300220c370300200241306a41086a220120024188016a41086a290300370300200241306a41106a220320024188016a41106a290300370300200241306a41186a2204200c3703002002200229038801370330200041023a000020002002290330370001200041096a2001290300370000200041116a2003290300370000200041196a2004290300370000200041306a200a3600002000412c6a200b360000200041286a2009360000200041246a2008360000200041216a20022f00703b0000200041236a200241f0006a41026a2d00003a00000c090b0240200341ff0171450d00200241003a00a8010b200041093a00002007450d0820094100200b1b2201450d08200b450d082001102c0c080b200041093a00000c070b02400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020041002105410021090240024002400240024020060e0404000102050b200241d0006a200110c60420022802502204450d04200241d8006a280200210b2002280254210341012105410121090c030b410221090c010b410321090b410021050b200241086a200110c5042002290308a70d012002290310210c200041033a0000200020022f00303b0001200041186a200c370300200041106a200b3600002000410c6a2003360000200041086a2004360000200041046a2009360000200041206a200229038801370300200041036a200241326a2d00003a0000200041286a20024188016a41086a290300370300200041306a20024188016a41106a2903003703000c080b200041093a00000c070b200041093a00002005450d062004410020031b2201450d062003450d062001102c0c060b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602004100210341002107410021080240024002400240024020060e0404000102050b20024188016a200110c6042002280288012209450d0420024190016a280200210a200228028c01210b41012107410121080c030b410221080c010b410321080b410021070b200241003a009c0102400340200128020022042802042205450d0120024188016a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a009c0120034114470d000b200241306a41086a20024188016a41086a290300220c370300200241306a41106a20024188016a41106a28020022013602002002200229038801220d370330200041043a00002000200d370001200041096a200c370000200041116a2001360000200041246a200a360000200041206a200b3600002000411c6a2009360000200041186a2008360000200041156a20022f0085013b0000200041176a20024187016a2d00003a0000200041286a2002290370370300200041306a200241f0006a41086a2903003703000c070b0240200341ff0171450d00200241003a009c010b200041093a00002007450d0620094100200b1b2201450d06200b450d062001102c0c060b200041093a00000c050b0240200128020022012802042203450d00200128020022042d0000210520012003417f6a3602042001200441016a360200200020053a0001200041053a0000200041026a2002290188013701002000410a6a20024190016a290100370100200041126a20024198016a2901003701002000411a6a200241a0016a290100370100200041226a200241a8016a2901003701002000412a6a200241b0016a290100370100200041306a200241b6016a2901003701000c050b200041093a00000c040b200241186a200110b10302402002290318a70d00200241186a41106a290300210c2002290320210d200041063a000020002002280050360001200041086a200d370300200041186a200229038801370300200041106a200c370300200041046a200241d3006a280000360000200041206a20024188016a41086a290300370300200041286a20024188016a41106a290300370300200041306a20024188016a41186a2903003703000c040b200041093a00000c030b200241306a200110c60402402002280230450d00200241db006a200241306a41086a28020036000020022002290330370053200041073a000020002002290050370001200041086a200241d0006a41076a290000370000200041106a200229038801370300200041186a20024188016a41086a290300370300200041206a20024188016a41106a290300370300200041286a20024188016a41186a290300370300200041306a20024188016a41206a2903003703000c030b200041093a00000c020b200041083a00000c010b200041093a00000b200241b0026a24000b961001027f0240024002400240024020002802000e0404000102030b024002400240024020002d0008417e6a0e06000102070703070b200028022c4101470d06200041346a2802002201450d0620002802302200450d062001450d062000102c0f0b200028020c4101470d05200041146a2802002201450d0520002802102200450d052001450d052000102c0f0b200041206a2802004101470d04200041286a2802002201450d0420002802242200450d042001450d042000102c0f0b200041106a2802002201450d03200028020c2200450d032001450d032000102c0f0b0240024002400240024020002d0008417e6a0e06000102040403040b200028022c4101470d03200041346a2802002201450d0320002802302202450d032001450d032002102c0c030b200028020c4101470d02200041146a2802002201450d0220002802102202450d022001450d022002102c0c020b200041206a2802004101470d01200041286a2802002201450d0120002802242202450d012001450d012002102c0c010b200041106a2802002201450d00200028020c2202450d002001450d002002102c0b0240024002400240200041c0006a2d0000417e6a0e06000102060603060b20002802644101470d05200041ec006a2802002201450d0520002802682200450d052001450d052000102c0f0b20002802444101470d04200041cc006a2802002201450d0420002802482200450d042001450d042000102c0f0b200041d8006a2802004101470d03200041e0006a2802002201450d03200028025c2200450d032001450d032000102c0f0b200041c8006a2802002201450d0220002802442200450d022001450d022000102c0f0b0240024002400240024020002d0008417e6a0e06000102040403040b200028022c4101470d03200041346a2802002201450d0320002802302202450d032001450d032002102c0c030b200028020c4101470d02200041146a2802002201450d0220002802102202450d022001450d022002102c0c020b200041206a2802004101470d01200041286a2802002201450d0120002802242202450d012001450d012002102c0c010b200041106a2802002201450d00200028020c2202450d002001450d002002102c0b02400240024002400240200041c0006a2d0000417e6a0e06000102040403040b20002802644101470d03200041ec006a2802002201450d0320002802682202450d032001450d032002102c0c030b20002802444101470d02200041cc006a2802002201450d0220002802482202450d022001450d022002102c0c020b200041d8006a2802004101470d01200041e0006a2802002201450d01200028025c2202450d012001450d012002102c0c010b200041c8006a2802002201450d0020002802442202450d002001450d002002102c0b0240024002400240200041f8006a2d0000417e6a0e06000102050503050b200028029c014101470d04200041a4016a2802002201450d0420002802a0012200450d042001450d042000102c0f0b200028027c4101470d0320004184016a2802002201450d032000280280012200450d032001450d032000102c0c030b20004190016a2802004101470d0220004198016a2802002201450d022000280294012200450d022001450d022000102c0f0b20004180016a2802002201450d01200028027c2200450d012001450d012000102c0f0b0240024002400240024020002d0008417e6a0e06000102040403040b200028022c4101470d03200041346a2802002201450d0320002802302202450d032001450d032002102c0c030b200028020c4101470d02200041146a2802002201450d0220002802102202450d022001450d022002102c0c020b200041206a2802004101470d01200041286a2802002201450d0120002802242202450d012001450d012002102c0c010b200041106a2802002201450d00200028020c2202450d002001450d002002102c0b02400240024002400240200041c0006a2d0000417e6a0e06000102040403040b20002802644101470d03200041ec006a2802002201450d0320002802682202450d032001450d032002102c0c030b20002802444101470d02200041cc006a2802002201450d0220002802482202450d022001450d022002102c0c020b200041d8006a2802004101470d01200041e0006a2802002201450d01200028025c2202450d012001450d012002102c0c010b200041c8006a2802002201450d0020002802442202450d002001450d002002102c0b02400240024002400240200041f8006a2d0000417e6a0e06000102040403040b200028029c014101470d03200041a4016a2802002201450d0320002802a0012202450d032001450d032002102c0c030b200028027c4101470d0220004184016a2802002201450d022000280280012202450d022001450d022002102c0c020b20004190016a2802004101470d0120004198016a2802002201450d012000280294012202450d012001450d012002102c0c010b20004180016a2802002201450d00200028027c2202450d002001450d002002102c0b0240024002400240200041b0016a2d0000417e6a0e06000102040403040b20002802d4014101470d03200041dc016a2802002201450d0320002802d8012200450d032001450d032000102c0f0b20002802b4014101470d02200041bc016a2802002201450d0220002802b8012200450d022001450d022000102c0f0b200041c8016a2802004101470d01200041d0016a2802002201450d0120002802cc012200450d012001450d012000102c0f0b200041b8016a2802002201450d0020002802b4012200450d002001450d002000102c0f0b0bc70401037f20022001108f0102402001450d0020014188026c2103200241086a210141002104034002400240024002400240024002400240200020046a22052802000e0700010203040506070b200220012802004101102f200228020020012802006a41003a00002001200128020041016a3602000c060b200220012802004101102f200228020020012802006a41013a00002001200128020041016a3602002002200541046a10a4012002200541106a10a5010c050b200220012802004101102f200228020020012802006a41023a00002001200128020041016a3602002002200541046a10a4012002200541206a10a501200541106a280200200541186a280200200210a3010c040b200220012802004101102f200228020020012802006a41033a00002001200128020041016a3602002002200541046a10a4012002200541106a10a4010c030b200220012802004101102f200228020020012802006a41043a00002001200128020041016a3602002002200541046a10a4012002200541206a10a501200541106a280200200541186a280200200210a3010c020b200220012802004101102f200228020020012802006a41053a00002001200128020041016a3602002002200541046a10a4012002200541206a10a501200541106a280200200541186a280200200210a3010c010b200220012802004101102f200228020020012802006a41063a00002001200128020041016a3602002002200541106a10a6012002200541186a10a5012002200541046a10a4010b200320044188026a2204470d000b0b0bbe0601037f230041106b2202240020012802002103200020012802082201108f0102402001450d0020014198026c2104200041086a21010340024002400240024002400240024002400240024002400240024020032802000e0c000102030405060708090a0b0c0b200020012802004101102f200028020020012802006a41003a00002001200128020041016a3602000c0b0b200020012802004101102f200028020020012802006a41013a00002001200128020041016a3602000c0a0b200020012802004101102f200028020020012802006a41023a00002001200128020041016a3602000c090b200020012802004101102f200028020020012802006a41033a00002001200128020041016a3602000c080b200020012802004101102f200028020020012802006a41043a00002001200128020041016a360200200341046a2802002003410c6a280200200010bb010c070b200020012802004101102f200028020020012802006a41053a00002001200128020041016a360200200341046a2802002003410c6a280200200010bb010c060b200020012802004101102f200028020020012802006a41063a00002001200128020041016a3602002000200341086a10a5010c050b200020012802004101102f200028020020012802006a41073a00002001200128020041016a3602002000200341086a10a5010c040b200020012802004101102f200028020020012802006a41083a00002001200128020041016a360200200341046a2802002003410c6a280200200010bb012002200341106a360208200241086a200010e9030c030b200020012802004101102f200028020020012802006a41093a00002001200128020041016a360200200341046a2802002003410c6a280200200010bb012000200341106a10b6070c020b200020012802004101102f200028020020012802006a410a3a00002001200128020041016a3602002000200341086a10a5012002200341f0016a36020c2002410c6a200010e9030c010b200020012802004101102f200028020020012802006a410b3a00002001200128020041016a3602002000200341086a10a5012000200341f0016a10b6070b20034198026a2103200441e87d6a22040d000b0b200241106a24000bf20201017f02400240024002400240024020012802000e050001020304050b2000200041086a22012802004101102f200028020020012802006a41003a00002001200128020041016a3602000f0b2000200041086a22022802004101102f200028020020022802006a41013a00002002200228020041016a3602002000200141086a10af070f0b2000200041086a22022802004101102f200028020020022802006a41023a00002002200228020041016a3602002000200141086a10af072000200141c0006a10af070f0b2000200041086a22022802004101102f200028020020022802006a41033a00002002200228020041016a3602002000200141086a10af072000200141c0006a10af072000200141f8006a10af070f0b2000200041086a22022802004101102f200028020020022802006a41043a00002002200228020041016a3602002000200141086a10af072000200141c0006a10af072000200141f8006a10af072000200141b0016a10af070b0bd20403017f017e047f230041e0006b22022400024002402001290300220342c000540d00024002400240200342808001540d002003428080808004540d014108200379a741037622046b4104490d022000200041086a22052802004101102f200028020020052802006a411320044102746b3a00002005200528020041016a2206360200200220012903002203370308200441786a21010340200020064101102f200028020020052802006a20033c00002005200528020041016a220636020020034208882103200141016a22042001492107200421012007450d000b200220033703082003500d04200241286a41146a4109360200200241346a410c360200200241106a41146a41033602002002200241086a360240200241f8fbc700360244200241c8006a41146a410036020020024203370214200241c0bbc4003602102002410c36022c200241c4b5c8003602582002420137024c200241b8bbc4003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a41d8bbc4001046000b2000200041086a22052802004102102f200028020020052802006a2003a74102744101723b00002005200528020041026a3602000c030b2000200041086a22052802004104102f200028020020052802006a2003a74102744102723600002005200528020041046a3602000c020b41efbac400413641a8bbc400103c000b2000200041086a22052802004101102f200028020020052802006a2003a74102743a00002005200528020041016a3602000b200241e0006a24000b100020002802002001200210a80141000bd70101037f02400240200041046a2802002203200041086a28020022046b2002490d00200028020021030c010b0240024002400240200420026a22052004490d00200341017422042005200420054b1b22044108200441084b1b210402402003450d0020044100480d0120002802002205450d0220052003200410352203450d030c040b200441004e0d010b103b000b2004103222030d010b1039000b20002003360200200041046a2004360200200041086a28020021040b200320046a2001200210c9081a200041086a2200200028020020026a3602000bf90101017f230041106b22022400200028020021002002410036020c02400240024002402001418001490d002001418010490d012001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a200110a801200241106a240041000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41dcb7c000200241086a103e2101200241206a240020010bab2d0b057f027e087f017e037f037e027f027e147f057e047f23004180016b2204240002402001450d0041002105034020002802082206450d0120002802002207200641e0006c6a2108420021094200210a03404104210b4100210c02400240024002402007280238220d450d00200d41d8006c210e2007280230220f21060240024002400240024002400240024002400240024002400340200641306a2802002210280208221141016a41004c0d01200641d8006a2112201020113602080240201041f4006a2d00000d0020122106200e41a87f6a220e450d0e0c010b0b41041032220b450d0b200b20063602000240200e41d800470d00420021134101210c0c0e0b200f200d41d8006c6a221141a87f6a210d4101210c410121140240024002400240024002400240024002400240034020122106024002400240024002400340200641306a2802002210280208220e41016a41004c0d012010200e3602080240201041f4006a2d00000d002011200641d8006a2206470d010c060b0b2014200c470d03200c41016a2210200c490d12200c410174220e2010200e20104b1b22104104201041044b1b221041ffffffff037122122010470d122010410274220e4100480d1220122010464102742112200c4102742015200c1b2115024002400240200b4100200c1b22100d00200e450d010c040b20150d01200e0d030b2012210b0c030b20102015200e1035220b0d020c060b41fcaec8004118200441f8006a4198b9c0004194bbc0001040000b200e1032220b450d040b200e410276210c0b200641d8006a2112200b20144102746a2006360200201441016a2114200d2006470d010b0b420021132014410249220f0d17200b2014410274220d6a211642002117420021180240200d450d00200b21060340427f20182006280200221041286a2903007c2017201041206a2903007c22192017542210ad7c22172010201720185420172018511b22101b2118427f201920101b21172016200641046a2206470d000b0b2004410036026020044208370358200441d8006a4100201410ac0120042802602112200b2016470d01200420123602600c020b2012450d0b0c140b200428025820124104746a2106200b210e0340200e28020041306a2802002210280208221141016a41004c0d0520102011360208201029034021192006201041c8006a29030037030820062019370300201241016a2112200641106a21062016200e41046a220e470d000b20042012360260200b2016460d00200b21060340024020062802002210290320201041286a29030084500d0020102802302210280208220e41016a41004a0d0341fcaec8004118200441f8006a4198b9c0004184bbc0001040000b200641046a2106200d417c6a220d0d000b0b4108211a4100211b0c010b2010200e360208201041c8006a29030021192010290340211c41101032221a450d11200641046a2106201a201c370300201a2019370308200442818080801037026c2004201a3602684101210d410021110240034020162006460d0120062802002110200641046a220e21062010290320201041286a29030084500d0020102802302206280208221041016a41004c0d0520062010360208200641c8006a29030021192006290340211c0240200d200428026c470d00200441e8006a200d410110ac012004280268211a0b201a200d4104746a220620193703082006201c3703002004200d41016a220d360270201141106a2111200e21060c000b0b200428026c211b200d0d010b200741086a2903002119200729030021130c060b200d410474450d0202400240200d4101470d00201a21100c010b201a41106a2106201a21100340201020062010290300200629030056201041086a2903002219200641086a290300221c562019201c511b1b2110200641106a2106201141706a22110d000b0b2012410474220e450d03200428025821110240024020124101470d002011210e0c010b201141106a2106200e41706a21122011210e03402006200e200e290300200629030056200e41086a2903002219200641086a290300221c562019201c511b1b210e200641106a2106201241706a22120d000b0b427f420020102903002219200e29030022137d221c201c201956201041086a290300221c200e41086a2903007d2019201354ad7d2219201c562019201c511b22061b221d42002007290300221c20177d22132013201c56200741086a290300221320187d201c201754ad7d221820135620182013511b22101b7c22172017201d54220e4200201920061b22174200201820101b7c200ead7c221820175420182017511b22061b221320025a427f201820061b221920035a20192003511b0d05201b410474201e201b1b211e0240201a4100201b1b2206450d00201e450d002006102c0b200428025c2206410474201f20061b211f2006450d12201f450d122011102c0c120b41fcaec8004118200441f8006a41a0a4c70041aca6c7001040000b41fcaec8004118200441f8006a4198b9c0004184bbc0001040000b41f4b7c000413041a4b8c000105c000b41b4b8c000413241e8b8c000105c000b41fcaec8004118200441f8006a4198b9c0004194bbc0001040000b02400240200b20164622200d00200b21100340201028020028023022062802080d022006417f36020820064200200629034022182010280200220e290320221c7d22172017201856200641c8006a22122903002217200e41286a2903007d2018201c54ad7d221820175620182017511b220e1b370340201242002018200e1b3703002010280200220e4200370320200e41286a42003703002006200628020841016a3602082016201041046a2210470d000b0b20144115490d042014410176220641ffffffff03712006470d0120064102742221417f4c0d01202110322222450d0a2004410036027020044204370368200b417c6a2123200b41746a2124201421250340024002402025220d417f6a22250d004101210e410021250c010b024002400240024002400240024002400240024002400240200b20254102746a28020041306a2802002206280208221041016a41004c0d0020062010360208200b200d417e6a220f4102746a28020041306a2802002210280208220e41016a41004c0d01200641c8006a2903002118200629034021172010200e36020820172010290340542018201041c8006a29030022175420182017511b0d042024200d4102746a2106410021254100211203400240200f2012470d00200d210e0c0e0b200641046a28020041306a2802002210280208220e41016a41004c0d032010200e360208200628020041306a280200220e280208221141016a41004c0d04201041c8006a290300211820102903402117200e20113602082006417c6a2106201241016a21122017200e2903405a2018200e41c8006a29030022175a20182017511b0d000b201241016a210e2012417f73200d6a21250c050b41fcaec8004118200441f8006a41a0bec00041c0bec0001040000b41fcaec8004118200441f8006a41a0bec00041c0bec0001040000b41fcaec8004118200441f8006a41a0bec00041c0bec0001040000b41fcaec8004118200441f8006a41a0bec00041c0bec0001040000b2024200d41027422116a210602400340024020254101470d00410021250c020b200641046a28020041306a2802002210280208220e41016a41004c0d032010200e360208200628020041306a280200220e280208221241016a41004c0d04201041c8006a290300211820102903402117200e20123602082006417c6a21062025417f6a21252017200e290340542018200e41c8006a29030022175420182017511b0d000b0b200d2025490d03200d20144b0d04200d20256b220e4101762212450d00200b20254102746a2106202320116a21100340200628020021112006201028020036020020102011360200200641046a21062010417c6a21102012417f6a22120d000b0b2025450d06200e41094b0d06200d20144b0d04200d20256b210e2025417f6a2106202320254102746a21100340200d2006490d0b2010200e41016a220e10ad012006417f6a221220064f0d062010417c6a211020122106200e410a490d000c060b0b41fcaec8004118200441f8006a41a0bec00041c0bec0001040000b41fcaec8004118200441f8006a41a0bec00041c0bec0001040000b2025200d41b8a3c8001059000b200d201441b8a3c800104f000b200d2025417f6a2206490d05200d201441c8a3c800104f000b201241016a21250b024020042802702206200428026c470d00200441e8006a10ae01200428027021060b2004280268221020064103746a2212200e360204201220253602002004200641016a2206360270024020064102490d000240024002400340024002400240024020102006417f6a4103746a220e280200450d00200641037420106a220d41746a2802002211200e28020422124d0d00200641024d0d0820102006417d6a22264103746a280204220e201220116a4d0d01200641034d0d08200d41646a280200200e20116a4d0d010c080b20064103490d01200e280204211220102006417d6a22264103746a280204210e0b200e2012490d010b2006417e6a21260b0240024002400240024002400240024002402006202641016a22274d0d00200620264d0d012010202641037422286a2206280204222920062802006a220620102027410374222a6a2210280200222b490d02200620144b0d03200b202b4102746a222c2010280204222d41027422106a210e200641027421112006202b6b220d202d6b2206202d4f0d062022200e2006410274221010c908222e20106a211202400240202d4101480d00200641014e0d010b202e2106200e21100c080b202320116a2111200e211003402012417c6a220d28020041306a2802002206280208220e41016a41004c0d052006200e3602082010417c6a220f28020041306a280200220e280208222f41016a41004c0d06200641c8006a290300211820062903402117200e202f3602082011200f200d2017200e290340542018200e41c8006a29030022175420182017511b22061b2802003602002012200d20061b21120240202c200f201020061b2210490d00202e21060c090b2011417c6a2111202e21062012202e4b0d000c080b0b2027200641d8a3c800103f000b2026200641e8a3c800103f000b202b200641f8a3c8001059000b2006201441f8a3c800104f000b41fcaec8004118200441f8006a41a0bec00041c0bec0001040000b41fcaec8004118200441f8006a41a0bec00041c0bec0001040000b2022202c201010c908220620106a211202400240202d4101480d00200d202d4a0d010b20062106202c21100c010b200b20116a212e20062106202c21100340200e28020041306a2802002211280208220d41016a41004c0d022011200d360208200628020041306a280200220d280208220f41016a41004c0d04201141c8006a290300211820112903402117200d200f3602082010200e20062017200d290340542018200d41c8006a29030022175420182017511b22111b2802003602002006200641046a20111b2106201041046a2110200e41046a200e20111b220e202e4f0d01201220064b0d000b0b20102006201220066b417c7110c9081a2004280270220620264d0d032004280268221020286a220e2029202d6a360204200e202b360200200620274d0d042010202a6a220e200e41086a20062027417f736a41037410ca081a20042006417f6a2206360270200641014d0d050c010b0b41fcaec8004118200441f8006a41a0bec00041c0bec0001040000b41fcaec8004118200441f8006a41a0bec00041c0bec0001040000b202620064188a4c800103f000b202720061047000b2025450d040c000b0b41d4afc8004110200441f8006a41f8b8c0004188b9c0001040000b103b000b2006200d41c8a3c8001059000b200428026c2206410374203020061b213002402006450d002030450d002010102c0b2021203120211b21312021450d012031450d012022102c0c010b200f0d002014417e6a210641022110200b20144102746a41786a210e034020142006490d02200e201010ad01200e417c6a210e201041016a21102006417f6a2206417f470d000b0b2014417f6a211102402020450d0042002118420021170c040b420021184100211042002117200b210e0340200e2802002802302206280208221241016a41004c0d0220062012360208200441386a200641c8006a290300223242002010ad2233420010ce08200441c8006a2006290340223442002033420010ce084200427f20042903482004290340420052200441c8006a41086a290300221c20042903387c221d201c547222061b221c20187d22352035201c56427f201d20061b221d20177d201c201854ad7d221c201d56201c201d511b22061b2007290300564200201c20061b221c200741086a290300221d56201c201d511b0d03201041016a2110427f201720327c201820347c221c2018542206ad7c22182006201820175420182017511b22061b2117427f201c20061b21182016200e41046a220e470d000c040b0b2006201441a8a3c8001058000b41fcaec8004118200441f8006a4198b9c00041a8b9c0001040000b42002033427f7c221c201c20335620104520101b1ba721110b02400240024002400240201420114d0d00200b20114102746a2802002802302206280208221041016a41004c0d0120062010360208200441186a200641c8006a29030022354200201141016a2211ad2233420010ce08200441286a2006290340223242002033420010ce084200427f200741086a290300221c20177c2007290300221720187c221d2017542206ad7c221820062018201c542018201c511b22061b2218427f200441286a41086a290300221720042903187c221c2004290320420052201c2017547222101b7d427f201d20061b2217427f200429032820101b221d54ad7d221c2017201d7d221d201756201c201856201c2018511b22061b21344200201d20061b21362014410274210e200b21120340200e450d0520122802002206450d0520062802302210280208220d41016a41004c0d032010200d360208200441086a203620342033420010c80820064200427f2004290308221820327c22172017201854220d200441086a41086a290300221820357c200dad7c221720185420172018511b220d1b22182010290340221c7d221d201d201856427f2017200d1b2217201041c8006a2903007d2018201c54ad7d221820175620182017511b22101b2217370320200641286a4200201820101b221c370300200628023022062802080d04201241046a2112200641003602082006427f2006290340221820177c221720172018542210200641c8006a220d2903002218201c7c2010ad7c221720185420172018511b22101b370340200d427f201720101b370300200e417c6a210e2011417f6a22110d000c050b0b41b8b9c000418a0141c4bac000105c000b41fcaec8004118200441f8006a4198b9c00041d4bac0001040000b41fcaec8004118200441f8006a4198b9c00041e4bac0001040000b41d4afc8004110200441f8006a41f8b8c00041f4bac0001040000b200c4102742037200c1b21370240200c450d002037450d00200b102c0b2004200710af01201b4104742038201b1b21380240201a4100201b1b2206450d002038450d002006102c0b200428025c2206410474203920061b21392004280258410020061b2206450d042039450d042006102c0c040b1039000b420021130b420021190b200c410274203a200c1b213a200b4100200c1b2206450d00203a450d002006102c0b2019200a20132009562019200a562019200a511b22061b210a2013200920061b2109200741e0006a22072008470d000b200541016a220520014f0d012009200258200a200358200a2003511b450d000b0b20044180016a24000bd80101027f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1b220141ffffffff007122042001470d02200141047422024100480d0220042001464103742104024002400240024002402000280200410020031b22010d002002450d010c030b200341047422030d0120020d020b200421010c020b200120032002103522010d010c030b200210322201450d020b20002001360200200041046a20024104763602000b0f0b2004450d001039000b103b000bf00303047f027e037f230041106b2202240002400240024002400240024020014102490d00200028020441306a2802002203280208220441016a41004c0d0220032004360208200028020041306a2802002204280208220541016a41004c0d03200341c8006a29030021062003290340210720042005360208200720042903405a2006200441c8006a29030022075a20062007511b0d00200028020021082000200028020436020002400240200141034f0d00200041046a21040c010b2001417f6a2109200041046a21050340200541046a220428020041306a2802002200280208220341016a41004c0d0620002003360208200841306a2802002203280208220a41016a41004c0d07200041c8006a2903002106200029034021072003200a3602080240200720032903405a2006200341c8006a29030022075a20062007511b450d00200521040c020b2009450d0320052004280200360200200421052009417f6a22094101470d000b0b200420083602000b200241106a24000f0b20012001419ca5c800103f000b41fcaec8004118200241086a41a0bec00041c0bec0001040000b41fcaec8004118200241086a41a0bec00041c0bec0001040000b41fcaec8004118200241086a41a0bec00041c0bec0001040000b41fcaec8004118200241086a41a0bec00041c0bec0001040000bd80101047f024002400240200041046a28020020002802082201470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1b220241ffffffff017122042002470d02200241037422034100480d0220042002464102742104024002400240024002402000280200410020011b22020d002003450d010c030b200141037422010d0120030d020b200421010c020b200220012003103522010d010c030b200310322201450d020b20002001360200200041046a20034103763602000b0f0b2004450d001039000b103b000bd33909077f027e037f027e027f087e097f017e0a7f230041f0006b220224000240024002400240024002400240024002400240024002400240024002400240024002400240200141386a2802002203450d002001280230220441306a21052004200341d8006c22066a2107034020052802002203280208220441016a41004c0d05200541706a22082903002109200841086a290300210a20032004360208200341f4006a2d00004101460d02200541d8006a2105200641a87f6a22060d000b0b4108210b4100210c4100210d0c010b41101032220b450d09200541286a2105200b2009370300200b200a370308200242818080801037025c2002200b3602584101210c0240034020052007460d01200541306a2802002203280208220441016a41004c0d03200541286a2903002109200541206a290300210a20032004360208200541d8006a22042105200341f4006a2d00004101470d000240200c200228025c470d00200241d8006a200c410110ac012002280258210b0b200b200c4104746a220520093703082005200a3703002002200c41016a220c360260200421050c000b0b200228025c210d0b200b200c4104746a2106200141086a290300210e2001290300210f4200210a200b2105420021090340024020062005470d00410021044100210741082110200c450d10200f200a200a200f542009200e542009200e511b22111b2212200a200f20111b220a7d2213200e200920111b2009200e20111b7d2012200a54ad7d221484500d04200241286a20132014200cad2215420010c808200241186a201320142015420010c708410021042002410036024020024208370338200241386a41002006200b6b41047610cd04200241186a41086a2903002116200241286a41086a290300211720022903182118200229032821192002280240211a2002280238211b02402006200b460d00200b200c4104746a2108201b201a41186c6a2105200b2103034020032903002109200541106a200341086a290300370300200541086a200937030020052004360200200541186a2105200441016a21042008200341106a2203470d000b201a20046a211a0b2002201a360240201a4115490d07201a410176ad42187e2209422088a70d092009a7221c417f4c0d09201c1032221d450d0a4100211e2002410036025020024204370348201b41686a211f201b41406a2120201a212103400240024020212210417f6a22040d0041002121410121070c010b024002400240024002400240201b200441186c6a220541086a290300201041186c2222201b6a41586a2203290300220a54200541106a2903002212200341086a29030022095420122009511b0d002010417e6a2107202020226a210541002121410021030340024020072003470d00201021070c080b200a200529030022235a21042009200541086a2903002212512108200920125a2106200541686a2105200341016a21032023210a201221092004200620081b0d000b200341016a21072003417f7320106a21040c010b202020226a210502400340024020044101470d00410021040c020b200a200529030022235421032009200541086a290300221251210820092012542106200541686a21052004417f6a21042023210a201221092003200620081b0d000b0b20102004490d022010201a4b0d01201020046b22074101762208450d00201b200441186c6a2105201f20226a21030340200241d8006a41106a2206200541106a2222290300370300200241d8006a41086a2224200541086a222529030037030020022005290300370358200341106a22262903002109200341086a2227290300210a200520032903003703002025200a37030020222009370300202620062903003703002027202429030037030020032002290358370300200541186a2105200341686a21032008417f6a22080d000b0b024020040d00200421210c050b0240200741094d0d00200421210c050b2010201a4b0d02200420106b2108201b200441186c6a2122034020102004417f6a2221490d0c0240201020216b22074102490d00201b200441186c6a220441086a2203290300201b202141186c6a220541086a220629030022125a200441106a2224290300220a200541106a221e29030022095a200a2009511b0d00200528020021252005200429030037030020062003290300370300201e2024290300370300024020074103490d00410121032022210503400240200541206a2204290300201254200541286a2206290300220a200954200a2009511b0d00200521040c020b0240200820036a4101460d00200541106a2006290300370300200541086a20042903003703002005200541186a2204290300370300200421052008200341016a22036a0d010c020b0b20032007419ca5c800103f000b2004201237030820042025360200200441106a20093703000b2021450d04202241686a21222008417f6a2108202121042007410a490d000c040b0b2010201a41b8a3c800104f000b2004201041b8a3c8001059000b20102004417f6a2221490d082010201a41c8a3c800104f000b2002280250211e0b0240201e200228024c470d00200241c8006a10ce042002280250211e0b20022802482226201e4103746a22052007360204200520213602002002201e41016a22273602502027211e024020274102490d000340024002400240024020262027221e417f6a22274103746a2205280200450d00201e41037420266a220641746a2802002208200528020422034d0d00201e41024d0d052026201e417d6a22054103746a2802042204200320086a4d0d01201e41034d0d05200641646a280200200420086a4b0d050c010b201e4103490d01200528020421032026201e417d6a22054103746a28020421040b20042003490d010b201e417e6a21050b024002400240024002400240201e200541016a22284d0d00201e20054d0d01202620054103746a2229280204222a20292802006a2205202620284103746a222b280200222c490d022005201a4b0d03202941046a212d201b202c41186c6a2224202b280204222541186c22036a2104200541186c21062005202c6b220720256b220520254f0d04201d2004200541186c220310c908220720036a21080240024020254101480d00200541014e0d010b20042105200721030c060b201f20066a21062004210503402006200541686a2210200841686a2222200841706a2203290300200541706a220429030054200341086a2903002209200441086a290300220a542009200a511b22031b2204290300370300200641086a200441086a290300370300200641106a200441106a2903003703002008202220031b2108024020242010200520031b2205490d00200721030c070b200641686a21062007210320072008490d000c060b0b2028201e41d8a3c800103f000b2005201e41e8a3c800103f000b202c200541f8a3c8001059000b2005201a41f8a3c800104f000b201d2024200310c908222220036a21080240024020254101480d00200720254a0d010b20242105202221030c010b201b20066a211020222103202421050340200520042003200441086a290300200341086a29030054200441106a2903002209200341106a290300220a542009200a511b22061b2207290300370300200541086a200741086a290300370300200541106a200741106a2903003703002003200341186a20061b2103200541186a2105200441186a200420061b220420104f0d01200820034b0d000b0b20052003200820036b220420044118706b10c9081a202d202a20256a3602002029202c360200202b202b41086a201e2028417f736a41037410ca081a200220273602504101211e202741014b0d000b0b2021450d070c000b0b2009200541086a2903007c200a20052903007c2223200a542203ad7c2212200951210420122009542108200541106a21052023210a201221092003200820041b450d000b411e21074186a7c80021050c0f0b41fcaec8004118200241c8006a4188a4c30041f8a4c3001040000b41fcaec8004118200241c8006a4188a4c30041f8a4c3001040000b200c41ffffffff0071200c470d04200c4104742205417f4c0d04200510322203450d0520024100360260200220033602582002200541047636025c200241d8006a4100200c10cf0420022802582210200228026022054104746a200b200c41047410c9081a2005200c6a21040c0a0b2021201041c8a3c8001059000b0240200228024c41ffffffff0171450d002026102c0b201c4118702105201c4118490d01201c2005460d01201d102c0c010b201a4102490d00201b201a417f6a220841186c6a2110410021060340024002400240201a20082205417f6a2208490d00201a20086b22244102490d02201b200541186c6a220441086a2203290300201b200841186c6a220541086a220729030022125a200441106a2222290300220a200541106a221e29030022095a200a2009511b0d02200528020021252005200429030037030020072003290300370300201e202229030037030020244103490d012006417f6a2122410021032010210503400240200541206a2204290300201254200541286a2207290300220a200954200a2009511b0d00200521040c030b024020222003460d00200541106a2007290300370300200541086a20042903003703002005200541186a22042903003703002004210520062003417f6a2203470d010c030b0b410120036b2024419ca5c800103f000b2008201a41a8a3c8001058000b2004201237030820042025360200200441106a20093703000b201041686a21102006417f6a210620080d000b0b0240024002400240024002400240024002400240024002402011450d00200241086a200f200e2015420010c80841002105200241086a41086a29030021122002290308210e0240201320155441002014501b0d00410021052002280238210620022802402107200c21040340200720054d0d0c2006200541186c6a2203290308220920197c220a2009542208200341106a290300222320177c2008ad7c220920235420092023511b4101460d0b200341086a2203200a370300200320093703080240200a200e54200920125420092012511b0d00200541016a200c7021050b2004417f6a22040d000b0b20182016844200520d012002280240211a2002280238211b0c040b2002280240221a450d0a200c417f6a21042002280238221b41106a2903002123201b290308210f201320155441002014501b450d012018210a200421050c020b2002280238211b2002280240211a0340201a20054d0d07201b200541186c6a2203290308222342017c22092023542204200341106a29030022192004ad7c220a201954200920235a1b4101460d06200341086a220320093703002003200a37030802402009200e54200a201254200a2012511b0d00200541016a200c7021050b2018427f7c2209201854210320092118200920162003ad7c427f7c22168450450d000c030b0b200421050340201a20054d0d04201b200541186c6a220342002003290308220920197d220e200e200956200341106a2208290300220a20177d2009201954ad7d2212200a562012200a511b22031b200e20031b220e37030820084200201220031b201220031b2212370300200520042005417f6a2208200820054b1b200e200f56201220235620122023511b1b210520162017200a7d2019200954ad7d420020031b7c2018201920097d420020031b7c220a201854ad7c2116200a2118200c417f6a220c0d000b0b200a201684500d00200a21180340201a20054d0d0202400240201b200541186c6a22032903082209427f7c2219200956200341106a2903002217200950ad7d221220175620094200521b4101470d0020042005417f6a2203200320054b1b21050c010b200341086a2203201937030020032012370308200520042005417f6a2203200320054b1b2019200f56201220235620122023511b1b21052016200a427f7c2218200a54ad7c427f7c21162018210a0b20182016844200520d000b0b201a4115490d0b201a410176ad42187e2209422088a70d072009a72211417f4c0d0720111032221d450d084100211e2002410036025020024204370348201b41686a210c201b41b87f6a211f201a212103400240024020212210417f6a22040d0041002121410121070c010b024002400240024002400240201b200441186c6a280200201041186c2222201b6a41506a2802002205490d002010417e6a2107201f20226a210441002121410021030340024020072003470d00201021070c080b200341016a21032005200428020022084f2106200441686a21042008210520060d000b200341016a21072003417f7320106a21040c010b201f20226a210302400340024020044101470d00410021040c020b2004417f6a2104200520032802002208492106200341686a21032008210520060d000b0b20102004490d022010201a4b0d01201020046b22074101762208450d00201b200441186c6a2105200c20226a21030340200241d8006a41106a2206200541106a2222290300370300200241d8006a41086a2224200541086a222529030037030020022005290300370358200341106a22262903002109200341086a2227290300210a200520032903003703002025200a37030020222009370300202620062903003703002027202429030037030020032002290358370300200541186a2105200341686a21032008417f6a22080d000b0b024020040d00200421210c050b0240200741094d0d00200421210c050b2010201a4b0d02200420106b2108201b200441186c6a2122034020102004417f6a2221490d100240201020216b22074102490d00201b200441186c6a2205280200201b202141186c6a220328020022064f0d002003200529030037030020032903082109200341086a200541086a290300370300200341106a2203290300210a2003200541106a290300370300024020074103490d00410121032022210502400340200541186a220428020020064f0d02200820036a4101460d01200541106a200541286a290300370300200541086a200541206a29030037030020052004290300370300200421052008200341016a22036a0d000b200421050c010b20032007419ca5c800103f000b2005200937030820052006360200200541106a200a3703000b2021450d04202241686a21222008417f6a2108202121042007410a490d000c040b0b2010201a41b8a3c800104f000b2004201041b8a3c8001059000b20102004417f6a2221490d0c2010201a41c8a3c800104f000b2002280250211e0b0240201e200228024c470d00200241c8006a10ce042002280250211e0b20022802482226201e4103746a22052007360204200520213602002002201e41016a22273602502027211e024020274102490d000340024002400240024020262027221e417f6a22274103746a2205280200450d00201e41037420266a220641746a2802002208200528020422034d0d00201e41024d0d052026201e417d6a22054103746a2802042204200320086a4d0d01201e41034d0d05200641646a280200200420086a4b0d050c010b201e4103490d01200528020421032026201e417d6a22054103746a28020421040b20042003490d010b201e417e6a21050b024002400240024002400240201e200541016a22284d0d00201e20054d0d01202620054103746a2229280204222a20292802006a2205202620284103746a222b280200222c490d022005201a4b0d03202941046a212d201b202c41186c6a2224202b280204222541186c22036a2104200541186c21062005202c6b220720256b220520254f0d04201d2004200541186c220310c908222220036a21080240024020254101480d00200541014e0d010b20042105202221030c060b200c20066a21062004210503402006200541686a2203200841686a2204200428020020032802004922071b2210290300370300200641106a201041106a290300370300200641086a201041086a2903003703002008200420071b2108024020242003200520071b2205490d00202221030c070b200641686a21062022210320222008490d000c060b0b2028201e41d8a3c800103f000b2005201e41e8a3c800103f000b202c200541f8a3c8001059000b2005201a41f8a3c800104f000b201d2024200310c908222220036a21080240024020254101480d00200720254a0d010b20242105202221030c010b201b20066a211020222103202421050340200520042003200428020020032802004922061b2207290300370300200541106a200741106a290300370300200541086a200741086a2903003703002003200341186a20061b2103200541186a2105200441186a200420061b220420104f0d01200820034b0d000b0b20052003200820036b220420044118706b10c9081a202d202a20256a3602002029202c360200202b202b41086a201e2028417f736a41037410ca081a200220273602504101211e202741014b0d000b0b2021450d0b0c000b0b2005201a41fca8c800103f000b2005201a41dca8c800103f000b4184a8c800412641cca8c800105c000b2005201a41bca8c800103f000b4184a8c800412641aca8c800105c000b2005200741f4a7c800103f000b41a4a7c800413f41e4a7c800105c000b103b000b1039000b2021201041c8a3c8001059000b0240200228024c41ffffffff0171450d002026102c0b2011411870210520114118490d0120112005460d01201d102c0c010b201a4102490d00201b201a417f6a220841186c6a2110410021060340024002400240201a20082205417f6a2208490d00201a20086b22244102490d02201b200541186c6a2205280200201b200841186c6a220328020022074f0d022003200529030037030020032903082109200341086a200541086a290300370300200341106a2203290300210a2003200541106a29030037030020244103490d012006417f6a2122410021032010210502400340200541186a220428020020074f0d0320222003460d01200541106a200541286a290300370300200541086a200541206a290300370300200520042903003703002004210520062003417f6a2203470d000b200421050c020b410120036b2024419ca5c800103f000b2008201a41a8a3c8001058000b2005200937030820052007360200200541106a200a3703000b201041686a21102006417f6a210620080d000b0b200241003602602002420837035820022802382107200228023c2106200241d8006a41002002280240220510cf04200228026021042002280258211002402005450d00200541186c2108200741086a2105201020044104746a21030340200529030021092003200541086a29030037030820032009370300200541186a2105200441016a2104200341106a2103200841686a22080d000b0b200220043602602006450d00200641186c450d002007102c0b200228025c21070b201020044104746a212420012802302204200128023841d8006c6a210820102106024002400340200820042205460d020240200541306a2802002203280208220441016a41004c0d0020032004360208200541d8006a2104200341f4006a2d0000450d0120062024460d03200541d8006a220441586a28020022052802080d02200641086a29030021092006290300210a2005417f3602082005420020052903402212200441486a222229030022167d22232023201256200541c8006a22032903002223202241086a221e2903007d2012201654ad7d221220235620122023511b22251b37034020034200201220251b370300201e20093703002022200a3703002005200528020841016a3602082005427f200a200529034022127c220a200a201254222220092003290300220a7c2022ad7c2209200a542009200a511b22221b3703402003427f200920221b370300200641106a21060c010b0b41fcaec8004118200241c8006a4188a4c3004198a4c3001040000b41d4afc8004110200241c8006a41a8a4c30041b8a4c3001040000b41002105200741ffffffff0071450d002010102c0b0240200b4100200d1b2203450d00200d41ffffffff0071450d002003102c0b2000200736020420002005360200200241f0006a24000b6201037e024002402001280200410a460d00420021020c010b420021020240200141086a2903004200510d000c010b200141f8016a2903002103200141f0016a2903002104420121020b2000200437030820002002370300200041106a20033703000bc60603057f017e037f23004180016b22022400200241306a200128020c200141146a28020010b2010240024020022802302203450d002001410c6a2104200141086a21050340024002402005280200220620022902342207422088a722084b0d00200128020022092003460d0120092003200610cc08450d010b2007a7450d022003450d022003102c0c020b02402001280210450d002004280200102c0b200120073702102001200336020c200241086a2003200810b301024002400240024020022802082203450d0020022802102106200228020c210a024020012d001c450d00200128020c200128021410b4010b2001280214220920052802002208490d02200241086a200128020c20086a200920086b200320062001280218110400200228020c450d0120002002290308370200200041106a200241086a41106a280200360200200041086a200241086a41086a290300370200200a450d062003102c0c060b41002802d8d248450d022002410d3602242002200436022041002802d4d248210341002802d0d248210841002802dcd24821062002418a04360270200242e680808010370368200241e2bbc0003602642002421637025c200241ccbbc0003602582002420137035020024201370340200241a4bbc00036023c20024116360238200241ccbbc00036023420024101360230200341e0a3c000200641024622061b28021021032002200241206a36024c200841f8a3c00020061b200241306a20031103000c020b024041002802d8d248450d002002410e36022c2002410d360224200220043602202002200241f8006a36022841002802d4d248210841002802d0d248210641002802dcd24821092002419804360270200242e680808010370368200241e2bbc0003602642002421637025c200241ccbbc0003602582002420237035020024202370340200241bcbbc00036023c20024116360238200241ccbbc00036023420024101360230200841e0a3c000200941024622091b28021021082002200241206a36024c200641f8a3c00020091b200241306a20081103000b200a450d012003102c0c010b2008200941acbbc0001058000b200241306a200128020c200128021410b201200228023022030d000b0b200041003602040b20024180016a24000b130020002002ad4220862001ad84102310fc070b130020002002ad4220862001ad84102210fc070b0e002001ad4220862000ad84101f0bbd0101047f230041106b22022400200028020821032000280200210041012104200128021841fc9dc00041012001411c6a28020028020c1100002105200241003a0005200220053a00042002200136020002402003450d0003402002200036020c20022002410c6a41dcedc60010671a200041016a21002003417f6a22030d000b20022d000421050b0240200541ff01710d0020022802002200280218419a92c10041012000411c6a28020028020c11000021040b200241106a240020040bbe0704057f017e037f037e230041b0016b22022400200241e0006a200128020c200141146a28020010b2010240024020022802602203450d002001410c6a2104200141086a21050340024002402005280200220620022902642207422088a722084b0d00200128020022092003460d0120092003200610cc08450d010b2007a7450d022003450d022003102c0c020b02402001280210450d002004280200102c0b200120073702102001200336020c200241286a2003200810b301024002400240024020022802282203450d0020022802302106200228022c210a024020012d001c450d00200128020c200128021410b4010b2001280214220920052802002208490d02200241286a200128020c20086a200920086b20032006200128021811040020022802284101460d01200241206a200241286a41246a2802002201360200200241186a200241286a411c6a2902002207370300200241106a200241286a41146a290200220b370300200241086a200241286a410c6a290200220c3703002002200229022c220d370300200041246a20013602002000411c6a2007370200200041146a200b3702002000410c6a200c3702002000200d37020420004101360200200a450d062003102c0c060b41002802d8d248450d022002410d3602042002200436020041002802d4d248210341002802d0d248210841002802dcd24821062002418a043602a001200242e68080801037039801200241e2bbc000360294012002421637028c01200241ccbbc00036028801200242013703800120024201370370200241a4bbc00036026c20024116360268200241ccbbc00036026420024101360260200341e0a3c000200641024622061b28021021032002200236027c200841f8a3c00020061b200241e0006a20031103000c020b024041002802d8d248450d002002410e36025c2002410d360254200220043602502002200241a8016a36025841002802d4d248210841002802d0d248210641002802dcd248210920024198043602a001200242e68080801037039801200241e2bbc000360294012002421637028c01200241ccbbc00036028801200242023703800120024202370370200241bcbbc00036026c20024116360268200241ccbbc00036026420024101360260200841e0a3c000200941024622091b28021021082002200241d0006a36027c200641f8a3c00020091b200241e0006a20081103000b200a450d012003102c0c010b2008200941acbbc0001058000b200241e0006a200128020c200128021410b201200228026022030d000b0b200041003602000b200241b0016a24000b960703057f017e037f230041a0016b22022400200241d0006a200128020c200141146a28020010b2010240024020022802502203450d002001410c6a2104200141086a21050340024002402005280200220620022902542207422088a722084b0d00200128020022092003460d0120092003200610cc08450d010b2007a7450d022003450d022003102c0c020b02402001280210450d002004280200102c0b200120073702102001200336020c20022003200810b301024002400240024020022802002203450d00200228020821062002280204210a024020012d001c450d00200128020c200128021410b4010b2001280214220920052802002208490d022002200128020c20086a200920086b2003200620012802181104002002280204450d0120002002290300370200200041386a200241386a280200360200200041306a200241306a290300370200200041286a200241286a290300370200200041206a200241206a290300370200200041186a200241186a290300370200200041106a200241106a290300370200200041086a200241086a290300370200200a450d062003102c0c060b41002802d8d248450d022002410d3602442002200436024041002802d4d248210341002802d0d248210841002802dcd24821062002418a0436029001200242e68080801037038801200241e2bbc000360284012002421637027c200241ccbbc0003602782002420137037020024201370360200241a4bbc00036025c20024116360258200241ccbbc00036025420024101360250200341e0a3c000200641024622061b28021021032002200241c0006a36026c200841f8a3c00020061b200241d0006a20031103000c020b024041002802d8d248450d002002410e36024c2002410d36024420022004360240200220024198016a36024841002802d4d248210841002802d0d248210641002802dcd2482109200241980436029001200242e68080801037038801200241e2bbc000360284012002421637027c200241ccbbc0003602782002420237037020024202370360200241bcbbc00036025c20024116360258200241ccbbc00036025420024101360250200841e0a3c000200941024622091b28021021082002200241c0006a36026c200641f8a3c00020091b200241d0006a20081103000b200a450d012003102c0c010b2008200941acbbc0001058000b200241d0006a200128020c200128021410b201200228025022030d000b0b200041003602040b200241a0016a24000ba00703057f017e037f230041a0016b22022400200241d0006a200128020c200141146a28020010b2010240024020022802502203450d002001410c6a2104200141086a21050340024002402005280200220620022902542207422088a722084b0d00200128020022092003460d0120092003200610cc08450d010b2007a7450d022003450d022003102c0c020b02402001280210450d002004280200102c0b200120073702102001200336020c200241086a2003200810b301024002400240024020022802082203450d0020022802102106200228020c210a024020012d001c450d00200128020c200128021410b4010b2001280214220920052802002208490d02200241086a200128020c20086a200920086b20032006200128021811040020022d00384102460d0120002002290308370200200041306a200241086a41306a280200360200200041286a200241086a41286a290300370200200041206a200241086a41206a290300370200200041186a200241086a41186a290300370200200041106a200241086a41106a290300370200200041086a200241086a41086a290300370200200a450d062003102c0c060b41002802d8d248450d022002410d3602442002200436024041002802d4d248210341002802d0d248210841002802dcd24821062002418a0436029001200242e68080801037038801200241e2bbc000360284012002421637027c200241ccbbc0003602782002420137037020024201370360200241a4bbc00036025c20024116360258200241ccbbc00036025420024101360250200341e0a3c000200641024622061b28021021032002200241c0006a36026c200841f8a3c00020061b200241d0006a20031103000c020b024041002802d8d248450d002002410e36024c2002410d36024420022004360240200220024198016a36024841002802d4d248210841002802d0d248210641002802dcd2482109200241980436029001200242e68080801037038801200241e2bbc000360284012002421637027c200241ccbbc0003602782002420237037020024202370360200241bcbbc00036025c20024116360258200241ccbbc00036025420024101360250200841e0a3c000200941024622091b28021021082002200241c0006a36026c200641f8a3c00020091b200241d0006a20081103000b200a450d012003102c0c010b2008200941acbbc0001058000b200241d0006a200128020c200128021410b201200228025022030d000b0b200041023a00300b200241a0016a24000bb00603057f017e037f23004190036b220224002002200128020c200141146a28020010b2010240024020022802002203450d002001410c6a2104200141086a21050340024002402005280200220620022902042207422088a722084b0d00200128020022092003460d0120092003200610cc08450d010b2007a7450d022003450d022003102c0c020b02402001280210450d002004280200102c0b200120073702102001200336020c200241c0026a2003200810b301024002400240024020022802c0022203450d0020022802c802210620022802c402210a024020012d001c450d00200128020c200128021410b4010b2001280214220920052802002208490d022002200128020c20086a200920086b20032006200128021811040020022802ec01450d012000200241ac0210c9081a200a450d062003102c0c060b41002802d8d248450d022002410d3602b402200220043602b00241002802d4d248210341002802d0d248210841002802dcd24821062002418a04360240200242e680808010370338200241e2bbc0003602342002421637022c200241ccbbc0003602282002420137032020024201370310200241a4bbc00036020c20024116360208200241ccbbc00036020420024101360200200341e0a3c000200641024622061b28021021032002200241b0026a36021c200841f8a3c00020061b200220031103000c020b024041002802d8d248450d002002410e3602bc022002410d3602b402200220043602b002200220024188036a3602b80241002802d4d248210841002802d0d248210641002802dcd2482109200241980436028003200242e6808080103703f802200241e2bbc0003602f402200242163702ec02200241ccbbc0003602e802200242023703e002200242023703d002200241bcbbc0003602cc02200241163602c802200241ccbbc0003602c402200241013602c002200841e0a3c000200941024622091b28021021082002200241b0026a3602dc02200641f8a3c00020091b200241c0026a20081103000b200a450d012003102c0c010b2008200941acbbc0001058000b2002200128020c200128021410b201200228020022030d000b0b200041003602ec010b20024190036a24000bb90101037f20004201370200200041086a2202410036020020012802002103200041004104102f2000280200200228020022046a20033600002002200441046a3602002001280204210320002001410c6a2802002204108f0102402004450d0020032004410c6c6a210403402003280200200341086a280200200010bb012003410c6a22032004470d000b0b20012802102103200020022802004104102f2000280200200228020022006a20033600002002200041046a3602000bd10201027f0240024002400240200141c000490d00200141808001490d012001418080808004490d022002200241086a22032802004101102f200228020020032802006a41033a00002003200328020041016a2204360200200220044104102f200228020020032802006a20013600002003200328020041046a22043602000c030b2002200241086a22032802004101102f200228020020032802006a20014102743a00002003200328020041016a22043602000c020b2002200241086a22032802004102102f200228020020032802006a20014102744101723b00002003200328020041026a22043602000c010b2002200241086a22032802004104102f200228020020032802006a20014102744102723600002003200328020041046a22043602000b200220042001102f2002280200200241086a22022802006a2000200110c9081a2002200228020020016a3602000bf30203027f017e067f230041206b22022400024020014102490d00200041206a22032000412010cc08417f4a0d002000290000210420002003290000370000200241186a2205200041186a2206290000370300200241106a2207200041106a2208290000370300200241086a2209200041086a220a290000370300200a200341086a2900003700002008200341106a2900003700002006200341186a29000037000020022004370300024020014103490d002001417f6a2106200041206a210302400340200341206a22002002412010cc0841004e0d022006450d0120032000290000370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a290000370000200021032006417f6a22064101470d000b200021030c010b20012001419ca5c800103f000b20032002290300370000200341186a2005290300370000200341106a2007290300370000200341086a20092903003700000b200241206a24000b930301067f230041106b2202240002400240024002400240024020014102490d0020002802042203280208220441016a41004c0d022003200436020820002802002204280208220541016a41004c0d032003280250210320042005360208200320042802504f0d00200028020021032000200028020436020002400240200141034f0d00200041046a21000c010b2001417f6a2106200041046a21040340200441046a22002802002205280208220741016a41004c0d06200520073602082003280208220741016a41004c0d072005280250210520032007360208024020052003280250490d00200421000c020b2006450d0320042000280200360200200021042006417f6a22064101470d000b0b200020033602000b200241106a24000f0b20012001419ca5c800103f000b41fcaec8004118200241086a41a0bec00041b0bec0001040000b41fcaec8004118200241086a41a0bec00041b0bec0001040000b41fcaec8004118200241086a41a0bec00041b0bec0001040000b41fcaec8004118200241086a41a0bec00041b0bec0001040000b130020004100360204200041c4b5c8003602000b4d01017f230041206b22002400200041146a410136020020004201370204200041eccdc8003602002000410436021c200041ec9cc8003602182000200041186a360210200041d0bec0001046000b7201047f230041106b220124002001410036020820014201370300200110c001200128020021022000200041086a220328020020012802082204102f200028020020032802006a2002200410c9081a2003200420032802006a36020002402001280204450d002002102c0b200141106a24000b340020004181dec70036020420004100360200200041146a4103360200200041106a41bcbfc000360200200041086a42033702000b2901017f230041106b2202240020024100360208200242043703002000200210c301200241106a24000bba0101047f02400240200128020822024104744104722203417f4c0d0020012802002101200310322204450d012000200336020420002004360200200041086a2203410036020020002002108f0102402002450d00200120024104746a2105034020012802002102200020032802004104102f2000280200200328020022046a20023600002003200441046a360200200141046a2802002001410c6a280200200010bb01200141106a22012005470d000b0b0f0b103b000b1039000bbb0f02077f017e230041d0016b220324000240024002400240200241086a220428020020004b0d00200341a8016a22004200370300200341a0016a2205420037030020034190016a41086a220642003703002003420037039001200341b0016a41c1dcc700410610c5012006200341b0016a41086a290000370300200320032900b00137039001200341286a4196a4c600410610c5012000200341286a41086a29000037030020052003290028370300200320034190016a412010c6012003280204210020032802002105200341086a410c6a200428020036020020032000410020051b22053602082003200229020037020c200341286a4181dec700410310c50120034190016a4198c2c000411910c50120032001360218200341c0016a200341186a410410c701200341c8006a410c6a200341186a41046a3602002003200341c0016a41086a36024c2003200341186a3602502003200341c0016a360248200341b0016a200341c8006a107e20032802b801220241206a2200417f4c0d020240024020000d00410121040c010b200010322204450d040b200341003602c801200320003602c401200320043602c001200341c0016a4100411010c80120032802c00120032802c80122006a22042003290028370000200441086a200341286a41086a2900003700002003200041106a22003602c801200341c0016a2000411010c80120032802c00120032802c80122006a2204200329009001370000200441086a20034190016a41086a22062900003700002003200041106a22003602c80120032802b0012104200341c0016a2000200210c80120032802c001220020032802c80122076a2004200210c9081a2003200720026a22023602c801024020032802b401450d002004102c0b200341c8006a2000200210c9012006200341d1006a29000037030020034190016a41106a200341d9006a29000037030020034190016a41186a2204200341e1006a29000037030020032003290049370390010240024020032d00484101460d00200341286a41186a4200370300200341386a4200370300200341306a4200370300200342003703280c010b200341286a41186a2004290300370300200341286a41106a20034190016a41106a290300370300200341286a41086a20034190016a41086a29030037030020032003290390013703280b20034190016a200341086a41047210ca01200341e4006a200341286a41186a2204290300370200200341dc006a200341286a41106a2206290300370200200341d4006a2207200341286a41086a2208290300370200200341f4006a20034190016a41086a2209290300370200200341fc006a20034190016a41106a29030037020020034184016a20034190016a41186a290300370200200320053602482003200329032837024c200320032903900137026c200341286a200341c8006a10cb01200341e1006a2004290300370000200341d9006a2006290300370000200341d1006a200829030037000020032003290328370049200341013a00482003200341c8006a410172360290012000200220034190016a10cc01024020032802c401450d002000102c0b2009200341086a41086a2903003703002003200329030837039001200341b0016a4181dec700410310c501200341286a41a4bfc000411510c501200320013602cc01200341186a200341cc016a410410c7012007200341cc016a41046a3602002003200341186a41086a36024c2003200341cc016a3602502003200341186a360248200341c0016a200341c8006a107e20032802c801220241206a2201417f4c0d020240024020010d00410121000c010b200110322200450d040b200341003602202003200136021c20032000360218200341186a4100411010c8012003280218200328022022016a220020032900b001370000200041086a200341b0016a41086a2900003700002003200141106a2201360220200341186a2001411010c8012003280218200328022022016a22002003290028370000200041086a200341286a41086a2900003700002003200141106a220036022020032802c0012101200341186a2000200210c80120032802182200200328022022046a2001200210c9081a2003200420026a2204360220024020032802c401450d002001102c0b200341c8006a2000200410cd0102400240200328024822010d0041002102200341003602302003420437032841042101410021060c010b2003200329024c220a37022c20032001360228200a422088a72102200aa721060b200341c8006a41086a220520034190016a41086a2903003703002003200329039001370348024020022006470d00200341286a200210ce0120032802302102200328022821010b200120024104746a22012003290348370200200141086a20052903003702002003200241016a22023602302005200236020020032003290328220a37034802400240200aa722050d002000200410b4010c010b20002004200341c8006a10cf010240200341d0006a2802002202450d0020024104742101200541046a210203400240200241046a280200450d002002280200102c0b200241106a2102200141706a22010d000b0b200328024c41ffffffff0071450d002005102c0b0240200328021c450d002000102c0b410021010c010b410121012002280204450d002002280200102c0b200341d0016a240020010f0b103b000b1039000b2c0020002002ad4220862001ad8410122201290000370000200041086a200141086a2900003700002001102c0b870201037f230041d0006b220324002003200236020420032001360200200341086a2001200210b30102400240200328020822040d00410021010c010b200328020c210502400240200341106a2802004104490d0020042800002102410121010c010b4100210120034100360220200342013703182003410f36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c200341b4bcc3003602382003200341286a360248200341346a41dcb7c000200341386a103e1a200335022042208620033502188410000240200328021c450d002003280218102c0b0b2005450d002004102c0b2000200236020420002001360200200341d0006a24000b25002002ad4220862001ad841013210120004200370000200020012900003700002001102c0b930101017f0240200041046a280200220320016b20024f0d000240024002400240200120026a22022001490d00200341017422012002200120024b1b22014108200141084b1b22014100480d002000280200410020031b2202450d012003450d0120022003200110352203450d020c030b103b000b2001103222030d010b1039000b20002003360200200041046a20013602000b0ba00902047f017e230041b0016b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00200041003a00000c010b200341186a280200210220032802142104200341003a0060024002402002450d00200320012d00003a0040200341013a0060024020024101460d00200320012d00013a0041200341023a006020024102460d00200320012d00023a0042200341033a006020024103460d00200320012d00033a0043200341043a006020024104460d00200320012d00043a0044200341053a006020024105460d00200320012d00053a0045200341063a006020024106460d00200320012d00063a0046200341073a006020024107460d00200320012d00073a0047200341083a006020024108460d00200320012d00083a0048200341093a006020024109460d00200320012d00093a00492003410a3a00602002410a460d00200320012d000a3a004a2003410b3a00602002410b460d00200320012d000b3a004b2003410c3a00602002410c460d00200320012d000c3a004c2003410d3a00602002410d460d00200320012d000d3a004d2003410e3a00602002410e460d00200320012d000e3a004e2003410f3a00602002410f460d00200320012d000f3a004f200341103a006020024110460d00200320012d00103a0050200341113a006020024111460d00200320012d00113a0051200341123a006020024112460d00200320012d00123a0052200341133a006020024113460d00200320012d00133a0053200341143a006020024114460d00200320012d00143a0054200341153a006020024115460d00200320012d00153a0055200341163a006020024116460d00200320012d00163a0056200341173a006020024117460d00200320012d00173a0057200341183a006020024118460d00200320012d00183a0058200341193a006020024119460d00200320012d00193a00592003411a3a00602002411a460d00200320012d001a3a005a2003411b3a00602002411b460d00200320012d001b3a005b2003411c3a00602002411c460d00200320012d001c3a005c2003411d3a00602002411d460d00200320012d001d3a005d2003411e3a00602002411e460d00200320012d001e3a005e2003411f3a00602002411f460d00200341206a41106a2202200341c0006a41106a290300370300200341206a41086a2205200341c0006a41086a290300370300200320012d001f3a005f200341206a41186a2206200341c0006a41186a290300370300200341203a006020032003290340220737036820032007370320200041196a2006290300370000200041116a2002290300370000200041096a200529030037000020002003290320370001410121020c020b200341003a00600b20034100360270200342013703682003410f3602242003200341086a3602202003200341e8006a3602ac01200341d4006a410136020020034201370244200341b4bcc3003602402003200341206a360250200341ac016a41dcb7c000200341c0006a103e1a200335027042208620033502688410000240200328026c450d002003280268102c0b410021020b200020023a00002004450d002001102c0b200341b0016a24000ba20301047f230041106b22022400024002402001280208220341046a2204417f4c0d002001280200210102400240024002400240024020040d0020024100360208200242013703000c010b200410322205450d06200241003602082002200436020420022005360200200341c000490d01200341808001490d022003418080808004490d030b200241004101102f2002280200200228020822046a41033a00002002200441016a2204360208200220044104102f2002280200200228020822046a2003360000200441046a21040c030b200241004101102f2002280200200228020822046a20034102743a0000200441016a21040c020b200241004102102f2002280200200228020822046a20034102744101723b0000200441026a21040c010b200241004104102f2002280200200228020822046a2003410274410272360000200441046a21040b20022004360208200220042003102f20022802002204200228020822056a2001200310c9081a2002200520036a2203360208200020042003109a0102402002280204450d002004102c0b200241106a24000f0b103b000b1039000bd70301057f230041206b220224000240410410322203450d002002420437020420022003360200412010322203450d002002422037021420022003360210200241106a41004120102f20022802102204200228021822056a22032001290004370000200341086a2001410c6a290000370000200341106a200141146a290000370000200341186a2001411c6a2900003700002002200541206a2203360218200241002003102f2002280200200228020822056a2004200310c9081a2002200520036a220336020802402002280214450d002004102c0b20012802002104200220034104102f2002280200200228020822036a20043600002002200341046a2205360208412010322203450d002002422037021420022003360210200241106a41004120102f20022802102204200228021822066a22032001290024370000200341086a2001412c6a290000370000200341106a200141346a290000370000200341186a2001413c6a2900003700002002200641206a2201360218200220052001102f20022802002203200228020822056a2004200110c9081a2002200520016a220136020802402002280214450d002004102c0b200020032001109a0102402002280204450d002003102c0b200241206a24000f0b1039000bb00101047f230041106b22032400200228020021020240412010322204450d002003422037020420032004360200200341004120102f20032802002205200328020822066a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200641206a2202360208200020012005200210a70202402003280204450d002005102c0b200341106a24000f0b1039000b9e0502077f017e230041e0006b220324002003200236021420032001360210200341186a2001200210b30102400240200328021822040d00200041003602000c010b200328021c21052003200341206a28020036022c20032004360228200341086a200341286a1087020240024020032802080d0041042106024002400240200328020c2202200328022c4104762201200120024b1b22074104742201417f4c0d0002402007450d00200110322206450d020b41002101200341003602402003200736023c2003200636023802402002450d000340200328022c22074104490d0420032802282208280000210920032007417c6a36022c2003200841046a360228200341c8006a200341286a108a0220032802482207450d04200329024c210a02402001200328023c470d00200341386a200110ce0120032802402101200328023821060b200620014104746a2201200736020420012009360200200141086a200a3702002003200328024041016a22013602402002417f6a22020d000b200328023821060b2006450d032000200329023c370204200020063602000c040b103b000b1039000b2003280238210702402001450d0020014104742102200741046a210103400240200141046a280200450d002001280200102c0b200141106a2101200241706a22020d000b0b200328023c41ffffffff0071450d002007102c0b20034100360240200342013703382003410f3602342003200341106a3602302003200341386a360244200341dc006a41013602002003420137024c200341b4bcc3003602482003200341306a360258200341c4006a41dcb7c000200341c8006a103e1a200335024042208620033502388410000240200328023c450d002003280238102c0b200041003602000b2005450d002004102c0b200341e0006a24000bd30101037f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1b220241ffffffff007122042002470d02200241047422034100480d0220042002464102742104024002400240024002402000280200410020011b22020d002003450d010c030b200141047422010d0120030d020b200421010c020b200220012003103522010d010c030b200310322201450d020b20002001360200200041046a20034104763602000b0f0b2004450d001039000b103b000be70101047f230041106b2203240002400240200228020822044104744104722205417f4c0d0020022802002102200510322206450d0120034100360208200320053602042003200636020020032004108f0102402004450d00200220044104746a2106034020022802002104200320032802084104102f2003280200200328020822056a20043600002003200541046a360208200241046a2802002002410c6a280200200310bb01200241106a22022006470d000b0b2000200120032802002202200328020810a70202402003280204450d002002102c0b200341106a24000f0b103b000b1039000bec0101017f230041306b2202240002400240200028020022002802004101470d00200220002802043602002002200041086a280200360204200241146a41023602002002410236020c2001411c6a28020021002002200241046a36021020022002360208200128021821012002412c6a41023602002002420237021c200241fcafc0003602182002200241086a36022820012000200241186a103e21010c010b2001411c6a2802002100200128021821012002412c6a4100360200200241c4b5c8003602282002420137021c2002418cb0c00036021820012000200241186a103e21010b200241306a240020010bf9e7010c057f037e087f017e027f017e0e7f027e017f017e037f117e230041d00e6b22012400200141f8086a10d201200120012802f808410b70220236029c01200141980d6a22034200370300200141800d6a41106a22044200370300200141800d6a41086a22054200370300200142003703800d200141d80c6a41d4dcc700410810c5012005200141d80c6a41086a290000370300200120012900d80c3703800d200141880e6a41bba8c700410d10c5012003200141880e6a41086a290000370300200420012900880e37030020014180016a200141800d6a412010d30120014180016a41106a290300210620012903880121072001290380012108024002400240024002400240411010322203450d002003200742002008a722051b37030020032006420020051b370308200141f497c1003602cc08200120033602c808200141003602c00c200142083703b80c200141003602d00c200142013703c80c200141d0036a41e6dcc700410710c501200141c8066a418893c700410a10c501412010322203450d00200142203702a401200120033602a001200141a0016a4100411010c80120012802a00120012802a80122036a220520012900d003370000200541086a200141d0036a41086a2900003700002001200341106a22033602a801200141a0016a2003411010c80120012802a001220920012802a80122036a220520012900c806370000200541086a200141c8066a41086a2900003700002001200341106a22033602a8010240024002402003417f4c0d004101210502402003450d00200310322205450d040b4100210a2001410036028009200120033602fc08200120053602f808200141f8086a4100200310c80120012802f808200128028009220b6a2009200310c9081a2001418c096a200141a0016a41086a220c280200360200200141003a0094092001411036029009200141880e6a41186a2209200129039009370300200120012903a00137028409200141880e6a41106a200141f8086a41106a220529030022063703002001200b20036a36028009200141880e6a41086a2001290380092207370300200120012903f80822083703880e20014190056a41106a200637030020014190056a41086a200737030020014190056a41186a20092903003703002001200837039005200141f8086a20014190056a10b6014100210d024020012802f8084101470d00200141f8086a410472210e4100210d4108210f0340200141c8066a41206a200e41206a280200360200200141c8066a41186a2203200e41186a2902002206370300200141c8066a41106a220b200e41106a2902002207370300200141c8066a41086a2210200e41086a29020022083703002001200e29020022113703c806200141a0016a41186a22122006370300200141a0016a41106a22132007370300200c2008370300200120113703a001200141f8086a41186a220920032903003703002005200b290300370300200141f8086a41086a220b2010290300370300200120012903c8063703f80820012802c808200141a0016a20012802cc0828020c1105002106412010322210450d05201020012903a001370000201041186a2012290300370000201041106a2013290300370000201041086a200c290300370000200141d0036a41086a200b2903002207370300200141d0036a41106a20052903002208370300200141d0036a41186a20092903002211370300200120012903f80822143703d0032009201137030020052008370300200b2007370300200120143703f8080240200d20012802bc0c470d00200141b80c6a200d10d50120012802c00c210d20012802b80c210f0b200f200d41386c6a22032006370300200b2903002106200529030021072009290300210820012903f80821112003412c6a4281808080103702002003201036022820032011370308200341206a2008370300200341186a2007370300200341106a2006370300200120012802c00c41016a220d3602c00c2009201229030037030020052013290300370300200b200c290300370300200120012903a0013703f808024020012802d00c220320012802cc0c470d00200141c80c6a2003410110d60120012802d00c21030b20012802c80c20034105746a221020012903f808370000201041086a200b290300370000201041106a2005290300370000201041186a20092903003700002001200341016a220a3602d00c200141f8086a20014190056a10b60120012802f8084101460d000b0b0240200128029405450d00200128029005102c0b0240200141a0056a280200450d00200128029c05102c0b200141d0036a41e6dcc700410710c501200141c8066a41b18ec100410a10c501412010322203450d03200142203702a401200120033602a001200141a0016a4100411010c80120012802a00120012802a80122036a220520012900d003370000200541086a200141d0036a41086a2900003700002001200341106a22033602a801200141a0016a2003411010c80120012802a001220520012802a80122036a220920012900c806370000200941086a200141c8066a41086a2900003700002001200341106a22033602a8012003417f4c0d000240024020030d00410121090c010b200310322209450d040b2001410036028009200120033602fc08200120093602f808200141f8086a4100200310c80120012802f80820012802800922096a2005200310c9081a2001418c096a200141a0016a41086a2215280200360200200141003a0094092001411136029009200141d80c6a41186a2205200129039009370300200120012903a00137028409200141d80c6a41106a200141f8086a41106a221629030022063703002001200920036a36028009200141d80c6a41086a2001290380092207370300200120012903f80822083703d80c200141c8066a41106a2006370300200141c8066a41086a2007370300200141c8066a41186a2005290300370300200120083703c8062001200141c8086a3602e806200141f8086a200141c8066a10b801024020012d00a8094102460d000340200141d0036a41186a2217200141f8086a41186a22182903002206370300200141d0036a41106a221920162903002207370300200141d0036a41086a221a200141f8086a41086a221b2903002208370300200120012903f80822143703d003200128029809211c20012802a409211d200129029c092111200141e0026a41186a2006370300200141e0026a41106a2007370300200141e0026a41086a2008370300200120143703e00202402011422088a72210450d002010417f6a211241002109201c210341002105034002400240024020102005460d00200120033602800d200141880e6a200141800d6a10d80102400240024020012802940e220b450d0020012802900e210e024020012802980e220c450d00200c41ffffffff0371450d00200b102c0b200e201d4b0d010b02402009450d00200520096b220b20104f0d02200141800d6a41186a220e200320094105746b220b41186a220c290000370300200141800d6a41106a2213200b41106a220f290000370300200141800d6a41086a221e200b41086a221f2900003703002001200b2900003703800d200341086a22202900002106200341106a22212900002107200341186a22222900002108200b2003290000370000200c2008370000200f2007370000201f20063700002022200e290300370000202120132903003700002020201e290300370000200320012903800d3700000c040b4100210920122005470d040c060b200941016a21090c020b200b201041e48ac500103f000b2010201041f48ac500103f000b20122005470d002009417f6a20104f0d02201142ffffffff0f83201020096bad4220868421110c020b200541016a2105200341206a21030c000b0b200141a0016a41186a20172903002206370300200141a0016a41106a201929030022073703002015201a2903002208370300200120012903d00322143703a0012018200637030020162007370300201b2008370300200120143703f80820012802e8062203280200200141f8086a200328020428020c110500210620014190056a41186a2018290300220737030020014190056a41106a2016290300220837030020014190056a41086a201b2903002214370300200120012903f8082223370390052018200737030020162008370300201b2014370300200120233703f8080240200d20012802bc0c470d00200141b80c6a200d10d5010b20012802b80c200d41386c6a22032006370300200320012903f8083703082003201c360228200341106a201b290300370300200341186a2016290300370300200341206a20182903003703002003412c6a20113702002001200d41016a220d3602c00c200141f8086a200141c8066a10b80120012d00a8094102470d000b0b024020012802cc06450d0020012802c806102c0b0240200141c8066a41106a280200450d0020012802d406102c0b20014190096a22094200370300200141f8086a41106a22054200370300200141f8086a41086a22034200370300200142003703f808200141d0036a41e6dcc700410710c5012003200141d0036a41086a220b290000370300200120012900d0033703f808200141c8066a419cb8c200411510c5012009200141c8066a41086a2210290000370300200520012900c806370300200141f8006a200141f8086a412010c601024002400240200a200128027c410020012802781b220e4101200e41014b1b4f0d00024041002802d8d248450d0020014190096a420037030020014188096a22094200370300200141f8086a41086a22034200370300200142003703f808200141d0036a41e6dcc700410710c5012003200141d0036a41086a290000370300200120012900d0033703f808200141c8066a41ccbac200410a10c501200541086a200141c8066a41086a290000370000200520012900c806370000200141e0006a200141f8086a412010c601200141123602d403200120012903603703c8062001200141c8066a3602d00341002802d4d248210541002802d0d248210b41002802dcd2482110200141b8096a41f316360200200141b0096a42de80808010370300200141ac096a41acc5c300360200200141a4096a420e370200200141a0096a41e28fc100360200200141f8086a41206a4201370300200942023703002003410736020020014194096a200141d0036a3602002001419498c10036028409200141db8fc1003602fc08200141013602f808200b41f8a3c000201041024622031b200141f8086a200541e0a3c00020031b2802101103000b024020012802cc0c41ffffff3f71450d0020012802c80c102c0b20012802b80c2109024020012802c00c2203450d00200341386c2105200941286a210303400240200341046a28020041ffffff3f71450d002003280200102c0b200341386a2103200541486a22050d000b0b4100211020012802bc0c2203450d01200341386c450d012009102c0c010b2009420037030020014188096a220e420037030020034200370300200142003703f808200141d0036a41e6dcc700410710c5012003200b290000370300200120012900d0033703f808200141c8066a41f4b7c200410e10c501200541086a2010290000370000200520012900c806370000200141f0006a200141f8086a412010c601200128027421052001280270210c200b200141c80c6a41086a280200360200200120012903c80c3703d0032010200141b80c6a41086a280200360200200120012903b80c3703c806200141f8086a200141d0036a200141c8066a10da01200141d8086a41086a20032802002212360200200120012903f80822063703d808200141a80d6a41086a2001418c096a2802002213360200200120012902840922073703a80d200b2012360200200120063703d00320102013360200200120073703c806200141f8086a20054100200c1b220c200141d0036a200141c8066a10db01200141a0016a41086a20092802003602002001200e2903003703a0012003280200211a20012802fc0821160240024020012802f8084101470d002016210b201a21100c010b20014184096a2802002105200141c80d6a41086a200141a0016a41086a280200360200200120012903a0013703c80d200141c80d6a20024200420010ab01201620054102746a21120240024002400240024002400240024002400240200c0d00201621032016210b0c010b201621032016210b20122016460d0020054102742110201621032016210b024003402003220941046a210320092802002205450d022005280208220e41016a41004c0d032005200e36020802400240200541f4006a2d00000d0020052005280200417f6a220936020020090d01200541046a22092009280200417f6a220936020020090d012005102c0c010b200b2005360200200b41046a210b200c417f6a220c450d020b2010417c6a22100d000b201221030c010b200941046a21030b0240201220036b2205450d00200541027541027421050340200328020022092009280200417f6a3602000240200328020022092802000d00200941046a22092009280200417f6a3602002003280200220941046a2802000d002009102c0b200341046a21032005417c6a22050d000b0b200b20166b221541027522184115490d032018410176220341ffffffff03712003470d0b2003410274220a417f4c0d0b200a1032221b450d0e2001410036028009200142043703f8082016417c6a2117201641746a211941042105410021032018211c02400340201c21134100211c4101210b02402013417f6a220e450d000240024002400240024002400240024002400240024002402016200e4102746a2802002209280208220b41016a41004c0d002009200b36020820162013417e6a22124102746a280200220b280208221041016a41004c0d0120092802502109200b20103602082009200b280250490d04201920134102746a21094100211c410021100340024020122010470d002013210b0c0e0b200941046a280200220b280208220e41016a41004c0d03200b200e3602082009280200220e280208220c41016a41004c0d04200b280250210b200e200c3602082009417c6a2109201041016a2110200b200e2802504f0d000b201041016a210b2010417f7320136a210e0c050b41fcaec8004118200141d0036a41a0bec00041b0bec0001040000b41fcaec8004118200141d0036a41a0bec00041b0bec0001040000b41fcaec8004118200141d0036a41a0bec00041b0bec0001040000b41fcaec8004118200141d0036a41a0bec00041b0bec0001040000b2019201341027422126a2109024003400240200e4101470d004100210e0c020b200941046a280200220b280208221041016a41004c0d03200b201036020820092802002210280208220c41016a41004c0d04200b280250210b2010200c3602082009417c6a2109200e417f6a210e200b2010280250490d000b0b2013200e490d03201320184b0d042013200e6b220b410176220c450d00201720126a21092016200e4102746a21100340201028020021122010200928020036020020092012360200201041046a21102009417c6a2109200c417f6a220c0d000b0b0240200e0d00200e211c0c070b0240200b41094d0d00200e211c0c070b201320184b0d042013200e6b210b200e417f6a21092017200e4102746a2110034020132009490d0b2010200b41016a220b10bd012009417f6a220e20094f0d062010417c6a2110200e2109200b410a490d000c060b0b41fcaec8004118200141d0036a41a0bec00041b0bec0001040000b41fcaec8004118200141d0036a41a0bec00041b0bec0001040000b200e201341b8a3c8001059000b2013201841b8a3c800104f000b2013200e417f6a2209490d052013201841c8a3c800104f000b200e41016a211c0b0240200320012802fc08470d00200141f8086a10ae01200128028009210320012802f80821050b200520034103746a2209200b3602042009201c3602002001200341016a2203360280090240024020034102490d0020012802f808210503400240024002400240024020052003417f6a4103746a2209280200450d00200341037420056a220e41746a28020022102009280204220b4b0d010b20034103490d022009280204210b20052003417d6a221f4103746a28020421090c010b200341024d0d0420052003417d6a221f4103746a2802042209200b20106a4d0d00200341034d0d04200e41646a280200200920106a4b0d040b2009200b490d010b2003417e6a211f0b0240024002400240024002400240024002402003201f41016a22204d0d002003201f4d0d012005201f41037422226a2203280204221d20032802006a220320052020410374220d6a22052802002221490d02200320184b0d03201620214102746a220f2005280204221e41027422056a210920034102742110200320216b220e201e6b2203201e4f0d06201b20092003410274220510c908221220056a210b201e4101480d0720034101480d07201720106a2110200921050340200b417c6a22032802002209280208220e41016a41004c0d052009200e3602082005417c6a220e280200220c280208221341016a41004c0d0620092802502109200c20133602082010200e20032009200c2802504922091b280200360200200b200320091b210b0240200f200e200520091b2205490d00201221030c0a0b2010417c6a211020122103200b20124b0d000c090b0b2020200341d8a3c800103f000b201f200341e8a3c800103f000b2021200341f8a3c8001059000b2003201841f8a3c800104f000b41fcaec8004118200141d0036a41a0bec00041b0bec0001040000b41fcaec8004118200141d0036a41a0bec00041b0bec0001040000b201b200f200510c908220320056a210b0240201e4101480d00200e201e4c0d00201620106a211220032103200f210502400240034020092802002210280208220e41016a41004c0d012010200e3602082003280200220e280208220c41016a41004c0d0220102802502110200e200c3602082005200920032010200e2802504922101b2802003602002003200341046a20101b2103200541046a2105200941046a200920101b220920124f0d05200b20034b0d000c050b0b41fcaec8004118200141d0036a41a0bec00041b0bec0001040000b41fcaec8004118200141d0036a41a0bec00041b0bec0001040000b20032103200f21050c010b20122103200921050b20052003200b20036b417c7110c9081a2001280280092203201f4d0d0220012802f808220520226a2209201d201e6a36020420092021360200200320204d0d042005200d6a2209200941086a20032020417f736a41037410ca081a20012003417f6a220336028009200341014b0d000b0b201c450d050c010b0b201f20034188a4c800103f000b202020031047000b41fcaec8004118200141d0036a41948bc50041a48bc5001040000b2009201341c8a3c8001059000b024020012802fc0841ffffffff0171450d0020012802f808102c0b200a450d01201b102c0c010b20184102490d002018417e6a210341022105201841027420166a41786a2109034020182003490d022009200510bd012009417c6a2109200541016a21052003417f6a2203417f470d000b0b20012802d00d210520012802cc0d2109200120012802c80d22033602880d200120093602840d200120033602800d20012003200541e0006c6a222036028c0d024002402005450d00200141f8086a41346a2105024002400340200141c8066a41286a220b200341286a290300370300200141c8066a41206a2210200341206a290300370300200141c8066a41186a220e200341186a290300370300200141c8066a41106a220c200341106a290300370300200141c8066a41086a2212200341086a290300370300200120032903003703c806200341306a2802002109200141e0026a41086a22132003413c6a290200370300200141e0026a41106a220f200341c4006a290200370300200141e0026a41186a221e200341cc006a2902003703002001200341346a2902003703e0022009450d01200341d4006a280200211f200341d8006a2902002106200141f8086a41286a200b290300370300200141f8086a41206a2010290300370300200141f8086a41186a200e290300370300200141f8086a41106a200c290300370300200141f8086a41086a2012290300370300200120012903c8063703f808200120093602a809200520012903e002370200200541086a2013290300370200200541106a200f290300370200200541186a201e290300370200200120063703d0092001201f3602cc09200141d0036a200141f8086a10dc01024020012802d00322090d00200341e0006a22032020470d010c030b0b20014190056a41086a2205200141d0036a41146a290200370300200141a0056a220b200141d0036a411c6a290200370300200141a8056a2210200141d0036a41246a2902003703002001200341e0006a3602880d2001200141dc036a29020037039005200141d0036a41086a280200210320012802d403210e412c1032221d450d0d201d2003360208201d200e360204201d2009360200201d20012903900537020c201d41146a2005290300370200201d411c6a200b290300370200201d41246a201029030037020020014281808080103702ec0d2001201d3602e80d2005200141800d6a41086a2903002206370300200120012903800d37039005024002402006a72209200128029c052222470d00410121130c010b200141d0036a410c6a210d200141f8086a41346a2105410121130340200941e0006a2109024002400340200141c8066a41286a2210200941a07f6a220341286a290300370300200141c8066a41206a220e200341206a290300370300200141c8066a41186a220c200341186a290300370300200141c8066a41106a2212200341106a290300370300200141c8066a41086a220f200341086a290300370300200120032903003703c806200341306a280200210b200141e0026a41086a221e2003413c6a290200370300200141e0026a41106a221f200341c4006a290200370300200141e0026a41186a2220200341cc006a2902003703002001200341346a2902003703e002200b450d01200341d4006a2802002121200341d8006a2902002106200141f8086a41286a2010290300370300200141f8086a41206a200e290300370300200141f8086a41186a2210200c290300370300200141f8086a41106a220e2012290300370300200141f8086a41086a220c200f290300370300200120012903c8063703f8082001200b3602a809200520012903e002370200200541086a201e290300370200200541106a201f290300370200200541186a2020290300370200200120063703d009200120213602cc09200141d0036a200141f8086a10dc0120012802d003220b0d02200941e0006a2109200341e0006a2022470d000b202221090b20012009360298050c020b200141880e6a41086a200d41086a2902002206370300200141880e6a41106a200d41106a2902002207370300200141880e6a41186a200d41186a29020022083703002001200d29020022113703880e20012802d803211220012802d403210f20102008370300200e2007370300200c2006370300200120113703f8080240201320012802ec0d470d00200141e80d6a2013410110dd0120012802e80d211d0b201d2013412c6c6a2203200f3602042003200b360200200341086a20123602002003410c6a20012903f808370200200341146a200c2903003702002003411c6a200e290300370200200341246a20102903003702002001201341016a22133602f00d20222009470d000b20012022360298050b20014190056a10de0120012802e80d212120012802ec0d21220c030b200341e0006a21200b200120203602880d0b200141800d6a10de014100212241042121410021130b2013412c6c210320212105024003402003450d01200341546a2103200141e8006a200510df012005412c6a21052001280268220b450d000b200128026c211002402013450d002013412c6c21052021210303400240200341046a2802002209450d00200941226c450d002003280200102c0b2003412c6a2103200541546a22050d000b0b02402022450d002022412c6c450d002021102c0b02402015450d0020184102742105201621030340200328020022092009280200417f6a3602000240200328020022092802000d00200941046a22092009280200417f6a3602002003280200220941046a2802000d002009102c0b200341046a21032005417c6a22050d000b0b201a450d042016450d04201a41ffffffff0371450d042016102c0c040b200141003602d006200142083703c806200141c8066a4100201810e00120012802d006210b02400240201841027422050d00201621030c010b201620056a211d2018410274211020012802c806200b41306c6a2105200141800d6a41186a210e200141800d6a41106a210c200141800d6a41086a211220162109024003400240200928020022030d00200941046a21030c020b200328020841016a220f41004c0d042003200f360208200e200341ec006a290000370300200c200341e4006a2900003703002012200341dc006a2900003703002001200341d4006a2900003703800d2003280208220f41016a221e41004c0d052003201e360208200e2903002106200c2903002107201229030021082003200f417f6a360208200141f8086a41086a220f2008370300200141f8086a41106a221e2007370300200141f8086a41186a221f2006370300200120012903800d3703f808200341c8006a29030021062003290340210720032003280200417f6a2220360200024020200d00200341046a22202020280200417f6a222036020020200d002003102c0b200941046a2109200520012903f808370300200f2903002108201e2903002111201f2903002114200541286a2006370300200541206a2007370300200541186a2014370300200541106a2011370300200541086a2008370300200541306a2105200b41016a210b2010417c6a22100d000b201d21030b201d20036b220541027521180b2001200b3602d00602402005450d00201841027421050340200328020022092009280200417f6a3602000240200328020022092802000d00200941046a22092009280200417f6a3602002003280200220941046a2802000d002009102c0b200341046a21032005417c6a22050d000b0b0240201a450d002016450d00201a41ffffffff0371450d002016102c0b20012902cc06210620012802c80621100c050b2003201841a8a3c8001058000b41fcaec8004118200141d0036a41a0a4c70041b0a4c7001040000b41fcaec8004118200141d0036a41a0a4c70041c0a4c7001040000b200120103602cc062001200b3602c8064100211041002802d8d248450d00200141043602ec0d2001200141c8066a3602e80d41002802d4d248210341002802d0d248210541002802dcd2482109200141b8096a41fc16360200200141b0096a42de80808010370300200141ac096a41acc5c300360200200141a4096a420e370200200141a0096a41e28fc10036020020014198096a420137030020014188096a420137030020014180096a410736020020014194096a200141e80d6a3602002001418c98c10036028409200141db8fc1003602fc08200141013602f808200541f8a3c000200941024622091b200141f8086a200341e0a3c00020091b2802101103000c010b0b20012802c80820012802cc08280200110200024020012802cc08280204450d0020012802c808102c0b02400240024002402010450d00200141f8086a109b010240200141f8086a41186a2903004200510d002001420020014198096a290300220742809ce8af6d7c220820082007561b37038803200141800d6a41186a4200370300200141900d6a22054200370300200141800d6a41086a22034200370300200142003703800d200141d80c6a41e6dcc700410710c5012003200141d80c6a41086a2209290000370300200120012900d80c3703800d200141880e6a41ec8ec100411210c501200441086a220b200141880e6a41086a220e290000370000200420012900880e370000200141f8086a200141800d6a10e1010240024020012802f808220c450d00200120012902fc08370294032001200c36029003200141980d6a42003703002005420037030020034200370300200142003703800d200141d80c6a41e6dcc700410710c50120032009290000370300200120012900d80c3703800d200141880e6a41fe8ec100411210c501200b200e290000370000200420012900880e370000200141f8086a200141800d6a10e101024020012802f8082203450d00200120012902fc0822243702a403200120033602a00320012f0198032102200141003602b803200142013703b003200141b0036a41002006422088a741306c220b41306d10d6012006a7210e20012802b80321090240200b450d0020012802b00320094105746a2103201021050340200541086a2900002106200541106a290000210720052900002108200341186a200541186a290000370000200341106a2007370000200341086a200637000020032008370000200941016a2109200341206a2103200541306a2105200b41506a220b0d000b0b200120093602b8030240200e450d00200e41306c450d002010102c0b2001201336028009200120223602fc08200120213602f808200141980d6a4200370300200141800d6a41106a4200370300200141800d6a41086a22034200370300200142003703800d200141d80c6a41d4dcc700410810c5012003200141d80c6a41086a290000370300200120012900d80c3703800d200141880e6a41bba8c700410d10c501200441086a200141880e6a41086a290000370000200420012900880e370000200141c8006a200141800d6a412010d301200141c8006a41106a29030021062001290350210720012903482108411010322203450d0b2003200742002008a722051b37030020032006420020051b370308200141c0036a200141f8086a200310e201200141c0036a10e30120012802c003221520012802c8032203412c6c6a211720012802c40321250240024020030d00201521122015210e0c010b200141880e6a41086a2120200141880e6a41106a2121200141880e6a41186a21222015211203402012220e280208210b200e280204211e2020200e41146a221d2902003703002021200e411c6a220d2902003703002022200e41246a22162902003703002001200e29020c3703880e200e412c6a2112200e280200220f450d0120014190056a41186a2218202229030037030020014190056a41106a221b202129030037030020014190056a41086a221c2020290300370300200120012903880e3703900502400240200b41306c22100d0042002107420021060c010b200f41206a21034200210720102105420021060340427f2006200341086a2903007c200720032903007c22082007542209ad7c22072009200720065420072006511b22091b2106427f200820091b2107200341306a2103200541506a22050d000b0b024002400240200b41306c2205450d00200f20106a2113200f21030340200341286a2903002108200341206a2903002111200341086a2900002114200341106a290000212320032900002126200141800d6a41186a2209200341186a290000370300200141800d6a41106a220b2023370300200141800d6a41086a22102014370300200120263703800d201120082007200610e401220c41ffff03710d02200341306a2103200541506a22050d000b0b41002103410221050240201e450d00201e41306c450d00200f102c0b4100210c0c010b200141d0036a41086a22192010290300370300200141d0036a41106a221a200b290300370300200141d0036a41186a220a2009290300370300200120012903800d22083703c806200120083703d00341221032221f450d0e201f20012903d003370100201f200c3b0120201f41186a200a290300370100201f41106a201a290300370100201f41086a201929030037010020014281808080103702dc0c2001201f3602d80c0240024020054130470d004101210c0c010b200341306a211a201341506a210a4101210c0340201a210302400340200341286a2903002108200341206a29030021112009200341186a290000370300200b200341106a2900003703002010200341086a290000370300200120032900003703800d201120082007200610e401220541ffff03710d012013200341306a2203470d000c030b0b200141c8066a41086a20102903002208370300200141c8066a41106a200b2903002211370300200141c8066a41186a20092903002214370300200120012903800d22233703c806200141f8086a41186a22272014370300200141f8086a41106a22282011370300200141f8086a41086a22292008370300200120233703f8080240200c20012802dc0c470d00200141d80c6a200c410110e50120012802d80c211f0b200341306a211a201f200c41226c6a221920012903f808370100202929030021082028290300211120272903002114201920053b0120201941186a2014370100201941106a2011370100201941086a20083701002001200c41016a220c3602e00c200a2003470d000b0b0240201e450d00201e41306c450d00200f102c0b20012802dc0c210320012802d80c21050b200141f8086a41186a22092018290300370300200141f8086a41106a220b201b290300370300200141f8086a41086a2210201c29030037030020012001290390053703f808200e2003360204200e200c360208200e2005360200200e20012903f80837020c201d2010290300370200200d200b2903003702002016200929030037020020122017470d000b2012210e201721120b20244220882107201720126b2203412c6d210502402003450d002005412c6c210303400240201241046a2802002205450d00200541306c450d002012280200102c0b2012412c6a2112200341546a22030d000b0b2007a7211c200e20156b2209412c6d2205412c6c21032005ad4220862025ad8421062015210503402003450d03200341546a2103200141c0006a200510df012005412c6a21052001280240220b450d000b2001280244ad210602402009450d0020152103034020032205412c6a21030240200541046a2802002209450d00200941226c450d002005280200102c0b200e2003470d000b0b20064220862106200bad210702402025450d002025412c6c450d002015102c0b20062007842106410321090c0d0b20012802940341ffffff3f71450d00200128029003102c0b02402006a72203450d00200341306c450d002010102c0b02402013450d002013412c6c21052021210303400240200341046a2802002209450d00200941226c450d002003280200102c0b2003412c6a2103200541546a22050d000b0b410621094101210320220d030c0a0b200120063702cc06200120153602c806200141f8086a200141c8066a200141a0036a20014190036a10e60120014180096a290300210620012802fc08210920012802f8084101460d0a2006422088212a200141b80a6a2802002110200141b00a6a290300212b200141ac0a6a280200210e200141a40a6a290200212c200141a00a6a280200210c200141980a6a290300212d200141940a6a28020021122001418c0a6a290200212e200141880a6a2802002113200141800a6a290300212f200141fc096a280200210f200141f4096a2902002130200141f0096a280200211e200141e8096a2903002131200141e4096a280200211f200141dc096a2902002132200141d8096a2802002120200141d0096a2903002133200141cc096a2802002121200141c4096a2902002134200141c0096a2802002122200141b8096a2903002135200141b4096a280200211d200141ac096a2902002136200141a8096a280200210d200141a0096a29030021372001419c096a280200211620014194096a290200213820014190096a280200211820014188096a290300213920012802b803211b41002105201c450d042001290388032108200742f8ad377e2002ad4280bce9007e7c2123201bad221142c0f0f50b7e2126201142a8ada6047e213a201c210302402024422188a7220b450d00427f2023200742d0fec82f7e7c203a7c20074280c2d72f7e7c20267c22114280a7f2a6017c2214201420114280a3c3c7007c541b2111201c21050340024002400240417f201120085220112008541b41016a0e03000901000b02402005200b6a220320054f0d00200521030c040b2003201c490d01200521030c030b2005200b6b220320054d0d00200521030c020b20032005460d06427f20232003ad221142d0fec82f7e7c203a7c20114280c2d72f7e7c20267c22114280a7f2a6017c2214201420114280a3c3c7007c541b211120032105200b410176220b0d000b0b024003402003220541016a2203201c4b0d01427f20232003ad221142d0fec82f7e7c203a7c20114280c2d72f7e7c20267c22114280a7f2a6017c2214201420114280a3c3c7007c541b2008540d000b0b410021172005417f6a20054b0d0303400240427f20232005ad221142d0fec82f7e7c203a7c20114280c2d72f7e7c20267c22114280a7f2a6017c2214201420114280a3c3c7007c541b2008560d00200521170c050b2005417e6a21032005417f6a220b21052003200b4d0d000c040b0b4192bdc000413e41d0bdc000105c000b200041043602000c0b0b2021450d062022412c6c450d062021102c0c090b201c20172017201c4b1b21050b202aa72103200120053602cc030240024041002802d8d24841034b0d00417f417f417f417f417f417f417f417f417f417f417f417f417f417f417f200320186a220b200b2003491b220320166a220b200b2003491b2203200d6a220b200b2003491b2203201d6a220b200b2003491b220320226a220b200b2003491b220320216a220b200b2003491b220320206a220b200b2003491b2203201f6a220b200b2003491b2203201e6a220b200b2003491b2203200f6a220b200b2003491b220320136a220b200b2003491b220320126a220b200b2003491b2203200c6a220b200b2003491b2203200e6a220b200b2003491b220320106a220b200b2003491b21030c010b200141c8066a411c6a4113360200200141dc066a4113360200200141d4066a41143602002001427f427f200742f8ad377e2002ad4280bce9007e7c417f417f417f417f417f417f417f417f417f417f417f417f417f417f417f200320186a220520052003491b220320166a220520052003491b2203200d6a220520052003491b2203201d6a220520052003491b220320226a220520052003491b220320216a220520052003491b220320206a220520052003491b2203201f6a220520052003491b2203201e6a220520052003491b2203200f6a220520052003491b220320136a220520052003491b220320126a220520052003491b2203200c6a220520052003491b2203200e6a220520052003491b220320106a220520052003491b2203ad220742d0fec82f7e7c201bad220842a8ada6047e7c20074280c2d72f7e7c4280a3c3c7007c2207200842c0f0f50b7e7c220820082007541b2207428084afdf007c220820082007541b3703d003200141143602cc062001200336029005200120014190056a3602e0062001200141cc036a3602d8062001200141d0036a3602d006200120014188036a3602c80641002802d4d248210541002802d0d248210b41002802dcd248211b200141b8096a419103360200200141b0096a42ec80808010370300200141ac096a41f1c7c000360200200141a4096a4221370200200141a0096a41d0c7c00036020020014198096a420437030020014188096a420437030020014180096a4107360200200141f8086a411c6a200141c8066a36020020014188c6c00036028409200141db8fc1003602fc08200141043602f808200b41f8a3c000201b410246221b1b200141f8086a200541e0a3c000201b1b28021011030020012802cc0321050b200141b40a6a2010360200200141a80a6a200e3602002001419c0a6a200c360200200141900a6a2012360200200141840a6a2013360200200141f8096a200f360200200141ec096a201e360200200141e0096a201f360200200141d4096a2020360200200141c8096a2021360200200141bc096a2022360200200141b0096a201d360200200141a4096a200d36020020014198096a20163602002001418c096a20183602002001202b3702ac0a2001202c3703a00a2001202d3702940a2001202e3703880a2001202f3702fc09200120303703f009200120313702e409200120323703d809200120333702cc09200120343703c009200120353702b409200120363703a8092001203737029c0920012038370390092001203937028409200120063702fc08200120093602f80820014184096a2115024002400240024002400240200320056b221a20034b0d00201a450d00200141980d6a4200370300200141800d6a41106a4200370300200141800d6a41086a22034200370300200142003703800d200141d80c6a41d4dcc700410810c5012003200141d80c6a41086a290000370300200120012900d80c3703800d200141880e6a41bba8c700410d10c501200441086a200141880e6a41086a290000370000200420012900880e370000200141286a200141800d6a412010d301200141286a41106a29030021062001290330210720012903282108411010322203450d092003200742002008a722051b37030020032006420020051b370308200141f497c1003602cc0c200120033602c80c200141d80c6a41e6dcc700410710c501200141880e6a41b18ec100410a10c501412010322203450d09200142203702840d200120033602800d200141800d6a4100411010c80120012802800d20012802880d22036a220520012900d80c370000200541086a200141d80c6a41086a2900003700002001200341106a22033602880d200141800d6a2003411010c80120012802800d220520012802880d22036a220920012900880e370000200941086a200141880e6a41086a2900003700002001200341106a22033602880d2003417f4c0d060240024020030d00410121090c010b200310322209450d0a0b200141003602900e2001200336028c0e200120093602880e200141880e6a4100200310c80120012802880e20012802900e22096a2005200310c9081a2001419c0e6a200141800d6a41086a220b280200360200200141003a00a40e200141113602a00e200141d8086a41186a220520012903a00e370300200120012903800d3702940e200141d8086a41106a200141880e6a41106a221029030022063703002001200920036a3602900e200141d8086a41086a20012903900e2207370300200120012903880e22083703d808200141d80c6a41106a2006370300200141d80c6a41086a2007370300200141d80c6a41186a2005290300370300200120083703d80c2001200141c80c6a3602f80c200141880e6a200141d80c6a10b80120012d00b80e4102460d03200141e80d6a41186a200141880e6a41186a2903002206370300200141e80d6a41106a20102903002207370300200141e80d6a41086a200141880e6a41086a2903002208370300200141c80d6a41086a2008370300200141c80d6a41106a2007370300200141c80d6a41186a2006370300200120012903880e22113703e80d200120113703c80d20012802a80e210920012802ac0e2103200141800d6a41186a2006370300200141800d6a41106a2007370300200b2008370300200120113703800d20012802f80c2205280200200141800d6a200528020428020c110500210602402003450d002009450d00200341ffffff3f71450d002009102c0b41281032221d450d09201d20012903c80d370300201d2006370320201d41186a200141c80d6a41186a221f290300370300201d41106a200141c80d6a41106a2220290300370300201d41086a200141c80d6a41086a2221290300370300200141800d6a41206a200141d80c6a41206a280200360200200141800d6a41186a200141d80c6a41186a290300370300200141800d6a41106a200141d80c6a41106a290300370300200141800d6a41086a200141d80c6a41086a290300370300200120012903d80c3703800d200141880e6a200141800d6a10b8010240024020012d00b80e4102470d00410121194101211b0c010b41c8002105410121194101211b0340201f200141880e6a41186a220929030022063703002020200141880e6a41106a220b29030022073703002021200141880e6a41086a22102903002208370300200141a80d6a41086a220e2008370300200141a80d6a41106a220c2007370300200141a80d6a41186a22122006370300200120012903880e22113703c80d200120113703a80d20012802a80e210f20012802ac0e2103200141e80d6a41186a2006370300200141e80d6a41106a2007370300200141e80d6a41086a2008370300200120113703e80d20012802a00d2213280200200141e80d6a201328020428020c110500210602402003450d00200f450d00200341ffffff3f71450d00200f102c0b20092012290300370300200b200c2903003703002010200e290300370300200120012903a80d3703880e0240201b2019470d00201941016a22032019490d092019410174220e2003200e20034b1b22034104200341044b1bad42287e2207422088a70d0941000d092007a722034100480d09201941286c201e20191b211e024002400240201d410020191b220e0d0020030d014108211d0c020b0240201e0d0020030d014108211d0c020b200e201e20031035221d450d0e0c010b20031032221d450d0d0b200341286e21190b201d20056a220e41606a220320012903880e37030020102903002107200b290300210820092903002111200e2006370300200341186a2011370300200341106a2008370300200341086a2007370300200541286a2105201b41016a211b200141880e6a200141800d6a10b80120012d00b80e4102470d000b0b024020012802840d450d0020012802800d102c0b0240200141900d6a280200450d00200128028c0d102c0b201b4115490d02201b410176ad42287e2206422088a70d062006a72228417f4c0d06202810322217450d09200141003602880d200142043703800d201d41586a210a201d41a87f6a2127201b212203402022210e41002122410121100240200e417f6a2209450d00024002400240024002400240201d200941286c6a41206a290300200e41286c220c201d6a41506a2903002206540d00200e417e6a210b2027200c6a2105410021224100210303400240200b2003470d00200e21100c080b200341016a21032006200529030022075a2109200541586a21052007210620090d000b200341016a21102003417f73200e6a21090c010b2027200c6a210302400340024020094101470d00410021090c020b2009417f6a2109200620032903002207542105200341586a21032007210620050d000b0b200e2009490d02200e201b4b0d01200e20096b2210410176220b450d00200a200c6a2103201d200941286c6a21050340200141a80d6a41186a220c200541186a2212290300370300200141a80d6a41106a2213200541106a220f290300370300200141a80d6a41086a221e200541086a221f290300370300200120052903003703a80d200341206a22202903002106200341086a22212903002107200341106a22222903002108200329030021112012200341186a220d290300370300200f2008370300201f200737030020052011370300200541206a2212290300210720122006370300200320012903a80d3703002021201e29030037030020222013290300370300200d200c29030037030020202007370300200341586a2103200541286a2105200b417f6a220b0d000b0b024020090d00200921220c050b0240201041094d0d00200921220c050b200e201b4b0d02200e20096b210b201d200941286c6a210c0340200e2009417f6a2222490d040240200e20226b22104102490d00201d200941286c6a220341206a2212290300201d202241286c6a220541206a22092903005a0d00200141880e6a41186a2213200541186a220f290300370300200141880e6a41106a221e200541106a221f290300370300200141880e6a41086a2220200541086a2221290300370300200120052903003703880e20092903002106200520032903003703002021200341086a290300370300201f200341106a290300370300200f200341186a29030037030020092012290300370300024020104103490d00200b417f6a211241002105200c210302400340200341c8006a220929030020065a0d02200b2005460d01200341206a2009290300370300200341186a200341c0006a290300370300200341106a200341386a290300370300200341086a200341306a2903003703002003200341286a2209290300370300200921032012200541016a2205470d000b200921030c010b200541016a2010419ca5c800103f000b200320012903880e37030020032006370320200341186a2013290300370300200341106a201e290300370300200341086a20202903003703000b2022450d05200b41016a210b200c41586a210c202221092010410a4f0d050c000b0b200e201b41b8a3c800104f000b2009200e41b8a3c8001059000b200e2009417f6a2222490d00200e201b41c8a3c800104f000b2022200e41c8a3c8001059000b024020012802880d220320012802840d470d00200141800d6a10ae0120012802880d21030b20012802800d220520034103746a22092010360204200920223602002001200341016a22033602880d024020034102490d0002400340024002400240024020052003417f6a4103746a2209280200450d00200341037420056a220e41746a28020022102009280204220b4d0d00200341024d0d0620052003417d6a221f4103746a2802042209200b20106a4d0d01200341034d0d06200e41646a280200200920106a4d0d010c060b20034103490d012009280204210b20052003417d6a221f4103746a28020421090b2009200b490d010b2003417e6a211f0b0240024002400240024002402003201f41016a22204d0d002003201f4d0d012005201f410374220d6a2203280204221620032802006a22032005202041037422186a22052802002221490d022003201b4b0d03201d202141286c6a220f2005280204221e41286c22056a2109200341286c210b200320216b2210201e6b2203201e4f0d0420172009200341286c220510c908220c20056a211302400240201e4101480d00200341014e0d010b200c2112200921050c060b200a200b6a2103200921052013210b034002400240200b41786a290300200941786a290300540d00200b41586a221321102009210e0c010b200b2110200941586a2205210e2009210b0b2003200b41586a2209290300370300200341206a200941206a290300370300200341186a200941186a290300370300200341106a200941106a290300370300200341086a200941086a29030037030002402010200c4b0d00200c21120c070b200341586a21032010210b200e2109200c2112200f200e490d000c060b0b2020200341d8a3c800103f000b201f200341e8a3c800103f000b2021200341f8a3c8001059000b2003201b41f8a3c800104f000b2017200f200510c908220320056a211302400240201e4101480d002010201e4a0d010b20032112200f21050c010b201d200b6a210e2003211220032103200f2105034002400240200941206a290300200341206a290300540d00200341286a2212210b200921100c010b200941286a21102003210b200921030b20052003290300370300200541206a200341206a290300370300200541186a200341186a290300370300200541106a200341106a290300370300200541086a200341086a290300370300200541286a2105200b20134f0d01200b2103201021092010200e490d000b0b20052012201320126b220320034128706b10c9081a024020012802880d2203201f4d0d0020012802800d2205200d6a22092016201e6a36020420092021360200200320204d0d02200520186a2209200941086a20032020417f736a41037410ca081a20012003417f6a22033602880d200341014d0d030c010b0b201f20034188a4c800103f000b202020031047000b2022450d020c000b0b024041002802d8d2484103490d00200141c5003602840d200141d8c6c0003602800d41002802d4d248210341002802d0d248210541002802dcd2482109200141c80e6a41b502360200200141c00e6a42ec80808010370300200141bc0e6a41f1c7c000360200200141b40e6a4221370200200141b00e6a41d0c7c000360200200141a80e6a4201370300200141980e6a4201370300200141900e6a4107360200200141a40e6a200141e80d6a360200200141b4b5c8003602940e200141db8fc10036028c0e200141033602880e200141043602ec0d200341e0a3c000200941024622091b28021021032001200141800d6a3602e80d200541f8a3c00020091b200141880e6a20031103000b20012902fc08210620012802f8082109200141c8066a201541b40110c9081a0c040b024020012802840d41ffffffff0171450d002005102c0b20284128490d022017102c0c020b201b4102490d01201d201b417f6a220941286c6a210e4100210b0340024002400240201b20092203417f6a2209490d00201b20096b22124102490d02201d200341286c6a220341206a220c290300201d200941286c6a220541206a22102903005a0d02200141880e6a41186a2213200541186a220f290300370300200141880e6a41106a221e200541106a221f290300370300200141880e6a41086a2220200541086a2221290300370300200120052903003703880e20102903002106200520032903003703002021200341086a290300370300201f200341106a290300370300200f200341186a2903003703002010200c29030037030020124103490d01200b417f6a210c41002105200e210302400340200341c8006a221029030020065a0d03200c2005460d01200341206a2010290300370300200341186a200341c0006a290300370300200341106a200341386a290300370300200341086a200341306a2903003703002003200341286a221029030037030020102103200b2005417f6a2205470d000b201021030c020b410120056b2012419ca5c800103f000b2009201b41a8a3c8001058000b200320012903880e37030020032006370320200341186a2013290300370300200341106a201e290300370300200341086a20202903003703000b200b417f6a210b200e41586a210e20090d000c020b0b024020012802dc0c450d0020012802d80c102c0b0240200141e80c6a280200450d0020012802e40c102c0b410021194108211d4100211b0b200141003602c80d4100210c0240201d201b41286c6a2213201d460d004100210c201d210b034041012109024020012802a8032205450d00200541057441606a41057641016a21104100210320012802a003210502400340200b2005460d012005200b412010cc08450d01200541206a2105410121092010200341016a2203470d000c020b0b410021090b2001200b41206a3602e80d0240024002400240024002400240024002400240024002400240024002400240024020090d00200b41286a210b200120033602d80c0240200128028009220e450d00200e41037441786a41037641016a21104100210920012802f8082105034020052802002003460d03200541086a21052010200941016a2209470d000b0b0240200128028c092212450d002012410c6c41746a21092012410274417c6a41027641016a210e410021102001280284092105034020052802002003460d04200941746a21092005410c6a2105200e201041016a2210470d000b0b0240200128029809220e450d00200e41047441706a41047641016a2110410021092001280290092105034020052802002003460d05200541106a21052010200941016a2209470d000b0b024020012802a4092212450d00201241146c416c6a21092012410274417c6a41027641016a210e41002110200128029c092105034020052802002003460d062009416c6a2109200541146a2105200e201041016a2210470d000b0b024020012802b0092212450d00201241186c41686a2109201241037441786a41037641016a210e4100211020012802a8092105034020052802002003460d07200941686a2109200541186a2105200e201041016a2210470d000b0b024020012802bc092212450d002012411c6c41646a21092012410274417c6a41027641016a210e4100211020012802b4092105034020052802002003460d08200941646a21092005411c6a2105200e201041016a2210470d000b0b024020012802c809220e450d00200e41057441606a41057641016a21104100210920012802c0092105034020052802002003460d09200541206a21052010200941016a2209470d000b0b024020012802d4092212450d00201241246c415c6a21092012410274417c6a41027641016a210e4100211020012802cc092105034020052802002003460d0a2009415c6a2109200541246a2105200e201041016a2210470d000b0b024020012802e0092212450d00201241286c41586a2109201241037441786a41037641016a210e4100211020012802d8092105034020052802002003460d0b200941586a2109200541286a2105200e201041016a2210470d000b0b024020012802ec092212450d002012412c6c41546a21092012410274417c6a41027641016a210e4100211020012802e4092105034020052802002003460d0c200941546a21092005412c6a2105200e201041016a2210470d000b0b024020012802f8092212450d00201241306c41506a2109201241047441706a41047641016a210e4100211020012802f0092105034020052802002003460d0d200941506a2109200541306a2105200e201041016a2210470d000b0b024020012802840a2212450d00201241346c414c6a21092012410274417c6a41027641016a210e4100211020012802fc092105034020052802002003460d0e2009414c6a2109200541346a2105200e201041016a2210470d000b0b024020012802900a2212450d00201241386c41486a2109201241037441786a41037641016a210e4100211020012802880a2105034020052802002003460d0f200941486a2109200541386a2105200e201041016a2210470d000b0b0240200128029c0a2212450d002012413c6c41446a21092012410274417c6a41027641016a210e4100211020012802940a2105034020052802002003460d10200941446a21092005413c6a2105200e201041016a2210470d000b0b02400240024020012802a80a220e450d00200e41067441406a41067641016a21104100210920012802a00a2105034020052802002003460d02200541c0006a21052010200941016a2209470d000b0b20012802b40a2212450d12201241c4006c41bc7f6a21092012410274417c6a41027641016a210e4100211020012802ac0a2105034020052802002003460d02200941bc7f6a2109200541c4006a2105200e201041016a2210470d000c130b0b2005200541c0006a200e2009417f736a41067410ca081a2001200e417f6a3602a80a0c100b2005200541c4006a200910ca081a20012012417f6a3602b40a0c0f0b02402019450d00201941286c450d00201d102c0b20012802c80c20012802cc0c280200110200024020012802cc0c280204450d0020012802c80c102c0b200141f8086a10e90120014190056a200141c8066a41b40110c9081a410921090c180b2005200541086a200e2009417f736a41037410ca081a2001200e417f6a360280090c0d0b20052005410c6a200910ca081a20012012417f6a36028c090c0c0b2005200541106a200e2009417f736a41047410ca081a2001200e417f6a360298090c0b0b2005200541146a200910ca081a20012012417f6a3602a4090c0a0b2005200541186a200910ca081a20012012417f6a3602b0090c090b20052005411c6a200910ca081a20012012417f6a3602bc090c080b2005200541206a200e2009417f736a41057410ca081a2001200e417f6a3602c8090c070b2005200541246a200910ca081a20012012417f6a3602d4090c060b2005200541286a200910ca081a20012012417f6a3602e0090c050b20052005412c6a200910ca081a20012012417f6a3602ec090c040b2005200541306a200910ca081a20012012417f6a3602f8090c030b2005200541346a200910ca081a20012012417f6a3602840a0c020b2005200541386a200910ca081a20012012417f6a3602900a0c010b20052005413c6a200910ca081a20012012417f6a36029c0a0b024041002802d8d2484105490d002001410c36028c0d200141023602840d2001200141e80d6a3602880d2001200141d80c6a3602800d41002802d4d248210341002802d0d248210541002802dcd24821092001419d023602c80e200142ec808080103703c00e200141f1c7c0003602bc0e200142213702b40e200141d0c7c0003602b00e200142023703a80e200142033703980e200141a8c6c0003602940e200141073602900e200141db8fc10036028c0e200141053602880e200341e0a3c000200941024622091b28021021032001200141800d6a3602a40e200541f8a3c00020091b200141880e6a20031103000b200120012802c80d41016a220c3602c80d0b200b2013460d01200c201a490d000b0b024041002802d8d2484102490d002001418c0d6a4102360200200141023602840d2001417f417f417f417f417f417f417f417f417f417f417f417f417f417f417f2001280280092203200128028c096a220520052003491b22032001280298096a220520052003491b220320012802a4096a220520052003491b220320012802b0096a220520052003491b220320012802bc096a220520052003491b220320012802c8096a220520052003491b220320012802d4096a220520052003491b220320012802e0096a220520052003491b220320012802ec096a220520052003491b220320012802f8096a220520052003491b220320012802840a6a220520052003491b220320012802900a6a220520052003491b2203200128029c0a6a220520052003491b220320012802a80a6a220520052003491b220320012802b40a6a220520052003491b200c6a3602d80c2001200141d80c6a3602880d2001200141c80d6a3602800d41002802d4d248210341002802d0d248210541002802dcd2482109200141c80e6a41ab02360200200141c00e6a42ec80808010370300200141bc0e6a41f1c7c000360200200141b40e6a4221370200200141b00e6a41d0c7c000360200200141a80e6a4202370300200141980e6a4203370300200141900e6a4107360200200141a40e6a200141800d6a360200200141c0c6c0003602940e200141db8fc10036028c0e200141023602880e200541f8a3c000200941024622091b200141880e6a200341e0a3c00020091b2802101103000b20012902fc08210620012802f8082109200141c8066a201541b40110c9081a02402019450d00201941286c450d00201d102c0b20012802c80c20012802cc0c28020011020020012802cc0c280204450d0020012802c80c102c0b20014190056a200141c8066a41b40110c9081a200120093602d003200120063702d403200141dc036a20014190056a41b40110c9081a2006422088a7220341ffffffff01712003470d0020034103742205417f4c0d000240024020050d004104210b0c010b20051032220b450d040b200141003602d0062001200b3602c806200120054103763602cc06200141c8066a4100200310eb0120012802c80620012802d00622054103746a2009200341037410c9081a2001200520036a3602d006200141e4036a2802002203ad420c7e2206422088a70d002006a72205417f4c0d0020012802dc03210b4104210902402005450d00200510322209450d040b2001410036029008200120093602880820012005410c6e36028c0820014188086a4100200310ec012001280288082001280290082205410c6c6a200b2003410c6c10c9081a2001200520036a36029008200141f0036a280200220341ffffffff00712003470d0020034104742205417f4c0d0020012802e803210b4104210902402005450d00200510322209450d040b200141003602a00820012009360298082001200541047636029c0820014198086a4100200310ed0120012802980820012802a00822054104746a200b200341047410c9081a2001200520036a3602a008200141fc036a2802002203ad42147e2206422088a70d002006a72205417f4c0d0020012802f40321090240024020050d004104210b0c010b20051032220b450d040b200141003602b0082001200b3602a8082001200541146e3602ac08200141a8086a4100200310ee0120012802a80820012802b008220541146c6a2009200341146c10c9081a2001200520036a3602b00820014188046a2802002203ad42187e2206422088a70d002006a72205417f4c0d0020012802800421090240024020050d004104210b0c010b20051032220b450d040b200141003602c0082001200b3602b8082001200541186e3602bc08200141b8086a4100200310ef0120012802b80820012802c008220541186c6a2009200341186c10c9081a2001200520036a3602c00820014194046a2802002203ad421c7e2206422088a70d002006a72205417f4c0d00200128028c0421090240024020050d004104210b0c010b20051032220b450d040b200141003602d0082001200b3602c80820012005411c6e3602cc08200141c8086a4100200310f00120012802c80820012802d0082205411c6c6a20092003411c6c10c9081a2001200520036a3602d008200141a0046a280200220341ffffff3f712003470d0020034105742205417f4c0d0020012802980421090240024020050d004104210b0c010b20051032220b450d040b200141003602c00c2001200b3602b80c200120054105763602bc0c200141b80c6a4100200310f10120012802b80c20012802c00c22054105746a2009200341057410c9081a2001200520036a3602c00c200141ac046a2802002203ad42247e2206422088a70d002006a72205417f4c0d0020012802a40421090240024020050d004104210b0c010b20051032220b450d040b200141003602d00c2001200b3602c80c2001200541246e3602cc0c200141c80c6a4100200310f20120012802c80c20012802d00c220541246c6a2009200341246c10c9081a2001200520036a3602d00c200141b8046a2802002203ad42287e2206422088a70d002006a72205417f4c0d0020012802b00421090240024020050d004104210b0c010b20051032220b450d040b200141003602e0082001200b3602d8082001200541286e3602dc08200141d8086a4100200310f30120012802d80820012802e008220541286c6a2009200341286c10c9081a2001200520036a3602e008200141c4046a2802002203ad422c7e2206422088a70d002006a72205417f4c0d0020012802bc0421090240024020050d004104210b0c010b20051032220b450d040b200141003602b00d2001200b3602a80d20012005412c6e3602ac0d200141a80d6a4100200310dd0120012802a80d20012802b00d2205412c6c6a20092003412c6c10c9081a2001200520036a3602b00d200141d0046a2802002203ad42307e2206422088a70d002006a72205417f4c0d0020012802c80421090240024020050d004104210b0c010b20051032220b450d040b200141003602d00d2001200b3602c80d2001200541306e3602cc0d200141c80d6a4100200310f40120012802c80d20012802d00d220541306c6a2009200341306c10c9081a2001200520036a3602d00d200141dc046a2802002203ad42347e2206422088a70d002006a72205417f4c0d0020012802d40421090240024020050d004104210b0c010b20051032220b450d040b200141003602f00d2001200b3602e80d2001200541346e3602ec0d200141e80d6a4100200310f50120012802e80d20012802f00d220541346c6a2009200341346c10c9081a2001200520036a3602f00d200141e8046a2802002203ad42387e2206422088a70d002006a72205417f4c0d0020012802e00421090240024020050d004104210b0c010b20051032220b450d040b200141003602e00c2001200b3602d80c2001200541386e3602dc0c200141d80c6a4100200310f60120012802d80c20012802e00c220541386c6a2009200341386c10c9081a2001200520036a3602e00c200141f4046a2802002203ad423c7e2206422088a70d002006a72205417f4c0d0020012802ec0421090240024020050d004104210b0c010b20051032220b450d040b200141003602880d2001200b3602800d20012005413c6e3602840d200141800d6a4100200310f70120012802800d20012802880d2205413c6c6a20092003413c6c10c9081a2001200520036a3602880d20014180056a280200220341ffffff1f712003470d0020034106742205417f4c0d0020012802f80421090240024020050d004104210b0c010b20051032220b450d040b200141003602900e2001200b3602880e2001200541067636028c0e200141880e6a4100200310f80120012802880e20012802900e22054106746a2009200341067410c9081a2001200520036a3602900e2001418c056a2802002203ad42c4007e2206422088a70d002006a72205417f4c0d0020012802840521090240024020050d004104210b0c010b20051032220b450d040b20014100360280092001200b3602f8082001200541c4006e3602fc08200141f8086a4100200310f90120012802f808200128028009220541c4006c6a2009200341c4006c10c9081a200141dc066a20014188086a41086a280200360200200141e8066a20014198086a41086a280200360200200141f4066a200141a8086a41086a28020036020020014180076a200141b8086a41086a280200360200200141c8066a41c4006a200141c8086a41086a2802003602002001200520036a3602800920012001290388083702d40620012001290398083703e006200120012903a8083702ec06200120012903b8083703f806200120012903c8083702840720014198076a200141b80c6a41086a280200360200200141a4076a200141c80c6a41086a280200360200200141b0076a200141d8086a41086a280200360200200141bc076a200141a80d6a41086a280200360200200141c8076a200141c80d6a41086a280200360200200120012903b80c37039007200120012903c80c37029c07200120012903d8083703a807200120012903a80d3702b407200120012903c80d3703c007200141d4076a200141e80d6a41086a280200360200200141e0076a200141d80c6a41086a280200360200200141ec076a200141800d6a41086a280200360200200141f8076a200141880e6a41086a220528020036020020014184086a200128028009360200200120012903e80d3702cc07200120012903d80c3703d807200120012903800d3702e407200120012903880e3703f007200120012903f8083702fc07200141f8086a200141c8066a41c00110c9081a200141880e6a200141f8086a200141a0036a20014190036a10fa01024020012802880e4101460d00200141940e6a2802002213ad422c7e2206422088a70d012006a72203417f4c0d012005280200210f200128028c0e211e0240024020030d00410421050c010b200310322205450d050b200141003602f00d200120053602e80d20012003412c6e3602ec0d200141e80d6a4100201310dd0120012802f00d210b02402013450d002013412c6c211020012802e80d200b412c6c6a2103200141f8086a410c6a2109201e21050340200141800d6a41186a220e200541246a290000370300200141800d6a41106a220c2005411c6a290000370300200141800d6a41086a2212200541146a29000037030020012005410c6a2900003703800d200141f8086a200510fb01200941186a200e290300370000200941106a200c290300370000200941086a2012290300370000200920012903800d370000200341286a200141f8086a41286a280200360200200341206a200141f8086a41206a290300370200200341186a200141f8086a41186a290300370200200341106a200141f8086a41106a290300370200200341086a200141f8086a41086a290300370200200320012903f808370200200b41016a210b2003412c6a21032005412c6a2105201041546a22100d000b0b2001200b3602f00d200141980d6a4200370300200141800d6a41106a4200370300200141800d6a41086a22034200370300200142003703800d200141d80c6a41d4dcc700410810c5012003200141d80c6a41086a290000370300200120012900d80c3703800d200141880e6a41bba8c700410d10c501200441086a200141880e6a41086a290000370000200420012900880e370000200141106a200141800d6a412010d301200141106a41106a29030021062001290318210720012903102108411010322203450d042003200742002008a722051b37030020032006420020051b370308200141c80d6a200141e80d6a200310e201200141f8086a20012802b003221220012802b803220e20012802c80d220b20012802d00d220310fc010240024020012d00f8084101460d00200120012802fc083602800d2001200141f8086a41086a2903003702840d20014190056a200141800d6a10fd01200141880e6a41086a200141800d6a41086a280200360200200120012903800d3703880e200141f8086a200141880e6a10fe01200141f8086a10ff0102402003450d002003412c6c2105200b210303400240200341046a2802002209450d00200941306c450d002003280200102c0b2003412c6a2103200541546a22050d000b0b024020012802cc0d2203450d002003412c6c450d00200b102c0b02402013450d002013412c6c2105201e210303400240200341046a2802002209450d00200941226c450d002003280200102c0b2003412c6a2103200541546a22050d000b0b0240200f450d00200f412c6c450d00201e102c0b200e200e6a2203200e490d032003417f4c0d030240024020030d004102210b0c010b20031032220b450d070b2003410176211020012802b4032113200e0d01410021050c050b02402003450d002003412c6c2105200b210303400240200341046a2802002209450d00200941306c450d002003280200102c0b2003412c6a2103200541546a22050d000b0b024020012802cc0d2203450d002003412c6c450d00200b102c0b02402013450d002013412c6c2105201e210303400240200341046a2802002209450d00200941226c450d002003280200102c0b2003412c6a2103200541546a22050d000b0b0240200f450d00200f412c6c450d00201e102c0b200141d0036a10e901410421090c070b2012200e4105746a211e410021052012210c0340200c41086a2900002106200c41106a2900002107200c2900002108200141f8086a41186a200c41186a290000370300200141f8086a41106a2007370300200141f8086a41086a2006370300200120083703f8082001280298032203450d03200c41206a210c200341057441606a41057641016a210e41002109200128029003210302400340200141f8086a2003460d012003200141f8086a412010cc08450d01200341206a2103200e200941016a2209470d000c050b0b200941ffff034b0d03024020052010470d0020054101742210200541016a2203201020034b1b22034104200341044b1b220e200e6a2203200e490d0341000d0320034100480d032010200f20051b210f024002400240200b410020051b220b0d0020030d014102210b0c020b0240200f0d0020030d014102210b0c020b200b200f20031035220b450d080c010b20031032220b450d070b200341017621100b200b20054101746a20093b0100200541016a2105200c201e460d040c000b0b200141f8086a41086a200141940e6a2802003602002001200129028c0e3703f80841c0cdc800412b200141f8086a41a0c7c00041b0c7c0001040000b103b000b02402013450d00201341ffffff3f71450d002012102c0b02402010450d00200b450d00201041ffffffff0771450d00200b102c0b200141d0036a10e901410821090c040b0240201341ffffff3f71450d002012102c0b200141d0066a20014190056a41106a290300370300200141c8066a41106a20014190056a41186a290300370300200141c8066a41186a20014190056a41206a290300370300200141c8066a41206a200141b8056a29030037030020012001290398053703c8062001290390052106200141f8086a200141d0036a41c00110c9081a024020012802a40341ffffff3f71450d0020012802a003102c0b024020012802940341ffffff3f71450d00200128029003102c0b410021030c040b1039000b0c020b20012802b40341ffffff3f71450d0020012802b003102c0b024020012802a40341ffffff3f71450d0020012802a003102c0b024020012802940341ffffff3f71450d00200128029003102c0b410121030b200141e0026a41086a220e200141c8066a41086a290300370300200141e0026a41106a220c200141c8066a41106a290300370300200141e0026a41186a2212200141c8066a41186a290300370300200141e0026a41206a2213200141c8066a41206a290300370300200120012903c8063703e002200141a0016a200141f8086a41c00110c9081a02402003450d0020002006370204200020093602000c010b200141c8066a200141a0016a41c00110c9081a20014190056a41106a200e29030037030020014190056a41186a200c29030037030020014190056a41206a201229030037030020014190056a41286a220920132903003703002001200637039005200120012903e00237039805024041002802d8d2484103490d00200141dc036a4115360200200141023602d403200120014190056a3602d80320012001419c016a3602d00341002802d4d248210341002802d0d248210e41002802dcd248210c200141b8096a418001360200200141b0096a42ec80808010370300200141ac096a41f1c7c000360200200141a4096a4221370200200141f8086a41286a41d0c7c00036020020014198096a420237030020014188096a420237030020014180096a410736020020014194096a200141d0036a360200200141c0c7c00036028409200141db8fc1003602fc08200141033602f808200e41f8a3c000200c410246220c1b200141f8086a200341e0a3c000200c1b2802101103000b200141800d6a41186a4200370300200141800d6a41106a4200370300200141800d6a41086a22034200370300200142003703800d200141d80c6a41e6dcc700410710c5012003200141d80c6a41086a290000370300200120012900d80c3703800d200141880e6a41ccbac200410a10c501200441086a200141880e6a41086a2203290000370000200420012900880e370000200141086a200141800d6a412010c601200128020c210e2001280208210c20014186096a20014190056a41086a2903003701002001418e096a20014190056a41106a29030037010020014196096a20014190056a41186a2903003701002001419e096a20014190056a41206a290300370100200141f8086a412e6a20092903002206370100200141a0016a412e6a2209200637010020012001290390053701fe08200141a0016a41086a2212200141f8086a41086a290100370300200141a0016a41106a2213200141f8086a41106a290100370300200141a0016a41186a220f200141f8086a41186a290100370300200141a0016a41206a221e200141f8086a41206a290100370300200141a0016a41286a221f200141f8086a41286a290100370300200120012901f8083703a001200141f8086a200141d0036a41e80010c9081a200141980a6a41183a0000200141a40a6a2005360200200141a00a6a20103602002001419c0a6a200b360200200141f0096a2003290300370300200141f8096a200141880e6a41106a290300370300200141800a6a200141880e6a41186a290300370300200141880a6a200141880e6a41206a2903003703002001419b0a6a200141820d6a2d00003a0000200142023703e009200141063602900a200120012903880e3703e809200120012f00800d3b00990a200141a80a6a200141c8066a41c00110c9081a200141f00b6a20023b0100200141ec0b6a201c360200200141e80b6a200e4100200c1b360200200141fa0b6a2012290300370100200141820c6a20132903003701002001418a0c6a200f290300370100200141920c6a201e2903003701002001419a0c6a201f290300370100200141a00c6a2009290100370100200141a80c6a20012903e002370300200141b00c6a200141e0026a41086a290300370300200120012903a0013701f20b2001200141f8086a3602d003200141880e6a200141d0036a108102200141d0036a41086a2003280200360200200120012903880e3703d003200141d0036a1082022103200141900a6a10830220004105410a20031b3602000b200141d00e6a24000b4401017f2000101b2201290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002001102c0ba00202017f037e230041d0006b220324002003200236020420032001360200200341086a2001200210b30102400240200328020822010d00420021040c010b200328020c210202400240200341086a41086a2802004110490d00200141086a290000210520012900002106420121040c010b20034100360220200342013703182003410f36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c200341b4bcc3003602382003200341286a360248200341346a41dcb7c000200341386a103e1a200335022042208620033502188410000240200328021c450d002003280218102c0b420021040b2002450d002001102c0b2000200637030820002004370300200041106a2005370300200341d0006a24000bcb0702027f047e230041c0026b2205240020052004360214200520033602100240024020024108490d00200141086a2101200241786a21040c010b4100210441c4b5c800210141002802d8d248450d00200541263602e401200541e59ec0003602e0014100210441002802d4d248210241002802d0d248210341002802dcd2482106200541d8016a41e900360200200541d0016a42df80808010370300200541cc016a419e9fc000360200200541c4016a4213370200200541c0016a418b9fc000360200200541b8016a4201370300200541a8016a4201370300200541a0016a4113360200200541b4016a20054180026a360200200541b4b5c8003602a4012005418b9fc00036029c0120054101360298012005410436028402200241e0a3c000200641024622061b28021021022005200541e0016a36028002200341f8a3c00020061b20054198016a20021103000b41002102200541003a00b8010240024002400240034020042002460d0120054198016a20026a200120026a2d00003a00002005200241016a22033a00b8012003210220034120470d000b20054180026a41086a220220054198016a41086a29030037030020054180026a41106a220420054198016a41106a29030037030020054180026a41186a220120054198016a41186a290300370300200520052903980137038002200341ff0171411f4d0d01200541d8006a41086a20022903002207370300200541d8006a41106a20042903002208370300200541d8006a41186a20012903002209370300200541386a41186a2009370300200541386a41106a2008370300200541386a41086a2007370300200520052903800222073703782005200737035820052007370338200541086a200541106a10870220052802080d02200528020c2102200541186a41086a200541386a41086a2903002207370300200541186a41106a200541386a41106a2903002208370300200541186a41186a200541386a41186a290300220937030020052005290338220a3703182005418094ebdc0336029c01200520023602980120054198016a2002418094ebdc034b4102746a28020021022000411c6a2009370200200041146a20083702002000410c6a20073702002000200a370204200041246a2002360200200041003602000c030b200241ff0171450d00200541003a00b8010b200541d8006a41086a200541f8006a41086a290300370300200541d8006a41106a200541f8006a41106a290300370300200541d8006a41186a200541f8006a41186a29030037030020052005290378370358200041013602000c010b200041013602000b200541c0026a24000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42387e2204422088a722030d022004a722024100480d022003454103742105024002400240024002402000280200410020011b22030d002002450d010c030b200141386c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241386e3602000b0f0b2005450d001039000b103b000bd40101027f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1b220141ffffff3f7122042001470d02200141057422024100480d0220042001462104024002400240024002402000280200410020031b22010d002002450d010c030b200341057422030d0120020d020b200421010c020b200120032002103522010d010c030b200210322201450d020b20002001360200200041046a20024105763602000b0f0b2004450d001039000b103b000be70803027f037e027f23004190026b2205240020052004360204200520033602000240024020024108490d00200141086a2101200241786a21040c010b4100210441c4b5c800210141002802d8d248450d00200541263602b401200541e59ec0003602b0014100210441002802d4d248210241002802d0d248210341002802dcd2482106200541a8016a41e900360200200541a0016a42df808080103703002005419c016a419e9fc00036020020054194016a421337020020054190016a418b9fc00036020020054188016a4201370300200541f8006a4201370300200541f0006a411336020020054184016a200541d0016a360200200541b4b5c8003602742005418b9fc00036026c20054101360268200541043602d401200241e0a3c000200641024622061b28021021022005200541b0016a3602d001200341f8a3c00020061b200541e8006a20021103000b41002102200541003a008801024002400240024002400240024002400240034020042002460d01200541e8006a20026a200120026a2d00003a00002005200241016a22033a0088012003210220034120470d000b200541d0016a41086a2202200541e8006a41086a290300370300200541d0016a41106a2204200541e8006a41106a290300370300200541d0016a41186a2201200541e8006a41186a290300370300200520052903683703d001200341ff0171411f4d0d01200541286a41086a20022903002207370300200541286a41106a20042903002208370300200541286a41186a20012903002209370300200541086a41186a2009370300200541086a41106a2008370300200541086a41086a2007370300200520052903d00122073703482005200737032820052007370308200541e8006a200510ca0320052802682202450d05200528026c2103200528020422044104490d02200541f0006a280200210a20052802002201280000210b20052004417c6a22063602042005200141046a22013602002006450d0320012d0000210620052004417b6a3602042005200141016a3602004100210420060e020706030b200241ff0171450d00200541003a0088010b200541286a41086a200541c8006a41086a290300370300200541286a41106a200541c8006a41106a290300370300200541286a41186a200541c8006a41186a29030037030020052005290348370328200041023a00300c060b200341ffffff3f710d010c020b200341ffffff3f71450d010b2002102c0b200541c8006a41026a200541b0016a41026a2d00003a0000200520052f01b0013b0148200041023a00300c020b410121040b200541c8006a41026a2201200541d0016a41026a2d00003a0000200520052f00d0013b0148200041186a200541086a41186a290300370000200041106a200541086a41106a290300370000200041086a200541086a41086a29030037000020002005290308370000200020043a00302000200b36022c2000200a3602282000200336022420002002360220200020052f01483b0031200041336a20012d00003a00000b20054190026a24000bc50301067f230041d0006b22022400200241306a41e6dcc700410710c501200241086a41d192c100410d10c501200241c0006a200128020010e402024002402002280248220141206a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b200241003602282002200336022420022004360220200241206a4100411010c8012002280220200228022822036a22042002290030370000200441086a200241306a41086a22052900003700002002200341106a2203360228200241206a2003411010c8012002280220200228022822036a22042002290008370000200441086a200241086a41086a22062900003700002002200341106a220436022820022802402103200241206a2004200110c80120022802202204200228022822076a2003200110c9081a2002200720016a220136022802402002280244450d002003102c0b200241086a2004200110d2032005200628020036020020022002290308370330024020022802142201450d002000200229033037020020002002290318370210200041086a200241306a41086a2802003602000b2000200136020c02402002280224450d002004102c0b200241d0006a24000f0b103b000b1039000ba90201027f230041106b220224000240024020002802004101470d0020022001280218419bbcc30041042001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41a4bcc30010661a20022d0008210120022802042203450d01200141ff0171210041012101024020000d00024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841fa9dc00041012000411c6a28020028020c1100000d010b2002280200220128021841c5c7c50041012001411c6a28020028020c11000021010b200220013a00080c010b2001280218419fbcc30041042001411c6a28020028020c11000021010b200241106a2400200141ff01714100470ba53c04157f047e1b7f017e230041d0066b220324004100210420034100360208200341003602002003410036021820034204370310200128020021052001280204210602400240024002400240024002400240024002400240024020012802082201450d0020014104200141044b1b220741ffffffff037122082007470d01200741027422094100480d01200920082007464102742009103222071b2108024020070d002008450d020c0c0b200520014105746a210a200320084102763602142003280218210420032007200920071b2201360210200120044102746a210b200341e0006a41046a210c200341be066a210d4100210e2005210f0340200341206a41186a2201200f41186a2207290000370300200341206a41106a2209200f41106a2208290000370300200341206a41086a2210200f41086a22112900003703002003200f290000370320200341c0006a41186a22122007290000370300200341c0006a41106a22132008290000370300200341c0006a41086a221420112900003703002003200f290000370340200341c0056a41186a22152001290300370300200341c0056a41106a22162009290300370300200341c0056a41086a22172010290300370300200320032903203703c0050240024020032802002210450d00200328020421110c010b41940310322210450d0d41002111201041003602002010200329029806370204201041003b01322010410c6a20034198066a41086a290200370200201041146a20034198066a41106a2902003702002010411c6a20034198066a41186a290200370200201041246a20034198066a41206a2902003702002010412a6a200d290100370100201041346a200341e0006a41e00210c9081a20034100360204200320103602000b200f41206a210f024002400340201041346a210720102f01322108410021010240034020082001460d01200341c0056a2007412010cc082209450d03200741206a2107200141016a21012009417f4a0d000b2001417f6a21080b02402011450d002011417f6a2111201020084102746a4194036a28020021100c010b0b200341f0056a41186a20152903002218370300200341f0056a41106a20162903002219370300200341f0056a41086a2017290300221a370300200320032903c005221b3703f005200341e0046a41186a221c2018370300200341e0046a41106a221d2019370300200341e0046a41086a221e201a3703002003201b3703e0040240024020102f01322207410b490d00410021114104210102400240200841054f0d00200821090c010b4105210141052109024002402008417b6a0e020201000b200841796a210941012111410621010c010b41002109410121110b41940310322207450d104100211f200741003602002007200329029806370204200741003b01322007410c6a20034198066a41086a2220290200370200200741146a20034198066a41106a22212902003702002007411c6a20034198066a41186a2222290200370200200741246a20034198066a41206a22232902003702002007412a6a200d290100370100200741346a200341e0006a41e00210c90821242017201041346a222520014105746a220841086a2900003703002016200841106a2900003703002015200841186a290000370300200320082900003703c005201041046a222620014102746a280200212720242025200141016a22284105746a20102f01322001417f736a220841057410c9081a200741046a202620284102746a200841027410c9081a201020013b0132200720083b0132200341e0006a41186a22242015290300370300200341e0006a41106a22252016290300370300200341e0006a41086a22262017290300370300200320032903c0053703602007201020111b220141346a2208200941016a22114105746a200820094105746a220820012f013220096b41057410ca081a200841186a201c290300370000200841106a201d290300370000200841086a201e290300370000200820032903e004370000200141046a220820114102746a200820094102746a220820012f013220096b41027410ca081a2008200e36020020034190056a41186a222920242903002218370300200120012f013241016a3b013220034190056a41106a222a2025290300221937030020034190056a41086a222b2026290300221a37030020032003290360221b37039005200341b0046a41186a222c2018370300200341b0046a41106a222d2019370300200341b0046a41086a222e201a3703002003201b3703b004024020102802002201450d004100211f03402007212f20272130201021072001211020072f01302111201c202c290300370300201d202d290300370300201e202e290300370300200320032903b0043703e00441000d0c02400240024020102f01322207410b490d004100213141042108024020114105490d0020112108024002402011417b6a0e020201000b201141796a211141012131410621080c010b4100211141012131410521080b41c40310322207450d15201f41016a211f41002101200741003602002007200329029806370204200741003b01322007410c6a2020290200370200200741146a20212902003702002007411c6a2022290200370200200741246a20232902003702002007412a6a200d290100370100200741346a200341e0006a41900310c90821322015201041346a222820084105746a220941186a2900003703002016200941106a2900003703002017200941086a290000370300200320092900003703c005201041046a223320084102746a280200212720322028200841016a22344105746a20102f013222352008417f736a220941057410c9082132200741046a2033203441027422346a200941027410c9082136201020083b0132200720093b0132202420152903003703002025201629030037030020262017290300370300200320032903c00537036020074194036a201020346a4194036a203520086b41027410c908213402400340200720014102746a4194036a280200220820013b0130200820073602002001200120094922086a220120094b0d0120080d000b0b202920242903002218370300202a20252903002219370300202b2026290300221a37030020032003290360221b3703900520242018370300202520193703002026201a3703002003201b3703602031450d012011410274220820346a41086a2034201141016a220141027422286a220920072f013220116b41027410ca081a2009202f360200203220014105746a203220114105746a220920072f013220116b41057410ca081a200941186a201c290300370000200941106a201d290300370000200941086a201e290300370000200920032903e004370000203620286a203620086a220920072f013220116b41027410ca081a20092030360200200720072f013241016a22093b01322001200941ffff037122094b0d020340200720014102746a4194036a280200220820013b013020082007360200200120012009496a220820094b0d03200120094f2111200821012011450d000c030b0b2011410274220920104194036a22086a41086a2008201141016a220141027422156a2208200720116b2216410274221710ca081a2008202f360200201041346a220720014105746a200720114105746a2207201641057410ca081a200741186a201c290300370000200741106a201d290300370000200741086a201e290300370000200720032903e004370000201041046a220720156a200720096a2207201710ca081a20072030360200201020102f013241016a22073b01322011200741ffff037122074f0d050340201020014102746a4194036a280200220920013b013020092010360200200120012007496a220920074b0d06200120074f2108200921012008450d000c060b0b2011410274220820104194036a22096a41086a2009201141016a220141027422316a220920102f013220116b41027410ca081a2009202f360200202820014105746a202820114105746a220920102f013220116b41057410ca081a200941186a201c290300370000200941106a201d290300370000200941086a201e290300370000200920032903e004370000203320316a203320086a220920102f013220116b41027410ca081a20092030360200201020102f013241016a22093b01322001200941ffff037122094b0d000340201020014102746a4194036a280200220820013b0130200820103602002001200120094922086a220120094b0d0120080d000b0b202c2024290300370300202d2025290300370300202e2026290300370300200320032903603703b004201028020022010d000b0b20034180046a41186a202c290300221837030020034180046a41106a202d290300221937030020034180046a41086a202e290300221a370300200320032903b004221b3703800420152018370300201620193703002017201a3703002003201b3703c0052003280200450d0941c40310322201450d10200141003602002001200329029806370204200141003b01322001410c6a2020290200370200200141146a20212902003702002001411c6a2022290200370200200141246a20232902003702002001412a6a200d290100370100200141346a200341e0006a41900310c9081a20012003280200220936029403200941003b01302003200136020020032003280204220841016a36020420092001360200202420152903003703002025201629030037030020262017290300370300200320032903c0053703602008201f470d0820012f01322209410a4b0d072001200941016a22103b0132200120094105746a220841346a20032903603700002008413c6a2026290300370000200841c4006a2025290300370000200841cc006a2024290300370000200120094102746a41046a2027360200200120104102746a4194036a200736020020072001360200200720103b01302003200328020841016a36020820071a201f1a0c030b201041346a2201200841016a22094105746a200120084105746a2201200720086b41057410ca081a200141186a201c290300370000200141106a201d290300370000200141086a201e290300370000200120032903e004370000201041046a220120094102746a200120084102746a220120102f013220086b41027410ca081a2001200e360200201020102f013241016a3b01320b2003200328020841016a3602080c010b201020014102746a41046a200e3602000b200c410041c40010cb081a20034198066a41186a2207201229030037030020034198066a41106a2209201329030037030020034198066a41086a22082014290300370300200320032903403703980641f80010322201450d0c2001410036020820014281808080103703002001410c6a200341e0006a41c80010c9081a200141003a0074200141ec006a2007290300370200200141e4006a2009290300370200200141dc006a20082903003702002001200329039806370254200120032f00c0053b0075200141f7006a200341c0056a41026a2d00003a0000200b2001360200200e41016a210e200441016a2104200b41046a210b200f200a470d000b0b200320043602180240200641ffffff3f71450d002005102c0b200228020821012002280204211420022802002113200341346a200341106a36020020032013360228200320143602242003201336022020032013200141386c22106a221636022c20032003360230201321092001450d08200341e0006a41346a2115200341206a41106a211220034198066a412c6a2108201321090340200341f0056a41086a220f2009220141086a290300370300200341f0056a41106a2211200141106a290300370300200341f0056a41186a220b200141186a290300370300200341f0056a41206a220e200141206a290300370300200320012903003703f0052003200141386a2209360228200141286a2802002107200341f0036a41086a2204200141346a28020036020020032001412c6a2902003703f0032007450d0820034198066a41206a200e29030037030020034198066a41186a200b29030037030020034198066a41106a201129030037030020034198066a41086a200f290300370300200820032903f003370200200841086a2004280200360200200320032903f00537039806200320073602c006200341e0006a201220034198066a10cc04024020032802900122070d00201041486a22100d010c090b0b200341c0056a41286a2201200341e0006a41286a290300370300200341c0056a41206a2209200341e0006a41206a290300370300200341c0056a41186a2208200341e0006a41186a290300370300200341c0056a41106a2210200341e0006a41106a290300370300200341c0056a41086a220f200341e0006a41086a29030037030020034180046a41086a2211201541086a29020037030020034180046a41106a220b201541106a29020037030020034180046a41186a220e201541186a29020037030020034180046a41206a2204201541206a29020037030020034180046a41286a2212201541286a280200360200200320032903603703c005200320152902003703800420034190056a41086a2213201129030037030020034190056a41106a2211200b29030037030020034190056a41186a220b200e29030037030020034190056a41206a220e200429030037030020034190056a41286a22042012280200360200200341e0046a41086a2212200f290300370300200341e0046a41106a220f2010290300370300200341e0046a41186a22102008290300370300200341e0046a41206a22142009290300370300200341e0046a41286a22092001290300370300200320032903800437039005200320032903c0053703e004200341b0046a41286a22012004280200360200200341b0046a41206a2204200e290300370300200341b0046a41186a220e200b290300370300200341b0046a41106a220b2011290300370300200341b0046a41086a2211201329030037030020032003290390053703b00441e00010322208450d0a200820032903e00437030020082007360230200820032903b004370234200841286a2009290300370300200841206a2014290300370300200841186a2010290300370300200841106a200f290300370300200841086a20122903003703002008413c6a2011290300370200200841c4006a200b290300370200200841cc006a200e290300370200200841d4006a2004290300370200200841dc006a2001280200360200200341c0006a41086a200341206a41086a2903002218370300200341c0006a41106a2214200341206a41106a2903003703002003200329032037034002402018a72209200328024c2212470d0041012113410121150c070b20034198066a412c6a2110200341e0006a41346a211741012113410121150340200341f0056a41186a220f2009220141186a290300370300200341f0056a41206a2211200141206a2903003703002003200141386a2209360248200341f0056a41086a220b200141086a290300370300200341f0056a41106a220e200141106a290300370300200320012903003703f005200141286a2802002107200341f0036a41086a2204200141346a28020036020020032001412c6a2902003703f0032007450d0620034198066a41206a2216201129030037030020034198066a41186a2211200f29030037030020034198066a41106a220f200e29030037030020034198066a41086a220e200b290300370300201020032903f003370200201041086a2004280200360200200320032903f00537039806200320073602c006200341e0006a201420034198066a10cc04024020032802900122070d0020122009470d010c070b200341c0056a41286a2201200341e0006a41286a2209290300370300200341c0056a41206a2226200341e0006a41206a220b290300370300200341c0056a41186a220a200341e0006a41186a2204290300370300200341c0056a41106a220c200341e0006a41106a2212290300370300200341c0056a41086a2228200341e0006a41086a222529030037030020034180046a41086a2233201741086a29020037030020034180046a41106a220d201741106a29020037030020034180046a41186a221c201741186a29020037030020034180046a41206a221d201741206a29020037030020034180046a41286a221e201741286a280200360200200320032903603703c005200320172902003703800420034190056a41086a2231203329030037030020034190056a41106a2233200d29030037030020034190056a41186a220d201c29030037030020034190056a41206a221c201d29030037030020034190056a41286a221d201e280200360200200341e0046a41086a221e2028290300370300200341e0046a41106a2228200c290300370300200341e0046a41186a220c200a290300370300200341e0046a41206a220a2026290300370300200341e0046a41286a22262001290300370300200320032903800437039005200320032903c0053703e004200341b0046a41286a2201201d280200360200200341b0046a41206a221d201c290300370300200341b0046a41186a221c200d290300370300200341b0046a41106a220d2033290300370300200341b0046a41086a2233203129030037030020032003290390053703b0042025201e290300370300201220282903003703002004200c290300370300200b200a29030037030020092026290300370300200320032903e004370360200e2033290300370300200f200d2903003703002011201c2903003703002016201d29030037030020034198066a41286a22262001280200360200200320032903b004370398060240024020152013470d00201341016a22012013490d032013410174220a2001200a20014b1b22014104200141044b1bad42e0007e2218422088a7220a0d032018a722014100480d03200a45410374210a201341e0006c202420131b2124024002400240024002402008410020131b22080d002001450d010c030b20240d0120010d020b200a21080c020b200820242001103522080d010c030b200110322208450d020b200141e0006e21130b2008201541e0006c6a2201200329036037030020092903002118202529030021192012290300211a2004290300211b200b290300213720012007360230200141206a2037370300200141186a201b370300200141106a201a370300200141086a2019370300200141286a2018370300200141346a2003290398063702002001413c6a200e290300370200200141c4006a200f290300370200200141cc006a2011290300370200200141d4006a2016290300370200200141dc006a2026280200360200201541016a211520032802482209200328024c2212470d010c080b0b200a0d0a0b103b000b41e0cec80041204180cfc800103c000b419ecec800413041d0cec800103c000b41ecd0c800412b41bcd2c800103c000b41a5d0c800413541dcd0c800103c000b200141386a21090b201220096b220141386d210702402001450d00200741386c2107200941286a210103400240200141046a28020041ffffff3f71450d002001280200102c0b200141386a2101200741486a22070d000b0b20032802404100200328024422011b2207450d02200141386c450d022007102c0c020b200141386a21090b201620096b220141386d210702402001450d00200741386c2107200941286a210103400240200141046a28020041ffffff3f71450d002001280200102c0b200141386a2101200741486a22070d000b0b410821084100211502402014450d00201441386c450d002013102c0b410021130b200020032903103702002000200836020c200041146a2015360200200041106a2013360200200041086a200341106a41086a2802003602004100210902400240200328020022070d00410021014100210b0c010b2003280208210b200328020421082007210103402008450d012008417f6a2108200720072f01324102746a4194036a280200210720012802940321010c000b0b200341a8056a210e20034190056a41106a210420034190056a41086a2112024002400340200b450d012001450d0202400240200920012f01324f0d00200121070c010b20102111200f2109034002400240200128020022070d0041002107201121080c010b20012f01302109200841016a220821110b2001102c20072101200821102009210f200920072f01324f0d000b0b200e200720094105746a220141cc006a2900003703002004200141c4006a29000037030020122001413c6a2900003703002003200141346a29000037039005200941016a21090240024020080d00200721010c010b200720094102746a4194036a280200210102402008417f6a2207450d00034020012802940321012007417f6a22070d000b0b410021090b200b417f6a210b410021080c000b0b02402001450d00200128020021072001102c2007450d000340200728020021012007102c2001210720010d000b0b200341d0066a24000f0b41ecd0c800412b4198d1c800103c000b1039000be01b09087f027e057f017e027f017e017f047e047f230041b0016b220424000240200241086a22052802002206200120062001491b2207450d0041002108024002400240024003402002280200210902402006450d002006410274210a2009210b02400340200b28020022012802080d012001417f3602080240200141f4006a2d00000d0002402001290330220c200141386a290300220d844200520d00200142013703202001427f370310200141286a4200370300200141186a427f3703000c010b200441086a427f427f200c200d10c8082001427f370320200141286a427f370300200141186a200441086a41086a290300370300200120042903083703100b200b41046a210b20014100360208200a417c6a220a0d000c020b0b41d4afc8004110200441186a41c0cec40041d0cec4001040000b2003280200220e2003280208220f41e0006c6a21100240200f450d00200e21110340024020112802382201450d00200141d8006c2112201128023041306a210b02400340200b28020022012802080d01417f210a2001417f3602080240200141f4006a2d00000d002001290330220c200141386a290300220d84500d00200441186a2011290310201141186a2903002011290300201141086a290300200c200d109c0620012001290310220c427f200c427f20042903202004280218410146220a1b22137c220d200d200c542214200141186a2215290300220c427f200441186a41106a290300200a1b22167c2014ad7c220d200c54200d200c511b220a1b20132016845022141b3703102015200c427f200d200a1b20141b3703002001280208210a0b2001200a41016a360208200b41d8006a210b201241a87f6a2212450d020c000b0b41d4afc8004110200441186a41c0cec40041f0cec4001040000b201141e0006a22112010470d000b0b200841016a21172009417c6a210a2009200641027422016a211503402001450d06200a41046a220a280200220b280208221241016a41004c0d05200b20123602082001417c6a2101200b41f4006a2d00000d000b200a2802002212280208220b41016a41004c0d032012200b36020802402001450d00200a41046a210b201241286a2903002113201241186a290300211820122903202116201229031021190340200b2802002201280208221241016a41004c0d04200120123602080240200141f4006a2d00000d0020012012360208200141186a290300210c2001290310210d0240024002400240024020162001290320221a852013200141286a290300221b8584500d002016201384500d04201a201b84500d0520044190016a2019201810e106200441a0016a201a201b10e106200441186a41086a220120044190016a41086a22122802003602002004200429039001370318200441f0006a200441186a200441a0016a10e206024020042802a40141ffffffff0371450d0020042802a001102c0b20044190016a200d200c10e106200441a0016a2016201310e10620012012280200360200200420042903900137031820044180016a200441186a200441a0016a10e206024020042802a40141ffffffff0371450d0020042802a001102c0b2004280270211c2004280278221d0d0141012106410021120c020b2019200d542018200c542018200c511b0d042019200d852018200c858442005221110c020b201d4102742211417c6a41027641016a211441002112201c21010240034020012802000d01200141046a210141012106201241016a21122011417c6a22110d000b201421120c010b410021060b200428028001211e02400240024002400240200428028801221f450d00201e201f4102746a210941002111201f2114201e2101034020012802000d022014417f6a2114201141016a2111200141046a22012009470d000b0b410121114100210920060d010c030b410121092006450d010b410020096b21110c010b201d2012490d07417f201f20116b2211201d20126b22064720062011491b22110d00201c20124102746a21092014200620142006491b41016a211441002112034002402014417f6a22140d00410021110c020b200120126a2111200920126a2106201241046a2112417f20062802002206201128020022114720062011491b2211450d000b0b024020042802840141ffffffff0371450d00201e102c0b200428027441ffffffff0371450d00201c102c0b20114101470d010b200d2119200c2118201a2116201b2113200b210a0b200b41046a220b2015470d000b0b200a450d050240200a280200220b2802080d00417f2101200b417f360208200b2008360250200b41f4006a41013a00000240200f450d00200b41206a210f200b41106a41c4006a21080340200e220a41e0006a210e0240200a2802382212450d00200a2802302101201241d8006c2112034002400240200f2001460d00200141346a2008412010cc080d010b200a41186a22112903002116200b41186a2214290300210c200a2903102113200b290310210d200b2903202118200141186a200b41286a2215290300370300200141106a20183703002001200c4200200c20167d200d201354ad7d2218200d20137d221a200d562018200c562018200c511b22061b20132016845022091b3703082001200d4200201a20061b20091b3703002014290300210c2015290300210d200b2903102113200a200b290320370320200a41286a200d370300200a20133703102011200c3703000b200141d8006a2101201241a87f6a22120d000b0b200e2010470d000b200b28020821010b200b200141016a36020820172007460d0620052802002106201721080c010b0b41d4afc8004110200441186a41c0cec4004180cfc4001040000b2012201d4194b0c8001058000b41fcaec8004118200441186a41a0a4c70041aca7c7001040000b41fcaec8004118200441186a41d8bcc30041bca7c7001040000b41fcaec8004118200441186a41e0cec40041aca7c7001040000b20032802002201200328020841e0006c6a210f200441286a21150240034002400240024002402001220a200f460d00200a41386a2209280200220b450d03200a2802302101200b41d8006c211203400240200141306a2211280200220b280208221441016a41004a0d0041fcaec8004118200441186a41e0cec4004190cfc4001040000b200b201436020802400240200b41f4006a2d00000d00200141286a4200370300200141206a42003703000c010b200441186a200a290300200a41086a2903002001290300200141086a290300200a290310200a41186a290300109c062004290320210c200141286a427f20152903002004280218410146220b1b370300200141206a427f200c200b1b3703000b2011280200220b2802080d02200b417f360208200141206a290300210c200141286a290300210d200b4100360208200b427f200c200b29034022137c220c200c2013542211200d200b41c8006a2214290300220c7c2011ad7c220d200c54200d200c511b22111b3703402014427f200d20111b370300200141d8006a2101201241a87f6a2212450d030c000b0b200441186a41086a2201200241086a280200360200200441186a41146a200341086a2802003602002000410036020020002002290200370204200420032902003702242000410c6a2001290300370200200041146a200441286a2903003702000c040b41d4afc8004110200441186a41c0cec40041a0cfc4001040000b20092802002211450d00200a28023021012011417f6a2114410021124100210b02400340024002400240024002402011200b460d00200141206a290300200141286a29030084500d0102402012450d00200b20126b220620114f0d03200441186a2001201241a87f6c6a220641d80010c9081a2006200141d80010ca081a2001200441186a41d80010c9081a0c040b410021122014200b470d040c070b2011201141f48ac500103f000b201241016a21120c010b2006201141e48ac500103f000b2014200b460d020b200b41016a210b200141d8006a21010c000b0b2012450d002009280200220b201120126b2201490d0020092001360200200b2001460d00201141a87f6c200b20126a41d8006c6a210b200a280230201141d8006c6a201241a87f6c6a41306a21010340200128020022122012280200417f6a3602000240200128020022122802000d00201241046a22122012280200417f6a3602002001280200221241046a2802000d002012102c0b200141d8006a2101200b41a87f6a220b0d000b0b200a41e0006a21012004200a10af012004280200220b450d000b200428020421012000200b36020420004101360200200041086a200136020020032802002114024020032802082201450d002014200141e0006c6a211120142101034002402001221241386a2802002201450d00200141d8006c210b201228023041306a210103402001280200220a200a280200417f6a36020002402001280200220a2802000d00200a41046a220a200a280200417f6a3602002001280200220a41046a2802000d00200a102c0b200141d8006a2101200b41a87f6a220b0d000b0b201241e0006a21010240201241346a280200220b450d002012280230220a450d00200b41d8006c450d00200a102c0b20012011470d000b0b024020032802042201450d00200141e0006c450d002014102c0b200228020021120240200241086a2802002201450d002001410274210b2012210103402001280200220a200a280200417f6a36020002402001280200220a2802000d00200a41046a220a200a280200417f6a3602002001280200220a41046a2802000d00200a102c0b200141046a2101200b417c6a220b0d000b0b200228020441ffffffff0371450d002012102c0b200441b0016a24000be30f06037f017e017f017e0c7f027e23004190026b22022400200141346a2802002103200141386a2802002104200141086a29030021052001280230210620012903002107200241186a200141d4006a290000370300200241106a200141cc006a290000370300200241086a200141c4006a2900003703002002200129003c37030020022005370328200220073703202006200441d8006c22086a21092006210102400240024002402004450d004100210a200241a0016a41086a210b200241a0016a41106a210c200241a0016a41186a210d024002400340200b2006200a6a2201413c6a290200370300200c200141c4006a290200370300200d200141cc006a290200370300200241a0016a41206a220e200141d4006a2802003602002002200141346a2902003703a001200141306a280200220f450d02200141286a2903002105200141206a2903002107200241e8016a41206a200e280200360200200241e8016a41186a220e200d290300370300200241e8016a41106a2210200c290300370300200241e8016a41086a2211200b290300370300200220022903a0013703e80102400240200720052002290320200241206a41086a29030010e401221241ffff03710d004100210e0c010b200241c8016a41186a200e290300370300200241c8016a41106a2010290300370300200241c8016a41086a2011290300370300200220022903e8013703c8014101210e201221130b200f200f280200417f6a2210360200024020100d00200f41046a22102010280200417f6a221036020020100d00200f102c0b200e0d012008200a41d8006a220a470d000b200921010c020b200241c0006a41086a220f200241c8016a41086a290300370300200241c0006a41106a220b200241c8016a41106a290300370300200241c0006a41186a220c200241c8016a41186a290300370300200220022903c801220537036020022005370340412210322208450d0420082002290340370100200820133b0120200841186a200c290300370100200841106a200b290300370100200841086a200f2903003701002002428180808010370234200220083602302002200936024c2002200141d8006a220b36024820022003360244200220063602402002200241206a36025002400240200441d8006c41a87f6a200a470d00410121040c010b200241a0016a41086a210a200241a0016a41106a210c200241a0016a41186a210d4101210403402002200b220141d8006a220b360248200141306a280200210f200141286a2903002105200141206a2903002107200a2001413c6a290200370300200c200141c4006a290200370300200d200141cc006a290200370300200241a0016a41206a220e200141d4006a2802003602002002200141346a2902003703a00102400240200f450d00200241e8016a41206a200e280200360200200241e8016a41186a2211200d290300370300200241e8016a41106a2212200c290300370300200241e8016a41086a2206200a290300370300200220022903a0013703e80102400240200720052002290320200241206a41086a29030010e401221041ffff03710d004100210e0c010b200241c8016a41186a2011290300370300200241c8016a41106a2012290300370300200241c8016a41086a2006290300370300200220022903e8013703c8014101210e201021130b200f200f280200417f6a2210360200024020100d00200f41046a22102010280200417f6a221036020020100d00200f102c0b200e0d012009200b470d020b200141d8006a210b0c020b200241e0006a41086a200241c8016a41086a2903002205370300200241e0006a41106a200241c8016a41106a2903002207370300200241e0006a41186a200241c8016a41186a2903002214370300200220022903c8012215370360201120143703002012200737030020062005370300200220153703e801024020042002280234470d00200241306a2004410110e501200228023021080b2008200441226c6a220120022903e801370100201229030021052011290300210720062903002114200120133b0120200141086a2014370100200141186a2007370100200141106a20053701002002200441016a22043602382002280248220b200228024c2209470d000b0b2009200b6b220141d8006d210f02402001450d00200f41d8006c210f200b41306a210103402001280200220a200a280200417f6a36020002402001280200220a2802000d00200a41046a220a200a280200417f6a3602002001280200220a41046a2802000d00200a102c0b200141d8006a2101200f41a87f6a220f0d000b0b024020022802404100200228024422011b220f450d00200141d8006c450d00200f102c0b2002280230210f2002280234210120040d02200041003602002001450d03200f450d03200141226c450d03200f102c0c030b200141d8006a21010b024020092001460d000340200141306a220f280200220a200a280200417f6a360200200141d8006a21010240200f280200220a2802000d00200a41046a220a200a280200417f6a360200200f280200220f41046a2802000d00200f102c0b20092001470d000b0b02402003450d00200341d8006c450d002006102c0b200041003602000c010b200020013602042000200f360200200041086a20043602002000410c6a2002290300370000200041146a200241086a2903003700002000411c6a200241106a290300370000200041246a200241186a2903003700000b20024190026a24000f0b1039000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad422c7e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b2003412c6c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a2001412c6e3602000b0f0b2005450d001039000b103b000b8b0201057f2000410c6a280200200028020822016b220241e0006d210302402002450d002001200341e0006c6a2104034002402001220541386a2802002201450d00200141d8006c2102200528023041306a21010340200128020022032003280200417f6a3602000240200128020022032802000d00200341046a22032003280200417f6a3602002001280200220341046a2802000d002003102c0b200141d8006a2101200241a87f6a22020d000b0b200541e0006a21010240200541346a2802002202450d0020052802302203450d00200241d8006c450d002003102c0b20012004470d000b0b024020002802042201450d0020002802002202450d00200141e0006c450d002002102c0b0ba42d03167f017e077f230041c0006b2202240020024100360208200242023703002001280200210320022001280208220410d00420022802082105200228020021060240200441226c2207450d00200341206a2104200620054101746a21060340200620042f01003b0100200441226a2104200541016a2105200641026a21062007415e6a22070d000b200228020021060b200220053602082002410036021820024204370310200241106a41002005109502200228021821082002280210210302402005450d0020054101742105200320084102746a21040340200420062f0100360200200841016a2108200441046a2104200641026a21062005417e6a22050d000b0b2002200836021820084102742106410021092003210402400240024002400240024002400240024002400240024002400340024020060d00024020080d004104210a4100210b410021050c0e0b41ffff032009200941ffff034922061b200941ffff0320061b6b220c450d02410021062002410036022820024204370320200241206a4100200810eb0120084102742105200c200870210d200c20086e210e200228022822074103742002280220220f6a41786a210403402004410c6a2003280200360200200441086a22042006360200200641016a2106200341046a21032005417c6a22050d000b2002200720066a221036022820104115490d052010410176220641ffffffff01712006470d0820064103742211417f4c0d08201110322212450d07410021062002410036023820024204370330200f41786a2113200f416c6a2114201021150340024002402015220a417f6a22040d00410021154101210b0c010b024002400240024002400240200f20044103746a41046a280200200a4103742216200f6a41746a2802002205490d00200a417e6a2117201420166a210741002115410021040340024020172004470d00200a210b0c080b200441016a21042005200728020022034f210b200741786a210720032105200b0d000b200441016a210b2004417f73200a6a21040c010b201420166a210702400340024020044101470d00410021040c020b2004417f6a210420052007280200220349210b200741786a210720032105200b0d000b0b200a2004490d02200a20104b0d01200a20046b220b4101762203450d00200f20044103746a2105201320166a21070340200529020021182005200729020037020020072018370200200541086a2105200741786a21072003417f6a22030d000b0b024020040d00200421150c050b0240200b41094d0d00200421150c050b200a20104b0d02200a20046b2105200f20044103746a2117201320166a21190340200a2004417f6a2215490d0a0240200a20156b220b4102490d00200f20044103746a220641046a280200200f20154103746a220441046a28020022034f0d0020043502002118200420062902003702000240200b4103490d002005417f6a21164100210420172106024003402006410c6a28020020034f0d0220052004460d012006200641086a2207290200370200200721062016200441016a2204470d000b201921060c010b200441016a200b419ca5c800103f000b20062003ad4220862018843702000b2015450d04200541016a2105201741786a211720152104200b410a490d000c040b0b200a201041b8a3c800104f000b2004200a41b8a3c8001059000b200a2004417f6a2215490d06200a201041c8a3c800104f000b200228023821060b024020062002280234470d00200241306a10ae01200228023821060b2002280230221620064103746a2204200b360204200420153602002002200641016a2206360238024020064102490d00024002400240024002400340024002400240024020162006417f6a4103746a2204280200450d00200641037420166a220341746a2802002207200428020422054d0d00200641024d0d0a20162006417d6a221a4103746a2802042204200520076a4d0d01200641034d0d0a200341646a280200200420076a4b0d0a0c010b20064103490d012004280204210520162006417d6a221a4103746a28020421040b20042005490d010b2006417e6a211a0b02402006201a41016a221b4d0d002006201a4d0d022016201a410374221c6a2206280204221d20062802006a22062016201b410374221e6a2204280200221f490d03200620104b0d04200f201f4103746a220a2004280204221941037422046a210720064103742103024002402006201f6b220b20196b220620194f0d00201220072006410374220410c908221720046a21050240024020194101480d00200641014e0d010b20172104200721060c020b201320036a210320072106024003402003200641786a2207200541786a220b2005417c6a2802002006417c6a2802004922041b2902003702002005200b20041b2105200a2007200620041b22064f0d01200341786a2103200520174b0d000b0b20022802302116201721040c010b2012200a200410c908220620046a21050240024020194101480d00200b20194a0d010b20062104200a21060c010b200f20036a210b20062104200a21060340200620072004200741046a280200200441046a2802004922031b2902003702002004200441086a20031b2104200641086a2106200741086a200720031b2207200b4f0d01200520044b0d000b0b20062004200520046b41787110c9081a20022802382206201a4d0d052016201c6a2206201d20196a3602042006201f36020020022802382206201b4d0d0620022802302216201e6a2204200441086a2006201b417f736a41037410ca081a20022006417f6a2206360238200641014d0d070c010b0b201b200641d8a3c800103f000b201a200641e8a3c800103f000b201f200641f8a3c8001059000b2006201041f8a3c800104f000b201a20064188a4c800103f000b201b20061047000b2015450d050c000b0b2006417c6a2106200920042802006a22052009492107200441046a2104200521092007450d000b024020022802104100200228021422061b2204450d00200641ffffffff0371450d002004102c0b411e210b4186a7c80021060c0c0b200841ffffffff03712008470d0520084102742206417f4c0d05200610322204450d04200241003602382002200436023020022006410276360234200241306a410020081095022002280230220a200228023822064102746a2003200841027410c9081a200620086a21050c090b2015200a41c8a3c8001059000b0240200228023441ffffffff0171450d002016102c0b2011450d012012102c0c010b20104102490d002010417f6a210741002103200421170340024002400240201020072206417f6a2207490d00201020076b22194102490d02200f20064103746a220641046a280200200f20074103746a220541046a280200220a4f0d02200535020021182005200629020037020020194103490d012003417f6a21164100210520172106024003402006410c6a280200200a4f0d0320162005460d012006200641086a220b290200370200200b210620032005417f6a2205470d000b200421060c020b410120056b2019419ca5c800103f000b2007201041a8a3c8001058000b2006200aad4220862018843702000b2003417f6a2103201741786a211720070d000b0b02400240024002400240024002400240024002400240024002400240200941ffff034f0d0041ffff0320086e21034100210602402008200c4b0d00410021062002280228210a200821050340200a20064d0d0e200228022020064103746a2207280204220b200e6a2204200b490d0d200741046a2004360200024020042003490d00200641016a20087021060b2005417f6a22050d000b0b200d0d012002280228211c200228022021150c040b2002280228221c450d0c2008417f6a210320022802202215280204210a2008200c4d0d01200321060c020b2002280228211c0340201c20064d0d092002280220221520064103746a2205280204220741016a22042007490d08200541046a2004360200024020042003490d00200641016a20087021060b200d417f6a220d0d000c030b0b200321060340201c20064d0d06201520064103746a2204410020042802042204200e6b2205200520044b22071b200520071b22053602042002280228221c20064d0d05200d200e20046b410020071b6a210d200620032006417f6a2204200420064b1b2005200a4b1b21062008417f6a22080d000b0b200d450d000340201c20064d0d03024002402015200641037422056a22072802042204417f6a220b20044d0d0020032006417f6a2204200420064b1b21060c010b200741046a200b3602002002280228221c20064d0d03200620032006417f6a2204200420064b1b2002280220221520056a280204200a4b1b2106200d417f6a210d0b200d0d000b0b201c4115490d0c201c410176220641ffffffff01712006470d0a20064103742212417f4c0d0a20121032221d450d092002410036023820024204370330201541786a211e201541686a2110201c211f0340201f210a4100211f4101210b0240200a417f6a2206450d00024002400240024002400240201520064103746a280200200a410374221620156a41706a2802002204490d00200a417e6a210b201020166a21054100211f4100210603400240200b2006470d00200a210b0c080b200641016a21062004200528020022074f2103200541786a21052007210420030d000b200641016a210b2006417f73200a6a21060c010b201020166a210502400340024020064101470d00410021060c020b2006417f6a2106200420052802002207492103200541786a21052007210420030d000b0b200a2006490d02200a201c4b0d01200a20066b220b4101762207450d00201520064103746a2104201e20166a21050340200429020021182004200529020037020020052018370200200441086a2104200541786a21052007417f6a22070d000b0b024020060d002006211f0c050b0240200b41094d0d002006211f0c050b200a201c4b0d02200a20066b2107201520064103746a2117201e20166a21190340200a2006417f6a221f490d040240200a201f6b220b4102490d00201520064103746a22062802002015201f4103746a220428020022034f0d0020043502042118200420062902003702000240200b4103490d002007417f6a2116410021042017210602400340200641086a220528020020034f0d0220072004460d0120062005290200370200200521062016200441016a2204470d000b201921060c010b200441016a200b419ca5c800103f000b200620184220862003ad843702000b201f450d05200741016a2107201741786a2117201f2106200b410a4f0d050c000b0b200a201c41b8a3c800104f000b2006200a41b8a3c8001059000b200a2006417f6a221f490d00200a201c41c8a3c800104f000b201f200a41c8a3c8001059000b0240200228023822062002280234470d00200241306a10ae01200228023821060b2002280230220420064103746a2205200b3602042005201f3602002002200641016a2206360238024020064102490d0002400340024002400240024020042006417f6a4103746a2205280200450d00200641037420046a220b41746a2802002203200528020422074d0d00200641024d0d0620042006417d6a22194103746a2802042205200720036a4d0d01200641034d0d06200b41646a280200200520036a4d0d010c060b20064103490d012005280204210720042006417d6a22194103746a28020421050b20052007490d010b2006417e6a21190b0240024002400240024002402006201941016a221a4d0d00200620194d0d012004201941037422086a2206280204220920062802006a22062004201a410374220f6a2204280200221b490d022006201c4b0d032015201b4103746a22172004280204221641037422046a2105200641037421032006201b6b220b20166b220620164f0d04201d20052006410374220410c908220a20046a21070240024020164101480d00200641014e0d010b200a2106200521040c060b201e20036a21032005210403402003200441786a2206200741786a22052005280200200628020049220b1b29020037020020072005200b1b21070240201720062004200b1b2204490d00200a21060c070b200341786a2103200a21062007200a4b0d000c060b0b201a200641d8a3c800103f000b2019200641e8a3c800103f000b201b200641f8a3c8001059000b2006201c41f8a3c800104f000b201d2017200410c908220620046a21070240024020164101480d00200b20164a0d010b20062106201721040c010b201520036a210b20062106201721040340200420052006200528020020062802004922031b2902003702002006200641086a20031b2106200441086a2104200541086a200520031b2205200b4f0d01200720064b0d000b0b20042006200720066b41787110c9081a02402002280238220620194d0d002002280230220420086a2205200920166a3602042005201b3602002006201a4d0d022004200f6a2205200541086a2006201a417f736a41037410ca081a20022006417f6a2206360238200641014d0d030c010b0b201920064188a4c800103f000b201a20061047000b201f450d0c0c000b0b2006201c418ca9c800103f000b2006201c41fca8c800103f000b2006201c41eca8c800103f000b2006201c41dca8c800103f000b4184a8c800412641cca8c800105c000b2006201c41bca8c800103f000b4184a8c800412641aca8c800105c000b2006200a41f4a7c800103f000b41a4a7c800413f41e4a7c800105c000b1039000b103b000b0240200228023441ffffffff0171450d002004102c0b2012450d01201d102c0c010b201c4102490d00410021032015201c417f6a22074103746a2219210a0340024002400240201c20072206417f6a2207490d00201c20076b22164102490d02201520064103746a2206280200201520074103746a2204280200220b4f0d02200435020421182004200629020037020020164103490d012003417f6a211741002104200a210602400340200641086a2205280200200b4f0d0320172004460d01200620052902003702002005210620032004417f6a2204470d000b201921060c020b410120046b2016419ca5c800103f000b2007201c41a8a3c8001058000b20062018422086200bad843702000b2003417f6a2103200a41786a210a20070d000b0b2002410036023820024204370330200228022021032002280224210b200241306a410020022802282206109502200228023821052002280230210a02402006450d0020064103742107200a20054102746a2106200321040340200620043502043e0200200541016a2105200641046a2106200441086a2104200741786a22070d000b0b20022005360238200b41ffffffff0171450d002003102c0b2002280234210b0b2002410036023820024202370330200241306a2005410274220641027510d0042002280238210502402006450d00200a20066a2103200228023020054101746a2106200a21040340200620042802002207417f200741808004491b3b0100200541016a2105200641026a21062003200441046a2204470d000b0b200220053602380240200b41ffffffff0371450d00200a102c0b2002280234210720022802302103024020022802104100200228021422061b2204450d00200641ffffffff0371450d002004102c0b02402005410174410175220620012802082204200420064b1b2205450d00200128020041206a2106200321040340200620042f01003b0100200441026a2104200641226a21062005417f6a22050d000b0b410021062003410020071b2204450d00200741ffffffff0771450d002004102c0b024020022802004100200228020422041b2205450d00200441ffffffff0771450d002005102c0b2000200b36020420002006360200200241c0006a24000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42307e2204422088a722020d022004a722014100480d022002454103742105024002400240024002402000280200410020031b22020d002001450d010c030b200341306c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141306e3602000b0f0b2005450d001039000b103b000bb60201027f230041e0006b220224002002412036020c20022001360208200241106a2001412010b30102400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a10ca030240024020022802480d0020024100360230200242013703282002410f36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241b4bcc3003602482002200241386a360258200241c4006a41dcb7c000200241c8006a103e1a200235023042208620023502288410000240200228022c450d002002280228102c0b200041003602000c010b20002002290348370200200041086a200241c8006a41086a2802003602000b2003450d002001102c0b200241e0006a24000b920e07117f017e0c7f017e017f037e027f230041f0026b220324002001280200220420012802082205412c6c6a21062001280204210702400240024020050d0020042108200421090c010b20034180016a410c6a210a20034180016a410472210b200341d8006a41086a210c200341d8006a41106a210d200341d8006a41186a210e200341d8006a41206a210f200421080340200c20082209410c6a290200370300200d200941146a2210290200370300200e2009411c6a2211290200370300200f200941246a2212290200370300200320092902043703582009412c6a210820092802002213450d01200b2003290358370200200b41086a200c290300370200200b41106a200d290300370200200b41186a200e290300370200200b41206a200f29030037020020032013360280012002200a10d7032114200341b0016a41086a2215200a41086a290200370300200341b0016a41106a2216200a41106a290200370300200341b0016a41186a2217200a41186a2902003703002003200a2902003703b00120032802840121182003280288012101200342003703d801200320143703d00102400240200141226c2205450d00201320056a2119201321010340200141206a2f0100211a200341d0026a41186a221b200141186a290000370300200341d0026a41106a221c200141106a290000370300200341d0026a41086a221d200141086a290000370300200320012900003703d0020240201a450d00200341f0016a41086a221e201d290300370300200341f0016a41106a221f201c290300370300200341f0016a41186a2220201b290300370300200320032903d002222137039002200320213703f001201442ffff03822121413010322222450d06200341c8006a2014420042ffff03420010c808200341386a2003290348200341c8006a41086a290300201aad420010ce08202220032903f001370300202241186a2020290300370300202241106a201f290300370300202241086a201e2903003703002022200329033822142021a7201a6c221a41ffff036e417f201a4180807c491b201a41ffff037041ffff014b6aad42ffff03837c2221370320202241286a200341386a41086a2903002021201454ad7c37030020034281808080103702e401200320223602e001200320193602fc012003200141226a22013602f801200320183602f401200320133602f0012003200341d0016a360280024101211a024020054122460d000340200141206a2f01002105201b200141186a290000370300201c200141106a290000370300201d200141086a290000370300200320012900003703d00202402005450d00200341086a20032903d0012214200341d0016a41086a290300222142ffff03420010c708200341286a2014202142ffff03420010c808200341186a2003290328200341286a41086a2903002005ad420010ce0820034190026a41086a201d290300221437030020034190026a41106a201c290300222137030020034190026a41186a201b29030022233703002003200141226a3602f801200320032903d002222437039002201b2023370300201c2021370300201d2014370300200320243703d002200341186a41086a29030020032903182214200328020820056c220141ffff036e417f20014180807c491b200141ffff037041ffff014b6aad42ffff03837c2221201454ad7c21140240201a20032802e401470d00200341e0016a201a410110e00120032802e00121220b2022201a41306c6a220120032903d002370300201c2903002123201b2903002124201d290300212520012021370320200141086a2025370300200141286a2014370300200141186a2024370300200141106a20233703002003201a41016a221a3602e80120032802f801220120032802fc012219470d010c020b2019200141226a2201470d000b200320193602f8010b20032802f401220141226c202620011b2126024020032802f001410020011b2201450d002026450d002001102c0b20032802e40121010c030b200141226a21012005415e6a22050d000b0b201841226c202720181b2127410021014108212202402018450d002027450d002013102c0b4100211a0b200341d0026a41186a22052017290300370300200341d0026a41106a221b2016290300370300200341d0026a41086a221c2015290300370300200320032903b0013703d002200920013602042009201a36020820092022360200200920032903d00237020c2010201c2903003702002011201b2903003702002012200529030037020020082006470d000b20082109200621080b200620086b2201412c6d210502402001450d002005412c6c210103400240200841046a2802002205450d002008280200221a450d00200541226c450d00201a102c0b2008412c6a2108200141546a22010d000b0b20002007360204200020043602002000200920046b412c6d3602082002102c200341f0026a24000f0b1039000bc9da01074d7f057e017f027e047f067e067f230041a00e6b220124004100210220014100360284022001410036020820014100360200024002400240024002400240200041086a220328020022040d00410021050c010b20014188056a41c0006a2106200141d80d6a41206a2107200141c0006a41206a210820014188056a41206a2109200141106a41106a210a200141106a41186a210b4100210c034002400240024020032802002205200c4d0d00200141106a41086a220d2000280200200c412c6c220e6a220f41146a290000370300200a200f411c6a290000370300200b200f41246a2900003703002001200f29000c3703102001410036023820014201370330200f2802002105200141306a4100200f280208220f10d60120012802382110200128023021110240200f41306c2212450d00201120104105746a210f0340200f2005290000370000200f41186a200541186a290000370000200f41106a200541106a290000370000200f41086a200541086a290000370000201041016a2110200f41206a210f200541306a2105201241506a22120d000b0b200120103602380240201041014b0d0041002113410121140c030b2010417f6a20106c410176220541ffffff1f712005470d0120054106742205417f4c0d01410121154101211402402005450d00200510322214450d070b417f21162010417f6a2117201141206a211820054106762113410021194100211a03400240201a220541016a221a20104f0d0002400240200520104f0d0020102015201020154b1b20166a211b201120054105746a211c201a2010201a20104b1b211d2019410674211e2019410174211f410021122018210f02400340200141c8046a41186a2205201c41186a290000370300200141c8046a41106a2220201c41106a290000370300200141c8046a41086a2221201c41086a2900003703002001201c2900003703c8040240024002400240201b2012460d0020014188056a41186a2222200529030037030020014188056a41106a2223202029030037030020014188056a41086a22202021290300370300200120012903c804370388052009200f290000370000200941086a200f41086a290000370000200941106a200f41106a290000370000200941186a200f41186a290000370000201920126a22052013470d03200541016a22212005490d0b201f2021201f20214b1b22214104202141044b1b222141ffffff1f7122242021470d0b202141067422134100480d0b20242021462121201e202520051b21250240024002402014410020051b22050d002013450d010c040b20250d0120130d030b202121140c030b200520252013103522140d020c050b201d201041dc85c400103f000b201310322214450d030b201341067621130b2014201e6a2205200129038805370000200541386a20014188056a41386a290300370000200541306a20014188056a41306a290300370000200541286a20014188056a41286a290300370000200541206a2009290300370000200541186a2022290300370000200541106a2023290300370000200541086a2020290300370000200f41206a210f201e41c0006a211e201f41026a211f2017201241016a2212460d030c000b0b20210d0a0c050b2005201041cc85c400103f000b201920126a21190b2017417f6a21172016417f6a2116201541016a2115201841206a2118201a2010470d000b2019450d02201420194106746a2126201421210340200141c0006a41386a202141386a290000370300200141c0006a41306a202141306a290000370300200141c0006a41286a202141286a2900003703002008202141206a290000370300200141c0006a41186a202141186a2205290000370300200141c0006a41106a202141106a220f290000370300200141c0006a41086a202141086a22122900003703002001202129000037034020014180016a41186a221c200529000037030020014180016a41106a2205200f29000037030020014180016a41086a220f20122900003703002001202129000037038001200141a0016a41186a200841186a2212290000370300200141a0016a41106a200841106a221e290000370300200141a0016a41086a200841086a221f290000370300200120082900003703a001200141d80d6a41186a2222201c290300370300200141d80d6a41106a22232005290300370300200141d80d6a41086a2224200f29030037030020072008290000370000200741086a201f290000370000200741106a201e290000370000200741186a201229000037000020012001290380013703d80d024002402001280200221e450d00200128020421200c010b41a8081032221e450d0841002120201e41003b0106201e4100360200201e41086a20014188056a41a00810c9081a200141003602042001201e3602000b202141c0006a21210340201e41286a2105201e41086a2117201e2f0106211c4100210f0340024002400240024002400240024002400240024002400240024002400240024002400240201c200f460d0002400240200141d80d6a200541606a412010cc082212450d002012417f4c0d010c130b20072005412010cc082212450d02201241004e0d120b200f211c0b2020450d012020417f6a2120201e201c4102746a41a8086a280200211e0c120b20032802002219200c4d0d0620002802002222200e6a220528020841306c221f450d0e201e200f41057422276a41c8056a2123200528020021054100211c034041012112024020014180016a2005460d00200520014180016a412010cc08450d000240200141a0016a2005470d00410121120c010b2005200141a0016a412010cc084521120b200541306a21052012201c6a211c201f41506a221f0d000b201c4102470d0e2019412c6c21120340202221052012450d0f02402005410c6a221c2023460d00201241546a21122005412c6a2122201c2023412010cc080d010b0b0240200541086a2802002212450d002005280200221f201241306c22226a211c20014180016a201f6b2119200141a0016a201f6b211b41002112034020192012460d03201f20126a220520014180016a412010cc08450d03201b2012460d032005200141a0016a412010cc08450d032022201241306a2212470d000b0b41002118410821150c0c0b200141c0016a41386a2205200141d80d6a41386a2220290300370300200141c0016a41306a220f200141d80d6a41306a2219290300370300200141c0016a41286a2212200141d80d6a41286a221b290300370300200141c0016a41206a221f2007290300370300200141c0016a41186a22102022290300370300200141c0016a41106a221a2023290300370300200141c0016a41086a22152024290300370300200120012903d80d3703c001202020052903003703002019200f290300370300201b20122903003703002007201f290300370300202220102903003703002023201a29030037030020242015290300370300200120012903c0013703d80d20014188036a41186a2228200b29030037030020014188036a41106a2229200a29030037030020014188036a41086a222a200d290300370300200120012903103703880302400240201e2f0106220f410b490d004100212b4104211202400240201c41054f0d00201c211f0c010b410521124105211f02400240201c417b6a0e020201000b201c41796a211f4101212b410621120c010b4100211f4101212b0b41a8081032220f450d1a4100212c200f41003b0106200f4100360200200f41086a20014188056a41a00810c908211c20014188056a41386a2210201720124106746a220541386a29000037030020014188056a41306a221a200541306a29000037030020014188056a41286a2215200541286a2900003703002009200541206a29000037030020014188056a41186a2216200541186a29000037030020014188056a41106a2218200541106a29000037030020014188056a41086a2211200541086a2900003703002001200529000037038805200141e8046a41186a221d201e41c8056a222d20124105746a220541186a290000370300200141e8046a41106a222e200541106a290000370300200141e8046a41086a2227200541086a290000370300200120052900003703e804201c2017201241016a222f4106746a201e2f01062012417f736a220541067410c9081a200f41c8056a202d202f4105746a200541057410c9081a201e20123b0106200f20053b0106200620012903e804370000200641086a22302027290300370000200641106a2231202e290300370000200641186a2232201d290300370000200141c8036a41086a222f2011290300370300200141c8036a41106a22332018290300370300200141c8036a41186a22342016290300370300200141c8036a41206a22352009290300370300200141c8036a41286a22362015290300370300200141c8036a41306a2237201a290300370300200141c8036a41386a2238201029030037030020012001290388053703c803200141c8046a41186a22392032290200370300200141c8046a41106a223a2031290200370300200141c8046a41086a223b2030290200370300200120062902003703c804200141a8046a41186a223c2039290300370300200141a8046a41106a223d203a290300370300200141a8046a41086a223e203b290300370300200120012903c8043703a804200f201e202b1b221241086a2205201f41016a221c4106746a2005201f4106746a220520122f0106201f6b41067410ca081a200541386a2020290300370000200541306a2019290300370000200541286a201b290300370000200541206a2007290300370000200541186a2022290300370000200541106a2023290300370000200541086a2024290300370000200520012903d80d370000201241c8056a2205201c4105746a2005201f4105746a220520122f0106201f6b41057410ca081a200541186a2028290300370000200541106a2029290300370000200541086a202a2903003700002005200129038803370000201220122f010641016a3b010620014188046a41186a223f203c29030037030020014188046a41106a2240203d29030037030020014188046a41086a2241203e290300370300200120012903a80437038804202a202f290300370300202920332903003703002028203429030037030020014188036a41206a2242203529030037030020014188036a41286a2243203629030037030020014188036a41306a2244203729030037030020014188036a41386a22452038290300370300200120012903c80337038803200141e8026a41086a22462041290300370300200141e8026a41106a22472040290300370300200141e8026a41186a2248203f29030037030020012001290388043703e8020240201e2802002205450d004100212c0340200f2149201e210f2005211e200f2f0104211f203820452903003703002037204429030037030020362043290300370300203520422903003703002034202829030037030020332029290300370300202f202a29030037030020012001290388033703c803203f20482903003703002040204729030037030020412046290300370300200120012903e8023703880441000d08024002400240201e2f0106220f410b490d004100214a4104211c0240201f4105490d00201f211c02400240201f417b6a0e020201000b201f41796a211f4101214a4106211c0c010b4100211f4101214a4105211c0b41d8081032220f450d1f202c41016a212c41002105200f41003b0106200f4100360200200f41086a20014188056a41d00810c908214b2010201e41086a2217201c4106746a221241386a290000370300201a201241306a2900003703002015201241286a2900003703002009201241206a2900003703002016201241186a2900003703002018201241106a2900003703002011201241086a2900003703002001201229000037038805201d201e41c8056a222b201c4105746a221241186a290000370300202e201241106a2900003703002027201241086a290000370300200120122900003703e804204b2017201c41016a222d4106746a201e2f0106224c201c417f736a221241067410c908214b200f41c8056a202b202d4105746a201241057410c908214d201e201c3b0106200f20123b0106200620012903e804370000203020272903003700002031202e2903003700002032201d290300370000202020102903003703002019201a290300370300201b20152903003703002007200929030037030020222016290300370300202320182903003703002024201129030037030020012001290388053703d80d20392032290200370300203a2031290200370300203b2030290200370300200120062902003703c804200f41a8086a201e202d4102746a41a8086a204c201c6b41027410c908212d02400340200f20054102746a41a8086a280200221c20053b0104201c200f36020020052005201249221c6a220520124b0d01201c0d000b0b20102020290300370300201a20192903003703002015201b29030037030020092007290300370300201620222903003703002018202329030037030020112024290300370300203e203b290300370300203d203a290300370300203c2039290300370300200120012903d80d37038805200120012903c8043703a804202020102903003703002019201a290300370300201b20152903003703002007200929030037030020222016290300370300202320182903003703002024201129030037030020012001290388053703d80d201d203c290300370300202e203d2903003703002027203e290300370300200120012903a8043703e804204a450d01201f410274202d6a41086a202d201f41016a22054102746a2212200f2f0106201f6b41027410ca081a20122049360200204b20054106746a204b201f4106746a2212200f2f0106201f6b41067410ca081a201241386a2038290300370000201241306a2037290300370000201241286a2036290300370000201241206a2035290300370000201241186a2034290300370000201241106a2033290300370000201241086a202f290300370000201220012903c803370000204d20054105746a204d201f4105746a2212200f2f0106201f6b41057410ca081a201241186a203f290300370000201241106a2040290300370000201241086a20412903003700002012200129038804370000200f200f2f010641016a22123b01062005201241ffff037122124b0d020340200f20054102746a41a8086a280200221c20053b0104201c200f360200200520052012496a221c20124b0d03200520124f211f201c2105201f450d000c030b0b201f410274201e41a8086a22126a41086a2012201f41016a22054102746a2212200f201f6b221c41027410ca081a20122049360200201e41086a221220054106746a2012201f4106746a2212201c41067410ca081a201241386a2038290300370000201241306a2037290300370000201241286a2036290300370000201241206a2035290300370000201241186a2034290300370000201241106a2033290300370000201241086a202f290300370000201220012903c803370000201e41c8056a221220054105746a2012201f4105746a2212201c41057410ca081a201241186a203f290300370000201241106a2040290300370000201241086a20412903003700002012200129038804370000201e200f41016a22123b0106201f200f4b0d05201241ffff0371210f0340201e20054102746a41a8086a280200221220053b01042012201e36020020052005200f496a2212200f4b0d062005200f4f211c20122105201c450d000c060b0b201f410274201e41a8086a22126a41086a2012201f41016a22054102746a2212201e2f0106201f6b41027410ca081a20122049360200201720054106746a2017201f4106746a2212201e2f0106201f6b41067410ca081a201241386a2038290300370000201241306a2037290300370000201241286a2036290300370000201241206a2035290300370000201241186a2034290300370000201241106a2033290300370000201241086a202f290300370000201220012903c803370000202b20054105746a202b201f4105746a2212201e2f0106201f6b41057410ca081a201241186a203f290300370000201241106a2040290300370000201241086a20412903003700002012200129038804370000201e201e2f010641016a22123b01062005201241ffff037122124b0d000340201e20054102746a41a8086a280200221c20053b0104201c201e36020020052005201249221c6a220520124b0d01201c0d000b0b20452020290300370300204420192903003703002043201b290300370300204220072903003703002028202229030037030020292023290300370300202a2024290300370300204620272903003703002047202e2903003703002048201d290300370300200120012903d80d37038803200120012903e8043703e802201e28020022050d000b0b200141a8026a41386a22052045290300370300200141a8026a41306a22122044290300370300200141a8026a41286a221c2043290300370300200141a8026a41206a221e2042290300370300200141a8026a41186a221f2028290300370300200141a8026a41106a22172029290300370300200141a8026a41086a221d202a29030037030020014188026a41086a222e204629030037030020014188026a41106a2227204729030037030020014188026a41186a222b204829030037030020012001290388033703a802200120012903e802370388022024201d290300370300202320172903003703002022201f2903003703002007201e290300370300201b201c2903003703002019201229030037030020202005290300370300200120012903a8023703d80d202a202e290300370300202920272903003703002028202b29030037030020012001290388023703880320012802002212450d0541d80810322205450d1a200541003b010620054100360200200541086a20014188056a41d00810c9081a200520123602a80820012001280204221c41016a360204201241003b0104200120053602002012200536020020102020290300370300201a20192903003703002015201b29030037030020092007290300370300201620222903003703002018202329030037030020112024290300370300200120012903d80d370388052034202829030037030020332029290300370300202f202a29030037030020012001290388033703c803201c202c470d0420052f0106221c410a4b0d032005201c4106746a221241086a200129038805370000201241106a2011290300370000201241186a2018290300370000201241206a2016290300370000201241286a2009290300370000201241306a2015290300370000201241386a201a290300370000201241c0006a20102903003700002005201c4105746a221241c8056a20012903c803370000201241d0056a202f290300370000201241d8056a2033290300370000201241e0056a20342903003700002005201c41016a22123b0106200520124102746a41a8086a200f360200200f2005360200200f20123b01042001200128020841016a360208202c1a0c0f0b2017201c41016a22124106746a2017201c4106746a2205200f201c6b41067410ca081a200541386a2020290300370000200541306a2019290300370000200541286a201b290300370000200541206a2007290300370000200541186a2022290300370000200541106a2023290300370000200541086a2024290300370000200520012903d80d370000201e41c8056a220520124105746a2005201c4105746a2205201e2f0106201c6b41057410ca081a200541186a2028290300370000200541106a2029290300370000200541086a202a2903003700002005200129038803370000201e201e2f010641016a3b01060b2001200128020841016a3602080c0d0b20014188056a41086a2211201f20126a220541086a29030037030020014188056a41106a221d200541106a29030037030020014188056a41186a222e200541186a2903003703002001200529030037038805200541286a290300214e200541206a290300214f413010322215450d172015204f3703202015200129038805370300201541286a204e370300201541186a202e290300370300201541106a201d290300370300201541086a201129030037030020014281808080103702cc03200120153602c8032001201c3602dc0d2001200541306a22053602d80d2001200141a0016a3602e40d200120014180016a3602e00d0240202241506a2012470d0020012802cc0321180c0b0b4101211f024003402001200541306a22123602d80d024020014180016a2005460d00200520014180016a412010cc08450d00200141a0016a2005460d002005200141a0016a412010cc08450d0020122105201c2012470d010c020b200541286a290300214e200541206a290300214f202e200541186a290300370300201d200541106a2903003703002011200541086a29030037030020012005290300370388050240201f20012802cc03470d00200141c8036a201f410110e00120012802c80321150b2015201f41306c6a2205200129038805370300201d2903002150202e2903002151201129030021522005204f370320200541086a2052370300200541286a204e370300200541186a2051370300200541106a20503703002001201f41016a221f3602d00320012802d80d2205201c470d000b0b20012802cc032118201f4102490d0a201f4102470d0741e00010322219450d17200142023702ac04200120193602a804024020032802002205200c4d0d000240024002400240024002402000280200200e6a220528020841306c2222450d00200528020021054100211c03400240024020014180016a2005460d00200520014180016a412010cc08450d00200141a0016a2005460d002005200141a0016a412010cc080d010b200141c8046a41186a221b200541186a290300370300200141c8046a41106a2210200541106a290300370300200141c8046a41086a221a200541086a290300370300200120052903003703c804200541286a290300214e200541206a290300214f0240201c20012802ac04470d00200141a8046a201c410110e00120012802a804211920012802b004211c0b2019201c41306c6a221220012903c804370300201a290300215020102903002151201b29030021522012204f370320201241286a204e370300201241186a2052370300201241106a2051370300201241086a20503703002001201c41016a221c3602b0040b200541306a2105202241506a22220d000b201c4102470d00201f450d0520192015460d0420152019412010cc08450d04201f0e020102030b20012802ac04220541306c205320051b21532019410020051b2205450d112053450d112005102c0c110b4100410041e48ac500103f000b41014101419c86c400103f000b20014188056a41286a2205201541286a22122903003703002009201541206a221c290300370300202e201541186a2222290300370300201d201541106a221b2903003703002011201541086a221029030037030020012015290300370388052012201541d8006a221a290300370300201c201541d0006a22122903003703002022201541c8006a221c290300370300201b201541c0006a22222903003703002010201541386a221b29030037030020152015290330370300201a200529030037030020122009290300370300201c202e2903003703002022201d290300370300201b201129030037030020152001290388053703300b2001427f3703e00d2001427f3703d80d2001410036028804200141003602d004200142083703c8042015201f41306c6a211002400240024020190d0020150d01410021050c020b024020150d00410221050c020b201020156b41306e41026a21050c010b201020156b41306e21050b4100211f200141c8046a4100200510e00120012802c80420012802d004221b41306c6a210502402019450d002024290300215020012903d80d2154410021224100211f03400240201920226a221241206a290300224f205456201241286a290300224e205056204e2050511b0d002001204f3703d80d2001201f360288042001204e3703e00d204f2154204e21500b200520226a221c2012290300370300201241086a2903002151201241106a2903002152201241186a2903002155201c41286a204e370300201c41206a204f370300201c41186a2055370300201c41106a2052370300201c41086a2051370300201f41016a211f202241306a222241e000470d000b200520226a2105201b201f6a211b0b02402015450d0020102015460d002024290300215020012903d80d2154201521120340201241306a211c0240201241206a290300224f205456201241286a290300224e205056204e2050511b0d002001204f3703d80d2001201f360288042001204e3703e00d204f2154204e21500b20052012290300370300201241086a2903002151201241106a2903002152201241186a2903002155200541286a204e370300200541206a204f370300200541186a2055370300200541106a2052370300200541086a2051370300200541306a2105201f41016a211f201b41016a211b201c21122010201c470d000b0b2001201b3602d004200141003602b002200142043703a80220014100360290032001420437038803200128028804210520014188036a10c406200128028803221c20012802900322124102746a20053602002001201241016a22053602900302400240200128028804221f4102490d00200141a8026a10c40620012802a802222220012802b00222124102746a201f410171410373221f3602002001201241016a22123602b002201f417e6a211f02402005200128028c03470d0020014188036a10c4062001280290032105200128028803211c0b201c20054102746a201f3602002001200541016a36029003200128028804417e6a21050240201220012802ac02470d00200141a8026a10c40620012802b002211220012802a80221220b202220124102746a20053602000c010b200141a8026a10c40620012802a802222220012802b00222124102746a4101201f6b3602002001201241016a22123602b0024103201f6b211f02402005200128028c03470d0020014188036a10c4062001280290032105200128028803211c0b201c20054102746a201f3602002001200541016a3602900320012802880441026a21050240201220012802ac02470d00200141a8026a10c40620012802b002211220012802a80221220b202220124102746a20053602000b2001201241016a22053602b002410410322212450d19200142013702cc03200120123602c80320012802a802212d20012802ac02212b024002402005450d00202d20054102746a2116202d211a034002400240201a28020022124102490d00202e202341186a290000370300201d202341106a2900003703002011202341086a29000037030020012023290000370388050c010b202e200b290300370300201d200a2903003703002011200d29030037030020012001290310370388050b024020032802002205450d002000280200221b2005412c6c6a211003400240024020014188056a201b410c6a2205460d00200520014188056a412010cc080d010b201b280208221c450d00201b2802002105201c41306c211f4100212220012802d00421190340201920124d0d060240200520012802c804201241306c6a221c460d002005201c412010cc08450d00200541306a2105202241016a2122201f41506a221f0d010c020b0b200541206a221c427f201c290300224e20012903d80d7c224f204f204e54221c200541286a2205290300224e20242903007c201cad7c224f204e54204f204e511b221c1b3703002005427f204f201c1b3703000b201b412c6a221b2010470d000b0b201a41046a221a2016470d000b0b202b4102742056202b1b21560240202b450d002056450d00202d102c0b2001280288032129200128028c032128024002402001280290032205450d00202920054102746a212d2029212b034002400240202b28020022124102490d00202e202341186a290000370300201d202341106a2900003703002011202341086a29000037030020012023290000370388050c010b202e200b290300370300201d200a2903003703002011200d29030037030020012001290310370388050b024020032802002205450d002000280200221b2005412c6c6a211a03400240024020014188056a201b410c6a2205460d00200520014188056a412010cc080d010b201b41086a22162802002210450d00201b2802002105201041306c41506a211c4100212220012802d00421190340201920124d0d060240200520012802c804201241306c6a221f460d002005201f412010cc08450d00200541306a2105202241016a2122201c41506a221c4150470d010c020b0b0240200541206a221f290300224f20012903d80d225158200541286a2222290300224e2024290300225058204e2050511b0d0020224200204e20507d204f205154ad7d2250204f20517d2251204f562050204e562050204e511b22051b370300201f4200205120051b3703000c010b2005200541306a201c10ca081a20162010417f6a360200024020012802d003220520012802cc03470d00200141c8036a10c40620012802d00321050b20012802c80320054102746a2012360200200120012802d00341016a3602d003200120012802840241016a360284020b201b412c6a221b201a470d000b0b202b41046a222b202d470d000b0b2028410274205720281b215702402028450d002057450d002029102c0b20012802c8032219417c6a211c20012802d0034102742205211202400340024020120d004100211c0c020b2012417c6a2112201c41046a221c28020041014b0d000b0b20012802cc032122201921120240024003402005450d012005417c6a21052012280200211f201241046a2112201f4102490d000b2022410274205820221b215802402022450d002058450d002019102c0b201c0d0120232001290310370000202341186a200b290300370000202341106a200a290300370000202341086a200d2903003700000c0c0b2022410274205920221b215902402022450d002059450d002019102c0b201c0d0b41cc86c400412941f886c400103c000b024002402020450d002020417f6a2112201e200f4106746a221c41086a211f201e200f4102746a41a8086a28020021050240034020052f0106210f2012450d012012417f6a21122005200f4102746a41a8086a28020021050c000b0b20054100200f1b221e41086a2212200f417f6a4100200f1b220f4106746a2205290000214e2005290008214f20052900102150200541186a290000215120052900202152200541286a2900002155200541306a2900002154200541386a290000215a4101213320052012200f41016a22204106746a200f417f732212201e2f01066a41067410ca081a201e41c8056a2222200f4105746a2205290000215b2005290008215c2005290010215d200541186a290000215e2005202220204105746a2012201e2f01066a41057410ca081a201e201e2f0106417f6a3b0106201c41c0006a205a370000201c41386a2054370000201c41306a2055370000201c41286a2052370000201f41186a2051370000201f2050370010201f204f370008201f204e370000202341186a205e3700002023205d3700102023205c3700082023205b370000201e2f010621050c010b2017200f4106746a2017200f41016a22054106746a200f417f732212201e2f01066a41067410ca081a201e41c8056a221c20276a201c20054105746a2012201e2f01066a41057410ca081a201e201e2f0106417f6a22053b0106410021330b4101212f200541ffff037141044b0d094100211b4101212f41012110201e2120034020202802002205450d0a0240024020202f010422120d004100211f2005410020052f01061b2120410021240c010b2012417f6a211f41012124200521200b0240024002400240024002400240024002400240024002400240202041a8086a2212201f41016a22054102746a221a28020022192f010622232012201f41027422276a2216280200221c2f010622226a410b490d0020240d03201941c0006a290000214e201941386a290000214f201941306a2900002150201941206a2900002151201941186a2900002152201941106a2900002155201929002821542019290008215a201941086a201941c8006a202341067441406a10ca081a201941e0056a290000215b201941d8056a290000215c201941d0056a290000215d20192900c805215e201941c8056a201941e8056a202341057441606a10ca081a201b0d01410021220c020b201b41016a211b20202f0106211720014188056a41386a222b202041086a222d201f4106746a221241386a29000037030020014188056a41306a2228201241306a29000037030020014188056a41286a2229201241286a2900003703002009201241206a290000370300202e201241186a290000370300201d201241106a2900003703002011201241086a29000037030020012012290000370388052012202d20054106746a2017201f417f73222d6a41067410ca081a201c41086a222a20224106746a221241386a202b290300370000201241306a2028290300370000201241286a2029290300370000201241206a2009290300370000201241186a202e290300370000201241106a201d290300370000201241086a20112903003700002012200129038805370000202a202241016a22174106746a201941086a202341067410c9081a20202f0106212b200141e8046a41186a2228202041c8056a2229201f4105746a221241186a290000370300200141e8046a41106a221f201241106a290000370300200141e8046a41086a222a201241086a290000370300200120122900003703e8042012202920054105746a202d202b6a41057410ca081a201c41c8056a222b20224105746a221241186a2028290300370000201241106a201f290300370000201241086a202a290300370000201220012903e804370000202b20174105746a201941c8056a202341057410c9081a201a201641086a20202f01062005417f736a41027441046a10ca081a0240200520202f010622224f0d00202720206a41ac086a211203402012280200221f20053b0104201f2020360200201241046a21122022200541016a2205470d000b20202f010621220b20202022417f6a3b0106201c2023201c2f01066a41016a3b0106201b41014d0d0b201c20174102746a41a8086a201941a8086a202341027441046a10c9081a201720236a2112201721050340201c20054102746a41a8086a280200221f20053b0104201f201c36020020052005201249221f6a220520124b0d0c201f450d0c0c000b0b20192802a8082122201941a8086a2205201941ac086a202341027410ca081a2022410036020002402023450d004100211203402005280200221c20123b0104201c2019360200200541046a21052023201241016a2212470d000b0b201b417f6a211c20192f010621230b20192023417f6a3b01062020201f4106746a220541206a2212290000215f20122051370000200541186a2212290000215120122052370000200541106a2212290000215220122055370000200541086a221229000021552012205a370000200541c0006a2212290000215a2012204e370000200541386a2212290000214e2012204f370000200541306a2212290000214f20122050370000200541286a22052900002150200520543700002020201f4105746a220541d8056a221229000021542012205c370000200541d0056a2212290000215c2012205d370000200541c8056a2212290000215d2012205e370000200541e0056a2205290000215e2005205b370000201628020021050240201b450d002022450d03201b417f6a201c470d0420052f0106221c410a4b0d052005201c41016a221f3b01062005201c4106746a221241c0006a205a370000201241386a204e370000201241306a204f370000201241286a2050370000201241206a205f370000201241186a2051370000201241106a2052370000201241086a20553700002005201c4105746a221241e0056a205e370000201241d8056a2054370000201241d0056a205c370000201241c8056a205d3700002005201f4102746a41a8086a20223602002022201f3b0104202220053602000c020b20052f0106221c410b4f0d052005201c41016a3b01062005201c4106746a221241c0006a205a370000201241386a204e370000201241306a204f370000201241286a2050370000201241206a205f370000201241186a2051370000201241106a2052370000201241086a20553700002005201c4105746a220541e0056a205e370000200541d8056a2054370000200541d0056a205c370000200541c8056a205d3700000c010b201c2022417f6a22124105746a220541e0056a290000214e200541d8056a290000214f200541d0056a2900002150200541c8056a2900002151201c20124106746a220541c0006a2900002152200541386a2900002155200541306a2900002154200541286a290000215a200541206a290000215b200541186a290000215c200541106a290000215d200541086a290000215e02400240201b0d00410021230c010b201c20224102746a41a8086a28020022234100360200201b417f6a2119201c2f010621220b201c2022417f6a3b01062020201f4106746a220541206a2212290000215f2012205b370000200541186a2212290000215b2012205c370000200541106a2212290000215c2012205d370000200541086a2212290000215d2012205e370000200541c0006a2212290000215e20122052370000200541386a2212290000215220122055370000200541306a2212290000215520122054370000200541286a220529000021542005205a3700002020201f4105746a220541d8056a2212290000215a2012204f370000200541d0056a2212290000214f20122050370000200541c8056a2212290000215020122051370000200541e0056a220529000021512005204e370000201a28020021120240201b450d002023450d06201b417f6a2019470d07024020122f01062205410a4b0d00201241c8006a201241086a200541067410ca081a201241386a2052370000201241306a205537000020122054370028201241186a205b370000201241106a205c3700002012205d370008201241c0006a205e370000201241206a205f370000201241e8056a201241c8056a20122f010641057410ca081a201241e0056a2051370000201241d8056a205a370000201241d0056a204f370000201220503700c805201241ac086a201241a8086a20122f010641027441046a10ca081a201220233602a808201220122f010641016a22053b0106200541ffff0371211c410021050340201220054102746a41a8086a280200221f20053b0104201f201236020020052005201c496a221f201c4b0d032005201c4f2120201f21052020450d000c030b0b41ecbec40041274194bfc400103c000b201241c8006a201241086a20122f010641067410ca081a201241c0006a205e370000201241386a2052370000201241306a205537000020122054370028201241206a205f370000201241186a205b370000201241106a205c3700002012205d370008201241e8056a201241c8056a20122f010641057410ca081a201241e0056a2051370000201241d8056a205a370000201241d0056a204f370000201220503700c805201220122f010641016a3b01060b2010202471450d12200f201e2f0106490d0641002112024003400240201e28020022050d00410021050c020b201241016a2112201e2f0104210f2005211e200f20052f01064f0d000b200f41016a210f0b024020120d002005211e0c130b2005200f4102746a41a8086a280200211e02402012417f6a2205450d000340201e2802a808211e2005417f6a22050d000b0b4100210f0c120b41ecd0c800412b41a4bfc400103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b41e0cec80041204188bec400103c000b41ecd0c800412b41ccbec400103c000b419ecec800413041dcbec400103c000b4101212f200f41016a210f0c0b0b2019102c024002402010417f732024417f73724101710d00201b4101470d01202020276a41a8086a280200211e2017410020241b200f6a210f0b024020202f010622050d004100212f0c0c0b4100211020054105490d010c0b0b0b41d5a1c800412841f8bdc400103c000b2012201941bc86c400103f000b2012201941ac86c400103f000b41004100418c86c400103f000b200c200541fc85c400103f000b41e0cec80041204180cfc800103c000b419ecec800413041d0cec800103c000b41ecd0c800412b41bcd2c800103c000b41a5d0c800413541dcd0c800103c000b200c201941ec85c400103f000b02402033450d00200f201e2f0106490d000340201e2802002205450d01201e2f0104210f2005211e200f20052f01064f0d000b0b20012001280208417f6a360208202f0d0020012802002205450d022001280204220f450d032001200f417f6a360204200120052802a808220f360200200f41003602002005102c0b20012802cc04220541306c206020051b2160024020012802c804410020051b2205450d002060450d002005102c0b20012802ac04220541306c206120051b216120012802a804410020051b2205450d002061450d002005102c0b201841306c206220181b21622015410020181b2205450d042062450d042005102c0c040b41ecd0c800412b41ac9ec800103c000b4198bec400412141bcbec400103c000b20232001290310370000202341186a200b290300370000202341106a200a290300370000202341086a200d2903003700000b201841306c206320181b21632015410020181b2205450d002063450d002005102c0b20212026460d060c030b200f41016a210f200541c0006a21050c000b0b0b0b200c200541bc85c400103f000b103b000b2013410674206420131b216402402013450d002064450d002014102c0b200c41016a210c20012802342205410574206520051b216502402001280230410020051b2205450d002065450d002005102c0b200c2004470d000b02402001280200220f0d00410021050c010b2001280208211f20012802042109200f210503402009450d022009417f6a2109200f200f2f01064102746a41a8086a280200210f20052802a80821050c000b0b4100211f0b20014180056a2114200141f8046a2120200141e8046a41086a2121024002400340201f450d012005450d0202400240200220052f01064f0d002005210f0c010b2012211e201c21020340024002402005280200220f0d004100210f201e21090c010b20052f01042102200941016a2209211e0b2005102c200f2105200921122002211c2002200f2f01064f0d000b0b2014200f20024105746a220541e0056a2900003703002020200541d8056a2900003703002021200541d0056a2900003703002001200541c8056a2900003703e804200241016a21020240024020090d00200f21050c010b200f20024102746a41a8086a280200210502402009417f6a220f450d00034020052802a8082105200f417f6a220f0d000b0b410021020b201f417f6a211f410021090c000b0b02402005450d002005280200210f2005102c200f450d000340200f2802002105200f102c2005210f20050d000b0b2001410036028002200141003602f002200141003602e802200041086a22152802002231450d022015280200210f20014188056a4104722108200141e8046a41106a2106200141e8046a41186a212f20014188036a41206a21284100211c024003402001201c36028402200f201c4d0d01201c41016a2130200141e8046a41086a223320002802002205201c412c6c6a220941146a29000037030020062009411c6a290000370300202f200941246a2900003703002001200929000c3703e8044100212e034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402005201c412c6c6a2205280208202e4d0d00200141c8046a41186a2005280200202e41306c6a220541186a2209290300370300200141c8046a41106a200541106a2212290300370300200141c8046a41086a200541086a221e290300370300200120052903003703c804200141c0016a41186a221f202f290300370300200141c0016a41106a22142006290300370300200141c0016a41086a22202033290300370300200120012903e8043703c001200141003a00e001200141a8026a41186a220f2009290000370300200141a8026a41106a22092012290000370300200141a8026a41086a2212201e290000370300200120052900003703a802200141013a00c802200141e8026a200141c0016a10c506211e200141e8026a200141a8026a10c5062121200141d80d6a41186a2216202f290300370300200141d80d6a41106a22182006290300370300200141d80d6a41086a22112033290300370300200120012903e8043703d80d200141003a00f80d20014188056a200141e8026a200141d80d6a10c606202820012d00e0013a000020014188036a41186a2227201f29030037030020014188036a41106a222b201429030037030020014188036a41086a222d2020290300370300200120012903c00137038803024002402001280288054101460d00200141d80d6a41306a200841306a280200360200200141d80d6a41286a200841286a290200370300200141d80d6a41206a200841206a2902003703002016200841186a2902003703002018200841106a2902003703002011200841086a290200370300200120082902003703d80d200141c8036a41086a221f202d290300370300200141c8036a41106a2214202b290300370300200141c8036a41186a22202027290300370300200141c8036a41206a222220282d00003a000020012001290388033703c803413410322205450d2b200542003702082005428180808010370200200520012903c803370210200520012f00403b0031200541186a201f290300370200200541206a2014290300370200200541286a2020290300370200200541306a20222d00003a0000200541336a200141c0006a41026a2d00003a0000200141d80d6a200510c70621050c010b2001280290052001280294054102746a41046a21050b2005280200222428020041016a220541014d0d1f202420053602002016200f2903003703002018200929030037030020112012290300370300200120012903a8023703d80d200141013a00f80d20014188056a200141e8026a200141d80d6a10c6062028200141a8026a41206a2d00003a00002027200f290300370300202b2009290300370300202d2012290300370300200120012903a80237038803024002402001280288054101460d00200141d80d6a41306a200841306a280200360200200141d80d6a41286a200841286a290200370300200141d80d6a41206a200841206a2902003703002016200841186a2902003703002018200841106a2902003703002011200841086a290200370300200120082902003703d80d200141c8036a41086a220f202d290300370300200141c8036a41106a2209202b290300370300200141c8036a41186a22122027290300370300200141c8036a41206a221f20282d00003a000020012001290388033703c803413410322205450d2b200542003702082005428180808010370200200520012903c803370210200520012f00403b0031200541186a200f290300370200200541206a2009290300370200200541286a2012290300370200200541306a201f2d00003a0000200541336a200141c0006a41026a2d00003a0000200141d80d6a200510c70621050c010b2001280290052001280294054102746a41046a21050b2005280200221b280200220f41016a220541014d0d1f201b200536020002400240024002400240024002400240201e0d0020210d01202428020041016a220541014d0d2720242005360200201b2802080d0b201b417f3602080240201b28020c2205450d0020052005280200417f6a360200201b28020c22052802000d002005410c6a10c806201b28020c41046a22052005280200417f6a360200201b28020c220541046a2802000d002005102c0b201b202436020c201b201b28020841016a3602080c2b0b2021450d0120014188056a202410c90620012802940521352001280290052136200128028c05211d200128028805212a20014188056a201b10c906200128029405214a2001280290052137200128028c0521290240202a2001280288052234460d00202a28020841016a220541004c0d09202a20053602082034280208220541016a220f41004c0d0a2034200f360208202a41106a203441106a412010cc08210f202a2d003021092034200536020820342d00302105202a202a280208417f6a360208200f0d05200941ff0171200541ff0171470d050b2029204a410274221a6a2121201d203541027422026a210920020d024100211e0c030b200f417e4f0d25201b200f41026a36020020242802080d0a2024417f3602080240202428020c2205450d0020052005280200417f6a360200202428020c22052802000d002005410c6a10c806202428020c41046a22052005280200417f6a360200202428020c220541046a2802000d002005102c0b2024201b36020c2024202428020841016a3602080c290b202428020041016a220541014d0d2420242005360200201b2802080d0a201b417f3602080240201b28020c2205450d0020052005280200417f6a360200201b28020c22052802000d002005410c6a10c806201b28020c41046a22052005280200417f6a360200201b28020c220541046a2802000d002005102c0b201b202436020c201b201b28020841016a3602080c280b204a41ffffffff037121224100211e202121122009211c0340024020292012470d002022211e0c020b0240201c417c6a221c28020022052012417c6a2212280200220f460d00200528020841016a221f41004c0d0c2005201f360208200f280208221f41016a221441004c0d0d200f2014360208200541106a200f41106a412010cc08211420052d00302120200f201f360208200f2d0030210f20052005280208417f6a36020820140d02202041ff0171200f41ff0171470d020b201e41016a211e201d201c470d000b0b200141003602900420014204370388042035201e6b2114204a201e6b224641016a210f024002402029450d00200f202120296b41027622052005200f4b1b4100200f1b20142009201d6b4102762205200520144b1b410020141b6a21050c010b20142009201d6b4102762205200520144b1b410020141b21050b20014188046a4100200510950220012802880420012802900422204102746a210502402029450d00200f450d002029201a6a211f204a417f73201e6a2112204a20206a201e6b41016a21212029210f0340201f200f460d01200f280200221c28020041016a221e41014d0d24201c201e3602002005201c360200202041016a2120200541046a2105200f41046a210f201241016a221c20124f211e201c2112201e0d000b202121200b02402014450d0002402009201d6b410276220f20144d0d00200f2014417f736a2212200f4f0d01200920124102746b417c6a201d2012200f491b21090b2009201d460d0003402009417c6a2209280200220f28020041016a221241014d0d24200f20123602002005200f360200202041016a2120200541046a2105201d2009470d000b0b20012020360290042001427f3703b0042001427f3703a804200141c0006a41186a22384200370300200141c0006a41106a223f4200370300200141c0006a41086a224042003703002001420037034020274200370300202b4200370300202d42003703002001420037038803410021252001410036020020014100360230200120014188046a360210200120014188046a36028001410021074100212c4100211002402020450d00427f21514100212c200128028804212141002110427f214e427f214f202021074100211f03402007201f4d0d0f2021201f4102746a22092802002205280208220f41016a41004c0d10201f41016a21142005200f360208024020052d00300d002001280290042205201f4d0d122009280200220528020841016a220f41004c0d132005200f360208200141c8036a41186a2222200541286a290000370300200141c8036a41106a2223200541206a290000370300200141c8036a41086a2213200541186a29000037030020052005280208417f6a360208200120052900103703c8032001280290042205201441002005417f6a201f4b1b220f4d0d142021200f4102746a280200220528020841016a220f41004c0d152005200f3602082016200541286a2900003703002018200541206a2900003703002011200541186a29000037030020052005280208417f6a360208200120052900103703d80d2001280290042205201f2005201f1b417f6a220f4d0d162021200f4102746a280200220528020841016a220f41004c0d172005200f36020820014188056a41186a2207200541286a29000037030020014188056a41106a2219200541206a29000037030020014188056a41086a2217200541186a29000037030020052005280208417f6a36020820012005290010370388052015280200412c6c220f210920002802002212211c02400340201c21052009450d010240200141c8036a2005410c6a221e460d00200941546a21092005412c6a211c201e200141c8036a412010cc080d010b0b200541086a28020041306c21092005280200211c0340201c21052009450d010240200141d80d6a2005460d00200941506a2109200541306a211c2005200141d80d6a412010cc080d010b0b2051200541206a290300225258204f200541286a290300225058204f2050511b0d0020402011290300370300203f201829030037030020382016290300370300202d2013290300370300202b202329030037030020272022290300370300200120523703a804200120012903d80d370340200120012903c803370388032001201f360200200120503703b0044101212c20014101360230201f2110205221512050214e2050214f0b034020122105200f450d010240200141c8036a2005410c6a2209460d00200f41546a210f2005412c6a21122009200141c8036a412010cc080d010b0b200541086a28020041306c210f20052802002109034020092105200f450d01024020014188056a2005460d00200f41506a210f200541306a2109200520014188056a412010cc080d010b0b204e214f2051200541206a290300225258204e200541286a290300225058204e2050511b0d0020402017290300370300203f201929030037030020382007290300370300202d2013290300370300202b202329030037030020272022290300370300200120523703a8042001200129038805370340200120012903c803370388032001201f360200200120503703b0044100212c20014100360230201f2110205221512050214e2050214f0b20012802900421072014211f20142020470d000b0b200141003602d003200142043703c803202c20106a21454101211720070d01410021050c210b2037ad4220862029ad84224e2036ad422086201dad84224f2035204a4b22201b2250a721140240204a203520201b2221410274220f450d002014200f6a211f410121054100211c2014210920142112034002400240201c4101710d00201f20096b41027620054d0d03200920054102746a21090c010b201f2009460d020b2012280200221c28020041016a220541014d0d23201c2005360200200928020022052802080d0c201241046a21122005417f3602080240200528020c221e450d00201e201e280200417f6a360200200528020c221e2802000d00201e410c6a10c806200528020c41046a221e201e280200417f6a360200200528020c221e41046a2802000d00201e102c0b200941046a21092005201c36020c4101211c2005200528020841016a36020841002105201f2012470d000b0b2021450d0b2035204a20201b221e0d014100410041b887c400103f000b204541017121134100212520072105410021200340200120203602a001200520204d0d14200128028804221220204102746a280200220528020841016a220f41004c0d15202041016a21192005200f3602082001200541086a220936028c0220012005410c6a36028802024020052d00300d0020202105024020200d0020012802800141086a28020021050b200128029004220f2005417f6a22054d0d17201220054102746a280200220528020841016a220f41004c0d182005200f3602082001200541086a3602dc0d20012005410c6a3602d80d02400240201528020022050d00201921050c010b2000280200221f2005412c6c6a21224100211403400240024020012802880241046a2205201f410c6a220f460d00200f2005412010cc080d010b201f41086a22232802002221450d00202141306c211e20012802d80d41046a221c201f28020022096b2112410021054100210f0240034020122005460d01200920056a201c412010cc08450d01200f41016a210f201e200541306a2205470d000c020b0b200920056a220f41286a2209290300214e200f41206a2212290300214f200141a8046a41086a290300215120012903a80421500240024002402020410171450d0020130d01427f204e20517c204f20507c2250204f54221cad7c224f201c204f204e54204f204e511b221c1b214e427f2050201c1b214f0c020b024020130d004200204e20517d204f205054ad7d2251204f20507d2250204f562051204e562051204e511b221c1b214e42002050201c1b214f0c020b427f204e20517c204f20507c2250204f54221cad7c224f201c204f204e54204f204e511b221c1b214e427f2050201c1b214f0c010b4200204e20517d204f205054ad7d2251204f20507d2250204f562051204e562051204e511b221c1b214e42002050201c1b214f0b0240204f204e84500d002009204e3703002012204f3703000c010b2001280284022109200f200f41306a201e20056b41506a10ca081a20232021417f6a360200200120012802800241016a360280024100201720092014461b2117024020012802a001222020012802002210470d0020012802300d00202021100c010b200128029004220520204d0d1c20012802880420204102746a280200220528020041016a220f41014d0d252005200f3602002020210f024020200d0020012802800141086a280200210f0b2001280290042209200f417f6a220f4d0d1d200128028804200f4102746a280200220f28020041016a220941014d0d25200f20093602000240202520012802cc03470d00200141c8036a10ae0120012802d00321250b20012802c80320254103746a2209200f360204200920053602002001202541016a22253602d0030b201441016a2114201f412c6a221f2022470d000b202041016a21050b200128029004220f20054100200128021041086a280200417f6a20204b1b22054d0d1b20012802880420054102746a280200220528020841016a220f41004c0d1c2005200f3602082001200541086a220936028c0520012005410c6a36028805024020152802002205450d002000280200221f2005412c6c6a21224100211403400240024020012802880241046a2205201f410c6a220f460d00200f2005412010cc080d010b201f41086a22232802002221450d00202141306c211e20012802880541046a221c201f28020022096b2112410021054100210f0240034020122005460d01200920056a201c412010cc08450d01200f41016a210f201e200541306a2205470d000c020b0b200920056a220f41286a2209290300214e200f41206a2212290300214f200141a8046a41086a290300215120012903a80421500240024002402020410171450d0020130d014200204e20517d204f205054ad7d2251204f20507d2250204f562051204e562051204e511b221c1b214e42002050201c1b214f0c020b024020130d00427f204e20517c204f20507c2250204f54221cad7c224f201c204f204e54204f204e511b221c1b214e427f2050201c1b214f0c020b4200204e20517d204f205054ad7d2251204f20507d2250204f562051204e562051204e511b221c1b214e42002050201c1b214f0c010b427f204e20517c204f20507c2250204f54221cad7c224f201c204f204e54204f204e511b221c1b214e427f2050201c1b214f0b0240204f204e84500d002009204e3703002012204f3703000c010b2001280284022109200f200f41306a201e20056b41506a10ca081a20232021417f6a360200200120012802800241016a360280024100201720092014461b2117024020012802a001222020012802002210470d0020012802304101470d00202021100c010b200128029004220520204d0d2020012802880420204102746a280200220528020041016a220f41014d0d252005200f3602002001280290042209202041016a4100200128021041086a280200417f6a20204b1b220f4d0d21200128028804200f4102746a280200220f28020041016a220941014d0d25200f20093602000240202520012802cc03470d00200141c8036a10ae0120012802d00321250b20012802c80320254103746a2209200f360204200920053602002001202541016a22253602d0030b201441016a2114201f412c6a221f2022470d000b200128028c052209280200210f0b2009200f417f6a36020020012802dc0d22052005280200417f6a360200200128028c022209280200210f0b2009200f417f6a36020020012802900421052019212020192007460d1f0c000b0b204f204e20201b224ea7221c280200220928020041016a220541014d0d1f20092005360200201428020022052802080d1c2005417f3602080240200528020c2212450d0020122012280200417f6a360200200528020c22122802000d002012410c6a10c806200528020c41046a22122012280200417f6a360200200528020c221241046a2802000d002012102c0b204e422088214e2050422088214f2005200936020c2005200528020841016a360208201e4102742109201c21050340200528020022122012280200417f6a3602000240200528020022122802000d002012410c6a10c806200528020041046a22122012280200417f6a3602002005280200221241046a2802000d002012102c0b200541046a21052009417c6a22090d000b2048204ea7410274204e5022051b214802404100201c20051b2205450d002048450d002005102c0b201421050340200528020022092009280200417f6a3602000240200528020022092802000d002009410c6a10c806200528020041046a22092009280200417f6a3602002005280200220941046a2802000d002009102c0b200541046a2105200f417c6a220f0d000b2047204fa7410274204f5022051b2147024020050d002047450d002014102c0b20342034280200417f6a220f36020041012105200f0d222034410c6a10c806203441046a220f200f280200417f6a220f360200200f0d222034102c0c220b2030211c20302031470d2520012802e8022205450d2920012802f002211c20012802ec02210f200521090240034020052f01322112200f450d01200f417f6a210f200520124102746a41a0036a280200210520092802a00321090c000b0b200141ec0d6a2012360200200141e80d6a20053602002001200f3602e40d200141003602e00d200120093602dc0d2001200f3602d80d0c2a0b41fcaec8004118200141980e6a41d887c4004198e9c4001040000b41fcaec8004118200141980e6a41d887c40041a8e9c4001040000b41d4afc8004110200141980e6a41a8ebc40041c8ebc4001040000b41d4afc8004110200141980e6a41a8ebc40041c8ebc4001040000b41d4afc8004110200141980e6a41a8ebc40041c8ebc4001040000b41fcaec8004118200141980e6a41d887c4004198e9c4001040000b41fcaec8004118200141980e6a41d887c40041a8e9c4001040000b41d4afc8004110200141980e6a41a8ebc40041c8ebc4001040000b4100410041a887c400103f000b201f200741c887c400103f000b41fcaec8004118200141980e6a41d887c40041e887c4001040000b201f200541f887c400103f000b41fcaec8004118200141980e6a41d887c400418888c4001040000b200f2005419888c400103f000b41fcaec8004118200141980e6a41d887c40041a888c4001040000b200f200541b888c400103f000b41fcaec8004118200141980e6a41d887c40041c888c4001040000b2020200541d888c400103f000b41fcaec8004118200141980e6a41d887c40041e888c4001040000b2005200f41f888c400103f000b41fcaec8004118200141980e6a41d887c400418889c4001040000b20202005419889c400103f000b200f200941a889c400103f000b2005200f41b889c400103f000b41fcaec8004118200141980e6a41d887c40041c889c4001040000b2020200541d889c400103f000b200f200941e889c400103f000b41d4afc8004110200141980e6a41a8ebc40041c8ebc4001040000b2001280230212c0b024020102005417f6a470d00202c4101460d030b41c0001032220f450d0a200f200129038803370000200f2001290340370020200f41186a2027290300370000200f41106a202b290300370000200f41086a202d290300370000200f41286a2040290300370000200f41306a203f290300370000200f41386a203829030037000002400240204520464b0d00204a417f6a2221450d01204a4101204a41014b1b417f6a212020014188056a200f6b211c200141d80d6a200f6b21124100211e024002400240024002400340201e2209204a460d01202920094102746a221f280200220528020041016a221e41014d0d082005201e360200200528020841016a221e41004c0d022005201e3602082016200541286a2900003703002018200541206a2900003703002011200541186a29000037030020052005280208417f6a360208200120052900103703d80d20052005280200417f6a221e3602000240201e0d002005410c6a10c806200541046a221e201e280200417f6a221e360200201e0d002005102c0b200941016a211e20092020460d032029201e4102746a2214280200220528020041016a220941014d0d0820052009360200200528020841016a220941004c0d042005200936020820014188056a41186a200541286a29000037030020014188056a41106a200541206a29000037030020014188056a41086a200541186a29000037030020052005280208417f6a360208200120052900103703880520052005280200417f6a2209360200024020090d002005410c6a10c806200541046a22092009280200417f6a220936020020090d002005102c0b4100210502400340200541c000460d01024020122005460d00200f20056a2109200541206a21052009200141d80d6a412010cc080d010b0b410021050340200541c000460d01201c2005460d09200f20056a2109200541206a2105200920014188056a412010cc080d000c090b0b201f280200220928020041016a220541014d0d0820092005360200201428020022052802080d052005417f3602080240200528020c221f450d00201f201f280200417f6a360200200528020c221f2802000d00201f410c6a10c806200528020c41046a221f201f280200417f6a360200200528020c221f41046a2802000d00201f102c0b2005200936020c2005200528020841016a360208201e2021470d000c070b0b204a204a41b88ac400103f000b41fcaec8004118200141980e6a41d887c40041c88ac4001040000b201e204a41d88ac400103f000b41fcaec8004118200141980e6a41d887c40041e88ac4001040000b41d4afc8004110200141980e6a41a8ebc40041c8ebc4001040000b02402035417f6a2221450d0020354101203541014b1b417f6a212020014188056a200f6b211c200141d80d6a200f6b21124100211e024002400240024002400340201e22092035460d01201d20094102746a221f280200220528020041016a221e41014d0d082005201e360200200528020841016a221e41004c0d022005201e3602082016200541286a2900003703002018200541206a2900003703002011200541186a29000037030020052005280208417f6a360208200120052900103703d80d20052005280200417f6a221e3602000240201e0d002005410c6a10c806200541046a221e201e280200417f6a221e360200201e0d002005102c0b200941016a211e20092020460d03201d201e4102746a2214280200220528020041016a220941014d0d0820052009360200200528020841016a220941004c0d042005200936020820014188056a41186a200541286a29000037030020014188056a41106a200541206a29000037030020014188056a41086a200541186a29000037030020052005280208417f6a360208200120052900103703880520052005280200417f6a2209360200024020090d002005410c6a10c806200541046a22092009280200417f6a220936020020090d002005102c0b4100210502400340200541c000460d01024020122005460d00200f20056a2109200541206a21052009200141d80d6a412010cc080d010b0b410021050340200541c000460d01201c2005460d08200f20056a2109200541206a2105200920014188056a412010cc080d000c080b0b201f280200220928020041016a220541014d0d0820092005360200201428020022052802080d052005417f3602080240200528020c221f450d00201f201f280200417f6a360200200528020c221f2802000d00201f410c6a10c806200528020c41046a221f201f280200417f6a360200200528020c221f41046a2802000d00201f102c0b2005200936020c2005200528020841016a360208201e2021470d000c060b0b2035203541f889c400103f000b41fcaec8004118200141980e6a41d887c40041888ac4001040000b201e203541988ac400103f000b41fcaec8004118200141980e6a41d887c40041a88ac4001040000b41d4afc8004110200141980e6a41a8ebc40041c8ebc4001040000b201b28020041016a220541014d0d01201b2005360200024020242802080d002024417f3602080240202428020c2205450d0020052005280200417f6a360200202428020c22052802000d002005410c6a10c806202428020c41046a22052005280200417f6a360200202428020c220541046a2802000d002005102c0b2024201b36020c2024202428020841016a360208200f102c0c040b41d4afc8004110200141980e6a41a8ebc40041c8ebc4001040000b202428020041016a220541014d0d0020242005360200201b2802080d01201b417f3602080240201b28020c2205450d0020052005280200417f6a360200201b28020c22052802000d002005410c6a10c806201b28020c41046a22052005280200417f6a360200201b28020c220541046a2802000d002005102c0b201b202436020c201b201b28020841016a360208200f102c0c020b00000b41d4afc8004110200141980e6a41a8ebc40041c8ebc4001040000b20012802c803221f20254103746a211220012802cc03211e201f210f02400240024002402025450d00201f21090240034020092802002205450d01024002402005200941046a280200220f10ca060d00200f200510ca06450d01200f2802080d07200f417f3602080240200f28020c221c450d00201c201c280200417f6a360200200f28020c221c2802000d00201c410c6a10c806200f28020c41046a221c201c280200417f6a360200200f28020c221c41046a2802000d00201c102c0b200f410036020c200f200f28020841016a3602080c010b20052802080d052005417f3602080240200528020c221c450d00201c201c280200417f6a360200200528020c221c2802000d00201c410c6a10c806200528020c41046a221c201c280200417f6a360200200528020c221c41046a2802000d00201c102c0b2005410036020c2005200528020841016a3602080b200f200f280200417f6a221c3602000240201c0d00200f410c6a10c806200f41046a221c201c280200417f6a221c360200201c0d00200f102c0b20052005280200417f6a220f3602000240200f0d002005410c6a10c806200541046a220f200f280200417f6a220f360200200f0d002005102c0b200941086a22092012470d000c030b0b200941086a210f0b2012200f460d000340200f2205280200220f200f280200417f6a36020002402005280200220f2802000d00200f410c6a10c806200528020041046a220f200f280200417f6a3602002005280200220f41046a2802000d00200f102c0b200541086a210f200541046a220528020022092009280200417f6a3602000240200528020022092802000d002009410c6a10c806200528020041046a22092009280200417f6a3602002005280200220541046a2802000d002005102c0b2012200f470d000b0b201e4103742044201e1b21440240201e450d002044450d00201f102c0b0240200128029004220f450d002001280288042105200f410274210f0340200528020022092009280200417f6a3602000240200528020022092802000d002009410c6a10c806200528020041046a22092009280200417f6a3602002005280200220941046a2802000d002009102c0b200541046a2105200f417c6a220f0d000b0b200128028c042205410274204320051b21430240200128028804410020051b2205450d002043450d002005102c0b0240204a450d002029210503402005280200220f200f280200417f6a36020002402005280200220f2802000d00200f410c6a10c806200528020041046a220f200f280200417f6a3602002005280200220f41046a2802000d00200f102c0b200541046a2105201a417c6a221a0d000b0b2037410274204220371b214202402029410020371b2205450d002042450d002005102c0b20342034280200417f6a2205360200024020050d002034410c6a10c806203441046a22052005280200417f6a220536020020050d002034102c0b02402035450d00201d210503402005280200220f200f280200417f6a36020002402005280200220f2802000d00200f410c6a10c806200528020041046a220f200f280200417f6a3602002005280200220f41046a2802000d00200f102c0b200541046a21052002417c6a22020d000b0b201741ff017121052036410274204120361b21412036450d022041450d02201d102c0c020b41d4afc8004110200141980e6a41a8ebc40041b8ebc4001040000b41d4afc8004110200141980e6a41a8ebc40041b8ebc4001040000b202a202a280200417f6a220f3602000240200f0d00202a410c6a10c806202a41046a220f200f280200417f6a220f360200200f0d00202a102c0b201b201b280200417f6a220f3602000240200f0d00201b410c6a10c806201b41046a220f200f280200417f6a220f360200200f0d00201b102c0b20242024280200417f6a220f3602000240200f0d002024410c6a10c806202441046a220f200f280200417f6a220f360200200f0d002024102c0b200128028402211c0c010b201b201b280200417f6a2205360200024020050d00201b410c6a10c806201b41046a22052005280200417f6a220536020020050d00201b102c0b20242024280200417f6a2205360200024020050d002024410c6a10c806202441046a22052005280200417f6a220536020020050d002024102c0b410121050b202e20056a212e200028020021052015280200220f201c4b0d000b0b201c200f419887c400103f000b201c200f418887c400103f000b41ecd0c800412b4198d1c800103c000b1039000b4100211c200141e80d6a4100360200200141003602dc0d0b2001201c3602f00d20014188056a200141d80d6a10cb06024020012d00a8054102460d00034020012802ac0522052005280200417f6a220f3602000240200f0d002005410c6a10c806200541046a220f200f280200417f6a220f360200200f0d002005102c0b20014188056a200141d80d6a10cb0620012d00a8054102470d000b0b024020012802dc0d220f450d00200f2802002105200f102c2005450d0003402005280200210f2005102c200f2105200f0d000b0b200141a00e6a24000ba50302027f037e230041d0006b22042400200441386a20024201200242015620034200522003501b22051b22022003420020051b220342ffff03420010c808200441286a2002200342ffff03420010c708200441186a20022003200429033822062004290328200441286a41086a29030084420052ad7c220742012007420156200441386a41086a2903002007200654ad7c22074200522007501b22051b22062007420020051b220710c8080240024002402004290318220842808004544100200441186a41086a290300501b450d00200441086a200220002002200054200320015420032001511b22051b2003200120051b2006200710c8082004290308220342808004544100200441086a41086a290300501b450d012008a741ffff037122050d0241f0bcc3004119419cbdc300103c000b2004411136024c20044194aac80036024841a5aac80041de00200441c8006a418cbdc300419cbdc3001040000b2004411136024c20044194aac80036024841a5aac80041de00200441c8006a418cbdc300419cbdc3001040000b200441d0006a24002003a741ffff037141ffff036c20056e0bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42227e2204422088a722020d022004a722014100480d022002454101742105024002400240024002402000280200410020031b22020d002001450d010c030b200341226c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141226e3602000b0f0b2005450d001039000b103b000bc7ae0103187f057e9e017f23004180026b22042400200441b8016a4200370300200441b0016a4280808080c000370300200441a0016a420037030020044198016a4280808080c00037030020044188016a420037030020044180016a4280808080c000370300200441f0006a4200370300200441e8006a4280808080c000370300200441d8006a4200370300200441d0006a4280808080c000370300200441c0006a4200370300200441386a4280808080c000370300200441286a4200370300200441206a4280808080c000370300200441106a4200370300200442043703a8012004420437039001200442043703782004420437036020044204370348200442043703302004420437031820044280808080c000370308200442043703002001280200220520012802082206412c6c22076a210820012802042109200521010240024002402006450d00200441b4016a210a200441a8016a210b2004419c016a210c20044190016a210d20044184016a210e200441f8006a210f200441ec006a2110200441e0006a2111200441d4006a2112200441c8006a21132004413c6a2114200441306a2115200441246a2116200441186a21172004410c6a2118200741546a2106200441e0016a41086a2119200441e0016a41106a211a200441e0016a41186a211b2005210703402007290204211c2019200741146a290200370300201a2007411c6a290200370300201b200741246a2902003703002004200729020c3703e0012007412c6a210120072802002207450d01200441c0016a41186a201b290300221d370300200441c0016a41106a201a290300221e370300200441c0016a41086a2019290300221f370300200420042903e00122203703c001201b201d370300201a201e3703002019201f370300200420203703e00102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240201c422088a70e11000105060708090a0b0c0d0e0f10111213020b201ca7222141226c202220211b21222007410020211b2207450d242022450d242007102c0c240b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c230b20032802082221450d02202141057441606a41057641016a21252003280200212141002123034020072021460d0220212007412010cc08450d02202141206a21212025202341016a2223470d000c030b0b20004281808080103702000c210b202341ffff034b2221450d1e0b20004281808080203702000c1f0b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c1f0b024020032802082221450d00202141057441606a41057641016a212520032802002121410021230240034020072021460d0120212007412010cc08450d01202141206a21212025202341016a2223470d000c020b0b202341ffff034b2221450d1c0b20004281808080203702000c1e0b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c1e0b024020032802082221450d00202141057441606a41057641016a212520032802002121410021230240034020072021460d0120212007412010cc08450d01202141206a21212025202341016a2223470d000c020b0b202341ffff034b2221450d1a0b20004281808080203702000c1d0b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c1d0b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d180b20004281808080203702000c1c0b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c1c0b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d160b20004281808080203702000c1b0b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c1b0b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d140b20004281808080203702000c1a0b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c1a0b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d120b20004281808080203702000c190b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c190b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d100b20004281808080203702000c180b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c180b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d0e0b20004281808080203702000c170b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c170b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d0c0b20004281808080203702000c160b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c160b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d0a0b20004281808080203702000c150b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c150b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d080b20004281808080203702000c140b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c140b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d060b20004281808080203702000c130b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c130b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d040b20004281808080203702000c120b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c120b024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d020b20004281808080203702000c110b0240024020022802082221450d00202141057441606a41057641016a212320022802002121410021240340200441e0016a2021460d022021200441e0016a412010cc08450d02202141206a21212023202441016a2224470d000b0b20004281808080203702000c110b0240024020032802082221450d00202141057441606a41057641016a212320032802002121410021250240034020072021460d0120212007412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b2026202520211b2126200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b2029202520211b2129200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b202b202520211b212b200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b202d202520211b212d20074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b202f202520211b212f200741aa016a2127200741a8016a2f010021302003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b2031202520211b2131200741cc016a2127200741ca016a2f010021322003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b2033202520211b2133200741ee016a2127200741ec016a2f010021342003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b2035202520211b213520074190026a21272007418e026a2f010021362003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b2037202520211b2137200741b2026a2127200741b0026a2f010021382003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b2039202520211b2139200741d4026a2127200741d2026a2f0100213a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b203b202520211b213b200741f6026a2127200741f4026a2f0100213c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b203d202520211b213d20074198036a212720074196036a2f0100213e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b203f202520211b213f200741ba036a2127200741b8036a2f010021402003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b2041202520211b2141200741dc036a2127200741da036a2f010021422003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b2043202520211b2143200741fe036a2127200741fc036a2f010021442003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c110b2045202520211b2145024020042802bc01222120042802b801470d00200a2021410110f90120042802bc0121210b20042802b401202141c4006c6a222120453b0140202120263b0104202120243602002021413e6a20443b01002021413c6a20433b01002021413a6a20423b0100202141386a20413b0100202141366a20403b0100202141346a203f3b0100202141326a203e3b0100202141306a203d3b01002021412e6a203c3b01002021412c6a203b3b01002021412a6a203a3b0100202141286a20393b0100202141266a20383b0100202141246a20373b0100202141226a20363b0100202141206a20353b01002021411e6a20343b01002021411c6a20333b01002021411a6a20323b0100202141186a20313b0100202141166a20303b0100202141146a202f3b0100202141126a202e3b0100202141106a202d3b01002021410e6a202c3b01002021410c6a202b3b01002021410a6a202a3b0100202141086a20293b0100202141066a20283b0100200420042802bc0141016a3602bc010c0f0b2046202520211b2146200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b2047202520211b2147200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b2048202520211b2148200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b2049202520211b214920074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b204a202520211b214a200741aa016a2127200741a8016a2f010021302003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b204b202520211b214b200741cc016a2127200741ca016a2f010021322003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b204c202520211b214c200741ee016a2127200741ec016a2f010021342003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b204d202520211b214d20074190026a21272007418e026a2f010021362003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b204e202520211b214e200741b2026a2127200741b0026a2f010021382003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b204f202520211b214f200741d4026a2127200741d2026a2f0100213a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b2050202520211b2150200741f6026a2127200741f4026a2f0100213c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b2051202520211b215120074198036a212720074196036a2f0100213e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b2052202520211b2152200741ba036a2127200741b8036a2f010021402003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b2053202520211b2153200741dc036a2127200741da036a2f010021422003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c100b2054202520211b2154024020042802b001222120042802ac01470d00200b2021410110f80120042802b00121210b20042802a80120214106746a222120543b013c202120463b0104202120243602002021413a6a20423b0100202141386a20533b0100202141366a20403b0100202141346a20523b0100202141326a203e3b0100202141306a20513b01002021412e6a203c3b01002021412c6a20503b01002021412a6a203a3b0100202141286a204f3b0100202141266a20383b0100202141246a204e3b0100202141226a20363b0100202141206a204d3b01002021411e6a20343b01002021411c6a204c3b01002021411a6a20323b0100202141186a204b3b0100202141166a20303b0100202141146a204a3b0100202141126a202e3b0100202141106a20493b01002021410e6a202c3b01002021410c6a20483b01002021410a6a202a3b0100202141086a20473b0100202141066a20283b0100200420042802b00141016a3602b0010c0e0b2055202520211b2155200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b2056202520211b2156200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b2057202520211b2157200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b2058202520211b215820074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b2059202520211b2159200741aa016a2127200741a8016a2f010021302003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b205a202520211b215a200741cc016a2127200741ca016a2f010021322003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b205b202520211b215b200741ee016a2127200741ec016a2f010021342003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b205c202520211b215c20074190026a21272007418e026a2f010021362003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b205d202520211b215d200741b2026a2127200741b0026a2f010021382003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b205e202520211b215e200741d4026a2127200741d2026a2f0100213a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b205f202520211b215f200741f6026a2127200741f4026a2f0100213c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b2060202520211b216020074198036a212720074196036a2f0100213e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b2061202520211b2161200741ba036a2127200741b8036a2f010021402003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0f0b2062202520211b2162024020042802a401222120042802a001470d00200c2021410110f70120042802a40121210b200428029c012021413c6c6a222120623b0138202120553b010420212024360200202141366a20403b0100202141346a20613b0100202141326a203e3b0100202141306a20603b01002021412e6a203c3b01002021412c6a205f3b01002021412a6a203a3b0100202141286a205e3b0100202141266a20383b0100202141246a205d3b0100202141226a20363b0100202141206a205c3b01002021411e6a20343b01002021411c6a205b3b01002021411a6a20323b0100202141186a205a3b0100202141166a20303b0100202141146a20593b0100202141126a202e3b0100202141106a20583b01002021410e6a202c3b01002021410c6a20573b01002021410a6a202a3b0100202141086a20563b0100202141066a20283b0100200420042802a40141016a3602a4010c0d0b2063202520211b2163200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b2064202520211b2164200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b2065202520211b2165200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b2066202520211b216620074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b2067202520211b2167200741aa016a2127200741a8016a2f010021302003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b2068202520211b2168200741cc016a2127200741ca016a2f010021322003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b2069202520211b2169200741ee016a2127200741ec016a2f010021342003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b206a202520211b216a20074190026a21272007418e026a2f010021362003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b206b202520211b216b200741b2026a2127200741b0026a2f010021382003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b206c202520211b216c200741d4026a2127200741d2026a2f0100213a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b206d202520211b216d200741f6026a2127200741f4026a2f0100213c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b206e202520211b216e20074198036a212720074196036a2f0100213e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0e0b206f202520211b216f02402004280298012221200428029401470d00200d2021410110f60120042802980121210b200428029001202141386c6a2221206f3b0134202120633b010420212024360200202141326a203e3b0100202141306a206e3b01002021412e6a203c3b01002021412c6a206d3b01002021412a6a203a3b0100202141286a206c3b0100202141266a20383b0100202141246a206b3b0100202141226a20363b0100202141206a206a3b01002021411e6a20343b01002021411c6a20693b01002021411a6a20323b0100202141186a20683b0100202141166a20303b0100202141146a20673b0100202141126a202e3b0100202141106a20663b01002021410e6a202c3b01002021410c6a20653b01002021410a6a202a3b0100202141086a20643b0100202141066a20283b0100200420042802980141016a360298010c0c0b2070202520211b2170200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0d0b2071202520211b2171200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0d0b2072202520211b2172200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0d0b2073202520211b217320074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0d0b2074202520211b2174200741aa016a2127200741a8016a2f010021302003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0d0b2075202520211b2175200741cc016a2127200741ca016a2f010021322003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0d0b2076202520211b2176200741ee016a2127200741ec016a2f010021342003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0d0b2077202520211b217720074190026a21272007418e026a2f010021362003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0d0b2078202520211b2178200741b2026a2127200741b0026a2f010021382003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0d0b2079202520211b2179200741d4026a2127200741d2026a2f0100213a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0d0b207a202520211b217a200741f6026a2127200741f4026a2f0100213c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0d0b207b202520211b217b0240200428028c012221200428028801470d00200e2021410110f501200428028c0121210b200428028401202141346c6a2221207b3b0130202120703b0104202120243602002021412e6a203c3b01002021412c6a207a3b01002021412a6a203a3b0100202141286a20793b0100202141266a20383b0100202141246a20783b0100202141226a20363b0100202141206a20773b01002021411e6a20343b01002021411c6a20763b01002021411a6a20323b0100202141186a20753b0100202141166a20303b0100202141146a20743b0100202141126a202e3b0100202141106a20733b01002021410e6a202c3b01002021410c6a20723b01002021410a6a202a3b0100202141086a20713b0100202141066a20283b01002004200428028c0141016a36028c010c0b0b207c202520211b217c200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0c0b207d202520211b217d200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0c0b207e202520211b217e200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0c0b207f202520211b217f20074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0c0b208001202520211b218001200741aa016a2127200741a8016a2f010021302003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0c0b208101202520211b218101200741cc016a2127200741ca016a2f010021322003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0c0b208201202520211b218201200741ee016a2127200741ec016a2f010021342003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0c0b208301202520211b21830120074190026a21272007418e026a2f010021362003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0c0b208401202520211b218401200741b2026a2127200741b0026a2f010021382003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0c0b208501202520211b218501200741d4026a2127200741d2026a2f0100213a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0c0b208601202520211b21860102402004280280012221200428027c470d00200f2021410110f40120042802800121210b2004280278202141306c6a22212086013b012c2021207c3b0104202120243602002021412a6a203a3b0100202141286a2085013b0100202141266a20383b0100202141246a2084013b0100202141226a20363b0100202141206a2083013b01002021411e6a20343b01002021411c6a2082013b01002021411a6a20323b0100202141186a2081013b0100202141166a20303b0100202141146a2080013b0100202141126a202e3b0100202141106a207f3b01002021410e6a202c3b01002021410c6a207e3b01002021410a6a202a3b0100202141086a207d3b0100202141066a20283b0100200420042802800141016a360280010c0a0b208701202520211b218701200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0b0b208801202520211b218801200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0b0b208901202520211b218901200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0b0b208a01202520211b218a0120074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0b0b208b01202520211b218b01200741aa016a2127200741a8016a2f010021302003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0b0b208c01202520211b218c01200741cc016a2127200741ca016a2f010021322003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0b0b208d01202520211b218d01200741ee016a2127200741ec016a2f010021342003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0b0b208e01202520211b218e0120074190026a21272007418e026a2f010021362003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0b0b208f01202520211b218f01200741b2026a2127200741b0026a2f010021382003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0b0b209001202520211b2190010240200428027422212004280270470d0020102021410110dd01200428027421210b200428026c2021412c6c6a22212090013b012820212087013b010420212024360200202141266a20383b0100202141246a208f013b0100202141226a20363b0100202141206a208e013b01002021411e6a20343b01002021411c6a208d013b01002021411a6a20323b0100202141186a208c013b0100202141166a20303b0100202141146a208b013b0100202141126a202e3b0100202141106a208a013b01002021410e6a202c3b01002021410c6a2089013b01002021410a6a202a3b0100202141086a2088013b0100202141066a20283b01002004200428027441016a3602740c090b209101202520211b219101200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0a0b209201202520211b219201200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0a0b209301202520211b219301200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0a0b209401202520211b21940120074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0a0b209501202520211b219501200741aa016a2127200741a8016a2f010021302003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0a0b209601202520211b219601200741cc016a2127200741ca016a2f010021322003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0a0b209701202520211b219701200741ee016a2127200741ec016a2f010021342003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0a0b209801202520211b21980120074190026a21272007418e026a2f010021362003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c0a0b209901202520211b2199010240200428026822212004280264470d0020112021410110f301200428026821210b2004280260202141286c6a22212099013b012420212091013b010420212024360200202141226a20363b0100202141206a2098013b01002021411e6a20343b01002021411c6a2097013b01002021411a6a20323b0100202141186a2096013b0100202141166a20303b0100202141146a2095013b0100202141126a202e3b0100202141106a2094013b01002021410e6a202c3b01002021410c6a2093013b01002021410a6a202a3b0100202141086a2092013b0100202141066a20283b01002004200428026841016a3602680c080b209a01202520211b219a01200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c090b209b01202520211b219b01200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c090b209c01202520211b219c01200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c090b209d01202520211b219d0120074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c090b209e01202520211b219e01200741aa016a2127200741a8016a2f010021302003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c090b209f01202520211b219f01200741cc016a2127200741ca016a2f010021322003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c090b20a001202520211b21a001200741ee016a2127200741ec016a2f010021342003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c090b20a101202520211b21a1010240200428025c22212004280258470d0020122021410110f201200428025c21210b2004280254202141246c6a222120a1013b01202021209a013b0104202120243602002021411e6a20343b01002021411c6a20a0013b01002021411a6a20323b0100202141186a209f013b0100202141166a20303b0100202141146a209e013b0100202141126a202e3b0100202141106a209d013b01002021410e6a202c3b01002021410c6a209c013b01002021410a6a202a3b0100202141086a209b013b0100202141066a20283b01002004200428025c41016a36025c0c070b20a201202520211b21a201200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c080b20a301202520211b21a301200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c080b20a401202520211b21a401200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c080b20a501202520211b21a50120074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c080b20a601202520211b21a601200741aa016a2127200741a8016a2f010021302003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c080b20a701202520211b21a701200741cc016a2127200741ca016a2f010021322003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c080b20a801202520211b21a801024020042802502221200428024c470d0020132021410110f101200428025021210b200428024820214105746a222120a8013b011c202120a2013b0104202120243602002021411a6a20323b0100202141186a20a7013b0100202141166a20303b0100202141146a20a6013b0100202141126a202e3b0100202141106a20a5013b01002021410e6a202c3b01002021410c6a20a4013b01002021410a6a202a3b0100202141086a20a3013b0100202141066a20283b01002004200428025041016a3602500c060b20a901202520211b21a901200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c070b20aa01202520211b21aa01200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c070b20ab01202520211b21ab01200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c070b20ac01202520211b21ac0120074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c070b20ad01202520211b21ad01200741aa016a2127200741a8016a2f010021302003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c070b20ae01202520211b21ae010240200428024422212004280240470d0020142021410110f001200428024421210b200428023c2021411c6c6a222120ae013b0118202120a9013b010420212024360200202141166a20303b0100202141146a20ad013b0100202141126a202e3b0100202141106a20ac013b01002021410e6a202c3b01002021410c6a20ab013b01002021410a6a202a3b0100202141086a20aa013b0100202141066a20283b01002004200428024441016a3602440c050b20af01202520211b21af01200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c060b20b001202520211b21b001200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c060b20b101202520211b21b101200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c060b20b201202520211b21b20120074188016a212720074186016a2f0100212e2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c060b20b301202520211b21b3010240200428023822212004280234470d0020152021410110ef01200428023821210b2004280230202141186c6a222120b3013b0114202120af013b010420212024360200202141126a202e3b0100202141106a20b2013b01002021410e6a202c3b01002021410c6a20b1013b01002021410a6a202a3b0100202141086a20b0013b0100202141066a20283b01002004200428023841016a3602380c040b20b401202520211b21b401200741226a21272003280200212120072f0120212841002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c050b20b501202520211b21b501200741c4006a2127200741c2006a2f0100212a2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c050b20b601202520211b21b601200741e6006a2127200741e4006a2f0100212c2003280200212141002125024002400240034020272021460d0120212027412010cc08450d01202141206a21212023202541016a2225470d000c020b0b202541ffff034b2221450d010b20004281808080203702000c050b20b701202520211b21b7010240200428022c22212004280228470d0020162021410110ee01200428022c21210b2004280224202141146c6a222120b7013b0110202120b4013b0104202120243602002021410e6a202c3b01002021410c6a20b6013b01002021410a6a202a3b0100202141086a20b5013b0100202141066a20283b01002004200428022c41016a36022c0c030b20b801202320211b21b801200741226a21272003280200212120072f0120212841002123024002400240034020272021460d0120212027412010cc08450d01202141206a21212025202341016a2223470d000c020b0b202341ffff034b2221450d010b20004281808080203702000c040b20b901202320211b21b901200741c4006a2127200741c2006a2f0100212a2003280200212141002123024002400240034020272021460d0120212027412010cc08450d01202141206a21212025202341016a2223470d000c020b0b202341ffff034b2221450d010b20004281808080203702000c040b20ba01202320211b21ba01024020042802202221200428021c470d0020172021410110ed01200428022021210b200428021820214104746a222120ba013b010c202120b8013b0104202120243602002021410a6a202a3b0100202141086a20b9013b0100202141066a20283b01002004200428022041016a3602200c020b20bb01202320211b21bb01200741226a21272003280200212120072f0120212841002123024002400240034020272021460d0120212027412010cc08450d01202141206a21212025202341016a2223470d000c020b0b202341ffff034b2221450d010b20004281808080203702000c030b20bc01202320211b21bc010240200428021422212004280210470d0020182021410110ec01200428021421210b200428020c2021410c6c6a222120bc013b0108202120bb013b010420212024360200202141066a20283b01002004200428021441016a3602140c010b20bd01202320211b21bd010240200428020822212004280204470d0020042021410110eb01200428020821210b200428020020214103746a222120bd013b0104202120243602002004200428020841016a3602080b201ca7222141226c20be0120211b21be012007410020211b2207450d0120be01450d012007102c0c010b024020074100201ca722191b2207450d00201941226c450d002007102c0b024020082001460d0003400240200141046a2802002207450d00200741226c450d002001280200102c0b2001412c6a2101200641546a22060d000b0b02402009450d002009412c6c450d002005102c0b200410e9010c040b200641546a21062001210720012008470d000c020b0b20082001460d00034020012206412c6a21010240200641046a2802002207450d00200741226c450d002006280200102c0b20082001470d000b0b02402009450d002009412c6c450d002005102c0b200041046a200441c00110c9081a200041003602000b20044180026a24000bb30201037f23004180016b2202240002400240024002400240200128020022034110710d002000280200210420034120710d012004ad2001104921000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141a888c0004102200220006a4180016a410020006b104d21000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141a888c0004102200220006a4180016a410020006b104d21000b20024180016a240020000f0b2004418001419888c0001058000b2004418001419888c0001058000bca0202027f017e23004180016b2202240002400240024002400240200128020022034110710d002000290300210420034120710d0120042001104921000c020b20002903002104418001210002400340024020000d00410021000c020b200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004181014f0d030b200141a888c0004102200220006a41800120006b104d21000c010b418001210002400340024020000d00410021000c020b200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004181014f0d030b200141a888c0004102200220006a41800120006b104d21000b20024180016a240020000f0b2000418001419888c0001058000b2000418001419888c0001058000bf50401027f024020002802042201450d0020002802002202450d002001410374450d002002102c0b0240200041106a2802002201450d00200028020c2202450d002001410c6c450d002002102c0b02402000411c6a2802002201450d0020002802182202450d002001410474450d002002102c0b0240200041286a2802002201450d0020002802242202450d00200141146c450d002002102c0b0240200041346a2802002201450d0020002802302202450d00200141186c450d002002102c0b0240200041c0006a2802002201450d00200028023c2202450d002001411c6c450d002002102c0b0240200041cc006a2802002201450d0020002802482202450d002001410574450d002002102c0b0240200041d8006a2802002201450d0020002802542202450d00200141246c450d002002102c0b0240200041e4006a2802002201450d0020002802602202450d00200141286c450d002002102c0b0240200041f0006a2802002201450d00200028026c2202450d002001412c6c450d002002102c0b0240200041fc006a2802002201450d0020002802782202450d00200141306c450d002002102c0b024020004188016a2802002201450d002000280284012202450d00200141346c450d002002102c0b024020004194016a2802002201450d002000280290012202450d00200141386c450d002002102c0b0240200041a0016a2802002201450d00200028029c012202450d002001413c6c450d002002102c0b0240200041ac016a2802002201450d0020002802a8012202450d00200141ffffff1f71450d002002102c0b0240200041b8016a2802002201450d0020002802b4012200450d00200141c4006c450d002000102c0b0bd10202027f017e23004180016b220224002000280200210002400240024002400240200128020022034110710d002000290300210420034120710d0120042001104921000c020b20002903002104418001210002400340024020000d00410021000c020b200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004181014f0d030b200141a888c0004102200220006a41800120006b104d21000c010b418001210002400340024020000d00410021000c020b200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004181014f0d030b200141a888c0004102200220006a41800120006b104d21000b20024180016a240020000f0b2000418001419888c0001058000b2000418001419888c0001058000bd80101027f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1b220141ffffffff017122042001470d02200141037422024100480d0220042001464102742104024002400240024002402000280200410020031b22010d002002450d010c030b200341037422030d0120020d020b200421010c020b200120032002103522010d010c030b200210322201450d020b20002001360200200041046a20024103763602000b0f0b2004450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad420c7e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b2003410c6c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a2001410c6e3602000b0f0b2005450d001039000b103b000bd80101027f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1b220141ffffffff007122042001470d02200141047422024100480d0220042001464102742104024002400240024002402000280200410020031b22010d002002450d010c030b200341047422030d0120020d020b200421010c020b200120032002103522010d010c030b200210322201450d020b20002001360200200041046a20024104763602000b0f0b2004450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42147e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b200341146c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141146e3602000b0f0b2005450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42187e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b200341186c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141186e3602000b0f0b2005450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad421c7e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b2003411c6c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a2001411c6e3602000b0f0b2005450d001039000b103b000bd70101027f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1b220141ffffff3f7122042001470d02200141057422024100480d0220042001464102742104024002400240024002402000280200410020031b22010d002002450d010c030b200341057422030d0120020d020b200421010c020b200120032002103522010d010c030b200210322201450d020b20002001360200200041046a20024105763602000b0f0b2004450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42247e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b200341246c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141246e3602000b0f0b2005450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42287e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b200341286c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141286e3602000b0f0b2005450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42307e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b200341306c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141306e3602000b0f0b2005450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42347e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b200341346c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141346e3602000b0f0b2005450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42387e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b200341386c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141386e3602000b0f0b2005450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad423c7e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b2003413c6c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a2001413c6e3602000b0f0b2005450d001039000b103b000bd70101027f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1b220141ffffff1f7122042001470d02200141067422024100480d0220042001464102742104024002400240024002402000280200410020031b22010d002002450d010c030b200341067422030d0120020d020b200421010c020b200120032002103522010d010c030b200210322201450d020b20002001360200200041046a20024106763602000b0f0b2004450d001039000b103b000bd90103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42c4007e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b200341c4006c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141c4006e3602000b0f0b2005450d001039000b103b000bb4a80214077f017e017f017e057f017e087f017e017f017e087f017e027f017e017f017e017f017e017f027e230041d0026b2204240020042003360204410021052004410036021020044204370308200128020421062001280200210702400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802082203450d002003410374210841002105200441f0006a41106a21092007210a03404100210302402002280208200a290200220ba7220c4d0d00200441a8026a41026a2002280200200c4105746a220341026a2d00003a0000200441f0006a41086a200341176a29000037030020092003411f6a2d00003a0000200420032f00003b01a8022004200329000f3703702003290007210d2003280003210e410121030b4102210f200441cc016a41026a200441a8026a41026a2d00003a0000200441e8016a41086a2210200441f0006a41086a2211290300370300200441e8016a41106a221220092d00003a0000200420042f01a8023b01cc01200420042903703703e8014101210c02402003450d00200441306a41026a200441cc016a41026a2d00003a000020044180026a41086a201029030037030020044180026a41106a20122d00003a0000200420042f01cc013b0130200420042903e801370380024100210c200d2113200e210f0b200441c4016a41026a2203200441306a41026a22142d00003a0000200441d0016a41086a221520044180026a41086a2216290300370300200441d0016a41106a221720044180026a41106a22182d00003a0000200420042f01303b01c40120042004290380023703d001200c0d02200441ec006a41026a221920032d00003a0000200441b0016a41086a221a2015290300370300200441b0016a41106a221b20172d00003a0000200420042f01c4013b016c200420042903d0013703b001412210322203450d0a4100210c024020042802042215280208200b422088a741ffff037122174d0d002014201528020020174105746a220c41026a2d00003a00002011200c41176a2900003703002009200c411f6a2d00003a00002004200c2f00003b01302004200c29000f370370200c290007211c200c280003211d4101210c0b41022115200441cc016a41026a200441306a41026a2d00003a000020102011290300370300201220092d00003a0000200420042f01303b01cc01200420042903703703e801410121110240200c450d00200441186a41026a200441cc016a41026a2d00003a000020162010290300370300201820122d00003a0000200420042f01cc013b0118200420042903e8013703800241002111201c211e201d21150b200441c8016a41026a220c200441186a41026a2d00003a0000200441a8026a41086a22102016290300370300200441a8026a41106a221220182d00003a0000200420042f01183b01c80120042004290380023703a80220110d05200320042f01c8013b00002003201e37000720032015360003200320042903a80237000f200341ffff033b0120200341026a200c2d00003a0000200341176a20102903003700002003411f6a20122d00003a0000200420042f016c3b0168200420192d00003a006a200441c8006a41106a2210201b2d00003a0000200441c8006a41086a2212201a290300370300200420042903b00137034802402005200428020c470d00200441086a2005410110dd01200428021021050b200a41086a210a20042802082005412c6c6a220c428180808010370204200c2003360200200c20042f01683b010c200c410e6a20042d006a3a0000200c41136a2013370000200c410f6a200f360000200c411b6a2004290348370000200c41236a2012290300370000200c412b6a20102d00003a00002004200541016a2205360210200841786a22080d000b0b0240200641ffffffff0171450d002007102c0b200128020c211f200141106a280200212002400240200141146a2802002203450d00201f2003410c6c6a2121200441f0006a41106a210a201f21090340200941066a2f0100221841ffff03460d02200941086a2f01002108200941046a2f0100211541002103024020022802082009280200220c4d0d00200441a8026a41026a2002280200200c4105746a220341026a2d00003a0000200441f0006a41086a200341176a290000370300200a2003411f6a2d00003a0000200420032f00003b01a8022004200329000f3703702003290007210d20032800032122410121030b41022117200441cc016a41026a200441a8026a41026a2d00003a0000200441e8016a41086a220c200441f0006a41086a2212290300370300200441e8016a41106a2210200a2d00003a0000200420042f01a8023b01cc01200420042903703703e8014101211602402003450d00200441d0016a41026a200441cc016a41026a2d00003a000020044180026a41086a200c29030037030020044180026a41106a20102d00003a0000200420042f01cc013b01d001200420042903e8013703800241002116200d210b202221170b200441e0006a41026a2203200441d0016a41026a2d00003a0000200441c8006a41086a221920044180026a41086a220f290300370300200441c8006a41106a221a20044180026a41106a22112d00003a0000200420042f01d0013b0160200420042903800237034820160d04200441c4006a41026a221d20032d00003a0000200441306a41086a22072019290300370300200441306a41106a2206201a2d00003a0000200420042f01603b01442004200429034837033041c40010322203450d0b4100211602402004280204221a280208221b20154d0d00200441a8026a41026a201a28020020154105746a221641026a2d00003a00002012201641176a290000370300200a2016411f6a2d00003a0000200420162f00003b01a8022004201629000f3703702016290007211c20162800032123410121160b41022119200441cc016a41026a200441a8026a41026a2d00003a0000200c20122903003703002010200a2d00003a0000200420042f01a8023b01cc01200420042903703703e8014101211502402016450d00200441c8016a41026a200441cc016a41026a2d00003a0000200f200c290300370300201120102d00003a0000200420042f01cc013b01c801200420042903e8013703800241002115201c2113202321190b200441e8006a41026a2216200441c8016a41026a22242d00003a0000200441d0016a41086a2214200f290300370300200441d0016a41106a220e20112d00003a0000200420042f01c8013b016820042004290380023703d00120150d05200441e4006a41026a222520162d00003a0000200441b0016a41086a22262014290300370300200441b0016a41106a2214200e2d00003a0000200420042f01683b0164200420042903d0013703b001410021150240201b20084d0d002024201a28020020084105746a221641026a2d00003a00002012201641176a290000370300200a2016411f6a2d00003a0000200420162f00003b01c8012004201629000f3703702016290007212720162800032128410121150b41022116200441cc016a41026a200441c8016a41026a2d00003a0000200c20122903003703002010200a2d00003a0000200420042f01c8013b01cc01200420042903703703e8014101211202402015450d00200441c4016a41026a200441cc016a41026a2d00003a0000200f200c290300370300201120102d00003a0000200420042f01cc013b01c401200420042903e80137038002410021122027211e202821160b200441ec006a41026a220c200441c4016a41026a2d00003a0000200441a8026a41086a2210200f290300370300200441a8026a41106a220f20112d00003a0000200420042f01c4013b016c20042004290380023703a80220120d0f200320042f01643b01002003201337000720032019360003200320042903b00137000f200320183b0120200320042f016c3b0022200341026a20252d00003a0000200341176a20262903003700002003411f6a20142d00003a0000200341246a200c2d00003a00002003201e3700292003201636002520032018417f733b0142200320042903a802370031200341396a2010290300370000200341c1006a200f2d00003a0000200441186a41086a22102007290300370300200441186a41106a221220062d00003a0000200420042f01443b012c2004201d2d00003a002e2004200429033037031802402005200428020c470d00200441086a2005410110dd01200428021021050b20042802082005412c6c6a220c428280808020370204200c2003360200200c20042f012c3b010c200c410e6a20042d002e3a0000200c41136a200b370000200c410f6a2017360000200c411b6a2004290318370000200c41236a2010290300370000200c412b6a20122d00003a00002004200541016a22053602102009410c6a22092021470d000b0b02402020450d002020410c6c450d00201f102c0b200128021821282001411c6a2802002121200141206a2802002203450d08202820034104746a2123200441bc016a211d200441f0006a4102722111200441306a41086a21262028210802400240034020082f010c21192008280200211a20042008290204370330200441003b016c200441043602b001200420263602ec012004200441b0016a3602f8012004200441046a3602f4012004200441ec006a3602f0012004200441306a3602e801200441f0006a200441e8016a10b9040240024020042f01704101470d00412210322209450d0e20092011290100370100200941206a201141206a22162f01003b0100200941186a201141186a2218290100370100200941106a201141106a2215290100370100200941086a201141086a221729010037010020044281808080103702d401200420093602d001200441a8026a41106a200441e8016a41106a280200360200200441a8026a41086a200441e8016a41086a290300370300200420042903e8013703a802200441f0006a200441a8026a10b9044101210c4101210320042f01704101470d0141012103412221054101210c034020044180026a41206a220a20162f01003b010020044180026a41186a2210201829010037030020044180026a41106a2212201529010037030020044180026a41086a220f201729010037030020042011290100370380020240200c2003470d00200441d0016a2003410110e50120042802d00121090b200920056a2203200429038002370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602d801200541226a2105200441f0006a200441a8026a10b90420042802d401210320042f01704101460d000c020b0b41002103410221094100210c0b024020042802b00122054104460d0020042902b401210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c0b0b200420093602482004200cad4220862003ad8437024c024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441b0016a41026a200a28020020194105746a220541026a2d00003a0000200441f0006a41086a200541176a290000370300200441f0006a41106a2005411f6a2d00003a0000200420052f00003b01b0012004200529000f3703702005290007210d20052800032124410121050b41022117200441cc016a41026a200441b0016a41026a2d00003a0000200441e8016a41086a2218200441f0006a41086a2219290300370300200441e8016a41106a2215200441f0006a41106a221b2d00003a0000200420042f01b0013b01cc01200420042903703703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a000020044180026a41086a201829030037030020044180026a41106a20152d00003a0000200420042f01cc013b0118200420042903e8013703800241002110200d2113202421170b200441c8016a41026a2216200441186a41026a22252d00003a0000200441a8026a41086a220520044180026a41086a2214290300370300200441a8026a41106a220a20044180026a41106a220e2d00003a0000200420042f01183b01c80120042004290380023703a80220100d022012417f732107200441c4016a41026a221020162d00003a0000200441d0016a41086a22122005290300370300200441d0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903a8023703d0010240200c2003470d00200441c8006a200c410110e5012004280250210c200428024821090b2009200c41226c6a2203201337000720102d0000210920042f01c401210620032017360003200320063b0100200341026a20093a0000200320042903d00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602504100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f3703702003290007211c20032800032122410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201820192903003703002015201b2d00003a0000200420042f01183b01cc01200420042903703703e8014101210c02402003450d002016200441cc016a41026a2d00003a000020142018290300370300200e20152d00003a0000200420042f01cc013b01c801200420042903e801370380024100210c201c211e202221090b201020162d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c40120042004290380023703a802200c0d03200841106a2108201d20042f01c4013b0000200441b0016a41086a200441c8006a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a0000200420042903483703b001200420042903a8023703d00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a220320042903b001370200200341136a201e3700002003410f6a20093600002003411b6a20042903d001370000200341076a20042900b701370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a36021020082023470d010c0c0b0b200042013702000c080b2000201736020420004101360200200041086a20133702000c070b2000200936020420004101360200200041086a201e370200200428024c21030c060b200042013702000c0d0b2000200f36020420004101360200200041086a20133702000c030b2000201736020420004101360200200041086a200b3702000c0b0b2000201936020420004101360200200041086a20133702002003102c0c0a0b2000201536020420004101360200200041086a201e3702002003102c0b0240200641ffffffff0171450d002007102c0b2004280208210902402005450d002005412c6c210c2009210303400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b0240200428020c2203450d002003412c6c450d002009102c0b200141106a2802002203450d09200128020c220c450d092003410c6c450d09200c102c0c090b2004280248410020031b220c450d00200341226c450d00200c102c0b0240202141ffffffff0071450d002028102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d082003412c6c450d08200c102c0c080b0240202141ffffffff0071450d002028102c0b20012802242121200141286a280200211f02402001412c6a2802002203450d002021200341146c6a2128200441b0016a410c6a211d200441f0006a4102722111200441306a410c6a2126200441306a41086a2124202121080240024002400240034020082f011021192008280200211a2008290104210b20242008410c6a2801003602002004200b370330200441003b016c200441043602b001200420263602ec012004200441b0016a3602f8012004200441046a3602f4012004200441ec006a3602f0012004200441306a3602e801200441f0006a200441e8016a10b9040240024020042f01704101470d00412210322209450d0820092011290100370100200941206a201141206a22162f01003b0100200941186a201141186a2218290100370100200941106a201141106a2215290100370100200941086a201141086a221729010037010020044281808080103702d401200420093602d001200441a8026a41106a200441e8016a41106a280200360200200441a8026a41086a200441e8016a41086a290300370300200420042903e8013703a802200441f0006a200441a8026a10b9044101210c4101210320042f01704101470d0141012103412221054101210c034020044180026a41206a220a20162f01003b010020044180026a41186a2210201829010037030020044180026a41106a2212201529010037030020044180026a41086a220f201729010037030020042011290100370380020240200c2003470d00200441d0016a2003410110e50120042802d00121090b200920056a2203200429038002370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602d801200541226a2105200441f0006a200441a8026a10b90420042802d401210320042f01704101460d000c020b0b41002103410221094100210c0b024020042802b00122054104460d0020042902b401210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602482004200cad4220862003ad8437024c024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441b0016a41026a200a28020020194105746a220541026a2d00003a0000200441f0006a41086a200541176a290000370300200441f0006a41106a2005411f6a2d00003a0000200420052f00003b01b0012004200529000f3703702005290007210d20052800032122410121050b41022117200441cc016a41026a200441b0016a41026a2d00003a0000200441e8016a41086a2218200441f0006a41086a2219290300370300200441e8016a41106a2215200441f0006a41106a221b2d00003a0000200420042f01b0013b01cc01200420042903703703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a000020044180026a41086a201829030037030020044180026a41106a20152d00003a0000200420042f01cc013b0118200420042903e8013703800241002110200d2113202221170b200441c8016a41026a2216200441186a41026a22252d00003a0000200441a8026a41086a220520044180026a41086a2214290300370300200441a8026a41106a220a20044180026a41106a220e2d00003a0000200420042f01183b01c80120042004290380023703a80220100d022012417f732107200441c4016a41026a221020162d00003a0000200441d0016a41086a22122005290300370300200441d0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903a8023703d0010240200c2003470d00200441c8006a200c410110e5012004280250210c200428024821090b2009200c41226c6a2203201337000720102d0000210920042f01c401210620032017360003200320063b0100200341026a20093a0000200320042903d00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602504100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f3703702003290007211c20032800032123410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201820192903003703002015201b2d00003a0000200420042f01183b01cc01200420042903703703e8014101210c02402003450d002016200441cc016a41026a2d00003a000020142018290300370300200e20152d00003a0000200420042f01cc013b01c801200420042903e801370380024100210c201c211e202321090b201020162d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c40120042004290380023703a802200c0d03200841146a2108201d20042f01c4013b0000200441b0016a41086a200441c8006a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a0000200420042903483703b001200420042903a8023703d00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a220320042903b001370200200341136a201e3700002003410f6a20093600002003411b6a20042903d001370000200341076a20042900b701370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a36021020082028470d010c060b0b200042013702000c020b2000201736020420004101360200200041086a20133702000c010b2000200936020420004101360200200041086a201e370200200428024c21030b2004280248410020031b220c450d00200341226c450d00200c102c0b0240201f450d00201f41146c450d002021102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d092003412c6c450d09200c102c0c090b0240201f450d00201f41146c450d002021102c0b20012802302121200141346a280200211f0240200141386a2802002203450d002021200341186c6a2128200441c8006a410c6a211d200441f0006a4102722111200441b0016a41106a2126200441b0016a41086a2124202121080240024002400240034020082f011421192008280200211a2008290104210b20242008410c6a2901003703002004200b3703b001200441003b016c20044104360248200420263602ec012004200441c8006a3602f8012004200441046a3602f4012004200441ec006a3602f0012004200441b0016a3602e801200441f0006a200441e8016a10b9040240024020042f01704101470d00412210322209450d0820092011290100370100200941206a201141206a22162f01003b0100200941186a201141186a2218290100370100200941106a201141106a2215290100370100200941086a201141086a221729010037010020044281808080103702d401200420093602d001200441a8026a41106a200441e8016a41106a280200360200200441a8026a41086a200441e8016a41086a290300370300200420042903e8013703a802200441f0006a200441a8026a10b9044101210c4101210320042f01704101470d0141012103412221054101210c034020044180026a41206a220a20162f01003b010020044180026a41186a2210201829010037030020044180026a41106a2212201529010037030020044180026a41086a220f201729010037030020042011290100370380020240200c2003470d00200441d0016a2003410110e50120042802d00121090b200920056a2203200429038002370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602d801200541226a2105200441f0006a200441a8026a10b90420042802d401210320042f01704101460d000c020b0b41002103410221094100210c0b0240200428024822054104460d00200429024c210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602302004200cad4220862003ad84370234024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441c8006a41026a200a28020020194105746a220541026a2d00003a0000200441f0006a41086a200541176a290000370300200441f0006a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f3703702005290007210d20052800032122410121050b41022117200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a2218200441f0006a41086a2219290300370300200441e8016a41106a2215200441f0006a41106a221b2d00003a0000200420042f01483b01cc01200420042903703703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a000020044180026a41086a201829030037030020044180026a41106a20152d00003a0000200420042f01cc013b0118200420042903e8013703800241002110200d2113202221170b200441c8016a41026a2216200441186a41026a22252d00003a0000200441a8026a41086a220520044180026a41086a2214290300370300200441a8026a41106a220a20044180026a41106a220e2d00003a0000200420042f01183b01c80120042004290380023703a80220100d022012417f732107200441c4016a41026a221020162d00003a0000200441d0016a41086a22122005290300370300200441d0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903a8023703d0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021090b2009200c41226c6a2203201337000720102d0000210920042f01c401210620032017360003200320063b0100200341026a20093a0000200320042903d00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602384100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f3703702003290007211c20032800032123410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201820192903003703002015201b2d00003a0000200420042f01183b01cc01200420042903703703e8014101210c02402003450d002016200441cc016a41026a2d00003a000020142018290300370300200e20152d00003a0000200420042f01cc013b01c801200420042903e801370380024100210c201c211e202321090b201020162d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c40120042004290380023703a802200c0d03200841186a2108201d20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a000020042004290330370348200420042903a8023703d00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a201e3700002003410f6a20093600002003411b6a20042903d001370000200341076a200429004f370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a36021020082028470d010c060b0b200042013702000c020b2000201736020420004101360200200041086a20133702000c010b2000200936020420004101360200200041086a201e370200200428023421030b2004280230410020031b220c450d00200341226c450d00200c102c0b0240201f450d00201f41186c450d002021102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d0a2003412c6c450d0a200c102c0c0a0b0240201f450d00201f41186c450d002021102c0b200128023c211f200141c0006a28020021200240200141c4006a2802002203450d00201f2003411c6c6a2121200441c8006a410c6a211d200441f0006a4102722111200441d0016a41146a2126200441d0016a41106a2124200441d0016a41086a2122201f21080240024002400240034020082f011821192008280200211a2008410c6a290100210b200829010421132024200841146a2801003602002022200b370300200420133703d001200441003b016c20044104360248200420263602ec012004200441c8006a3602f8012004200441046a3602f4012004200441ec006a3602f0012004200441d0016a3602e801200441f0006a200441e8016a10b9040240024020042f01704101470d00412210322209450d0820092011290100370100200941206a201141206a22162f01003b0100200941186a201141186a2218290100370100200941106a201141106a2215290100370100200941086a201141086a221729010037010020044281808080103702b401200420093602b001200441a8026a41106a200441e8016a41106a280200360200200441a8026a41086a200441e8016a41086a290300370300200420042903e8013703a802200441f0006a200441a8026a10b9044101210c4101210320042f01704101470d0141012103412221054101210c034020044180026a41206a220a20162f01003b010020044180026a41186a2210201829010037030020044180026a41106a2212201529010037030020044180026a41086a220f201729010037030020042011290100370380020240200c2003470d00200441b0016a2003410110e50120042802b00121090b200920056a2203200429038002370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602b801200541226a2105200441f0006a200441a8026a10b90420042802b401210320042f01704101460d000c020b0b41002103410221094100210c0b0240200428024822054104460d00200429024c210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602302004200cad4220862003ad84370234024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441c8006a41026a200a28020020194105746a220541026a2d00003a0000200441f0006a41086a200541176a290000370300200441f0006a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f3703702005290007211c20052800032123410121050b41022117200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a2218200441f0006a41086a2219290300370300200441e8016a41106a2215200441f0006a41106a221b2d00003a0000200420042f01483b01cc01200420042903703703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a000020044180026a41086a201829030037030020044180026a41106a20152d00003a0000200420042f01cc013b0118200420042903e8013703800241002110201c211e202321170b200441c8016a41026a2216200441186a41026a22252d00003a0000200441a8026a41086a220520044180026a41086a2214290300370300200441a8026a41106a220a20044180026a41106a220e2d00003a0000200420042f01183b01c80120042004290380023703a80220100d022012417f732107200441c4016a41026a221020162d00003a0000200441b0016a41086a22122005290300370300200441b0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903a8023703b0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021090b2009200c41226c6a2203201e37000720102d0000210920042f01c401210620032017360003200320063b0100200341026a20093a0000200320042903b00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602384100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f3703702003290007212720032800032128410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201820192903003703002015201b2d00003a0000200420042f01183b01cc01200420042903703703e8014101210c02402003450d002016200441cc016a41026a2d00003a000020142018290300370300200e20152d00003a0000200420042f01cc013b01c801200420042903e801370380024100210c2027210d202821090b201020162d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c40120042004290380023703a802200c0d032008411c6a2108201d20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a000020042004290330370348200420042903a8023703b00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a200d3700002003410f6a20093600002003411b6a20042903b001370000200341076a200429004f370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a36021020082021470d010c060b0b200042013702000c020b2000201736020420004101360200200041086a201e3702000c010b2000200936020420004101360200200041086a200d370200200428023421030b2004280230410020031b220c450d00200341226c450d00200c102c0b02402020450d002020411c6c450d00201f102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d0b2003412c6c450d0b200c102c0c0b0b02402020450d002020411c6c450d00201f102c0b2001280248211f200141cc006a28020021200240200141d0006a2802002203450d00201f20034105746a2121200441c8006a410c6a211d200441f0006a4102722111200441a8026a41186a2126200441a8026a41106a2124200441a8026a41086a2122201f21080240024002400240034020082f011c21192008280200211a2008410c6a290100210b200829010421132024200841146a2901003703002022200b370300200420133703a802200441003b016c20044104360248200420263602d4012004200441c8006a3602e0012004200441046a3602dc012004200441ec006a3602d8012004200441a8026a3602d001200441f0006a200441d0016a10b9040240024020042f01704101470d00412210322209450d0820092011290100370100200941206a201141206a22162f01003b0100200941186a201141186a2218290100370100200941106a201141106a2215290100370100200941086a201141086a221729010037010020044281808080103702b401200420093602b001200441e8016a41106a200441d0016a41106a280200360200200441e8016a41086a200441d0016a41086a290300370300200420042903d0013703e801200441f0006a200441e8016a10b9044101210c4101210320042f01704101470d0141012103412221054101210c034020044180026a41206a220a20162f01003b010020044180026a41186a2210201829010037030020044180026a41106a2212201529010037030020044180026a41086a220f201729010037030020042011290100370380020240200c2003470d00200441b0016a2003410110e50120042802b00121090b200920056a2203200429038002370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602b801200541226a2105200441f0006a200441e8016a10b90420042802b401210320042f01704101460d000c020b0b41002103410221094100210c0b0240200428024822054104460d00200429024c210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602302004200cad4220862003ad84370234024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441c8006a41026a200a28020020194105746a220541026a2d00003a0000200441f0006a41086a200541176a290000370300200441f0006a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f3703702005290007211c20052800032123410121050b41022117200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a2218200441f0006a41086a2219290300370300200441e8016a41106a2215200441f0006a41106a221b2d00003a0000200420042f01483b01cc01200420042903703703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a000020044180026a41086a201829030037030020044180026a41106a20152d00003a0000200420042f01cc013b0118200420042903e8013703800241002110201c211e202321170b200441c8016a41026a2216200441186a41026a22252d00003a0000200441d0016a41086a220520044180026a41086a2214290300370300200441d0016a41106a220a20044180026a41106a220e2d00003a0000200420042f01183b01c80120042004290380023703d00120100d022012417f732107200441c4016a41026a221020162d00003a0000200441b0016a41086a22122005290300370300200441b0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903d0013703b0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021090b2009200c41226c6a2203201e37000720102d0000210920042f01c401210620032017360003200320063b0100200341026a20093a0000200320042903b00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602384100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f3703702003290007212720032800032128410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201820192903003703002015201b2d00003a0000200420042f01183b01cc01200420042903703703e8014101210c02402003450d002016200441cc016a41026a2d00003a000020142018290300370300200e20152d00003a0000200420042f01cc013b01c801200420042903e801370380024100210c2027210d202821090b201020162d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c40120042004290380023703d001200c0d03200841206a2108201d20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a000020042004290330370348200420042903d0013703b00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a200d3700002003410f6a20093600002003411b6a20042903b001370000200341076a200429004f370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a36021020082021470d010c060b0b200042013702000c020b2000201736020420004101360200200041086a201e3702000c010b2000200936020420004101360200200041086a200d370200200428023421030b2004280230410020031b220c450d00200341226c450d00200c102c0b0240202041ffffff3f71450d00201f102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d0c2003412c6c450d0c200c102c0c0c0b0240202041ffffff3f71450d00201f102c0b20012802542120200141d8006a28020021290240200141dc006a2802002203450d002020200341246c6a211f200441c8006a410c6a211d200441f0006a4102722111200441a8026a411c6a2126200441a8026a41186a2124200441a8026a41106a2122200441a8026a41086a2123202021160240024002400240034020162f012021192016280200211a2016410c6a290100210b201641146a29010021132016290104211e20242016411c6a280100360200202220133703002023200b3703002004201e3703a802200441003b016c20044104360248200420263602d4012004200441c8006a3602e0012004200441046a3602dc012004200441ec006a3602d8012004200441a8026a3602d001200441f0006a200441d0016a10b9040240024020042f01704101470d00412210322209450d0820092011290100370100200941206a201141206a22182f01003b0100200941186a201141186a2215290100370100200941106a201141106a2217290100370100200941086a201141086a220829010037010020044281808080103702b401200420093602b001200441e8016a41106a200441d0016a41106a280200360200200441e8016a41086a200441d0016a41086a290300370300200420042903d0013703e801200441f0006a200441e8016a10b9044101210c4101210320042f01704101470d0141012103412221054101210c034020044180026a41206a220a20182f01003b010020044180026a41186a2210201529010037030020044180026a41106a2212201729010037030020044180026a41086a220f200829010037030020042011290100370380020240200c2003470d00200441b0016a2003410110e50120042802b00121090b200920056a2203200429038002370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602b801200541226a2105200441f0006a200441e8016a10b90420042802b401210320042f01704101460d000c020b0b41002103410221094100210c0b0240200428024822054104460d00200429024c210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602302004200cad4220862003ad84370234024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441c8006a41026a200a28020020194105746a220541026a2d00003a0000200441f0006a41086a200541176a290000370300200441f0006a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f3703702005290007212720052800032128410121050b41022108200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a2215200441f0006a41086a2219290300370300200441e8016a41106a2217200441f0006a41106a221b2d00003a0000200420042f01483b01cc01200420042903703703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a000020044180026a41086a201529030037030020044180026a41106a20172d00003a0000200420042f01cc013b0118200420042903e80137038002410021102027210d202821080b200441c8016a41026a2218200441186a41026a22252d00003a0000200441d0016a41086a220520044180026a41086a2214290300370300200441d0016a41106a220a20044180026a41106a220e2d00003a0000200420042f01183b01c80120042004290380023703d00120100d022012417f732107200441c4016a41026a221020182d00003a0000200441b0016a41086a22122005290300370300200441b0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903d0013703b0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021090b2009200c41226c6a2203200d37000720102d0000210920042f01c401210620032008360003200320063b0100200341026a20093a0000200320042903b00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602384100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f3703702003290007212a20032800032121410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201520192903003703002017201b2d00003a0000200420042f01183b01cc01200420042903703703e8014101210c02402003450d002018200441cc016a41026a2d00003a000020142015290300370300200e20172d00003a0000200420042f01cc013b01c801200420042903e801370380024100210c202a211c202121090b201020182d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c40120042004290380023703d001200c0d03201641246a2116201d20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a000020042004290330370348200420042903d0013703b00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a201c3700002003410f6a20093600002003411b6a20042903b001370000200341076a200429004f370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a3602102016201f470d010c060b0b200042013702000c020b2000200836020420004101360200200041086a200d3702000c010b2000200936020420004101360200200041086a201c370200200428023421030b2004280230410020031b220c450d00200341226c450d00200c102c0b02402029450d00202941246c450d002020102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d0d2003412c6c450d0d200c102c0c0d0b02402029450d00202941246c450d002020102c0b20012802602120200141e4006a28020021290240200141e8006a2802002203450d002020200341286c6a211f200441c8006a410c6a211d200441f0006a4102722111200441a8026a41206a2126200441a8026a41186a2124200441a8026a41106a2122200441a8026a41086a2123202021160240024002400240034020162f012421192016280200211a2016410c6a290100210b201641146a29010021132016290104211e20242016411c6a290100370300202220133703002023200b3703002004201e3703a802200441003b016c20044104360248200420263602d4012004200441c8006a3602e0012004200441046a3602dc012004200441ec006a3602d8012004200441a8026a3602d001200441f0006a200441d0016a10b9040240024020042f01704101470d00412210322209450d0820092011290100370100200941206a201141206a22182f01003b0100200941186a201141186a2215290100370100200941106a201141106a2217290100370100200941086a201141086a220829010037010020044281808080103702b401200420093602b001200441e8016a41106a200441d0016a41106a280200360200200441e8016a41086a200441d0016a41086a290300370300200420042903d0013703e801200441f0006a200441e8016a10b9044101210c4101210320042f01704101470d0141012103412221054101210c034020044180026a41206a220a20182f01003b010020044180026a41186a2210201529010037030020044180026a41106a2212201729010037030020044180026a41086a220f200829010037030020042011290100370380020240200c2003470d00200441b0016a2003410110e50120042802b00121090b200920056a2203200429038002370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602b801200541226a2105200441f0006a200441e8016a10b90420042802b401210320042f01704101460d000c020b0b41002103410221094100210c0b0240200428024822054104460d00200429024c210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602302004200cad4220862003ad84370234024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441c8006a41026a200a28020020194105746a220541026a2d00003a0000200441f0006a41086a200541176a290000370300200441f0006a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f3703702005290007212720052800032128410121050b41022108200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a2215200441f0006a41086a2219290300370300200441e8016a41106a2217200441f0006a41106a221b2d00003a0000200420042f01483b01cc01200420042903703703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a000020044180026a41086a201529030037030020044180026a41106a20172d00003a0000200420042f01cc013b0118200420042903e80137038002410021102027210d202821080b200441c8016a41026a2218200441186a41026a22252d00003a0000200441d0016a41086a220520044180026a41086a2214290300370300200441d0016a41106a220a20044180026a41106a220e2d00003a0000200420042f01183b01c80120042004290380023703d00120100d022012417f732107200441c4016a41026a221020182d00003a0000200441b0016a41086a22122005290300370300200441b0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903d0013703b0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021090b2009200c41226c6a2203200d37000720102d0000210920042f01c401210620032008360003200320063b0100200341026a20093a0000200320042903b00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602384100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f3703702003290007212a20032800032121410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201520192903003703002017201b2d00003a0000200420042f01183b01cc01200420042903703703e8014101210c02402003450d002018200441cc016a41026a2d00003a000020142015290300370300200e20172d00003a0000200420042f01cc013b01c801200420042903e801370380024100210c202a211c202121090b201020182d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c40120042004290380023703d001200c0d03201641286a2116201d20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a000020042004290330370348200420042903d0013703b00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a201c3700002003410f6a20093600002003411b6a20042903b001370000200341076a200429004f370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a3602102016201f470d010c060b0b200042013702000c020b2000200836020420004101360200200041086a200d3702000c010b2000200936020420004101360200200041086a201c370200200428023421030b2004280230410020031b220c450d00200341226c450d00200c102c0b02402029450d00202941286c450d002020102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d0e2003412c6c450d0e200c102c0c0e0b02402029450d00202941286c450d002020102c0b200128026c2129200141f0006a280200212b0240200141f4006a2802002203450d0020292003412c6c6a2120200441c8006a410c6a211d200441f0006a410272211120044180026a41246a212620044180026a41206a212420044180026a41186a212220044180026a41106a212320044180026a41086a2128202921160240024002400240034020162f012821192016280200211a2016410c6a290100210b201641146a29010021132016411c6a290100211e2016290104210d2024201641246a2801003602002022201e370300202320133703002028200b3703002004200d37038002200441003b016c20044104360248200420263602d4012004200441c8006a3602e0012004200441046a3602dc012004200441ec006a3602d801200420044180026a3602d001200441f0006a200441d0016a10b9040240024020042f01704101470d00412210322209450d0820092011290100370100200941206a201141206a22182f01003b0100200941186a201141186a2215290100370100200941106a201141106a2217290100370100200941086a201141086a220829010037010020044281808080103702b401200420093602b001200441e8016a41106a200441d0016a41106a280200360200200441e8016a41086a200441d0016a41086a290300370300200420042903d0013703e801200441f0006a200441e8016a10b9044101210c4101210320042f01704101470d0141012103412221054101210c0340200441a8026a41206a220a20182f01003b0100200441a8026a41186a22102015290100370300200441a8026a41106a22122017290100370300200441a8026a41086a220f2008290100370300200420112901003703a8020240200c2003470d00200441b0016a2003410110e50120042802b00121090b200920056a220320042903a802370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602b801200541226a2105200441f0006a200441e8016a10b90420042802b401210320042f01704101460d000c020b0b41002103410221094100210c0b0240200428024822054104460d00200429024c210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602302004200cad4220862003ad84370234024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441c8006a41026a200a28020020194105746a220541026a2d00003a0000200441f0006a41086a200541176a290000370300200441f0006a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f3703702005290007212a20052800032121410121050b41022108200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a2215200441f0006a41086a2219290300370300200441e8016a41106a2217200441f0006a41106a221b2d00003a0000200420042f01483b01cc01200420042903703703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a0000200441a8026a41086a2015290300370300200441a8026a41106a20172d00003a0000200420042f01cc013b0118200420042903e8013703a80241002110202a211c202121080b200441c8016a41026a2218200441186a41026a22252d00003a0000200441d0016a41086a2205200441a8026a41086a2214290300370300200441d0016a41106a220a200441a8026a41106a220e2d00003a0000200420042f01183b01c801200420042903a8023703d00120100d022012417f732107200441c4016a41026a221020182d00003a0000200441b0016a41086a22122005290300370300200441b0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903d0013703b0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021090b2009200c41226c6a2203201c37000720102d0000210920042f01c401210620032008360003200320063b0100200341026a20093a0000200320042903b00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602384100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f3703702003290007212c2003280003211f410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201520192903003703002017201b2d00003a0000200420042f01183b01cc01200420042903703703e8014101210c02402003450d002018200441cc016a41026a2d00003a000020142015290300370300200e20172d00003a0000200420042f01cc013b01c801200420042903e8013703a8024100210c202c2127201f21090b201020182d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c401200420042903a8023703d001200c0d032016412c6a2116201d20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a000020042004290330370348200420042903d0013703b00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a20273700002003410f6a20093600002003411b6a20042903b001370000200341076a200429004f370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a36021020162020470d010c060b0b200042013702000c020b2000200836020420004101360200200041086a201c3702000c010b2000200936020420004101360200200041086a2027370200200428023421030b2004280230410020031b220c450d00200341226c450d00200c102c0b0240202b450d00202b412c6c450d002029102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d0f2003412c6c450d0f200c102c0c0f0b0240202b450d00202b412c6c450d002029102c0b20012802782129200141fc006a280200212b024020014180016a2802002203450d002029200341306c6a2120200441c8006a410c6a211d20044180026a410272211120044198016a2126200441f0006a41206a2124200441f0006a41186a2122200441f0006a41106a2123200441f0006a41086a2128202921160240024002400240034020162f012c21192016280200211a2016410c6a290100210b201641146a29010021132016411c6a290100211e2016290104210d2024201641246a2901003703002022201e370300202320133703002028200b3703002004200d370370200441003b016c20044104360248200420263602d4012004200441c8006a3602e0012004200441046a3602dc012004200441ec006a3602d8012004200441f0006a3602d00120044180026a200441d0016a10b9040240024020042f0180024101470d00412210322209450d0820092011290100370100200941206a201141206a22182f01003b0100200941186a201141186a2215290100370100200941106a201141106a2217290100370100200941086a201141086a220829010037010020044281808080103702b401200420093602b001200441e8016a41106a200441d0016a41106a280200360200200441e8016a41086a200441d0016a41086a290300370300200420042903d0013703e80120044180026a200441e8016a10b9044101210c4101210320042f0180024101470d0141012103412221054101210c0340200441a8026a41206a220a20182f01003b0100200441a8026a41186a22102015290100370300200441a8026a41106a22122017290100370300200441a8026a41086a220f2008290100370300200420112901003703a8020240200c2003470d00200441b0016a2003410110e50120042802b00121090b200920056a220320042903a802370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602b801200541226a210520044180026a200441e8016a10b90420042802b401210320042f0180024101460d000c020b0b41002103410221094100210c0b0240200428024822054104460d00200429024c210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602302004200cad4220862003ad84370234024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441c8006a41026a200a28020020194105746a220541026a2d00003a000020044180026a41086a200541176a29000037030020044180026a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f370380022005290007212a20052800032121410121050b41022108200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a221520044180026a41086a2219290300370300200441e8016a41106a221720044180026a41106a221b2d00003a0000200420042f01483b01cc0120042004290380023703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a0000200441a8026a41086a2015290300370300200441a8026a41106a20172d00003a0000200420042f01cc013b0118200420042903e8013703a8024100211020212108202a211c0b200441c8016a41026a2218200441186a41026a22252d00003a0000200441d0016a41086a2205200441a8026a41086a2214290300370300200441d0016a41106a220a200441a8026a41106a220e2d00003a0000200420042f01183b01c801200420042903a8023703d00120100d022012417f732107200441c4016a41026a221020182d00003a0000200441b0016a41086a22122005290300370300200441b0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903d0013703b0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021090b2009200c41226c6a2203201c37000720102d0000210920042f01c401210620032008360003200320063b0100200341026a20093a0000200320042903b00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602384100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f370380022003290007212c2003280003211f410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201520192903003703002017201b2d00003a0000200420042f01183b01cc0120042004290380023703e8014101210c02402003450d002018200441cc016a41026a2d00003a000020142015290300370300200e20172d00003a0000200420042f01cc013b01c801200420042903e8013703a8024100210c201f2109202c21270b201020182d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c401200420042903a8023703d001200c0d03201641306a2116201d20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a000020042004290330370348200420042903d0013703b00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a20273700002003410f6a20093600002003411b6a20042903b001370000200341076a200429004f370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a36021020162020470d010c060b0b200042013702000c020b2000200836020420004101360200200041086a201c3702000c010b2000200936020420004101360200200041086a2027370200200428023421030b2004280230410020031b220c450d00200341226c450d00200c102c0b0240202b450d00202b41306c450d002029102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d102003412c6c450d10200c102c0c100b0240202b450d00202b41306c450d002029102c0b200128028401212b20014188016a280200212d02402001418c016a2802002203450d00202b200341346c6a2129200441c8006a410c6a211d20044180026a4102722116200441f0006a412c6a212620044198016a2124200441f0006a41206a2122200441f0006a41186a2123200441f0006a41106a2128200441f0006a41086a2121202b21110240024002400240034020112f013021192011280200211a2011410c6a290100210b201141146a29010021132011411c6a290100211e201141246a290100210d2011290104211c20242011412c6a2801003602002022200d3703002023201e370300202820133703002021200b3703002004201c370370200441003b016c20044104360248200420263602d4012004200441c8006a3602e0012004200441046a3602dc012004200441ec006a3602d8012004200441f0006a3602d00120044180026a200441d0016a10b9040240024020042f0180024101470d00412210322209450d0820092016290100370100200941206a201641206a22182f01003b0100200941186a201641186a2215290100370100200941106a201641106a2217290100370100200941086a201641086a220829010037010020044281808080103702b401200420093602b001200441e8016a41106a200441d0016a41106a280200360200200441e8016a41086a200441d0016a41086a290300370300200420042903d0013703e80120044180026a200441e8016a10b9044101210c4101210320042f0180024101470d0141012103412221054101210c0340200441a8026a41206a220a20182f01003b0100200441a8026a41186a22102015290100370300200441a8026a41106a22122017290100370300200441a8026a41086a220f2008290100370300200420162901003703a8020240200c2003470d00200441b0016a2003410110e50120042802b00121090b200920056a220320042903a802370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602b801200541226a210520044180026a200441e8016a10b90420042802b401210320042f0180024101460d000c020b0b41002103410221094100210c0b0240200428024822054104460d00200429024c210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602302004200cad4220862003ad84370234024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441c8006a41026a200a28020020194105746a220541026a2d00003a000020044180026a41086a200541176a29000037030020044180026a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f370380022005290007212c2005280003211f410121050b41022108200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a221520044180026a41086a2219290300370300200441e8016a41106a221720044180026a41106a221b2d00003a0000200420042f01483b01cc0120042004290380023703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a0000200441a8026a41086a2015290300370300200441a8026a41106a20172d00003a0000200420042f01cc013b0118200420042903e8013703a80241002110201f2108202c21270b200441c8016a41026a2218200441186a41026a22252d00003a0000200441d0016a41086a2205200441a8026a41086a2214290300370300200441d0016a41106a220a200441a8026a41106a220e2d00003a0000200420042f01183b01c801200420042903a8023703d00120100d022012417f732107200441c4016a41026a221020182d00003a0000200441b0016a41086a22122005290300370300200441b0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903d0013703b0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021090b2009200c41226c6a2203202737000720102d0000210920042f01c401210620032008360003200320063b0100200341026a20093a0000200320042903b00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602384100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f370380022003290007212e20032800032120410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201520192903003703002017201b2d00003a0000200420042f01183b01cc0120042004290380023703e8014101210c02402003450d002018200441cc016a41026a2d00003a000020142015290300370300200e20172d00003a0000200420042f01cc013b01c801200420042903e8013703a8024100210c20202109202e212a0b201020182d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c401200420042903a8023703d001200c0d03201141346a2111201d20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a000020042004290330370348200420042903d0013703b00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a202a3700002003410f6a20093600002003411b6a20042903b001370000200341076a200429004f370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a36021020112029470d010c060b0b200042013702000c020b2000200836020420004101360200200041086a20273702000c010b2000200936020420004101360200200041086a202a370200200428023421030b2004280230410020031b220c450d00200341226c450d00200c102c0b0240202d450d00202d41346c450d00202b102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d112003412c6c450d11200c102c0c110b0240202d450d00202d41346c450d00202b102c0b200128029001212d20014194016a280200212b024020014198016a2802002203450d00202d200341386c6a2129200441c8006a410c6a211d20044180026a4102722116200441a0016a212620044198016a2124200441f0006a41206a2122200441f0006a41186a2123200441f0006a41106a2128200441f0006a41086a2121202d21110240024002400240034020112f013421192011280200211a2011410c6a290100210b201141146a29010021132011411c6a290100211e201141246a290100210d2011290104211c20242011412c6a2901003703002022200d3703002023201e370300202820133703002021200b3703002004201c370370200441003b016c20044104360248200420263602d4012004200441c8006a3602e0012004200441046a3602dc012004200441ec006a3602d8012004200441f0006a3602d00120044180026a200441d0016a10b9040240024020042f0180024101470d00412210322209450d0820092016290100370100200941206a201641206a22182f01003b0100200941186a201641186a2215290100370100200941106a201641106a2217290100370100200941086a201641086a220829010037010020044281808080103702b401200420093602b001200441e8016a41106a200441d0016a41106a280200360200200441e8016a41086a200441d0016a41086a290300370300200420042903d0013703e80120044180026a200441e8016a10b9044101210c4101210320042f0180024101470d0141012103412221054101210c0340200441a8026a41206a220a20182f01003b0100200441a8026a41186a22102015290100370300200441a8026a41106a22122017290100370300200441a8026a41086a220f2008290100370300200420162901003703a8020240200c2003470d00200441b0016a2003410110e50120042802b00121090b200920056a220320042903a802370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602b801200541226a210520044180026a200441e8016a10b90420042802b401210320042f0180024101460d000c020b0b41002103410221094100210c0b0240200428024822054104460d00200429024c210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602302004200cad4220862003ad84370234024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441c8006a41026a200a28020020194105746a220541026a2d00003a000020044180026a41086a200541176a29000037030020044180026a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f370380022005290007212c2005280003211f410121050b41022108200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a221520044180026a41086a2219290300370300200441e8016a41106a221720044180026a41106a221b2d00003a0000200420042f01483b01cc0120042004290380023703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a0000200441a8026a41086a2015290300370300200441a8026a41106a20172d00003a0000200420042f01cc013b0118200420042903e8013703a80241002110201f2108202c21270b200441c8016a41026a2218200441186a41026a22252d00003a0000200441d0016a41086a2205200441a8026a41086a2214290300370300200441d0016a41106a220a200441a8026a41106a220e2d00003a0000200420042f01183b01c801200420042903a8023703d00120100d022012417f732107200441c4016a41026a221020182d00003a0000200441b0016a41086a22122005290300370300200441b0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903d0013703b0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021090b2009200c41226c6a2203202737000720102d0000210920042f01c401210620032008360003200320063b0100200341026a20093a0000200320042903b00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602384100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f370380022003290007212e20032800032120410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201520192903003703002017201b2d00003a0000200420042f01183b01cc0120042004290380023703e8014101210c02402003450d002018200441cc016a41026a2d00003a000020142015290300370300200e20172d00003a0000200420042f01cc013b01c801200420042903e8013703a8024100210c20202109202e212a0b201020182d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c401200420042903a8023703d001200c0d03201141386a2111201d20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a000020042004290330370348200420042903d0013703b00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a202a3700002003410f6a20093600002003411b6a20042903b001370000200341076a200429004f370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a36021020112029470d010c060b0b200042013702000c020b2000200836020420004101360200200041086a20273702000c010b2000200936020420004101360200200041086a202a370200200428023421030b2004280230410020031b220c450d00200341226c450d00200c102c0b0240202b450d00202b41386c450d00202d102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d122003412c6c450d12200c102c0c120b0240202b450d00202b41386c450d00202d102c0b200128029c01212f200141a0016a280200212d0240200141a4016a2802002203450d00202f2003413c6c6a212b200441c8006a410c6a211d20044180026a4102722116200441f0006a41346a2126200441a0016a212420044198016a2122200441f0006a41206a2123200441f0006a41186a2128200441f0006a41106a2121200441f0006a41086a211f202f21110240024002400240034020112f013821192011280200211a2011410c6a290100210b201141146a29010021132011411c6a290100211e201141246a290100210d2011412c6a290100211c201129010421272024201141346a2801003602002022201c3703002023200d3703002028201e37030020212013370300201f200b37030020042027370370200441003b016c20044104360248200420263602d4012004200441c8006a3602e0012004200441046a3602dc012004200441ec006a3602d8012004200441f0006a3602d00120044180026a200441d0016a10b9040240024020042f0180024101470d00412210322209450d0820092016290100370100200941206a201641206a22182f01003b0100200941186a201641186a2215290100370100200941106a201641106a2217290100370100200941086a201641086a220829010037010020044281808080103702b401200420093602b001200441e8016a41106a200441d0016a41106a280200360200200441e8016a41086a200441d0016a41086a290300370300200420042903d0013703e80120044180026a200441e8016a10b9044101210c4101210320042f0180024101470d0141012103412221054101210c0340200441a8026a41206a220a20182f01003b0100200441a8026a41186a22102015290100370300200441a8026a41106a22122017290100370300200441a8026a41086a220f2008290100370300200420162901003703a8020240200c2003470d00200441b0016a2003410110e50120042802b00121090b200920056a220320042903a802370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602b801200541226a210520044180026a200441e8016a10b90420042802b401210320042f0180024101460d000c020b0b41002103410221094100210c0b0240200428024822054104460d00200429024c210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602302004200cad4220862003ad84370234024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441c8006a41026a200a28020020194105746a220541026a2d00003a000020044180026a41086a200541176a29000037030020044180026a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f370380022005290007212e20052800032120410121050b41022108200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a221520044180026a41086a2219290300370300200441e8016a41106a221720044180026a41106a221b2d00003a0000200420042f01483b01cc0120042004290380023703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a0000200441a8026a41086a2015290300370300200441a8026a41106a20172d00003a0000200420042f01cc013b0118200420042903e8013703a8024100211020202108202e212a0b200441c8016a41026a2218200441186a41026a22252d00003a0000200441d0016a41086a2205200441a8026a41086a2214290300370300200441d0016a41106a220a200441a8026a41106a220e2d00003a0000200420042f01183b01c801200420042903a8023703d00120100d022012417f732107200441c4016a41026a221020182d00003a0000200441b0016a41086a22122005290300370300200441b0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903d0013703b0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021090b2009200c41226c6a2203202a37000720102d0000210920042f01c401210620032008360003200320063b0100200341026a20093a0000200320042903b00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602384100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f370380022003290007213020032800032129410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201520192903003703002017201b2d00003a0000200420042f01183b01cc0120042004290380023703e8014101210c02402003450d002018200441cc016a41026a2d00003a000020142015290300370300200e20172d00003a0000200420042f01cc013b01c801200420042903e8013703a8024100210c202921092030212c0b201020182d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c401200420042903a8023703d001200c0d032011413c6a2111201d20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a000020042004290330370348200420042903d0013703b00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a202c3700002003410f6a20093600002003411b6a20042903b001370000200341076a200429004f370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a3602102011202b470d010c060b0b200042013702000c020b2000200836020420004101360200200041086a202a3702000c010b2000200936020420004101360200200041086a202c370200200428023421030b2004280230410020031b220c450d00200341226c450d00200c102c0b0240202d450d00202d413c6c450d00202f102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d132003412c6c450d13200c102c0c130b0240202d450d00202d413c6c450d00202f102c0b20012802a801212d200141ac016a280200212f0240200141b0016a2802002203450d00202d20034106746a212b200441c8006a410c6a211d20044180026a4102722116200441a8016a2126200441a0016a212420044198016a2122200441f0006a41206a2123200441f0006a41186a2128200441f0006a41106a2121200441f0006a41086a211f202d21110240024002400240034020112f013c21192011280200211a2011410c6a290100210b201141146a29010021132011411c6a290100211e201141246a290100210d2011412c6a290100211c201129010421272024201141346a2901003703002022201c3703002023200d3703002028201e37030020212013370300201f200b37030020042027370370200441003b016c20044104360248200420263602d4012004200441c8006a3602e0012004200441046a3602dc012004200441ec006a3602d8012004200441f0006a3602d00120044180026a200441d0016a10b9040240024020042f0180024101470d00412210322209450d0820092016290100370100200941206a201641206a22182f01003b0100200941186a201641186a2215290100370100200941106a201641106a2217290100370100200941086a201641086a220829010037010020044281808080103702b401200420093602b001200441e8016a41106a200441d0016a41106a280200360200200441e8016a41086a200441d0016a41086a290300370300200420042903d0013703e80120044180026a200441e8016a10b9044101210c4101210320042f0180024101470d0141012103412221054101210c0340200441a8026a41206a220a20182f01003b0100200441a8026a41186a22102015290100370300200441a8026a41106a22122017290100370300200441a8026a41086a220f2008290100370300200420162901003703a8020240200c2003470d00200441b0016a2003410110e50120042802b00121090b200920056a220320042903a802370100200341206a200a2f01003b0100200341186a2010290300370100200341106a2012290300370100200341086a200f2903003701002004200c41016a220c3602b801200541226a210520044180026a200441e8016a10b90420042802b401210320042f0180024101460d000c020b0b41002103410221094100210c0b0240200428024822054104460d00200429024c210b02402009410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c050b200420093602302004200cad4220862003ad84370234024020042f016c221241ffff03460d004100210502402004280204220a28020820194d0d00200441c8006a41026a200a28020020194105746a220541026a2d00003a000020044180026a41086a200541176a29000037030020044180026a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f370380022005290007212e20052800032120410121050b41022108200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a221520044180026a41086a2219290300370300200441e8016a41106a221720044180026a41106a221b2d00003a0000200420042f01483b01cc0120042004290380023703e8014101211002402005450d00200441186a41026a200441cc016a41026a2d00003a0000200441a8026a41086a2015290300370300200441a8026a41106a20172d00003a0000200420042f01cc013b0118200420042903e8013703a8024100211020202108202e212a0b200441c8016a41026a2218200441186a41026a22252d00003a0000200441d0016a41086a2205200441a8026a41086a2214290300370300200441d0016a41106a220a200441a8026a41106a220e2d00003a0000200420042f01183b01c801200420042903a8023703d00120100d022012417f732107200441c4016a41026a221020182d00003a0000200441b0016a41086a22122005290300370300200441b0016a41106a220f200a2d00003a0000200420042f01c8013b01c401200420042903d0013703b0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021090b2009200c41226c6a2203202a37000720102d0000210920042f01c401210620032008360003200320063b0100200341026a20093a0000200320042903b00137000f200f2d000021092012290300210b200320073b0120200341176a200b3700002003411f6a20093a00002004200c41016a3602384100210302402002280208201a4d0d0020252002280200201a4105746a220341026a2d00003a00002019200341176a290000370300201b2003411f6a2d00003a0000200420032f00003b01182004200329000f370380022003290007213020032800032129410121030b41022109200441cc016a41026a200441186a41026a2d00003a0000201520192903003703002017201b2d00003a0000200420042f01183b01cc0120042004290380023703e8014101210c02402003450d002018200441cc016a41026a2d00003a000020142015290300370300200e20172d00003a0000200420042f01cc013b01c801200420042903e8013703a8024100210c202921092030212c0b201020182d00003a000020052014290300370300200a200e2d00003a0000200420042f01c8013b01c401200420042903a8023703d001200c0d03201141c0006a2111201d20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200201d41026a20102d00003a000020122005290300370300200f200a2d00003a000020042004290330370348200420042903d0013703b00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a202c3700002003410f6a20093600002003411b6a20042903b001370000200341076a200429004f370000200341236a20122903003700002003412b6a200f2d00003a00002004200c41016a3602102011202b470d010c060b0b200042013702000c020b2000200836020420004101360200200041086a202a3702000c010b2000200936020420004101360200200041086a202c370200200428023421030b2004280230410020031b220c450d00200341226c450d00200c102c0b0240202f41ffffff1f71450d00202d102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d142003412c6c450d14200c102c0c140b0240202f41ffffff1f71450d00202d102c0b20012802b401212d200141b8016a280200212f200141bc016a2802002203450d03202d200341c4006c6a212b200441c8006a410c6a210e20044180026a4102722111200441f0006a413c6a2125200441a8016a2126200441a0016a212420044198016a2122200441f0006a41206a2123200441f0006a41186a2128200441f0006a41106a2121200441f0006a41086a211f202d210f024002400340200f2f01402108200f2802002119200f410c6a290100210b200f41146a2901002113200f411c6a290100211e200f41246a290100210d200f412c6a290100211c200f41346a2901002127200f290104212a2026200f413c6a280100360200202420273703002022201c3703002023200d3703002028201e37030020212013370300201f200b3703002004202a370370200441003b016c20044104360248200420253602d4012004200441c8006a3602e0012004200441046a3602dc012004200441ec006a3602d8012004200441f0006a3602d00120044180026a200441d0016a10b9040240024020042f0180024101470d00412210322201450d0520012011290100370100200141206a201141206a22162f01003b0100200141186a201141186a2218290100370100200141106a201141106a2215290100370100200141086a201141086a221729010037010020044281808080103702b401200420013602b001200441e8016a41106a200441d0016a41106a280200360200200441e8016a41086a200441d0016a41086a290300370300200420042903d0013703e80120044180026a200441e8016a10b9044101210c4101210320042f0180024101470d0141012103412221054101210c0340200441a8026a41206a220920162f01003b0100200441a8026a41186a220a2018290100370300200441a8026a41106a22102015290100370300200441a8026a41086a22122017290100370300200420112901003703a8020240200c2003470d00200441b0016a2003410110e50120042802b00121010b200120056a220320042903a802370100200341206a20092f01003b0100200341186a200a290300370100200341106a2010290300370100200341086a20122903003701002004200c41016a220c3602b801200541226a210520044180026a200441e8016a10b90420042802b401210320042f0180024101460d000c020b0b41002103410221014100210c0b0240200428024822054104460d00200429024c210b02402001410020031b220c450d00200341226c450d00200c102c0b2000200536020420004101360200200041086a200b3702000c060b200420013602302004200cad4220862003ad84370234024020042f016c221041ffff03460d004100210502402004280204220928020820084d0d00200441c8006a41026a200928020020084105746a220541026a2d00003a000020044180026a41086a200541176a29000037030020044180026a41106a2005411f6a2d00003a0000200420052f00003b01482004200529000f370380022005290007213020052800032120410121050b41022117200441cc016a41026a200441c8006a41026a2d00003a0000200441e8016a41086a221820044180026a41086a2208290300370300200441e8016a41106a221520044180026a41106a221a2d00003a0000200420042f01483b01cc0120042004290380023703e8014101210a02402005450d00200441186a41026a200441cc016a41026a2d00003a0000200441a8026a41086a2018290300370300200441a8026a41106a20152d00003a0000200420042f01cc013b0118200420042903e8013703a8024100210a202021172030212c0b200441c8016a41026a2216200441186a41026a22062d00003a0000200441d0016a41086a2205200441a8026a41086a221b290300370300200441d0016a41106a2209200441a8026a41106a22142d00003a0000200420042f01183b01c801200420042903a8023703d001200a0d022010417f73211d200441c4016a41026a220a20162d00003a0000200441b0016a41086a22102005290300370300200441b0016a41106a221220092d00003a0000200420042f01c8013b01c401200420042903d0013703b0010240200c2003470d00200441306a200c410110e5012004280238210c200428023021010b2001200c41226c6a2203202c370007200a2d0000210120042f01c401210720032017360003200320073b0100200341026a20013a0000200320042903b00137000f20122d000021012010290300210b2003201d3b0120200341176a200b3700002003411f6a20013a00002004200c41016a360238410021030240200228020820194d0d002006200228020020194105746a220341026a2d00003a00002008200341176a290000370300201a2003411f6a2d00003a0000200420032f00003b01182004200329000f370380022003290007213120032800032129410121030b41022101200441cc016a41026a200441186a41026a2d00003a0000201820082903003703002015201a2d00003a0000200420042f01183b01cc0120042004290380023703e8014101210c02402003450d002016200441cc016a41026a2d00003a0000201b2018290300370300201420152d00003a0000200420042f01cc013b01c801200420042903e8013703a8024100210c202921012031212e0b200a20162d00003a00002005201b290300370300200920142d00003a0000200420042f01c8013b01c401200420042903a8023703d001200c0d03200f41c4006a210f200e20042f01c4013b0000200441c8006a41086a200441306a41086a280200360200200e41026a200a2d00003a000020102005290300370300201220092d00003a000020042004290330370348200420042903d0013703b00102402004280210220c200428020c470d00200441086a200c410110dd012004280210210c0b2004280208200c412c6c6a22032004290348370200200341136a202e3700002003410f6a20013600002003411b6a20042903b001370000200341076a200429004f370000200341236a20102903003700002003412b6a20122d00003a00002004200c41016a360210200f202b470d010c070b0b200042013702000c030b2000201736020420004101360200200041086a202c3702000c020b2000200136020420004101360200200041086a202e370200200428023421030c010b1039000b2004280230410020031b220c450d00200341226c450d00200c102c0b0240202f450d00202f41c4006c450d00202d102c0b02402004280210220c450d0020042802082103200c412c6c210c03400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b20042802084100200428020c22031b220c450d112003412c6c450d11200c102c0c110b0240202f450d00202f41c4006c450d00202d102c0b20002004290308370204200041003602002000410c6a200441106a2802003602000c100b2000201636020420004101360200200041086a201e3702002003102c0b02402020450d002020410c6c450d00201f102c0b2004280208210902402005450d002005412c6c210c2009210303400240200341046a2802002205450d00200541226c450d002003280200102c0b2003412c6a2103200c41546a220c0d000b0b200428020c2203450d002003412c6c450d002009102c0b2001411c6a2802002203450d002001280218220c450d002003410474450d00200c102c0b200141286a2802002203450d002001280224220c450d00200341146c450d00200c102c0b200141346a2802002203450d002001280230220c450d00200341186c450d00200c102c0b200141c0006a2802002203450d00200128023c220c450d002003411c6c450d00200c102c0b200141cc006a2802002203450d002001280248220c450d002003410574450d00200c102c0b200141d8006a2802002203450d002001280254220c450d00200341246c450d00200c102c0b200141e4006a2802002203450d002001280260220c450d00200341286c450d00200c102c0b200141f0006a2802002203450d00200128026c220c450d002003412c6c450d00200c102c0b200141fc006a2802002203450d002001280278220c450d00200341306c450d00200c102c0b20014188016a2802002203450d00200128028401220c450d00200341346c450d00200c102c0b20014194016a2802002203450d00200128029001220c450d00200341386c450d00200c102c0b200141a0016a2802002203450d00200128029c01220c450d002003413c6c450d00200c102c0b200141ac016a2802002203450d0020012802a801220c450d00200341ffffff1f71450d00200c102c0b200141b8016a2802002203450d0020012802b401220c450d00200341c4006c450d00200c102c0b200441d0026a24000ba20204017f017e027f037e0240024020012802082202ad42227e2203422088a70d002003a72204417f4c0d00200128020021010240024020040d00410221050c010b200410322205450d020b20002005360200200041086a22054100360200200041046a200441226e36020020004100200210e5012005280200210402402002450d00200241226c21022000280200200441226c6a21000340200141086a2901002103200141106a2901002106200141186a290100210720012901002108200041206a200141206a2f01003b0100200041186a2007370100200041106a2006370100200041086a200337010020002008370100200041226a2100200441016a2104200141226a21012002415e6a22020d000b0b200520043602000f0b103b000b1039000beb25030a7f087e257f23004180086b22052400024002400240024002400240024020020d0041002106410021070c010b200120024105746a21084100210641002107034020054200370308200542003703002005410036021820054208370310200541d0046a41186a2209200141186a290000370300200541d0046a41106a220a200141106a290000370300200541d0046a41086a220b200141086a290000370300200520012900003703d004024020070d0041c80510322207450d074100210c2007200541c0006a41e00210c908220241003b01e602200241003602e002200241e8026a200541f0046a41e00210c9081a0b200541f0046a200c2007200541d0046a108d0220052802fc04210220052802f804210d0240024020052802f0044101470d0020052802f404210e200541206a41186a2009290300220f370300200541206a41106a200a2903002210370300200541206a41086a200b2903002211370300200520052903d0042212370320200541186a2903002113200529031021142005290308211520052903002116200541f8036a41186a2217200f370300200541f8036a41106a22182010370300200541f8036a41086a22192011370300200520123703f8030240024002400240200d2f01e602221a410b490d004100211b4104211c02400240200241054f0d002002211a0c010b4105211c4105211a024002402002417b6a0e020201000b200241796a211a4101211b4106211c0c010b4100211a4101211b0b41c8051032221d450d0c201d200541c0006a41e00210c908221e41003b01e602201e41003602e002201e41e8026a200541f0046a41e00210c908211f200541c0006a41186a2220200d41e8026a2221201c41057422226a222341186a290000370300200541c0006a41106a2224202341106a290000370300200541c0006a41086a2225202341086a29000037030020054198046a41086a2226200d20226a220241106a29030037030020054198046a41106a2227200241186a2903003703002005202329000037034020052002290308370398042002280200212820022802042129201f2021202241206a22026a200d2f01e602201c417f736a2223410574222210c9081a201e200d20026a202210c9082102200d201c3b01e60220092020290300220f370300200220233b01e602200a20242903002210370300200b202529030022113703002005200529034022123703d004200541b0046a41186a222a200f370300200541b0046a41106a222b2010370300200541b0046a41086a222c2011370300200520123703b0042002200d201b1b220241e8026a221c201a410574221e41206a22236a201c201e6a221c20022f01e602201a6b41057410ca081a201c41186a2017290300370000201c41106a2018290300370000201c41086a2019290300370000201c20052903f803370000200220236a2002201e6a221c20022f01e602201a6b41057410ca081a201c41186a2013370300201c2014370310201c2015370308201c2016370300200541d8036a41086a221b202c290300370300200541d8036a41106a2222202b290300370300200541d8036a41186a221c202a290300370300200220022f01e60241016a3b01e602200520052903b0043703d803200541c0036a41086a222d2026290300370300200541c0036a41106a222e202729030037030020052005290398043703c003200541a0036a41086a222f201b290300370300200541a0036a41106a22302022290300370300200541a0036a41186a2231201c290300370300200520052903d8033703a003200d2802e00222020d014100210e0c020b200d41e8026a221c2002410574221e41206a22236a201c201e6a221c201a20026b41057410ca081a201c41186a2017290300370000201c41106a2018290300370000201c41086a2019290300370000201c20052903f803370000200d20236a200d201e6a221c200d2f01e60220026b41057410ca081a201c41186a2013370300201c2014370310201c2015370308201c2016370300200d200d2f01e60241016a3b01e6020c020b4100211c03402028213220292133201d2134200d211a2002210d201a2f01e402212320172031290300370300201820302903003703002019202f290300370300200520052903a0033703f8032027202e2903003703002026202d290300370300200520052903c00337039804200e201c470d0a024002400240200d2f01e602221c410b490d00410021354104211e024020234105490d002023211e024002402023417b6a0e020201000b202341796a2123410121354106211e0c010b41002123410121354105211e0b41f8051032221d450d0e200e41016a210e41002102201d200541c0006a41e00210c908221f41003b01e602201f41003602e002201f41e8026a200541f0046a41900310c90821362020200d41e8026a2221201e410574221a6a221c41186a2900003703002024201c41106a2900003703002025201c41086a2900003703002005201c290000370340200d201a6a221c2802002128201c28020421292022201c41186a290300370300201b201c41106a2903003703002005201c2903083703d80320362021201e41016a2237410574221c6a200d2f01e6022238201e417f736a221a410574223910c908213a201f200d201c6a203910c908211c200d201e3b01e602200541f0046a41186a221f2020290300220f370300201c201a3b01e602200541f0046a41106a223620242903002210370300200541f0046a41086a2239202529030022113703002005200529034022123703f0042009200f370300200a2010370300200b2011370300200520123703d004202420222903003703002025201b290300370300200520052903d803370340201c41c8056a200d20374102746a41c8056a2038201e6b41027410c908213702400340201c20024102746a41c8056a280200221e20023b01e402201e201c3602e00220022002201a49221e6a2202201a4b0d01201e0d000b0b20222024290300370300201b2025290300370300202c200b290300220f370300202b200a2903002210370300202a20092903002211370300200520052903403703d803200520052903d00422123703b004201f2011370300203620103703002039200f370300200520123703f004202420222903003703002025201b290300370300200520052903d8033703402035450d01202341027420376a41086a2037202341016a22024102746a221a201c2f01e60220236b41027410ca081a201a2034360200203a2002410574221e6a203a202341057422216a221a201c2f01e60220236b41057410ca081a201a41186a2017290300370000201a41106a2018290300370000201a41086a2019290300370000201a20052903f803370000201c201e6a201c20216a221a201c2f01e60220236b41057410ca081a201a2033360204201a2032360200201a200529039804370308201a41106a2026290300370300201a41186a2027290300370300201c201c2f01e60241016a221a3b01e6022002201a41ffff0371221a4b0d020340201c20024102746a41c8056a280200221e20023b01e402201e201c3602e00220022002201a496a221e201a4b0d032002201a4f2123201e21022023450d000c030b0b2023410274200d41c8056a221a6a41086a201a202341016a22024102746a221a201c20236b221e41027410ca081a201a2034360200200d41e8026a221c2002410574221a6a201c202341057422246a221c201e410574221e10ca081a201c41186a2017290300370000201c41106a2018290300370000201c41086a2019290300370000201c20052903f803370000200d201a6a200d20246a221c201e10ca081a201c2033360204201c2032360200201c200529039804370308201c41106a2026290300370300201c41186a2027290300370300200d200d2f01e60241016a221c3b01e6022023201c41ffff0371221c4f0d040340200d20024102746a41c8056a280200221a20023b01e402201a200d3602e00220022002201c496a221a201c4b0d052002201c4f211e201a2102201e450d000c050b0b2023410274200d41c8056a221c6a41086a201c202341016a22024102746a221c200d2f01e60220236b41027410ca081a201c203436020020212002410574221a6a20212023410574221e6a221c200d2f01e60220236b41057410ca081a201c41186a2017290300370000201c41106a2018290300370000201c41086a2019290300370000201c20052903f803370000200d201a6a200d201e6a221c200d2f01e60220236b41057410ca081a201c2033360204201c2032360200201c200529039804370308201c41106a2026290300370300201c41186a2027290300370300200d200d2f01e60241016a221c3b01e6022002201c41ffff0371221c4b0d000340200d20024102746a41c8056a280200221a20023b01e402201a200d3602e00220022002201c49221a6a2202201c4b0d01201a0d000b0b202e2024290300370300202d2025290300370300202f2039290300370300203020362903003703002031201f290300370300200520052903403703c003200520052903f0043703a003200e211c200d2802e00222020d000b0b2022202e290300370300201b202d290300220f370300202c202f290300370300202b2030290300370300202a2031290300370300200520052903c00322103703d803200520052903a0033703b0042019200f37030020182022290300370300200520103703f803200b202c290300370300200a202b2903003703002009202a290300370300200520052903b0043703d0042007450d0741f80510322202450d092002200541c0006a41e00210c908220241003b01e602200241003602e002200241e8026a200541f0046a41900310c9081a200220073602c805200741003b01e402200720023602e002200541f0046a41186a221e2009290300370300200541f0046a41106a220d200a290300370300200541f0046a41086a2223200b290300370300200520052903d0043703f0042024201829030037030020252019290300370300200520052903f803370340200c200e470d0620022f01e602221c410a4b0d05200c41016a210c2002201c41016a221a3b01e6022002201c4105746a221c2029360204201c2028360200201c2005290340370308201c41e8026a20052903f004370000201c41f0026a2023290300370000201c41f8026a200d290300370000201c4180036a201e290300370000201c41106a2025290300370300201c41186a20242903003703002002201a4102746a41c8056a201d360200201d201a3b01e402201d20023602e002200221070b2005410036028005200641016a21060c010b200d20024105746a2202290310210f2002200529031037031020022903082110200220052903083703082002290300211120022005290300370300200241186a220229030021122002200541186a290300370300200541f0046a41186a20123703002005200f37038005200520103703f804200520113703f004200fa7221c450d00200528028405220241306c203b20021b213b201c410020021b2202450d00203b450d002002102c0b200141206a22012008470d000b0b024002402004450d0020032004412c6c6a211f03400240200328020841306c2202450d002003280200221b20026a21222003410c6a211a201b211c0340024002402007450d00200541f0046a200c2007201c108d0220052802f0044101470d01201c211b0b201b41086a290000210f201b41106a2900002110201b2900002111200041196a201b41186a290000370000200041116a2010370000200041096a200f37000020002011370001200041013a0000200520063602482005200c36024420052007360240200541f0046a200541c0006a10fe01200541f0046a10ff010c050b20052802f80420052802fc044105746a2202427f2002290300220f201c41206a221e2903007c22102010200f54220d200241086a2223290300220f201c41286a22242903007c200dad7c2210200f542010200f511b220d1b3703002023427f2010200d1b370300200541f0046a41186a201a41186a290000220f370300200541f0046a41106a201a41106a2900002210370300200541f0046a41086a201a41086a29000022113703002005201a29000022123703f00420242903002113201e2903002114200541c0006a41186a2224200f370300200541c0006a41106a22252010370300200541c0006a41086a220e201137030020052012370340200241186a211e200241106a212302402002280218220d200241146a280200470d002023200d410110e001201e280200210d0b2023280200200d41306c6a2202200529034037030020022014370320200241186a2024290300370300200241106a2025290300370300200241086a200e290300370300200241286a2013370300201e201e28020041016a360200201c41306a221c2022470d000b0b2003412c6a2203201f470d000b0b200041003a00002000410c6a2006360200200041086a200c360200200041046a20073602000b20054180086a24000f0b41e0cec80041204180cfc800103c000b419ecec800413041d0cec800103c000b41ecd0c800412b41bcd2c800103c000b41a5d0c800413541dcd0c800103c000b1039000be50706047f017e017f067e027f047e230041c0006b2202240002400240200128020022030d004100210341002104410021010c010b20012802042205ad4220862106200321040240034020032f01e60221072005450d0120064280808080707c21062005417f6a2105200320074102746a41c8056a280200210320042802c80521040c000b0b200128020821010b200241346a2007360200200241306a2003360200200220013602382002200637032820022004360224200220053602200240024020010d00427f2108420021094200210a4200210b4200210c427f210d0c010b20022001417f6a220e360238200241206a410020041b220128020021040240024020012802082207200128020422032f01e6024f0d00200321050c010b0340024020032802e00222050d00410021050c020b200441016a210420032f01e402210720052103200720052f01e6024f0d000b0b200741016a210f0240024020040d00200521030c010b2005200f4102746a41c8056a280200210302402004417f6a2204450d00034020032802c80521032004417f6a22040d000b0b4100210f0b20012003360204200141003602002001200f360208200520074105746a2103427f2108427f210d4200210b4200210c420021094200210a03402002200341086a2903002206420020032903002210420010ce08200241106a201042002010420010ce08427f200a427f200241106a41086a29030022112002290300221220127c7c22122006200229030822138420138442005220122011547222031b7c2009427f200229031020031b7c22112009542203ad7c220920032009200a542009200a511b22031b210a427f201120031b21092006200d20102008542006200d542006200d511b22031b210d2010200820031b2108427f200c20067c200b20107c2210200b542203ad7c220620032006200c542006200c511b22031b210c427f201020031b210b200e450d012002200e417f6a220e360238200241206a410020022802241b220128020021040240024020012802082207200128020422032f01e6024f0d00200321050c010b0340024020032802e00222050d00410021050c020b200441016a210420032f01e402210720052103200720052f01e6024f0d000b0b200741016a210f0240024020040d00200521030c010b2005200f4102746a41c8056a280200210302402004417f6a2204450d00034020032802c80521032004417f6a22040d000b0b4100210f0b20012003360204200141003602002001200f360208200520074105746a21030c000b0b200020093703202000200b37031020002008370300200041286a200a370300200041186a200c3703002000200d370308200241c0006a24000ba70101047f0240200128020022020d0020004100360204200041106a4100360200200041003602180f0b2001280204210320012802082104200221010240034020022f01e60221052003450d012003417f6a2103200220054102746a41c8056a280200210220012802c80521010c000b0b2000200336020c200041003602082000200136020420002003360200200041146a2005360200200041106a2002360200200020043602180b8e0101037f230041c0006b220124002001200010c1070240200141306a2802002202450d000340024020012802342203450d00200341306c450d002002102c0b2001200010c107200128023022020d000b0b024020002802042202450d0020022802e00221032002102c2003450d00034020032802e00221022003102c2002210320020d000b0b200141c0006a24000bc00101037f230041106b2202240041012103200128021841fc9dc00041012001411c6a28020028020c1100002104200241003a0005200220043a0004200220013602002002200036020c20022002410c6a41ecedc600106721012002200041106a36020c20012002410c6a41ecedc600106721012002200041206a36020c20012002410c6a41ecedc60010671a024020022d00040d0020022802002200280218419a92c10041012000411c6a28020028020c11000021030b200241106a240020030bd60f01077f230041c0006b220224000240024041c20310322203450d0020002003360200200041046a220442c20337020020004100410210c8012000280200200041086a220528020022036a41003b00002005200341026a22033602002004280200210402400240200128020022012903684202520d00024020032004470d0020002003410110c801200041086a28020021030b200028020020036a41043a0000200041086a2203200328020041016a3602000c010b024020032004470d0020002003410110c801200041086a28020021030b200141e8006a2106200028020020036a4184013a0000200041086a2203200328020041016a2204360200200020044120102f200028020020032802006a22042001290000370000200441186a200141186a290000370000200441106a200141106a290000370000200441086a200141086a2900003700002003200328020041206a2205360200200141206a2104024002400240024020012d00200e03000102030b200020054101102f200028020020032802006a41003a00002003200328020041016a22053602002000200541c000102f200028020020032802006a22052004290001370000200541386a200441396a290000370000200541306a200441316a290000370000200541286a200441296a290000370000200541206a200441216a290000370000200541186a200441196a290000370000200541106a200441116a290000370000200541086a200441096a2900003700002003200328020041c0006a3602000c020b200020054101102f200028020020032802006a41013a00002003200328020041016a22053602002000200541c000102f200028020020032802006a22052004290001370000200541386a200441396a290000370000200541306a200441316a290000370000200541286a200441296a290000370000200541206a200441216a290000370000200541186a200441196a290000370000200541106a200441116a290000370000200541086a200441096a2900003700002003200328020041c0006a3602000c010b200020054101102f200028020020032802006a41023a00002003200328020041016a22053602002000200541c100102f200028020020032802006a200441016a41c10010c9081a2003200328020041c1006a3602000b2006200010b5030b20014198016a200010b403200041086a2802002101410410322203450d002002420437020420022003360200024002400240024041012001417e6a220120014101461b410020011b220341c000490d00200341808001490d012003418080808004490d02200241004101102f2002280200200228020822016a41033a00002002200141016a2201360208200220014104102f20022802002201200228020822046a2003360000200441046a21030c030b200241004101102f20022802002201200228020822046a20034102743a0000200441016a21030c020b200241004102102f20022802002201200228020822046a20034102744101723b0000200441026a21030c010b200241004104102f20022802002201200228020822046a2003410274410272360000200441046a21030b20022003360208200041086a2205280200220641014d0d01200241286a200120036a2204360200200220003602204100210320054100360200200241023602102002411c6a2000280200220541026a22073602002002200136022420022006417e6a220636021420022007360218200241246a21070240024002402006450d00034020012004460d032002200141016a360224200520036a20012d00003a00002000200028020841016a36020820034101460d02200341016a210320022802242101200228022821040c000b0b2000200710be070c010b024020022802282205200228022422016b2203450d002002280220220420022802142206200228021022006a200310c80120042802002208200020036a22036a200820006a200610ca081a20022003360210200428020822062003460d00200620016a417f73200520006a6a2103200428020020066a2100034020012005460d022002200141016a360224200020012d00003a00002004200428020841016a3602082003450d01200041016a21002003417f6a210320022802242101200228022821050c000b0b2002410036023820024201370330200241306a200710be072002280234210620022802302107024020022802382201450d0020022802202203200228021420022802106a200110c801200328020022042002280210220020016a22036a200420006a200228021410ca081a200220033602102002280220220428020822082003460d00200820006b2105200428020020086a21032007210003402001450d01200320002d00003a00002004200428020841016a360208200041016a2100200341016a210320052001417f6a2201470d000b0b2006450d002007102c0b02402002280218200228021c2201460d00200220013602180b2002411c6a2802002103200228021821010240034020032001460d012002200141016a22013602180c000b0b024020022802142201450d000240200228021022042002280220220541086a22002802002203460d002005280200220520036a200520046a200110ca081a200228021421010b2000200120036a3602000b024020022802004100200228020422011b2203450d002001450d002003102c0b200241c0006a24000f0b1039000b4102200641d089c500104f000b850103027f017e027f230041106b22012400024002400240200035020842208620002802002202ad84101c2203428080808010540d00410021042003a722052d00000e020201000b41f2b3c800412e200141086a41a0b4c80041b0b4c8001040000b410121040b2005102c0240200041046a280200450d002002102c0b200141106a240020040bcb0e01057f02400240024002400240024002400240024002400240024020002802000e1800010b0b0b02030b0405060b0b0b070b0b0b0b0b0b0b08090a0b024002400240024002400240200041086a280200417e6a0e080010010210030405100b200041106a2802002201450d0f2000410c6a2802002200450d0f2001450d0f2000102c0f0b200041106a2802002201450d0e2000410c6a2802002200450d0e2001450d0e2000102c0f0b200041106a2802002201450d0d2000410c6a2802002200450d0d2001450d0d2000102c0f0b2000410c6a10c1020f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041106a2802002201450d0b200028020c2200450d0b2001410c6c450d0b2000102c0f0b200041106a2802002201450d0a2000410c6a2802002200450d0a2001450d0a2000102c0f0b02400240200041086a2802000e020b00010b2000412c6a102b2000419c016a102b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0a20002802102200450d0a2001410c6c450d0a2000102c0f0b2000412c6a102b2000419c016a102b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0920002802102200450d092001410c6c450d092000102c0f0b02402000410c6a2802002201450d00200141f0006c2102200028020441046a210103402001102b200141f0006a2101200241907f6a22020d000b0b200041086a2802002201450d0820002802042200450d08200141f0006c450d082000102c0f0b02400240024002400240200041086a2d00000e180c0c0c0c0c0c000c0c0c0c0c0c0c0c010c0c020c0c0c0c03040b200041106a2802002201450d0b2000410c6a2802002200450d0b200141ffffff3f71450d0b2000102c0f0b200041106a2802002201450d0a2000410c6a2802002200450d0a200141ffffff3f71450d0a2000102c0f0b200041146a2802002201450d09200041106a2802002200450d09200141ffffffff0371450d092000102c0f0b0240200041106a2802002201450d002000410c6a2802002202450d00200141ffffffff0771450d002002102c0b200041186a10e9010f0b0240200041106a2802002201450d002000410c6a2802002202450d00200141ffffffff0771450d002002102c0b200041186a10e9010f0b20002802042201450d06200041086a280200450d062001102c0f0b02400240200041086a280200417f6a0e020001070b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0620002802102200450d062001410c6c450d062000102c0f0b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0520002802102200450d052001410c6c450d052000102c0f0b02402000410c6a2802002201450d00200041086a2802002202450d002001450d002002102c0b02402000411c6a2802002202450d00200041146a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041186a2802002201450d0420002802142200450d042001410c6c450d042000102c0f0b02402000410c6a2802002202450d0020002802042201200241d0006c6a21030340200141046a41003602002001280200210420014101360200200141086a2802002202200520021b210502402002450d002005450d002004102c0b200141d0006a22012003470d000b0b0240200041086a2802002201450d0020002802042202450d00200141d0006c450d002002102c0b200041106a10c2020f0b20002802044101470d020240200041106a2802002201450d002000410c6a2802002202450d002001450d002002102c0b2000411c6a2802002201450d02200041186a2802002200450d022001450d022000102c0f0b02400240200041086a280200417f6a0e03000301030b0240200041146a2802002201450d00200041106a2802002202450d002001450d002002102c0b200041206a2802002201450d022000411c6a2802002200450d022001450d022000102c0c020b200041106a10c5020f0b024002400240200041086a2d00000e0403000103020b2000410c6a22012802001083022001280200102c0f0b2000410c6a22012802001083022001280200102c0f0b2000412c6a22012802001083022001280200102c0f0b0bc60601057f230041106b220224000240024002400240024002400240024020012d00000e06010402030500010b20004201370200200041086a22034100360200200041004101102f200028020020032802006a41003a00002003200328020041016a360200200141046a2802002001410c6a280200200010bb010c050b20004201370200200041086a22034100360200200041004101102f200028020020032802006a41023a00002003200328020041016a360200412010322204450d052002422037020420022004360200200241004120102f20022802002205200228020822066a22042001290001370000200441086a200141096a290000370000200441106a200141116a290000370000200441186a200141196a2900003700002002200641206a2201360208200020032802002001102f200028020020032802006a2005200110c9081a2003200328020020016a3602002002280204450d042005102c0c040b20004201370200200041086a22034100360200200041004101102f200028020020032802006a41043a00002003200328020041016a2204360200200020044104102f200028020020032802006a20012800013600002003200328020041046a360200200141086a280200200141106a280200200010bb010c030b20004201370200200041086a22034100360200200041004101102f200028020020032802006a41053a00002003200328020041016a2204360200200020044104102f200028020020032802006a20012800013600002003200328020041046a360200200141086a280200200141106a280200200010bb010c020b20004201370200200041086a22034100360200200041004101102f200028020020032802006a41063a00002003200328020041016a2204360200200020044104102f200028020020032802006a20012800013600002003200328020041046a360200200141086a280200200141106a280200200010bb010c010b20004201370200200041086a22034100360200200041004101102f200028020020032802006a41073a00002003200328020041016a2204360200200020044101102f200028020020032802006a41003a00002003200328020041016a3602002000200141046a1085020b200241106a24000f0b1039000bc20101037f200128020021022000200041086a22032802004101102f200028020020032802006a21040240024020024101460d00200441003a0000200328020041016a21030c010b200441013a00002003200328020041016a220236020020012802042104200020024104102f200028020020032802006a20043600002003200328020041046a2202360200200141086a2802002101200020024104102f200028020020032802006a2001360000200328020041046a21030b200041086a20033602000bbf0e05037f017e0a7f017e037f230041e0016b22022400200241186a20011087020240024020022802180d000240200228021c2203200128020441246e2204200420034b1bad42247e2205422088a70d002005a72204417f4c0d0002400240024020040d00410421060c010b200410322206450d010b4100210720024100360228200220063602202002200441246e36022402402003450d00200241dd006a2108200241ab016a220941056a210a4100210b0340024002402001280204220c450d002001280200220d2d000021042001200c417f6a220e3602042001200d41016a3602000240024002400240024002400240024020040e080508000802030104080b41002104200241003a00b801200c417e6a210c02400340200e2004460d0120024198016a20046a200d20046a220f41016a2d00003a00002001200c3602042001200f41026a3602002002200441016a220f3a00b801200c417f6a210c200f2104200f4120460d080c000b0b200441ff0171450d07200241003a00b8010c070b20024198016a200110880220022d0098014101460d06200228009901210c200241106a200110870220022802100d062001280204220d20022802142204490d062004417f4c0d0b0240024020040d004101210f0c010b20041037220f450d0b2001280204210d0b02400240200d2004490d00200f2001280200200410c908210d2001280204220e20044f0d012004200e4194afc0001058000b2004450d072004450d07200f102c0c070b2001200e20046b3602042001200128020020046a360200200d450d062004ad22054220862005842210428080808070832105200c41187621042010a7210d4101210e0c070b20024198016a200110880220022d0098014101460d05200228009901210c2002200110870220022802000d052001280204220d20022802042204490d052004417f4c0d0a0240024020040d004101210f0c010b20041037220f450d0a2001280204210d0b02400240200d2004490d00200f2001280200200410c908210d2001280204220e20044f0d012004200e4194afc0001058000b2004450d062004450d06200f102c0c060b2001200e20046b3602042001200128020020046a360200200d450d052004ad22054220862005842210428080808070832105200c41187621042010a7210d4102210e0c060b20024198016a200110880220022d0098014101460d04200228009901210c200241086a200110870220022802080d042001280204220d200228020c2204490d042004417f4c0d090240024020040d004101210f0c010b20041037220f450d092001280204210d0b02400240200d2004490d00200f2001280200200410c908210d2001280204220e20044f0d012004200e4194afc0001058000b2004450d052004450d05200f102c0c050b2001200e20046b3602042001200128020020046a360200200d450d042004ad22054220862005842210428080808070832105200c41187621042010a7210d4103210e0c050b200e450d03200d2d000121042001200c417e6a3602042001200d41026a36020020040d03200241d0016a200110890220022802d00122044102460d03200241d0006a41086a20024198016a41086a290200370300200220022902980137035020022802d801210d20022802d401210f4104210e42002105410021110c010b200241d0016a2001108a0220022802d0012204450d0220022802d801210d20022802d401210f200241d0006a41086a20024198016a41086a2902003703002002200229029801370350200441087621114105210e420021050b0c020b200220092900003703d0012002200a2900003700d501200220022903d0013703c001200220022900d5013700c501200f41ff0171411f4d0d0020022f01980120022d009a0141107472210c200228009b012104200228009f01210f20022900a3012110200220022900c50137008d01200220022903c001370388012002200229008d0137007d2002200229038801370378200220022903783703682002200229007d37006d2002200229006d37005520022002290368370350200820022f00653b0000200841026a200241e5006a41026a2d00003a00002010428080808070832105200441087621112010a7210d4100210e0c010b200241206a102b0c050b200b41016a210b200241c0006a41086a200241d0006a41086a2903002210370300200241306a41086a22122010370300200220022903502210370340200220103703302011410874200441ff01717221132005200dad842105024020072002280224470d00200241206a2007410110f20120022802282107200228022021060b2006200741246c6a2204200537000c2004200f360008200420133600042004200c3b00012004200e3a0000200441036a200c4110763a0000200420022903303700142004411c6a20122903003700002002200741016a2207360228200b2003470d000b200228022021060b2006450d0220002002290224370204200020063602000c030b1039000b103b000b200041003602000b200241e0016a24000bcf0201067f0240024020012802042202450d00200128020022032d0000210420012002417f6a2205360204410121062001200341016a3602000240200441037122074103460d0002400240024020070e03000102000b20044102762107410021060c040b41012106024020050d000c040b20032d0001210520012002417e6a3602042001200341026a3602002005410874200472220141ffff0371418002490d03200141fcff03714102762107410021060c030b20054103490d01200341036a2d0000210620032f0001210720012002417c6a3602042001200341046a3602002007200641107472410874200472220141808004492106200141027621070c020b0240200441034d0d000c020b20054104490d012003280001210720012002417b6a3602042001200341056a36020020074180808080044921060c010b410121060b20002007360204200020063602000ba80201057f230041106b220241003a000c02400240024020012802042203450d00200128020022042d0000210520012003417f6a2206360204200241013a000c2001200441016a360200200220053a000820060d01200041013a00000c020b200041013a00000f0b200128020022042d0000210520012003417e6a22063602042001200441016a360200200241023a000c200220053a0009024002402006450d00200128020022042d0000210520012003417d6a22063602042001200441016a360200200241033a000c200220053a000a2006450d01200041003a0000200128020022042d0000210520012003417c6a3602042001200441016a360200200220053a000b200020022802083600010f0b200041013a00000c010b200041013a00000b200241003a000c0bc40101047f024002400240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a36020020040e020203010b200041023602000f0b200041023602000f0b200041003602000f0b024020054104490d002003280001210520012002417b6a22043602042001200341056a36020020044104490d002000200536020420004101360200200328000521042001200241776a3602042001200341096a360200200041086a20043602000f0b200041023602000b840202047f017e230041106b22022400200241086a2001108702024002402002280208450d00200041003602000c010b024020012802042203200228020c2204490d00024002402004417f4c0d000240024020040d00410121050c010b200410372205450d02200128020421030b0240024020032004490d0020052001280200200410c90821032001280204220520044f0d01200420054194afc0001058000b2005410020041b2201450d032004450d032001102c0c030b2001200520046b3602042001200128020020046a3602002003450d0220002004ad2206422086200684370204200020033602000c030b103b000b1039000b200041003602000b200241106a24000bfd0201027f02402000280200220220012802002203460d00417f410120022003491b0f0b02400240024002400240024020020d000240200041086a2802002202200141086a2802002203460d00417f410120022003491b0f0b410021032002417f6a0e0405030201040b0240200028020420012802042001410c6a28020022012000410c6a2802002200200020014b1b10cc082202450d00417f410120024100481b0f0b417f200020014720002001491b21030c030b200041106a200141106a108c02220341ff01710d02200041c8006a200141c8006a108c02220341ff01710d0220004180016a20014180016a108c02220341ff01710d02200041b8016a200141b8016a108c020f0b200041106a200141106a108c02220341ff01710d01200041c8006a200141c8006a108c02220341ff01710d0120004180016a20014180016a108c020f0b200041106a200141106a108c02220341ff01710d00200041c8006a200141c8006a108c020f0b20030f0b200041106a200141106a108c020b8d0603027f047e017f024020002d0000220220012d00002203460d00417f410120022003491b0f0b41002103024002400240024002400240024002402002417f6a0e0707050403020100060b0240200041046a280200200141046a2802002001410c6a28020022012000410c6a2802002200200020014b1b10cc082202450d00417f410120024100481b0f0b417f200020014720002001491b21030c050b417f200041086a2903002204200141086a290300220585200041106a2903002206200141106a290300220785844200522004200554200620075420062007511b1b0f0b417f20002d0001220020012d000122014720002001491b0f0b0240200041186a2802002202200141186a2802002203460d00417f410120022003491b0f0b024020024101470d0002402000411c6a2802002001411c6a280200200141246a2802002202200041246a2802002208200820024b1b10cc082203450d00417f410120034100481b0f0b41ff01210320082002490d03200820024722030d030b41002103200041016a200141016a411410cc082200450d02417f410120004100481b0f0b0240200041046a2802002202200141046a2802002203460d00417f410120022003491b0f0b024020024101470d000240200041086a280200200141086a280200200141106a2802002202200041106a2802002208200820024b1b10cc082203450d00417f410120034100481b0f0b41ff01210320082002490d02200820024722030d020b417f200041186a2903002206200141186a29030022075220062007541b0f0b0240200041246a2802002202200141246a2802002203460d00417f410120022003491b0f0b024020024101470d000240200041286a280200200141286a280200200141306a2802002202200041306a2802002208200820024b1b10cc082203450d00417f410120034100481b0f0b41ff01210320082002490d01200820024722030d010b41002103200041016a200141016a412010cc082200450d00417f410120004100481b0f0b20030f0b417f200041046a2802002200200141046a28020022014720002001491b0bb50101047f02400340200241e8026a210420022f01e60221054100210602400240034020052006460d0120032004412010cc082207450d02200441206a2104200641016a21062007417f4a0d000b2006417f6a21050b2001450d022001417f6a2101200220054102746a41c8056a28020021020c010b0b20002001360204200041003602002000410c6a2006360200200041086a20023602000f0b200042013702002000410c6a2005360200200041086a20023602000bbd0101047f0240034020022f018e182104410021052002210602400240034020042005460d01200541016a210520032006108f02210720064198026a21060240200741187441187541016a0e03000301000b0b2005417f6a21040b2001450d022001417f6a2101200220044102746a4190186a28020021020c010b0b20002001360204200041003602002000410c6a2005417f6a360200200041086a20023602000f0b200042013702002000410c6a2004360200200041086a20023602000bfe0202027f047e024020002001108b02220241ff01710d00024020002d00f001220320012d00f0012202460d00417f410120032002491b0f0b410021020240024002400240024002402003417f6a0e06000504030201060b417f200041f8016a2903002204200141f8016a29030022058520004180026a290300220620014180026a290300220785844200522004200554200620075420062007511b1b21020c050b0240200041f4016a280200200141f4016a280200200141fc016a2802002201200041fc016a2802002200200020014b1b10cc082202450d00417f410120024100481b0f0b417f200020014720002001491b0f0b200041f1016a200141f1016a412010cc082200450d03417f410120004100481b0f0b200041f1016a200141f1016a411010cc082200450d02417f410120004100481b0f0b200041f1016a200141f1016a410810cc082200450d01417f410120004100481b0f0b200041f1016a200141f1016a410410cc082200450d00417f410120004100481b0f0b20020bb30101047f02400340200241346a210420022f013221054100210602400240034020052006460d0120032004412010cc082207450d02200441206a2104200641016a21062007417f4a0d000b2006417f6a21050b2001450d022001417f6a2101200220054102746a4194036a28020021020c010b0b20002001360204200041003602002000410c6a2006360200200041086a20023602000f0b200042013702002000410c6a2005360200200041086a20023602000bb50101047f024003402002418c016a210420022f018a0121054100210602400240034020052006460d0120032004410810cc082207450d02200441086a2104200641016a21062007417f4a0d000b2006417f6a21050b2001450d022001417f6a2101200220054102746a41e4016a28020021020c010b0b20002001360204200041003602002000410c6a2006360200200041086a20023602000f0b200042013702002000410c6a2005360200200041086a20023602000b891304067f017e0f7f047e230041a0036b22012400200141386a22024200370300200141206a41106a22034200370300200141206a41086a420037030020014200370320200141206a41eddcc700410810c501200141c0026a41f1cbc000411010c5012002200141c0026a41086a290000370300200320012900c002370300200141203602442001200141206a360240200141c8006a200141206a412010b30102400240200128024822040d00410021020c010b200128024c21052001200141c8006a41086a28020036025c20012004360258200141186a200141d8006a1087020240024020012802180d0002400240024002400240200128021c2206200128025c411c6e2202200220064b1bad421c7e2207422088a70d002007a72203417f4c0d000240024020030d00410421020c010b200310322202450d020b200141003602682001200236026020012003411c6e36026402402006450d00200141c0026a41c4006a21034100210802400240024002400340200141106a200141d8006a10870220012802100d0a20012802142209200128025c41e0006e2202200220094b1bad42e0007e2207422088a70d062007a72202417f4c0d060240024020020d004108210a0c010b20021032220a450d080b200141003602782001200a3602702001200241e0006e36027402400240024002402009450d00410021020340200141c0026a200141d8006a10930220014180026a41386a220b200141c0026a41386a29030037030020014180026a41306a220c200141c0026a41306a29030037030020014180026a41286a220d200141c0026a41286a29030037030020014180026a41206a220e200141c0026a41206a29030037030020014180026a41186a220f200141c0026a41186a29030037030020014180026a41106a2210200141c0026a41106a29030037030020014180026a41086a2211200141c0026a41086a290300370300200141e0016a41086a2212200341086a290200370300200141e0016a41106a2213200341106a290200370300200141e0016a41186a2214200341186a280200360200200120012903c00237038002200120032902003703e0012001280280032215450d02200141a0016a41386a2216200b290300370300200141a0016a41306a220b200c290300370300200141a0016a41286a220c200d290300370300200141a0016a41206a220d200e290300370300200141a0016a41186a220e200f290300370300200141a0016a41106a220f2010290300370300200141a0016a41086a2210201129030037030020014180016a41086a2211201229030037030020014180016a41106a2212201329030037030020014180016a41186a2213201428020036020020012001290380023703a001200120012903e00137038001024020022001280274470d00200141f0006a20024101109402200128027821022001280270210a0b200a200241e0006c6a220220012903a001370300200241106a200f290300370300200241086a2010290300370300200b290300210720162903002117200c2903002118200d2903002119200e290300211a200241c0006a2015360200200241186a201a370300200241206a2019370300200241286a2018370300200241c4006a200129038001370200200241386a2017370300200241306a2007370300200241cc006a2011290300370200200241d4006a2012290300370200200241dc006a20132802003602002001200128027841016a22023602782009417f6a22090d000b2001280270210a0b200a450d0d20012902742107200141086a200141d8006a10870220012802080d05200128020c220b200128025c41027622022002200b4b1b22024102742209417f4c0d0920020d014104210e0c020b2001280270210b2002450d0b200241e0006c2103200b41d4006a21020c0a0b20091032220e450d080b200141003602c802200120023602c4022001200e3602c0020240200b450d00410021020340200128025c220c4104490d032001280258220d28000021092001200c417c6a36025c2001200d41046a3602582009418094ebdc034b0d030240200220012802c402470d00200141c0026a2002410110950220012802c802210220012802c002210e0b200e20024102746a20093602002001200241016a22023602c802200b417f6a220b0d000b20012802c002210e0b200e450d0220012902c4022117200128025c22024104490d03200841016a210820012802582209280000210c20012002417c6a36025c2001200941046a36025802402001280268220b2001280264470d00200141e0006a200b1096022001280268210b0b20012802602202200b411c6c6a2209200c360218200920073702042009200a360200200941106a20173702002009410c6a200e3602002001200b41016a36026820082006470d000b200129026421070c0b0b20012802c40241ffffffff0371450d0020012802c002102c0b02402007422088a72202450d00200241e0006c2103200a41d4006a210203400240200241706a2802002209450d00200941306c450d002002416c6a280200102c0b0240200228020041ffffff3f71450d002002417c6a280200102c0b200241e0006a2102200341a07f6a22030d000b0b2007a72202450d07200241e0006c0d010c070b02402017a72202450d00200241ffffffff0371450d00200e102c0b02402007422088a72202450d00200241e0006c2103200a41d4006a210203400240200241706a2802002209450d00200941306c450d002002416c6a280200102c0b0240200228020041ffffff3f71450d002002417c6a280200102c0b200241e0006a2102200341a07f6a22030d000b0b2007a72202450d06200241e0006c450d060b200a102c0c050b2001290264210720020d060c050b103b000b1039000b03400240200241706a2802002209450d00200941306c450d002002416c6a280200102c0b0240200228020041ffffff3f71450d002002417c6a280200102c0b200241e0006a2102200341a07f6a22030d000b0b20012802742202450d00200241e0006c450d00200b102c0b200141e0006a1097020b41002102200141003602880220014201370380022001410f3602a4012001200141c0006a3602a001200120014180026a3602e001200141d4026a4101360200200142013702c402200141b4bcc3003602c0022001200141a0016a3602d002200141e0016a41dcb7c000200141c0026a103e1a200135028802422086200135028002841000200128028402450d00200128028002102c0b2005450d002004102c0b0240024020020d0020004100360208200042043702000c010b20002007370204200020023602000b200141a0036a24000b9c0803097f087e037f23004180036b2202240041002103200241003a0090022001280204417f6a2104024002400240024003402004417f460d01200241f0016a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a0090022004417f6a21042005210320054120470d000b200241c0026a41086a2204200241f0016a41086a290300370300200241c0026a41106a2203200241f0016a41106a290300370300200241c0026a41186a2206200241f0016a41186a290300370300200220022903f0013703c002200541ff0171411f4b0d010c020b200341ff0171450d01200241003a0090020c010b200241d0016a41086a2004290300370300200241d0016a41106a2003290300370300200241d0016a41186a2006290300370300200220022903c0023703d001200241f0016a200110f6032002280290022203450d0020024190016a41186a2206200241d0016a41186a29030037030020024190016a41106a2207200241d0016a41106a29030037030020024190016a41086a2204200241d0016a41086a29030037030020024190016a41286a2208200241f0016a41086a29030037030020024190016a41306a2209200241f0016a41106a29030037030020024190016a41386a220a200241f0016a41186a290300370300200220022903d00137039001200220022903f0013703b00120024194026a2802002105200241f0016a41286a290300210b200241d0006a41086a2004290300220c370300200241d0006a41106a2007290300220d370300200241d0006a41186a2006290300220e370300200241d0006a41206a20022903b001220f370300200241d0006a41286a20082903002210370300200241d0006a41306a20092903002211370300200241d0006a41386a2206200a29030037030020022002290390012212370350200241106a41306a22072011370300200241106a41286a22082010370300200241106a41206a2209200f370300200241106a41186a220a200e370300200241106a41106a2213200d370300200241106a41086a2214200c370300200241106a41386a221520062903003703002002201237031020024190016a200110ca030240200228029001450d00200241086a220120042802003602002002200229039001370300200041386a2015290300370300200041306a2007290300370300200041286a2008290300370300200041206a2009290300370300200041186a200a290300370300200041106a2013290300370300200041086a201429030037030020002002290310370300200041c8006a200b3703002000200536024420002003360240200041d0006a2002290300370300200041d8006a20012802003602000c020b200041003602402005450d01200541306c450d012003102c0c010b200041003602400b20024180036a24000bd90103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42e0007e2204422088a722020d022004a722014100480d022002454103742105024002400240024002402000280200410020031b22020d002001450d010c030b200341e0006c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141e0006e3602000b0f0b2005450d001039000b103b000bd80101027f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1b220141ffffffff037122042001470d02200141027422024100480d0220042001464102742104024002400240024002402000280200410020031b22010d002002450d010c030b200341027422030d0120020d020b200421010c020b200120032002103522010d010c030b200210322201450d020b20002001360200200041046a20024102763602000b0f0b2004450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad421c7e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b2001411c6c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a2002411c6e3602000b0f0b2005450d001039000b103b000b950201067f024020002802082201450d00200028020022022001411c6c6a21030340024020022802082201450d00200141e0006c2104200228020041d4006a210103400240200141706a2802002205450d002001416c6a2802002206450d00200541306c450d002006102c0b024020012802002205450d002001417c6a2802002206450d002005410574450d002006102c0b200141e0006a2101200441a07f6a22040d000b0b024020022802042201450d00200141e0006c450d002002280200102c0b2002411c6a21010240200241106a28020041ffffffff0371450d00200228020c102c0b2001210220012003470d000b0b024020002802042201450d0020002802002204450d002001411c6c450d002004102c0b0bbd0101047f230041106b22022400200028020421032000280200210041012104200128021841fc9dc00041012001411c6a28020028020c1100002105200241003a0005200220053a00042002200136020002402003450d0003402002200036020c20022002410c6a41dcedc60010671a200041016a21002003417f6a22030d000b20022d000421050b0240200541ff01710d0020022802002200280218419a92c10041012000411c6a28020028020c11000021040b200241106a240020040b3400200041eddcc70036020420004100360200200041146a4104360200200041106a4184ccc000360200200041086a42083702000b2901017f230041106b22022400200241003602082002420137030020002002109b02200241106a24000ba80301047f024002402001280208220241046a2203417f4c0d002001280200210102400240024002400240024020030d002000200336020420004101360200200041086a220341003602000c010b200310322204450d062000200336020420002004360200200041086a22034100360200200241c000490d01200241808001490d022002418080808004490d030b200041004101102f2000280200200041086a220528020022046a41033a00002005200441016a2204360200200020044104102f2000280200200528020022046a20023600002005200441046a22043602000c030b200041004101102f2000280200200041086a220528020022046a20024102743a00002005200441016a22043602000c020b200041004102102f2000280200200041086a220528020022046a20024102744101723b00002005200441026a22043602000c010b200041004104102f2000280200200041086a220528020022046a20024102744102723600002005200441046a22043602000b200020042002102f2000280200200328020022006a2001200210c9081a2003200020026a3602000f0b103b000b1039000b2701017f02404104103222020d001039000b200042043702042000200236020020004100108f010b3001017f230041106b220224002002410036020820024204370300200041044100109e022002109702200241106a24000bd50401077f024002402002411c6c41046a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b2000200336020420002004360200200041086a2204410036020020002002108f0102402002450d0020012002411c6c6a2105034020012802002106200020012802082202108f0102402002450d002006200241e0006c6a21070340200020042802004120102f2000280200200428020022036a22022006290000370000200241186a200641186a290000370000200241106a200641106a290000370000200241086a200641086a2900003700002004200341206a360200200641206a200010f80320062802502102200020062802582203108f01200641e0006a210602402003450d0020034105742108200428020021030340200020034120102f2000280200200428020022096a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a2900003700002004200941206a2203360200200241206a2102200841606a22080d000b0b20062007470d000b0b2001411c6a2106200128020c2102200020012802142203108f010240024020030d00200428020021030c010b2003410274210820042802002103034020022802002109200020034104102f2000280200200428020022036a20093600002004200341046a2203360200200241046a21022008417c6a22080d000b0b20012802182102200020034104102f2000280200200428020022036a20023600002004200341046a3602002006210120062005470d000b0b0f0b103b000b1039000bb90101027f230041e0006b22022400200241c0006a41003602000240410110322203450d002000420137020420002003360200200041004101102f2000280200200041086a220028020022036a41003a00002000200341016a360200024020022802402200450d000240200241c4006a2802002203450d00200341306c450d002000102c0b20022802504100200241d4006a28020022001b2203450d00200041ffffff3f71450d002003102c0b200241e0006a24000f0b1039000b910701057f230041f0006b22032400200341086a41eddcc700410810c501200341186a4180d0c000411610c501200341286a200110a102024002402002280208220141046a2204417f4c0d002002280200210202400240024002400240024020040d0020034100360250200342013703480c010b200410322205450d06200341003602502003200436024c20032005360248200141c000490d01200141808001490d022001418080808004490d030b200341c8006a41004101102f2003280248200328025022046a41033a00002003200441016a2204360250200341c8006a20044104102f2003280248200328025022046a20013600002003200441046a2204360250200341c8006a21050c030b200341c8006a41004101102f2003280248200328025022046a20014102743a00002003200441016a2204360250200341c8006a21050c020b200341c8006a41004102102f2003280248200328025022046a20014102744101723b00002003200441026a2204360250200341c8006a21050c010b200341c8006a41004104102f2003280248200328025022046a20014102744102723600002003200441046a2204360250200341c8006a21050b200520042001102f20032802482204200328025022056a2002200110c9081a2003200520016a2201360250200341d8006a2004200110c701200341ec006a200420016a360200200320043602682003200341e0006a3602642003200341d8006a360260200341386a200341e0006a107e0240200328024c450d002004102c0b20032802302204200328024022026a41206a2201417f4c0d000240024020010d00410121050c010b200110322205450d020b2000200136020420002005360200200041086a2201410036020020004100411010c8012000280200200128020022056a220620032900083700002001200541106a2205360200200641086a200341086a41086a29000037000020002005411010c8012000280200200128020022056a220620032900183700002001200541106a2207360200200641086a200341186a41086a2900003700002003280228210520002007200410c8012000280200200128020022066a2005200410c9081a2001200620046a22063602002003280238210420002006200210c8012000280200200128020022006a2004200210c9081a2001200020026a3602000240200328023c450d002004102c0b0240200328022c450d002005102c0b200341f0006a24000f0b103b000b1039000bc10101047f230041306b220224000240411010322203450d002002421037020c20022003360208200241086a41004110102f20022802082203200228021022046a22052001290000370000200541086a200141086a2900003700002002200441106a2201360210200241186a2003200110c7012002412c6a200320016a360200200220033602282002200241186a41086a3602242002200241186a3602202000200241206a107e0240200228020c450d002003102c0b200241306a24000f0b1039000b8f0401057f230041e0006b22022400200241086a41eddcc700410810c501200241186a41e4cec000410710c50102400240412010322203450d002002422037023c20022003360238200241386a41004120102f20022802382203200228024022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360240200241c8006a2003200110c701200241dc006a200320016a360200200220033602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a107e0240200228023c450d002003102c0b2002280230220341206a2201417f4c0d010240024020010d00410121050c010b200110322205450d010b2000200136020420002005360200200041086a2201410036020020004100411010c8012000280200200128020022056a220420022900083700002001200541106a2205360200200441086a200241086a41086a29000037000020002005411010c8012000280200200128020022056a220420022900183700002001200541106a2206360200200441086a200241186a41086a2900003700002002280228210520002006200310c8012000280200200128020022006a2005200310c9081a2001200020036a3602000240200228022c450d002005102c0b200241e0006a24000f0b1039000b103b000bf10904017f017e067f077e23004180016b2205240020052000200120022003200410a402024002400240024020052802000d00410121010c010b200541106a1092022001ad42e0007e2206422088a70d012006a72207417f4c0d010240024020070d00410821080c010b200710322208450d030b20054100360228200520083602202005200741e0006e360224200541206a410020011094022005280228210702402001450d002000200141e0006c6a21092005280220200741e0006c6a2101200541e4006a21080340200541c0006a41086a220a200041086a290300370300200541c0006a41106a220b200041106a290300370300200541c0006a41186a220c200041186a29030037030020052000290300370340200041206a2903002106200041286a290300210d200041306a290300210e200041386a290300210f200541306a200041c0006a10a502200541f0006a200041d0006a10a602200841086a200541f0006a41086a28020036020020082005290370370200200c2903002110200b2903002111200a290300211220052903402113200141386a200f370300200141306a200e370300200141286a200d370300200141206a2006370300200141086a201237030020012013370300200141106a2011370300200141c0006a2005290330370300200141c8006a200541306a41086a280200360200200141186a2010370300200141cc006a2005290260370200200141d4006a200541e0006a41086a290200370200200141e0006a2101200741016a2107200041e0006a22002009470d000b0b20052007360228200341ffffffff03712003470d0120034102742201417f4c0d010240024020010d00410421000c010b200110322200450d030b200541003602682005200036026020052001410276360264200541e0006a410020031095022005280260200528026822014102746a2002200341027410c9081a200541d4006a200120036a360200200541c0006a41086a2207200541206a41086a280200360200200520052903203703402005200529036037024c0240200528021822012005280214470d00200541106a2001109602200528021821010b20052802102001411c6c6a2200200529034037020020002004360218200041086a2007290300370200200041106a200541c0006a41106a22002903003702002005200141016a2201360218200541f0006a41086a2001360200200520052903102206370370024002402006a722010d00200541d8006a2201420037030020004200370300200541c0006a41086a2207420037030020054200370340200541e0006a41eddcc700410810c5012007200541e0006a41086a220829000037030020052005290060370340200541e0006a41f1cbc000411010c5012001200829000037030020002005290060370300200541c0006a412010b4010c010b200541d8006a2207420037030020004200370300200541c0006a41086a2208420037030020054200370340200541e0006a41eddcc700410810c5012008200541e0006a41086a220a29000037030020052005290060370340200541e0006a41f1cbc000411010c5012007200a29000037030020002005290060370300200541e0006a2001200541f0006a41086a280200109e02200541c0006a412020052802602201200528026810a70202402005280264450d002001102c0b200541f0006a1097020b410021010b20054180016a240020010f0b103b000b1039000b8b4012067f017e017f017e047f017e037f017e077f047e027f017e017f017e037f017e017f017e230041d0036b22062400200641e8026a22074200370300200641e0026a22084200370300200641d0026a41086a22094200370300200642003703d002200641c0026a41e6dcc700410710c5012009200641c0026a41086a220a290000370300200620062900c0023703d002200641b0036a41a08ec100411110c5012007200641b0036a41086a220b290000370300200820062900b003370300200641d8016a200641d0026a1089040240024020062802d801417d71450d004201210c0c010b200742003703002008420037030020094200370300200642003703d002200641c0026a41e6dcc700410710c5012009200a290000370300200620062900c0023703d002200641b0036a4180c0c200411310c501200841086a200b290000370000200820062900b003370000200641203602c4022006200641d0026a3602c002200641b0036a200641d0026a412010b3010240024020062802b00322090d004100210d0c010b20062802b403210702400240200641b8036a2802004104490d004101210d2009280000220b418194ebdc03490d010b4100210d200641003602e801200642013703e0012006410f3602c4032006200641c0026a3602c0032006200641e0016a3602b00220064194036a41013602002006420137028403200641b4bcc300360280032006200641c0036a36029003200641b0026a41dcb7c00020064180036a103e1a20063502e80142208620063502e00184100020062802e401450d0020062802e001102c0b2007450d002009102c0b4200210c200641e8026a4200370300200641d0026a41106a4200370300200641d0026a41086a22094200370300200642003703d002200641c0026a41e6dcc700410710c5012009200641c0026a41086a290000370300200620062900c0023703d002200641b0036a4188bbc200410910c501200841086a200641b0036a41086a2209290000370000200820062900b00337000020064180036a200641d0026a10cb0342c0f0f50b210e2006290380034202510d0020064180036a41106a280200210f200641b0026a41e6dcc700410710c50120064180036a41d0bbc200411510c5012006200f3602c002200641b0036a200641c0026a410410c701200641dc026a200641c0026a41046a360200200620093602d4022006200641c0026a3602d8022006200641b0036a3602d002200641e0016a200641d0026a107e02400240024020062802e801220941206a2207417f4c0d000240024020070d004101210a0c010b20071032220a450d020b200641003602d802200620073602d4022006200a3602d002200641d0026a4100411010c80120062802d00220062802d80222076a220a20062900b002370000200a41086a200641b0026a41086a2900003700002006200741106a22073602d802200641d0026a2007411010c80120062802d00220062802d80222076a220a200629008003370000200a41086a20064180036a41086a2900003700002006200741106a220a3602d80220062802e0012107200641d0026a200a200910c80120062802d002220a20062802d80222106a2007200910c9081a2006201020096a22093602d802024020062802e401450d002007102c0b200641d0016a200a200910c60120062802d401210720062802d0012109024020062802d402450d00200a102c0b0240024020090d0041c983c300ad4280808080e0068410004100200f41646a22092009200f4b1b2111428084afdf00210e200f21100c010b4100200f41646a22092009200f4b1b2111428084afdf00210e0240200720054b0d00200f21100c010b200641e8026a4200370300200641e0026a4200370300200641d0026a41086a22094200370300200642003703d002200641c0026a41e6dcc700410710c5012009200641c0026a41086a290000370300200620062900c0023703d002200641b0036a41c8c1c200410a10c501200841086a200641b0036a41086a290000370000200820062900b00337000020064180036a200641d0026a108a042006280280032209410420091b2212200629028403420020091b2213422088a741037422096a210703402009450d04200941786a21092007417c6a210a200741786a2107200a28020020054b0d000b201220096a280200211042c0f4a4eb00210e2013a72209450d00200941ffffffff0171450d002012102c0b200b4100200d1b2114200641d0026a41186a220d4200370300200641d0026a41106a22124200370300200641d0026a41086a220b4200370300200642003703d002200641c0026a41e6dcc700410710c501200b200641c0026a41086a2215290000370300200620062900c0023703d002200641b0036a4188c4c200411610c501200841086a2209200641b0036a41086a2216290000370000200820062900b003370000200641c8016a200641d0026a412010c60120062802cc01210720062802c8012105200d420037030020124200370300200b4200370300200642003703d002200641c0026a41e6dcc700410710c501200b2015290000370300200620062900c0023703d002200641b0036a4188c4c200411610c50120092016290000370000200820062900b00337000020062007200f20054101461b36028003200641d0026a412020064180036a410410a702200d420037030020124200370300200b4200370300200642003703d002200641c0026a41e6dcc700410710c501200b2015290000370300200620062900c0023703d002200641b0036a41ccb8c200410d10c50120092016290000370000200820062900b00337000020064180036a200641d0026a10e101200629028403420020062802800322081b2217422088a7410574211820042002200220044b1b21192008410120081b211a20064180026a41046a211b20064190026a41086a211c20064180036a41106a211d41002102034020022019200220194b1b21042001200241e0006c6a210a0340024020022004470d004200210c2017a72208450d06200841ffffff3f71450d06201a102c0c060b200241016a211e2001200241e0006c6a210520182109201a2108024003402009450d010240200a2008460d00200941606a210920082005412010cc082107200841206a210820070d010b0b200a41e0006a210a201e21020c010b0b200320024102746a2802002108200642003703880220064200370380022006420037039802200642003703900220064188016a2005290330220c200541386a2903002213428094ebdc03420010c70820064198016a200c2013428094ebdc03420010c808200641f8006a20062903980120064198016a41086a2903002008ad221f420010ce08200641a8016a2005290320220c200541286a2903002213428094ebdc03420010c708200641b8016a200c2013428094ebdc03420010c808200641e8006a20062903b801200641b8016a41086a290300201f420010ce08200629038801201f7e2213428094ebdc038021202013428094ebdc038221210240024002400240024002402006290368420020062903a801201f7e220c428094ebdc0380a7417f200c428080808080c0b2cd3b541b200c428094ebdc03824280cab5ee01566a2209ad7d85200641e8006a41086a29030042002009410047ad7d8584500d002006290378210c200641f8006a41086a2903002122200641c0026a2010200510d00320062802c0022109200620062802c80222073602b402200620093602b002200641b0036a2009200710b3010240024020062802b003220a0d0041002107202421230c010b20062802b40321020240024020062802b80322044104490d00200a2800002223418094ebdc034b0d00202321072004417c6a410f4b0d010b200641003602880320064201370380032006410f3602c4032006200641b0026a3602c003200620064180036a3602a003200641013602e402200642013702d402200641b4bcc3003602d0022006200641c0036a3602e002200641a0036a41dcb7c000200641d0026a103e1a2006350288034220862006350280038410000240200628028403450d00200628028003102c0b41002107202421230b2002450d00200a102c0b024020062802c402450d002009102c0b200820074d0d0320064180036a2010200510d003200628028803210a2006280280032109411010322202450d08200642103702d402200620023602d002200641d0026a41004104102f20062802d00220062802d80222026a20083600002006200241046a22083602d802200641d0026a20084110102f20062802d002220820062802d80222026a22042022200c2020a7417f2013428080808080c0b2cd3b541b20214280cab5ee01566aad7c2213200c54ad7c220c370008200420133700002006200241106a22023602d8022009200a2008200210a702024020062802d402450d002008102c0b0240200628028403450d002009102c0b200641b0036a41e6dcc700410710c50120064180036a41d192c100410d10c501200641c0026a200510e40220062802c802220841206a2209417f4c0d0720090d014101210a0c020b200642003703b802200642003703b002200642003703c802200642003703c002200641b0036a41e6dcc700410710c50120064180036a41d192c100410d10c501200641c0036a200510e40220062802c803220941206a2208417f4c0d060240024020080d00410121070c010b200810322207450d080b200641003602a803200620083602a403200620073602a003200641a0036a4100411010c80120062802a00320062802a80322086a220720062900b003370000200741086a20162900003700002006200841106a22083602a803200641a0036a2008411010c80120062802a00320062802a80322076a2208200629008003370000200841086a20064180036a41086a22082900003700002006200741106a220a3602a80320062802c0032107200641a0036a200a200910c80120062802a003220a20062802a80322026a2007200910c9081a2006200220096a22093602a803024020062802c403450d002007102c0b20064180036a200a200910d203200641c0036a41086a2207200828020036020020062006290380033703c0030240200628028c032209450d0020162007280200360200200620062903c0033703b00320062903900321250b024020062802a403450d00200a102c0b0240024020090d00200642003703900320064280808080c0003703880320062011360284032006410036028003200520064180036a10d4030c010b20082016280200360200200620062903b0033703800320062025370390032006200936028c030b200b200629038003370200200b41086a2008290300370200200b41106a201d290300370200200641003a00fc02200620053602d402200620113602d002200620143602f8022006200641c0026a3602f4022006200641b0026a3602f00220064180036a200641d0026a2010108b0402402006280288034102460d0020062802800320062802d802470d002006200b200f10960120062d00fc02410047723a00fc02200510d6032005108c0441ff017122094102460d002009410171450d0020064180036a41186a22074200370300201d4200370300200842003703002006420037038003200641b0036a41e6dcc700410710c50120082016290000370300200620062900b00337038003200641b0036a41d8bfc200410810c501201d41086a22052016290000370000201d20062900b0033700000240410020064180036a108d042209200941ff01714104461b41ff0171417f6a0e03010001000b20074200370300201d4200370300200842003703002006420037038003200641b0036a41e6dcc700410710c50120082016290000370300200620062900b00337038003200641b0036a41d8bfc200410810c50120052016290000370000201d20062900b00337000020064180036a4101108e040b200641d0026a108f040c030b20091032220a450d060b200641003602b802200620093602b4022006200a3602b002200641b0026a4100411010c80120062802b00220062802b80222096a220a20062900b003370000200a41086a20162900003700002006200941106a22093602b802200641b0026a2009411010c80120062802b00220062802b80222096a220a200629008003370000200a41086a20064180036a41086a220a2900003700002006200941106a22023602b80220062802c0022109200641b0026a2002200810c80120062802b002220220062802b80222046a2009200810c9081a2006200420086a22083602b802024020062802c402450d002009102c0b20064180036a2002200810d203200641c0036a41086a2226200a28020036020020062006290380033703c0030240200628028c032208450d0020162026280200360200200620062903c0033703b00320062903900321270b024020062802b402450d002002102c0b0240024020080d00200642003703900320064280808080c0003703880320062011360284032006410036028003200520064180036a10d4030c010b200a2016280200360200200620062903b0033703800320062027370390032006200836028c030b200b200629038003370200200b41086a2228200a290300370200200b41106a2229201d290300370200200641003a00fc02200620053602d402200620113602d002200620143602f802200620064190026a3602f402200620064180026a3602f002200641e0006a200641d0026a20102013200c109004024020062802604101470d00200628026420062802d802470d002006200b200f10960120062d00fc02410047723a00fc02200510d6032005108c0441ff017122084102460d002008410171450d0020064180036a41186a22094200370300201d4200370300200a42003703002006420037038003200641b0036a41e6dcc700410710c501200a2016290000370300200620062900b00337038003200641b0036a41d8bfc200410810c501201d41086a22022016290000370000201d20062900b0033700000240410020064180036a108d042208200841ff01714104461b41ff0171417f6a0e03010001000b20094200370300201d4200370300200a42003703002006420037038003200641b0036a41e6dcc700410710c501200a2016290000370300200620062900b00337038003200641b0036a41d8bfc200410810c50120022016290000370000201d20062900b00337000020064180036a4101108e040b200641d0026a108f04200641003602a802200642083703a002200642003703c802200642003703c002200641a0026a4100200541c8006a220828020010e00102400240200828020022080d004200211320062802a802210920062802a0022102420021200c010b200841306c2124200528024041106a21082007ad21220340200642003703b803200642003703b003200641386a200841706a2209290300220c200941086a2903002213428094ebdc03420010c708200641286a200c2013428094ebdc03420010c808200641186a2006290328220c200641286a41086a29030022132022420010ce08200641086a200c2013201f420010ce08200641d0026a2010200810d103200641c8006a20062802d002220720062802d80210d3014200200641086a41086a2903002006290308221320062903382220201f7e220c428094ebdc0380a7417f200c428080808080c0b2cd3b541b200c428094ebdc03824280cab5ee01566aad7c220c201354ad7c2213200641186a41086a29030020062903182221202020227e2220428094ebdc0380a7417f2020428080808080c0b2cd3b541b2020428094ebdc03824280cab5ee01566aad7c2220202154ad7c7d200c202054ad7d2221200c20207d2220200c56202120135620212013511b22091b21134200202020091b210c200641c8006a41106a29030021202006290350212120062802482109024020062802d402450d002007102c0b20064180036a2010200810d1032006280288032102200628028003210720062021420020091b2221200c7c220c3703d00220062020420020091b20137c200c202154ad7c22133703d80220072002200641d0026a411010a7020240200628028403450d002007102c0b200641b0026a41e6dcc700410710c50120064180036a41d192c100410d10c501200641c0036a200810e40220062802c803220941206a2207417f4c0d060240024020070d00410121020c010b200710322202450d080b200641003602a803200620073602a403200620023602a003200641a0036a4100411010c80120062802a00320062802a80322076a220220062900b002370000200241086a200641b0026a41086a22042900003700002006200741106a22073602a803200641a0036a2007411010c80120062802a00320062802a80322076a2202200629008003370000200241086a200a2900003700002006200741106a22023602a80320062802c0032107200641a0036a2002200910c80120062802a003220220062802a803222a6a2007200910c9081a2006202a20096a22093602a803024020062802c403450d002007102c0b20064180036a2002200910d2032026200a28020036020020062006290380033703c0030240200628028c032209450d0020042026280200360200200620062903c0033703b002200629039003212b0b024020062802a403450d002002102c0b0240024020090d00200642003703900320064280808080c0003703880320062011360284032006410036028003200820064180036a10d4030c010b200a2004280200360200200620062903b002370380032006202b370390032006200936028c030b200b2006290380033702002028200a2903003702002029201d290300370200200641003a00fc02200620083602d402200620113602d002200620143602f8022006200641b0036a3602f4022006200641c0026a3602f0022006200641d0026a2010200c2013109004024020062802004101470d00200628020420062802d802470d002006200b200f10960120062d00fc02410047723a00fc020b200641d0026a108f04200841086a290000210c200841106a290000211320082900002120200d200841186a29000037030020122013370300200b200c370300200620203703d0022016290300210c20062903b0032113024020062802a802220720062802a402470d00200641a0026a2007410110e00120062802a80221070b20062802a0022202200741306c6a22092013370320200920062903d002370300200941286a200c370300200941086a200b290300370300200941106a2012290300370300200941186a200d2903003703002006200741016a22093602a802200841306a2108202441506a22240d000b2015290300212020062903c00221130b200641e0016a41086a2208200541086a290300370300200641e0016a41106a2207200541106a290300370300200641e0016a41186a2204200541186a290300370300200620052903003703e00120020d020b202321240b200e42808c8d9e027c210e201e21020c010b20064180026a41086a2903002121200629038002210c201c290300211f200629039002212220062802a4022124200641d0026a200541d0006a10a60220062802d802210520062802d402212a20062802d002212620064180036a41186a22282004290300370300201d2007290300370300200a2008290300370300200620062903e00137038003200641c0026a41e6dcc700410710c501200641b0036a41f0c0c200411010c5012006200f3602800220064190026a20064180026a410410c7012006201b3602dc022006201c3602d402200620064180026a3602d802200620064190026a3602d002200641b0026a200641d0026a107e20062802b802220841206a2207417f4c0d010240024020070d00410121040c010b200710322204450d030b200c20137c2213200c54212920064100360298022006200736029402200620043602900220064190026a4100411010c80120062802900220062802980222076a220420062900c002370000200441086a20152900003700002006200741106a22073602980220064190026a2007411010c80120062802900220062802980222076a220420062900b003370000200441086a20162900003700002006200741106a22043602980220062802b002210720064190026a2004200810c8012006280290022204200628029802222c6a2007200810c9081a2006202c20086a220836029802024020062802b402450d002007102c0b2009ad210c202120207c21202029ad2121200641d0026a200420081091040240024020062802d00222080d0041002107200641003602b803200642083703b00341082108410021040c010b200620062902d402222d3702b403200620083602b003202d422088a72107202da721040b200c42c097e8b2017e210c202020217c2120200d20282903003703002012201d290300370300200b200a29030037030020062006290380033703d002024020072004470d00200641b0036a200710920420062802b803210720062802b00321080b200c200e7c210c2008200741d8006c22046a220820133703102008201f370308200820223703002008202636022c20082002360220200841186a2020370300200841346a2005360200200841306a202a360200200841286a2009360200200841246a2024360200200820062903d002370338200841c0006a200b290300370300200841c8006a2012290300370300200841d0006a200d2903003703002006200741016a22083602b803200628029802210920062802900221050240024020062802b003220a0d002005200910b4010c010b20062802b4032102200641d0026a200a200810e3032005200920062802d002220720062802d80210a702024020062802d402450d002007102c0b02402008450d00200a41306a2108200441d8006a210903400240200841746a2802002207450d00200741306c450d00200841706a280200102c0b024020082802002207450d00200741ffffff3f71450d002008417c6a280200102c0b200841d8006a2108200941a87f6a22090d000b0b2002450d00200241d8006c450d00200a102c0b200c42c097e8b2017c210c0240200628029402450d002005102c0b200c42c0b2cd3b7c210e20232124201e21020c000b0b103b000b1039000b4200210c42c0d1e123210e2013a72208450d00200841ffffffff0171450d002012102c0b2000200e3703082000200c370300200641d0036a24000b9b0203017f017e027f0240024020012802082202ad42307e2203422088a70d002003a72204417f4c0d00200128020021014108210502402004450d00200410322205450d020b20002005360200200041086a22054100360200200041046a200441306e36020020004100200210e0012005280200210402402002450d002001200241306c6a21052000280200200441306c6a21020340200220012903003703002002200141086a290300370308200241106a200141106a290300370300200241186a200141186a290300370300200241206a200141206a290300370300200241286a200141286a290300370300200241306a2102200441016a2104200141306a22012005470d000b0b200041086a20043602000f0b103b000b1039000bfd0101037f024002402001280208220241ffffff3f712002470d0020024105742203417f4c0d00200128020021010240024020030d00410121040c010b200310322204450d020b20002004360200200041086a22044100360200200041046a200341057636020020004100200210d6012004280200210302402002450d0020024105742102200028020020034105746a2100034020002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a290000370000200341016a2103200041206a2100200141206a2101200241606a22020d000b0b200420033602000f0b103b000b1039000b18002001ad4220862000ad842003ad4220862002ad8410260b4d01017f230041206b22002400200041146a410136020020004201370204200041eccdc8003602002000410436021c200041ec9cc8003602182000200041186a36021020004180d6c0001046000bc00101027f4100210341c4b5c80021040240024002400240024002400240200241e6e485f3064a0d00200241f0c2c98b06460d03200241e2c289ab06460d01200241e1ea91cb06470d06200141a0016a21040c050b200241e9dabdf306460d01200241e1e69df306460d03200241e7e485f306470d0541202103200121040c050b41202103200141206a21040c040b200141c0006a21040c020b200141e0006a21040c010b20014180016a21040b412021030b20002003360204200020043602000b130020004105360204200041c0e1c6003602000b130020004103360204200041b899c8003602000b130020004108360204200041b0cdc7003602000b130020004109360204200041c8f6c2003602000b130020004101360204200041f4a9c0003602000b130020004101360204200041ecacc0003602000b1300200041033602042000419ca7c0003602000b1300200041033602042000418881c4003602000b130020004103360204200041809cc7003602000b130020004103360204200041e4cac4003602000b040041010b040041010b040041010bf02705017f027e017f017e0e7f230041d0016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e190102030405060708090a0b0c0d0e0f10111213141516171800010b02400240024002400240200141086a2d00000e050001020304000b2002411c6a41013602002002420137020c200241eccdc800360208200241043602c401200241ec9cc8003602c0012002200241c0016a360218200241086a4190cdc4001046000b200241c0016a2001410c6a280200220110b70220022903c0012103200241086a200110b70220022d00102101200041003a0009200020013a0008200020034290ce007c3703000c1b0b200141106a2903002103200241086a2001410c6a28020010b70220022d00102101200041003a0009200020013a0008200020033703000c1a0b200041003b0108200042003703000c190b200241c0016a2001412c6a280200220110b70220022903c0012103200241086a200110b70220022d00102101200041003a0009200020013a00082000427f200342d080ce3b7c220420042003541b3703000c180b02400240024002400240024002400240024002400240200141086a2802000e0b000102030405060708090a000b2002411c6a41013602002002420137020c200241eccdc800360208200241043602c401200241ec9cc8003602c0012002200241c0016a360218200241086a41dce5c6001046000b2001410c6a3502002103200241086a109b0120022903102104200041003b0108200020032004428094ebdc03807e20032004428094ebdc03827e2203428094ebdc038042ffffffff0f2003428080808080c0b2cd3b541b2003428094ebdc03824280cab5ee0156ad7c42ffffffff0f837c3703000c200b200041003b010820004288b6f8003703000c1f0b200041013b010820004280b283313703000c1e0b200241086a109b0120022903102103200041013b0108200020033703000c1d0b200241086a109b0120022903102103200041013b0108200020033703000c1c0b200041013b0108200042f898e5f0003703000c1b0b200041013b01082000200141146a35020042e8ad8a307e3703000c1a0b200041013b01082000200141146a35020022034288b8247e20034280c2d72f7e7c42b88882017c3703000c190b200041013b01082000417f200141186a280200220141016a220520052001491bad220342a8a7347e20034280c2d72f7e7c42a0f3d2057c3703000c180b200041013b0108200042a887df113703000c170b024002400240200141086a2802000e03000102000b2002411c6a41013602002002420137020c200241eccdc800360208200241043602c401200241ec9cc8003602c0012002200241c0016a360218200241086a41a4f0c5001046000b200041003b010820002001411c6a280200220141e400200141e4004b1bad4298d70a7e4280a9f3bbb0027c3703000c170b200041003b010820002001411c6a280200220141e400200141e4004b1bad4298d70a7e4280a9f3bbb0027c3703000c160b200041023b0108200042d0aa8acd003703000c150b02400240024002400240024020012d00040e06000102030405000b2002411c6a41013602002002420137020c200241eccdc800360208200241043602c401200241ec9cc8003602c0012002200241c0016a360218200241086a41f49cc8001046000b200041003b01082000429883a1d5003703000c180b200041003b0108200042f0ebfa93013703000c170b200041003b0108200042a89de5d2003703000c160b200041003b0108200042d082f88e013703000c150b200041003b0108200042c8fdffd0003703000c140b02400240024002400240200141086a2d00000e050001020304000b2002411c6a41013602002002420137020c200241eccdc800360208200241043602c401200241ec9cc8003602c0012002200241c0016a360218200241086a41cca7c7001046000b200041003b01082000428089bce8003703000c160b200041003b0108200042a8e6a6d1003703000c150b200041003b0108200042909ac6a3013703000c140b200041003b0108200042a097c2da003703000c130b200041023b0108200042003703000c120b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141086a2d00000e19000102030405060708090a0b0c0d0e0f101112131415161718000b2002411c6a41013602002002420137020c200241eccdc800360208200241043602c401200241ec9cc8003602c0012002200241c0016a360218200241086a41dc85c3001046000b200041003b0108200042b894eea9023703000c280b200041003b01082000428889dfb4013703000c270b200041003b0108200042e091edec013703000c260b200041003b010820002001410c6a350200220342f0d2ee017e20034280c2d72f7e7c42d881a689047c3703000c250b200041003b0108200042f8ebba83013703000c240b200041003b01082000200141146a35020042f8b10c7e42f0dcff93017c3703000c230b200041003b0108200042f8c29e83013703000c220b200041003b0108200042a8d6ffc3003703000c210b200041003b0108200042d0edd9c4013703000c200b200041003b010820004290a0a3313703000c1f0b200041003b010820004290a0a3313703000c1e0b200041003b010820004290a0a3313703000c1d0b200041003b0108200042c8d4c3313703000c1c0b200041003b0108200042b892bf313703000c1b0b200041003b01082000200141146a35020042a8c6007e42d8fbd0317c3703000c1a0b200041003b010820002001412c6a35020022034280aaec017e20034280c2d72f7e7c42d8aae7d3037c3703000c190b200041003b0108200042889cc1313703000c180b200041003b01082000200141186a35020042f0b1cc107e42c0e2d19c167c3703000c170b200041003b010820004290df898ffb003703000c160b200041003b0108200042b0b7fbd7013703000c150b200041003b01082000200141106a350200220342e8cfaf127e20034280cee4cd027e7c4280e9c9d6017c3703000c140b200041003b010820002001412c6a35020022034290f2ee017e20034280c2d72f7e7c42e88ac4dd037c3703000c130b200141146a3502002103200141dc016a3502002104200141e0016a3301002106200141d4016a2802002105200141c8016a2802002107200141bc016a2802002108200141b0016a2802002109200141a4016a280200210a20014198016a280200210b2001418c016a280200210c20014180016a280200210d200141f4006a280200210e200141e8006a280200210f200141dc006a2802002110200141d0006a2802002111200141c4006a2802002112200141386a28020021132001412c6a2802002114200141206a2802002101200041003b01082000427f427f200442f8ad377e20064280bce9007e7c417f2005417f2007417f2008417f2009417f200a417f200b417f200c417f200d417f200e417f200f417f2010417f2011417f2012417f2013417f200120146a221420142001491b22016a221320132001491b22016a221220122001491b22016a221120112001491b22016a221020102001491b22016a220f200f2001491b22016a220e200e2001491b22016a220d200d2001491b22016a220c200c2001491b22016a220b200b2001491b22016a220a200a2001491b22016a220920092001491b22016a220820082001491b22016a220720072001491b22016a220520052001491bad220442d0fec82f7e7c200342a8ada6047e7c20044280c2d72f7e7c4280a3c3c7007c2204200342c0f0f50b7e7c220320032004541b2203428084afdf007c220420042003541b3703000c120b200141146a3502002103200141dc016a3502002104200141e0016a3301002106200141d4016a2802002105200141c8016a2802002107200141bc016a2802002108200141b0016a2802002109200141a4016a280200210a20014198016a280200210b2001418c016a280200210c20014180016a280200210d200141f4006a280200210e200141e8006a280200210f200141dc006a2802002110200141d0006a2802002111200141c4006a2802002112200141386a28020021132001412c6a2802002114200141206a2802002101200041003b01082000427f427f200442f8ad377e20064280bce9007e7c417f2005417f2007417f2008417f2009417f200a417f200b417f200c417f200d417f200e417f200f417f2010417f2011417f2012417f2013417f200120146a221420142001491b22016a221320132001491b22016a221220122001491b22016a221120112001491b22016a221020102001491b22016a220f200f2001491b22016a220e200e2001491b22016a220d200d2001491b22016a220c200c2001491b22016a220b200b2001491b22016a220a200a2001491b22016a220920092001491b22016a220820082001491b22016a220720072001491b22016a220520052001491bad220442d0fec82f7e7c200342a8ada6047e7c20044280c2d72f7e7c4280a3c3c7007c2204200342c0f0f50b7e7c220320032004541b2203428084afdf007c220420042003541b3703000c110b10a802000b200041003b0108200042e8f1fbde0242b0cf95a00220012802041b3703000c0f0b0240024002400240200141086a2802000e0400010203000b2002411c6a41013602002002420137020c200241eccdc800360208200241043602c401200241ec9cc8003602c0012002200241c0016a360218200241086a418889c6001046000b200041003b010820002001411c6a280200220141e400200141e4004b1bad4298d70a7e42c0c6cbccb0027c3703000c100b200041003b010820002001411c6a280200220141e400200141e4004b1bad4298d70a7e42c0c6cbccb0027c3703000c0f0b200041003b0108200042c0cf8e313703000c0e0b200041003b01082000200141286a35020042f8ae0d7e2001411c6a35020042e8ad1d7e7c42f895f495017c3703000c0d0b10b802000b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141086a2802000e25000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324000b2002411c6a41013602002002420137020c200241eccdc800360208200241043602c401200241ec9cc8003602c0012002200241c0016a360218200241086a41e88bc4001046000b200041013b0108200042e8073703000c2e0b200041013b0108200042e8073703000c2d0b200041013b0108200042e8073703000c2c0b200041013b0108200042e8073703000c2b0b200041013b0108200042e8073703000c2a0b200041013b0108200042e8073703000c290b200041013b0108200042e8073703000c280b200041013b0108200042e8073703000c270b200041013b0108200042e8073703000c260b200041013b0108200042e8073703000c250b200041013b0108200042e8073703000c240b200041013b0108200042e8073703000c230b200041013b0108200042e8073703000c220b200041013b0108200042e8073703000c210b200041013b0108200042e8073703000c200b200041013b0108200042e8073703000c1f0b200041013b0108200042e8073703000c1e0b200041013b0108200042e8073703000c1d0b200041013b0108200042e8073703000c1c0b200041013b0108200042e8073703000c1b0b200041013b0108200042e8073703000c1a0b200041013b0108200042e8073703000c190b200041013b0108200042e8073703000c180b200041013b0108200042e8073703000c170b200041013b0108200042e8073703000c160b200041013b0108200042e8073703000c150b200041013b0108200042e8073703000c140b200041013b0108200042e8073703000c130b200041013b0108200042e8073703000c120b200041013b0108200042e8073703000c110b200041013b0108200042e8073703000c100b200041013b0108200042e8073703000c0f0b200041013b0108200042e8073703000c0e0b200041013b0108200042e8073703000c0d0b200041013b0108200042e8073703000c0c0b200041013b0108200042e8073703000c0b0b10b902000b200041023b01082000428094ebdc033703000c090b10ba02000b10bb02000b10bc02000b10bf01000b10bd02000b024002400240024020012802040e0400010203000b2002411c6a41013602002002420137020c200241eccdc800360208200241043602c401200241ec9cc8003602c0012002200241c0016a360218200241086a41b48bc5001046000b200041003b0108200042003703000c050b200041003b0108200042003703000c040b200041003b0108200042003703000c030b10be02000b02400240024002400240024020012802040e06000102030405000b2002411c6a41013602002002420137020c200241eccdc800360208200241043602c401200241ec9cc8003602c0012002200241c0016a360218200241086a4190f1c4001046000b200041003b0108200042003703000c050b200041003b0108200042003703000c040b200041003b0108200042003703000c030b200041003b0108200042003703000c020b200041003b0108200042003703000c010b02400240024002400240200141086a2802000e050001020304000b2002411c6a41013602002002420137020c200241eccdc800360208200241043602c401200241ec9cc8003602c0012002200241c0016a360218200241086a41d8cfc4001046000b200041013b0108200042e8073703000c030b200041013b0108200042e8073703000c020b200041013b0108200042e8073703000c010b200041013b0108200042e8073703000b200241d0016a24000b4d01017f230041206b22002400200041146a410136020020004201370204200041eccdc8003602002000410436021c200041ec9cc8003602182000200041186a360210200041dce7c3001046000b4d01017f230041206b22002400200041146a410136020020004201370204200041eccdc8003602002000410436021c200041ec9cc8003602182000200041186a360210200041b4f9c6001046000b4d01017f230041206b22002400200041146a410136020020004201370204200041eccdc8003602002000410436021c200041ec9cc8003602182000200041186a360210200041e4e7c7001046000b4d01017f230041206b22002400200041146a410136020020004201370204200041eccdc8003602002000410436021c200041ec9cc8003602182000200041186a36021020004198f5c0001046000b4d01017f230041206b22002400200041146a410136020020004201370204200041eccdc8003602002000410436021c200041ec9cc8003602182000200041186a36021020004188eec6001046000b4d01017f230041206b22002400200041146a410136020020004201370204200041eccdc8003602002000410436021c200041ec9cc8003602182000200041186a360210200041cc8fc6001046000b4d01017f230041206b22002400200041146a410136020020004201370204200041eccdc8003602002000410436021c200041ec9cc8003602182000200041186a360210200041acbdc3001046000bce1201027f230041d0026b2203240002400240200228022422042802082001200428020c28020c110100450d002003200141a80210c908220441a8026a41206a200241206a290200370300200441a8026a41186a200241186a290200370300200441a8026a41106a200241106a290200370300200441a8026a41086a200241086a290200370300200420022902003703a80220002004200441a8026a10c0020c010b2000420037030820004201370300200041206a41023a0000200041186a41003a000020042004280200417f6a2202360200024020020d002004280208200428020c2802001102000240200428020c280204450d002004280208102c0b200441046a22022002280200417f6a220236020020020d002004102c0b0240024002400240024002400240024002400240024020012802000e1800010b0b0b02030b0405060b0b0b070b0b0b0b0b0b0b08090a0b024002400240024002400240200141086a280200417e6a0e080010010210030405100b200141106a280200450d0f2001410c6a280200102c0c0f0b200141106a280200450d0e2001410c6a280200102c0c0e0b200141106a280200450d0d2001410c6a280200102c0c0d0b2001410c6a10c1020c0c0b0240200141146a2802002204450d002001410c6a28020021022004410c6c210403400240200241046a280200450d002002280200102c0b2002410c6a2102200441746a22040d000b0b200141106a2802002202450d0b2002410c6c450d0b200128020c102c0c0b0b200141106a280200450d0a2001410c6a280200102c0c0a0b02400240200141086a2802000e020b00010b2001412c6a102b2001419c016a102b0240200141186a2802002204450d00200141106a28020021022004410c6c210403400240200241046a280200450d002002280200102c0b2002410c6a2102200441746a22040d000b0b200141146a2802002202450d0a2002410c6c450d0a2001280210102c0c0a0b2001412c6a102b2001419c016a102b0240200141186a2802002204450d00200141106a28020021022004410c6c210403400240200241046a280200450d002002280200102c0b2002410c6a2102200441746a22040d000b0b200141146a2802002202450d092002410c6c450d092001280210102c0c090b02402001410c6a2802002202450d00200241f0006c2104200128020441046a210203402002102b200241f0006a2102200441907f6a22040d000b0b200141086a2802002202450d08200241f0006c450d082001280204102c0c080b02400240024002400240200141086a2d00000e180c0c0c0c0c0c000c0c0c0c0c0c0c0c010c0c020c0c0c0c03040b200141106a28020041ffffff3f71450d0b2001410c6a280200102c0c0b0b200141106a28020041ffffff3f71450d0a2001410c6a280200102c0c0a0b200141146a28020041ffffffff0371450d09200141106a280200102c0c090b0240200141106a28020041808080807872418080808078460d002001410c6a280200102c0b200141186a10e9010c080b0240200141106a28020041808080807872418080808078460d002001410c6a280200102c0b200141186a10e9010c070b20012802042202450d06200141086a280200450d062002102c0c060b02400240200141086a280200417f6a0e020001070b0240200141186a2802002204450d00200141106a28020021022004410c6c210403400240200241046a280200450d002002280200102c0b2002410c6a2102200441746a22040d000b0b200141146a2802002202450d062002410c6c450d062001280210102c0c060b0240200141186a2802002204450d00200141106a28020021022004410c6c210403400240200241046a280200450d002002280200102c0b2002410c6a2102200441746a22040d000b0b200141146a2802002202450d052002410c6c450d052001280210102c0c050b02402001410c6a280200450d00200141086a280200102c0b02402001411c6a2802002204450d00200141146a28020021022004410c6c210403400240200241046a280200450d002002280200102c0b2002410c6a2102200441746a22040d000b0b200141186a2802002202450d042002410c6c450d042001280214102c0c040b02402001410c6a2802002204450d0020012802042202200441d0006c6a21000340200241046a410036020020022802002104200241013602000240200241086a280200450d002004102c0b200241d0006a22022000470d000b0b0240200141086a2802002202450d00200241d0006c450d002001280204102c0b200141106a10c2020c030b20012802044101470d020240200141106a280200450d002001410c6a280200102c0b2001411c6a280200450d02200141186a280200102c0c020b02400240200141086a280200417f6a0e03000301030b0240200141146a280200450d00200141106a280200102c0b200141206a280200450d022001411c6a280200102c0c020b0240024002400240024002400240200141106a2d00000e0700010203040506080b200141146a2802002001411c6a28020010c3020240200141186a2802002202450d0020024198026c450d002001280214102c0b200141206a280200200141286a28020010c402200141246a2802002202450d0720024188026c450d072001280220102c0c070b200141146a2802002001411c6a28020010c3020240200141186a2802002202450d0020024198026c450d002001280214102c0b200141206a280200200141286a28020010c402200141246a2802002202450d0620024188026c450d062001280220102c0c060b200141146a2802002001411c6a28020010c3020240200141186a2802002202450d0020024198026c450d002001280214102c0b200141206a280200200141286a28020010c402200141246a2802002202450d0520024188026c450d052001280220102c0c050b200141146a2802002001411c6a28020010c302200141186a2802002202450d0420024198026c450d042001280214102c0c040b200141186a280200450d03200141146a280200102c0c030b200141186a10a201200141146a220228020010c5022002280200102c0c020b200141186a10a201200141146a220228020010c5022002280200102c0c010b024002400240200141086a2d00000e0403000103020b2001410c6a22022802001083022002280200102c0c020b2001410c6a22022802001083022002280200102c0c010b2001412c6a22022802001083022002280200102c0b200341d0026a24000b888203050c7f0e7e027f077e127f230041f0116b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e190203040506070801090a0b010c010d01010101010e010f1000020b200341800c6a41086a2204200141186a290300370300200341800c6a41106a2205200141206a290300370300200341800c6a41186a2206200141286a2802003602002003200141106a2903003703800c2001410c6a2802002107200141086a2d000021082001412c6a280200210920012d000b210a20012f0009210b200341800e6a41206a2201200241206a290200370300200341800e6a41186a220c200241186a290200370300200341800e6a41106a220d200241106a290200370300200341800e6a41086a220e200241086a290200370300200320022902003703800e0240024002400240024020080e050001020304000b200341d40f6a4101360200200342013702c40f200341eccdc8003602c00f200341043602e406200341ec9cc8003602e0062003200341e0066a3602d00f200341c00f6a4190cdc4001046000b200341c00f6a41206a2001290300370300200341c00f6a41186a200c290300370300200341c00f6a41106a200d290300370300200341c00f6a41086a200e290300370300200320032903800e3703c00f200341e0066a200341c00f6a10c602200341b0066a41086a200341e0066a41096a290000370300200341b0066a41106a200341e0066a41116a290000370300200341b0066a41186a200341e0066a41196a290000370300200320032900e1063703b00620032d00e0064101460d13200341a00c6a41186a200341b0066a41186a290300370300200341a00c6a41106a200341b0066a41106a290300370300200341a00c6a41086a200341b0066a41086a290300370300200320032903b0063703a00c200341a0096a41186a22014200370300200341a0096a41106a22024200370300200341a0096a41086a22084200370300200342003703a009200341800a6a41afdec700410410c5012008200341800a6a41086a290000370300200320032900800a3703a009200341900a6a41f8b4c600410310c5012001200341900a6a41086a290000370300200220032900900a370300200341c00f6a200341a0096a412010c90120032d00c00f2101200341e8086a41186a2202200341c00f6a41196a290000370300200341e8086a41106a2208200341c00f6a41116a290000370300200341e8086a41086a220c200341c00f6a41096a290000370300200320032900c10f3703e8080240024020014101460d00200341e0066a41186a4200370300200341e0066a41106a4200370300200341e0066a41086a4200370300200342003703e0060c010b200341e0066a41186a2002290300370300200341e0066a41106a2008290300370300200341e0066a41086a200c290300370300200320032903e8083703e0060b0240200341a00c6a200341e0066a412010cc080d00200341c00f6a200741a80210c9081a200341003b01e006200341d8026a200341e0066a10c702200341e0066a200341c00f6a200341d8026a10c002200341e0066a41206a2d0000210120032f008107210220032903e006210f20032903e80621102003290284072111200341cb0f6a20034183076a2d00003a0000200341cc0f6a2011370200200341c00f6a41086a4104200120104202511b4104200f4201511b3a0000200341d40f6a20032902c00a370200200341c00f6a411c6a200341c00a6a41086a290200370200200341e40f6a200341d00a6a280200360200200320023b00c90f200341003a00c40f200341093602c00f200320032f00d8023b00c50f2003200341da026a2d00003a00c70f200341c00f6a10c8022007102c2003200341f3046a2800003600e30d200320032800f0043602e00d200041186a41013a000020004200370308200020032802e00d3600192000411c6a20032800e30d360000200042003703000c5e0b410321010c5c0b200341c00f6a41206a2001290300370300200341c00f6a41186a200c290300370300200341c00f6a41106a200d290300370300200341c00f6a41086a200e290300370300200320032903800e3703c00f200341e0066a200341c00f6a10c602200341b0066a41086a200341e0066a41096a290000370300200341b0066a41106a200341e0066a41116a290000370300200341b0066a41186a200341e0066a41196a290000370300200320032900e1063703b00620032d00e0064101460d13200341a00c6a41186a200341b0066a41186a290300370300200341a00c6a41106a200341b0066a41106a290300370300200341a00c6a41086a200341b0066a41086a290300370300200320032903b0063703a00c200341a0096a41186a22014200370300200341a0096a41106a22024200370300200341a0096a41086a22084200370300200342003703a009200341800a6a41afdec700410410c5012008200341800a6a41086a290000370300200320032900800a3703a009200341900a6a41f8b4c600410310c5012001200341900a6a41086a290000370300200220032900900a370300200341c00f6a200341a0096a412010c90120032d00c00f2101200341e8086a41186a2202200341c00f6a41196a290000370300200341e8086a41106a2208200341c00f6a41116a290000370300200341e8086a41086a220c200341c00f6a41096a290000370300200320032900c10f3703e8080240024020014101460d00200341e0066a41186a4200370300200341e0066a41106a4200370300200341e0066a41086a4200370300200342003703e0060c010b200341e0066a41186a2002290300370300200341e0066a41106a2008290300370300200341e0066a41086a200c290300370300200320032903e8083703e0060b0240200341a00c6a200341e0066a412010cc080d00200341c00f6a200741a80210c9081a200341003b01e006200341d8026a200341e0066a10c702200341e0066a200341c00f6a200341d8026a10c002200341e0066a41206a2d0000210120032f008107210220032903e006210f20032903e80621102003290284072111200341cb0f6a20034183076a2d00003a0000200341cc0f6a2011370200200341c00f6a41086a4104200120104202511b4104200f4201511b3a0000200341d40f6a20032902c00a370200200341c00f6a411c6a200341c00a6a41086a290200370200200341e40f6a200341d00a6a280200360200200320023b00c90f200341003a00c40f200341093602c00f200320032f00d8023b00c50f2003200341da026a2d00003a00c70f200341c00f6a10c8022007102c2003200341f3046a2800003600e30d200320032800f0043602e00d200041186a41013a000020004200370308200020032802e00d3600192000411c6a20032800e30d360000200042003703000c5d0b410321010c5a0b200341a00a6a41186a20062d00003a0000200341a00a6a41106a2005290300370300200341a00a6a41086a2004290300370300200320032903800c3703a00a200341c00f6a41206a2001290300370300200341c00f6a41186a200c290300370300200341c00f6a41106a200d290300370300200341c00f6a41086a200e290300370300200320032903800e3703c00f200341e0066a200341c00f6a10c602200341e00d6a41086a200341e0066a41106a290300370300200341e00d6a41106a200341e0066a41186a290300370300200341e00d6a41186a200341e0066a41206a2d00003a00002003200341e0066a41086a2903003703e00d20032d00e0064101460d1320032f00e106210120032d00e306210220032802e4062108200341e7026a200341e00d6a41086a290300370000200341ef026a200341e00d6a41106a290300370000200341f7026a200341e00d6a41186a2d00003a0000200320083600db02200320023a00da02200320013b01d802200320032903e00d3700df02200341a0096a41186a22024200370300200341a0096a41106a22014200370300200341a0096a41086a22084200370300200342003703a009200341800a6a41afdec700410410c5012008200341800a6a41086a290000370300200320032900800a3703a009200341900a6a41f8b4c600410310c5012002200341900a6a41086a290000370300200120032900900a370300200341c00f6a200341a0096a412010c90120032d00c00f2102200341e8086a41186a2208200341d90f6a290000370300200341e8086a41106a220c200341d10f6a290000370300200341e8086a41086a220d200341c90f6a290000370300200320032900c10f3703e8080240024020024101460d00200341e0066a41186a4200370300200341e0066a41106a4200370300200341e0066a41086a4200370300200342003703e0060c010b200341e0066a41186a2008290300370300200341e0066a41106a200c290300370300200341e0066a41086a200d290300370300200320032903e8083703e0060b0240200341d8026a200341e0066a412010cc08450d00410321010c590b200341cf0a6a200341a00a6a41086a290300370000200341d70a6a200341a00a6a41106a290300370000200341df0a6a200341a00a6a41186a2d00003a0000200320032903a00a3700c70a200341f0046a41086a200341c00a6a41086a290300370300200341f0046a41106a200341c00a6a41106a290300370300200341f0046a41186a200341c00a6a41186a290300370300200320073600c30a2003200a3a00c20a2003200b3b01c00a200320032903c00a3703f004200341a0096a41186a4200370300200341a0096a41106a4200370300200341a0096a41086a22024200370300200342003703a009200341800a6a41afdec700410410c5012002200341800a6a41086a290000370300200320032900800a3703a009200341900a6a41f8b4c600410310c501200141086a200341900a6a41086a290000370000200120032900900a370000200341c00f6a200341a0096a412010c90120032d00c00f2101200341e8086a41186a2202200341d90f6a290000370300200341e8086a41106a2207200341d10f6a290000370300200341e8086a41086a2208200341c90f6a290000370300200320032900c10f3703e8080240024020014101460d00200341e00d6a41186a4200370300200341e00d6a41106a4200370300200341e00d6a41086a4200370300200342003703e00d0c010b200341e00d6a41186a2002290300370300200341e00d6a41106a2007290300370300200341e00d6a41086a2008290300370300200320032903e8083703e00d0b200341cd0f6a200341e00d6a41086a290300370000200341d50f6a200341e00d6a41106a290300370000200341dd0f6a200341e00d6a41186a290300370000200341013a00c40f200341093602c00f200320032903e00d3700c50f200341c00f6a10c802200341c00f6a41186a200341f0046a41186a290300370300200341c00f6a41106a200341f0046a41106a290300370300200341c00f6a41086a200341f0046a41086a290300370300200320032903f0043703c00f200341b0066a41186a22014200370300200341b0066a41106a22024200370300200341b0066a41086a22074200370300200342003703b006200341900a6a41afdec700410410c5012007200341900a6a41086a290000370300200320032900900a3703b006200341e8086a41f8b4c600410310c5012001200341e8086a41086a290000370300200220032900e808370300200341b0066a4120200341c00f6a10c902200320032800a00c3602e0042003200341a00c6a41036a2800003600e304200041186a41013a000020004200370308200020032802e0043600192000411c6a20032800e304360000200042003703000c5b0b200341a00a6a41186a20062d00003a0000200341a00a6a41106a2005290300370300200341a00a6a41086a2004290300370300200320032903800c3703a00a200341c00f6a41206a2001290300370300200341c00f6a41186a200c290300370300200341c00f6a41106a200d290300370300200341c00f6a41086a200e290300370300200320032903800e3703c00f200341e0066a200341c00f6a10c602200341c00a6a41086a200341e0066a41096a290000370300200341c00a6a41106a200341e0066a41116a290000370300200341c00a6a41186a200341e0066a41196a290000370300200320032900e1063703c00a0240024020032d00e0064101460d00200341a00c6a41186a200341c00a6a41186a290300370300200341a00c6a41106a200341c00a6a41106a290300370300200341a00c6a41086a200341c00a6a41086a290300370300200320032903c00a3703a00c200341a0096a41186a22014200370300200341a0096a41106a22024200370300200341a0096a41086a22084200370300200342003703a009200341800a6a41afdec700410410c5012008200341800a6a41086a290000370300200320032900800a3703a009200341900a6a41f8b4c600410310c5012001200341900a6a41086a290000370300200220032900900a370300200341c00f6a200341a0096a412010c90120032d00c00f2101200341e8086a41186a2202200341c00f6a41196a290000370300200341e8086a41106a2208200341c00f6a41116a290000370300200341e8086a41086a220c200341c00f6a41096a290000370300200320032900c10f3703e8080240024020014101460d00200341e0066a41186a4200370300200341e0066a41106a4200370300200341e0066a41086a4200370300200342003703e0060c010b200341e0066a41186a2002290300370300200341e0066a41106a2008290300370300200341e0066a41086a200c290300370300200320032903e8083703e0060b0240200341a00c6a200341e0066a412010cc08450d0020091083022009102c410321010c020b200341bf066a200341a00a6a41086a290300370000200341c7066a200341a00a6a41106a290300370000200341cf066a200341a00a6a41186a2d00003a0000200320032903a00a3700b706200341e00d6a41086a2201200341b0066a41086a290300370300200341e00d6a41106a2202200341b0066a41106a290300370300200341e00d6a41186a2208200341b0066a41186a290300370300200320073600b3062003200a3a00b2062003200b3b01b006200320032903b0063703e00d200341c00f6a200941a80210c9081a200341ea066a2001290300370100200341f2066a2002290300370100200341fa066a200829030037010020034180023b01e006200320032903e00d3701e206200341d8026a200341e0066a10c702200341e0066a200341c00f6a200341d8026a10c002200341e0066a41206a2d0000210120032f008107210220032903e006210f20032903e80621102003290284072111200341cb0f6a20034183076a2d00003a0000200341cc0f6a2011370200200341c00f6a41086a4104200120104202511b4104200f4201511b3a0000200341d40f6a20032902c00a370200200341c00f6a411c6a200341c00a6a41086a290200370200200341e40f6a200341c00a6a41106a280200360200200320023b00c90f200341093602c00f200320032f00d8023b00c50f200341023a00c40f2003200341d8026a41026a2d00003a00c70f200341c00f6a10c8022009102c200320032800e0043602f0092003200341e3046a2800003600f309200041186a41013a000020004200370308200020032802f0093600192000411c6a20032800f309360000200042003703000c5c0b20091083022009102c410221010b200320032800e0043602f0092003200341e3046a2800003600f309200041186a41003a000020004200370308200020032802f0093600192000411c6a20032800f309360000200041286a410b360000200041b4bfc4003600242000411b3b0021200041206a20013a0000200042013703000c5a0b000b200341e0066a41106a200141186a290300370300200341e0066a41086a200141106a2903003703002003200141086a2903003703e006200341c00f6a41206a200241206a290200370300200341c00f6a41186a200241186a290200370300200341c00f6a41106a200241106a290200370300200341c00f6a41086a200241086a290200370300200320022902003703c00f2000200341e0066a200341c00f6a10ca020c580b2001411c6a2802002106200141186a2802002107200141146a280200210c200141106a28020021082001410c6a2802002109200141086a280200210d200341d8026a200141206a41880210c9081a200341a00c6a41206a2201200241206a290200370300200341a00c6a41186a220e200241186a290200370300200341a00c6a41106a2204200241106a290200370300200341a00c6a41086a2205200241086a290200370300200320022902003703a00c024002400240200d0e03000102000b200341c00f6a41146a4101360200200342013702c40f200341eccdc8003602c00f200341043602e406200341ec9cc8003602e0062003200341e0066a3602d00f200341c00f6a41a4f0c5001046000b200341e0066a200341d8026a41880210c9081a200341c00f6a41206a2001290300370300200341c00f6a41186a200e290300370300200341c00f6a41106a2004290300370300200341c00f6a41086a2005290300370300200320032903a00c3703c00f200341c00a6a200341c00f6a10c602200341e8086a41086a200341c90a6a2201290000370300200341e8086a41106a200341d10a6a2202290000370300200341e8086a41186a200341d90a6a220d290000370300200320032900c10a3703e80802400240024020032d00c00a4101470d00200341a00e6a41023a0000200341980e6a41003a0000200342003703880e200342013703800e02402007450d002007410c6c21022008210103400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b0240200c450d002008450d00200c410c6c450d002008102c0b200341ec066a102b200341dc076a102b200341a80e6a2102200341880e6a210141002107410221080c010b200341a0096a41186a200341e8086a41186a290300220f370300200341a0096a41106a200341e8086a41106a2903002210370300200341a0096a41086a200341e8086a41086a2903002211370300200320032903e80822123703a009200d200f3700002002201037000020012011370000200320123700c10a200341013a00c00a200341c00f6a200341e0066a41880210c9081a200341fc046a2007360200200341f0046a41086a200c3602002003200636028005200320083602f404200320093602f004200341800e6a200341c00a6a200341c00f6a200341f0046a10cb0220032903800e4201520d01200341a80e6a2102200341800e6a41086a2101200341a00e6a2d0000210820032d00980e210720032903900e210f0b200320012800113602f0092003200141146a2800003600f30920012f0019210c20012d001b210d200128001c210e200228000021022001280224210120032903880e2110200041186a20073a0000200041106a200f37030020002010370308200020032802f0093600192000411c6a20032800f3093600002000412c6a2001360200200041286a20023600002000200e3600242000200d3a00232000200c3b0021200041206a20083a0000200042013703000c590b200320032800990e3602f0092003200341800e6a411c6a2800003600f30920032903880e210f20032903900e2110200041186a20032d00980e3a0000200041106a20103703002000200f370308200020032802f0093600192000411c6a20032800f309360000200042003703000c580b200341e0066a200341d8026a41880210c9081a200341c00f6a41206a2001290300370300200341c00f6a41186a200e290300370300200341c00f6a41106a2004290300370300200341c00f6a41086a2005290300370300200320032903a00c3703c00f024002400240200341c00f6a10cc02450d00200341a00e6a41023a0000200341980e6a41003a0000200342003703880e200342013703800e02402007450d002007410c6c21022008210103400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b0240200c450d002008450d00200c410c6c450d002008102c0b200341ec066a102b200341dc076a102b200341a80e6a2102200341880e6a210141002107410221080c010b200341c00f6a10cd02200341d90a6a200341c00f6a41186a290300370000200341d10a6a200341c00f6a41106a290300370000200341c90a6a200341c00f6a41086a290300370000200341013a00c00a200320032903c00f3700c10a200341c00f6a200341e0066a41880210c9081a200341fc046a2007360200200341f0046a41086a200c3602002003200636028005200320083602f404200320093602f004200341800e6a200341c00a6a200341c00f6a200341f0046a10cb0220032903800e4201520d01200341a80e6a2102200341800e6a41086a2101200341a00e6a2d0000210820032d00980e210720032903900e210f0b200320012800113602e0042003200141146a2800003600e30420012f0019210c20012d001b210d200128001c210e200228000021022001280224210120032903880e2110200041186a20073a0000200041106a200f37030020002010370308200020032802e0043600192000411c6a20032800e3043600002000412c6a2001360200200041286a20023600002000200e3600242000200d3a00232000200c3b0021200041206a20083a0000200042013703000c580b200320032800990e3602e0042003200341800e6a411c6a2800003600e30420032903880e210f20032903900e2110200041186a20032d00980e3a0000200041106a20103703002000200f370308200020032802e0043600192000411c6a20032800e304360000200042003703000c570b200141086a290300210f200341c00f6a41206a200241206a290200370300200341c00f6a41186a200241186a290200370300200341c00f6a41106a200241106a290200370300200341c00f6a41086a200241086a290200370300200320022902003703c00f02400240200341c00f6a10cc020d00200341e8086a41186a22024200370300200341e8086a41106a22014200370300200341e8086a41086a22074200370300200342003703e808200341800a6a41cbdcc700410910c5012007200341800a6a41086a290000370300200320032900800a3703e808200341900a6a4194d8c300410910c5012002200341900a6a41086a290000370300200120032900900a370300200341e8086a412010ce020d11200341e8086a41186a22074200370300200341f8086a22084200370300200341e8086a41086a22024200370300200342003703e808200341800a6a41cbdcc700410910c5012002200341800a6a41086a220c290000370300200320032900800a3703e808200341900a6a41f8d7c300410310c501200141086a220d200341900a6a41086a220e290000370000200120032900900a3700002003200341e8086a10cf0220032903082210500d012003280200450d01201042b8177c200f580d0141dcddc30041ce0041acdec300103c000b2000420037002420004200370308200041206a41023a0000200041186a41003a0000200042013703000c570b200742003703002008420037030020024200370300200342003703e808200341800a6a41cbdcc700410910c5012002200c290000370300200320032900800a3703e808200341900a6a41f8d7c300410310c501200d200e290000370000200120032900900a3700002003200f3703c00f200341e8086a4120200341c00f6a410810a702200742003703002008420037030020024200370300200342003703e808200341800a6a41cbdcc700410910c5012002200c290000370300200320032900800a3703e808200341900a6a4194d8c300410910c501200d200e290000370000200120032900900a370000200341013a00a00c200341e8086a4120200341a00c6a410110a702200041186a41003a000020004200370308200020032800d0093600192000411c6a200341d0096a41036a280000360000200042003703000c560b200341e0046a41086a220e2001411d6a290000370300200320012900153703e0042001410d6a2900002110200141286a2802002104200141056a290000210f20012d0004210d20012d00252105200341c00a6a41206a2201200241206a290200370300200341c00a6a41186a2207200241186a290200370300200341c00a6a41106a2208200241106a290200370300200341c00a6a41086a220c200241086a290200370300200320022902003703c00a200f421888a72102024002400240024002400240200d0e06000102030405000b200341d40f6a4101360200200342013702c40f200341eccdc8003602c00f200341043602e406200341ec9cc8003602e0062003200341e0066a3602d00f200341c00f6a41f49cc8001046000b200341c00f6a41206a2001290300370300200341c00f6a41186a2007290300370300200341c00f6a41106a2008290300370300200341c00f6a41086a200c290300370300200320032903c00a3703c00f200341e0066a200341c00f6a10c602200341a00a6a41086a200341e0066a41106a290300370300200341a00a6a41106a200341e0066a41186a290300370300200341a00a6a41186a200341e0066a41206a2d00003a00002003200341e0066a41086a2903003703a00a20032d00e0064101460d1320032f00e106210120032d00e306210720032802e4062108200341d8026a410f6a200341a00a6a41086a290300370000200341d8026a41176a200341a00a6a41106a290300370000200341d8026a411f6a200341a00a6a41186a2d00003a0000200320083600db02200320073a00da02200320013b01d802200320032903a00a3700df02200341800e6a200210d002200341c00f6a20032802800e220820032802880e220c10d102200341e00d6a41086a2207200341c00f6a411f6a290000370300200341e00d6a41106a220d200341e70f6a290000370300200341e00d6a41186a220e200341ef0f6a2d00003a0000200320032900d70f3703e00d200320032800f10f3602e0062003200341f40f6a2800003600e306200341c00f6a41086a290300210f20032903c00f2110024020032d00f00f22014102460d0020032800d30f210420032d00d20f210520032f01d00f2106200341b0066a410f6a2007290300370000200341b0066a41176a200d290300370000200341b0066a411f6a200e2d00003a0000200320043600b306200320053a00b206200320063b01b006200320032903e00d3700b706200320032802e0063602c809200320032800e3063600cb090b0240024020014102470d00200341b0066a41186a200341d8026a41186a290300370300200341b0066a41106a200341d8026a41106a290300370300200341b0066a41086a200341d8026a41086a290300370300200320032903d8023703b0064200210f4280a094a58d1d2110200341e0066a200341d8026a4280a094a58d1d420010d202410021010c010b200341e0066a410310d3020b0240024020032d00e00622074104470d00200341f40f6a20032800cb09360000200341c00f6a41186a200341b8066a290300370300200341e00f6a200341b0066a41106a290300370300200341e80f6a200341b0066a41186a290300370300200320103703c00f200320032903b0063703d00f200320013a00f00f200320032802c8093600f10f2003200f3703c80f2008200c200341c00f6a10d40220032f00e10620032d00e3064110747221010c010b20032f00e10620032d00e3064110747221010b20032902e406210f024020032802840e450d002008102c0b20074104470d55200341e80f6a2002360200200341cd0f6a200341e0026a290300370000200341d50f6a200341e8026a290300370000200341dd0f6a200341d8026a41186a290300370000200341003a00c40f200341013602c00f200320032903d8023700c50f200341c00f6a10c802200041186a41003a000020004200370308200020032800a00c3600192000411c6a200341a30c6a280000360000200042003703000c590b200341a0096a41186a200e290300370300200320103703a8092003200f3703a009200320032903e0043703b009200341c00f6a41206a2001290300370300200341c00f6a41186a2007290300370300200341c00f6a41106a2008290300370300200341c00f6a41086a200c290300370300200320032903c00a3703c00f200341e0066a200341c00f6a10c602200341e00d6a41086a200341e0066a41106a290300370300200341e00d6a41106a200341e0066a41186a290300370300200341e00d6a41186a200341e0066a41206a2d00003a00002003200341e0066a41086a2903003703e00d20032d00e0064101460d1320032f00e106210120032d00e306210220032802e40621072003418f0c6a200341e00d6a41086a290300370000200341970c6a200341f00d6a2903003700002003419f0c6a200341e00d6a41186a2d00003a0000200320073600830c200320023a00820c200320013b01800c200320032903e00d3700870c0240200341800c6a200341a0096a412010cc08450d00200341d0096a200410d002200341c00f6a20032802d009220220032802d809220710d102200341800e6a41086a200341e80f6a290300370300200320032903e00f3703800e200320032800f10f3602e0062003200341f40f6a2800003600e306200341c00f6a41186a290300211320032903d00f211420032903c80f211120032903c00f2112024020032d00f00f220841024622010d00200341a00a6a41086a200341800e6a41086a290300370300200320032903800e3703a00a200320032802e0063602c809200320032800e3063600cb090b200341e0066a41086a220c200341a00a6a41086a290300370300200320032903a00a3703e00620010d15200341f0046a41086a200c2903002215370300200320032903e00622163703f004200341c8066a2015370300200320133703b806200320143703b006200320163703c00620084101710d16200341b0066a200341800c6a412010cc080d1a0240201220118450450d0042002113420021140c4f0b02400240200341800c6a200341a0096a412010cc08450d00200341800a6a41c1dcc700410610c501200341900a6a41acc8c700410710c501200341c00f6a200341a0096a10d50220032802c80f220141206a2208417f4c0d190240024020080d004101210c0c010b20081032220c450d1b0b200341003602f809200320083602f4092003200c3602f009200341f0096a4100411010c80120032802f00920032802f80922086a220c20032900800a370000200c41086a200341800a6a41086a2900003700002003200841106a22083602f809200341f0096a2008411010c80120032802f00920032802f80922086a220c20032900900a370000200c41086a200341900a6a41086a2900003700002003200841106a22083602f80920032802c00f210c200341f0096a2008200110c80120032802f009220820032802f809220d6a200c200110c9081a2003200d20016a22013602f809024020032802c40f450d00200c102c0b200341d8026a2008200110d60220032903d8022117200342003703d802200341a4036a2802002105200341a0036a280200210602400240024020174201520d00200341d8026a41186a290300211520032903e802211620032903e0022118200341d8026a41286a2903002119200341d8026a41306a290300211a200329039803211b20032903f802211c200341800e6a41306a20034190036a290300370300200341800e6a41286a201a370300200341800e6a41206a2019370300200341900e6a20153703002003201c3703980e200320163703880e200320183703800e2003201b3703b80e2003200341800e6a3602fc09200341900a6a41c1dcc700410610c501200341e8086a41acc8c700410710c501200341c00f6a200341800c6a10d50220032802c80f220c41206a220d417f4c0d1c02400240200d0d004101210e0c010b200d1032220e450d1e0b41002109200341003602f8042003200d3602f4042003200e3602f004200341f0046a4100411010c80120032802f00420032802f804220d6a220e20032900900a370000200e41086a200341900a6a41086a2900003700002003200d41106a220d3602f804200341f0046a200d411010c80120032802f00420032802f804220d6a220e20032900e808370000200e41086a200341e8086a41086a2900003700002003200d41106a220d3602f80420032802c00f210e200341f0046a200d200c10c80120032802f004220d20032802f804220a6a200e200c10c9081a2003200a200c6a220c3602f804024020032802c40f450d00200e102c0b200341e0066a200d200c10d60220032903e006211b42002115200342003703e006200341ac076a280200210b200341a8076a280200211d02400240201b4201510d004101211e420021164200211f42002120420021214200212242002119420021180c010b20034198076a290300212220034190076a290300212120034188076a290300212020034180076a2903002115200341e0066a41186a290300211620032903f006211820032903e8062119410121094100211e20032903a007211f0b0240024020032903900e221a201220162016201256201520115620152011511b220e1b221c7c2223201a54220a200341800e6a41186a290300221a20112015200e1b22247c200aad7c2225201a542025201a511b4101470d00200341c00f6a410310d70220032902c40f22154280807c8321162015420888a7210c20032802c00f21092015a7210e4101210a0c010b200341800e6a41186a2025370300200320233703900e200341d00c6a220a2022370300200341c80c6a22262021370300200341a00c6a41186a201520247d2016201c54ad7d221a370300200320203703c00c20032016201c7d22163703b00c200320193703a00c200320183703a80c02400240427f201920167c22152015201954220e2018201a7c200ead7c221520185420152018511b220e1b22254280c8afa025544100427f2015200e1b2215501b0d00200341b00c6a2903002115200a29030021162026290300211a200341c00c6a290300212520032903a80c212020032903a00c21214201212320032903b80c21220c010b0240024020192016842018201a848450450d00420021230c010b42002123200341e8086a41186a220e4200370300200341e8086a41106a220a4200370300200341e8086a41086a22264200370300200342003703e808200341800a6a41d4dcc700410810c5012026200341800a6a41086a2227290000370300200320032900800a3703e808200341900a6a41bba8c700410d10c501200e200341900a6a41086a2228290000370300200a20032900900a370300200341286a200341e8086a412010d301200341286a41106a29030021162003290330211a20032802282129200e4200370300200a420037030020264200370300200342003703e808200341800a6a41d4dcc700410810c50120262027290000370300200320032900800a3703e808200341900a6a41bba8c700410d10c501200e2028290000370300200a20032900900a370300200342002016420020291b221620157d201a420020291b221a202554ad7d2220201a20257d2221201a56202020165620202016511b220e1b3703c80f200342002021200e1b3703c00f200341e8086a4120200341c00f6a411010a702200341f80f6a2015370300200341f00f6a2025370300200341c00f6a41086a41013a0000200341d10f6a200341800c6a41086a290300370000200341d90f6a200341800c6a41106a290300370000200341e10f6a200341800c6a41186a290300370000200341023602c00f200320032903800c3700c90f200341c00f6a10c8020b0b201b420151210e20034188076a202537030020034190076a201a370300200341f0066a202037030020034198076a2016370300200341f8066a201537030020032022370380072003201f3703a007200320213703e8064100210a2003200b410020091b3602ac072003201d410020091b3602a807200320234201512209ad3703e0060240024020090d00200d200c10b401420021164100210c0c010b200d200c200341e8066a10d802420021164101210c0b0b024020032802f404450d00200d102c0b024002400240200a0d000240200c41ff0171220c450d00200e41ff0171450d020b200c0d02200e41ff0171450d02200341c00f6a41086a41043a0000200341d10f6a200341800c6a41086a290300370000200341d90f6a200341900c6a290300370000200341e10f6a200341980c6a290300370000200320032903800c3700c90f200341003602c00f200341c00f6a10c8020c020b200341e80d6a200cad42ff0183420886200ead42ff018384201684370300200320093602e40d4101210d200341013602e00d410021090c030b200341c00f6a41086a41033a0000200341d10f6a200341800c6a41086a290300370000200341d90f6a200341900c6a290300370000200341e10f6a200341980c6a290300370000200320032903800c3700c90f200341003602c00f200341c00f6a10c8020b0240201e450d00200341f80f6a2018370300200341f00f6a2019370300200341c00f6a41086a41003a0000200341d10f6a200341800c6a41086a290300370000200341d90f6a200341900c6a290300370000200341e10f6a200341980c6a290300370000200341023602c00f200320032903800c3700c90f200341c00f6a10c8020b200341f00d6a2024370300200341e80d6a201c37030041002109200341003602e00d4101210d4100210c0c020b200341b80e6a4200370300200341b00e6a4200370300200341a80e6a4200370300200341a00e6a4200370300200341800e6a41186a4200370300200341900e6a4200370300200341800e6a41086a4200370300200342003703800e2003200341800e6a3602fc09200341c00f6a410810d702200341ec0d6a200341c00f6a41086a28020036020041012109200341013602e00d200320032903c00f3702e40d4100210d0b4101210c0b200341a00c6a41086a220e200341800e6a41186a290300370300200341a00c6a41106a220a200341800e6a41206a290300370300200341a00c6a41186a220b200341800e6a41286a290300370300200341a00c6a41206a221d200341800e6a41306a290300370300200320032903900e3703a00c200341800e6a41086a290300211520032903800e211602400240200c450d00200341e00d6a41086a29030022174280807c83211a2017420888a7210120032802e40d210d2017a7210c4101210e0c010b200341b80e6a2903002125200341e00d6a41106a2903002119200341e00d6a41086a2903002118200341e0066a41186a200e290300221b370300200341e0066a41206a200a290300370300200341e0066a41286a200b290300370300200341e0066a41306a201d290300370300200320032903a00c221c3703f006200320163703e006200320153703e80602400240427f2016201c7c221a201a201654220c2015201b7c200cad7c221a201554201a2015511b220c1b22244280c8afa025544100427f201a200c1b221a501b0d00200341f0066a290300211a20034190076a290300211b20034188076a290300211c20034180076a290300212420032903e806211f20032903e00621204201212120032903f80621220c010b024002402016201c842015201b848450450d00420021210c010b42002121200341f0046a41186a220e4200370300200341f0046a41106a220a4200370300200341f0046a41086a220b4200370300200342003703f004200341c00f6a41d4dcc700410810c501200b200341c00f6a41086a220c290000370300200320032900c00f3703f004200341c00f6a41bba8c700410d10c501200e200c290000370300200a20032900c00f370300200341106a200341f0046a412010d301200341106a41106a290300211b2003290318211c2003280210211d200e4200370300200a4200370300200b4200370300200342003703f004200341c00f6a41d4dcc700410810c501200b200c290000370300200320032900c00f3703f004200341c00f6a41bba8c700410d10c501200e200c290000370300200a20032900c00f37030020034200201b4200201d1b221b201a7d201c4200201d1b221c202454ad7d221f201c20247d2220201c56201f201b56201f201b511b220e1b3703c80f200342002020200e1b3703c00f200341f0046a4120200341c00f6a411010a702200341f80f6a201a370300200341f00f6a2024370300200c41013a0000200341d10f6a20032903a809370000200341d90f6a200341a0096a41106a290300370000200341e10f6a200341a0096a41186a290300370000200341023602c00f200320032903a0093700c90f200341c00f6a10c8020b0b2017420151210c20034180036a202437030020034188036a201c370300200341e8026a201f37030020034190036a201b370300200341f0026a201a370300200320223703f8022003202537039803200320203703e0024100210e200320054100200d1b3602a403200320064100200d1b3602a00320032021420151220dad3703d80202400240200d0d002008200110b4014200211a410021010c010b20082001200341e0026a10d8024200211a410121010b0b024020032802f409450d002008102c0b200e0d010240200141ff01712201450d00200c41ff0171450d1c0b20010d4f200c41ff0171450d4f200341c80f6a41043a0000200341d10f6a20032903a809370000200341d90f6a200341b0096a290300370000200341e10f6a200341b8096a290300370000200320032903a0093700c90f200341003602c00f200341c00f6a10c8020c4f0b200341e00d6a41c1dcc700410610c501200341c00f6a41acc8c700410710c501200341e0066a200341800c6a10d50220032802e806220141206a2208417f4c0d180240024020080d004101210c0c010b20081032220c450d1a0b200341003602e002200320083602dc022003200c3602d802200341d8026a4100411010c80120032802d80220032802e00222086a220c20032900e00d370000200c41086a200341e00d6a41086a2900003700002003200841106a22083602e002200341d8026a2008411010c80120032802d80220032802e00222086a220c20032900c00f370000200c41086a200341c00f6a41086a2900003700002003200841106a220c3602e00220032802e0062108200341d8026a200c200110c80120032802d802220c20032802e002220d6a2008200110c9081a2003200d20016a22013602e002024020032802e406450d002008102c0b200341c00f6a200c200110d602200341e00f6a290300420020032903c00f42015122011b2114200341d80f6a290300420020011b2113024020032802dc02450d00200c102c0b4200201120147d2012201354ad7d2214201220137d2213201256201420115620142011511b22011b21144200201320011b21130c4f0b2003200d3602e00920032001ad42ff0183420886200cad42ff018384201a843702e4090c4c0b20034190096a410410d30220032d0090094104460d500c520b200341c00f6a41206a2001290300370300200341c00f6a41186a2007290300370300200341c00f6a41106a2008290300370300200341c00f6a41086a200c290300370300200320032903c00a3703c00f200341e0066a200341c00f6a10c602200341e00d6a41086a200341e0066a41106a290300370300200341e00d6a41106a200341e0066a41186a290300370300200341e00d6a41186a200341e0066a41206a2d00003a00002003200341e0066a41086a2903003703e00d20032d00e0064101460d1b20032f00e106210120032d00e306210720032802e4062108200341e7026a200341e00d6a41086a290300370000200341ef026a200341f00d6a290300370000200341f7026a200341e00d6a41186a2d00003a0000200320083600db02200320073a00da02200320013b01d802200320032903e00d3700df02200341a00c6a200210d002200341c00f6a20032802a00c220820032802a80c220c10d102200341800e6a41086a2207200341e80f6a290300370300200320032903e00f3703800e200341c00f6a41186a290300210f20032903d00f211020032903c80f211120032903c00f2112024020032d00f00f220d41024622010d00200341a00a6a41086a2007290300370300200320032903800e3703a00a0b200341e0066a41086a200341a00a6a41086a290300370300200320032903a00a3703e00620010d19200341f0046a41086a200341e0066a41086a2903002213370300200320032903e00622143703f004200341d80f6a20133703002003200f3703c80f200320103703c00f200320143703d00f200d4101710d1a0240200341c00f6a200341d8026a412010cc080d00200341d8026a2012201110d902200341043a00800e0c460b200341800e6a410210d3020c440b200341d8026a41086a200e290300370300200320032903e0043703d802200341c00f6a41206a2001290300370300200341c00f6a41186a2007290300370300200341c00f6a41106a2008290300370300200341c00f6a41086a200c290300370300200320032903c00a3703c00f200341c00f6a10da020d1b200341a00c6a200410d002200341c00f6a20032802a00c220120032802a80c220210d102200341f0046a41086a2208200341e80f6a290300370300200320032903e00f3703f004200320032800f10f3602e0062003200341f40f6a2800003600e306200341d80f6a290300211120032903d00f211220032903c80f211320032903c00f2114024020032d00f00f41024622070d00200341800e6a41086a2008290300370300200320032903f0043703800e200320032802e0063602c809200320032800e3063600cb090b200341e0066a41086a200341800e6a41086a290300370300200320032903800e3703e006024020070d00200341d80f6a200341e8066a290300370300200320032903e0063703d00f200320123703c00f200320113703c80f200341c00f6a2014201310d9020b200341c00f6a41186a2010370300200341e00f6a20032903d802370300200341f40f6a20032800cb09360000200341e80f6a2207200341e0026a22082903003703002003200f3703d00f200342003703c80f200342003703c00f200320053a00f00f200320032802c8093600f10f20012002200341c00f6a10d402024020032802a40c450d002001102c0b200341cd0f6a201037000020072004360200200341dd0f6a20082903003700002003200f3700c50f200341003a00c40f200341013602c00f200320032903d8023700d50f200341c00f6a10c802200041186a41003a000020004200370308200020032800f0093600192000411c6a200341f3096a280000360000200042003703000c560b200341c00f6a41206a2001290300370300200341c00f6a41186a2007290300370300200341c00f6a41106a2008290300370300200341c00f6a41086a200c290300370300200320032903c00a3703c00f200341e0066a200341c00f6a10c602200341e00d6a41086a200341e0066a41106a290300370300200341e00d6a41106a200341e0066a41186a290300370300200341e00d6a41186a200341e0066a41206a2d00003a00002003200341e0066a41086a2903003703e00d20032d00e0064101460d1e20032f00e106210120032d00e306210720032802e4062108200341af0c6a200341e00d6a41086a290300370000200341b70c6a200341f00d6a290300370000200341bf0c6a200341e00d6a41186a2d00003a0000200320083600a30c200320073a00a20c200320013b01a00c200320032903e00d3700a70c200341a0096a200210d002200341c00f6a20032802a009220820032802a809220c10d102200341800e6a41086a2207200341e80f6a290300370300200320032903e00f3703800e200320032800f10f3602e0062003200341f40f6a2800003600e306200341c00f6a41186a290300210f20032903d00f211020032903c80f211120032903c00f2112024020032d00f00f220d41024622010d00200341a00a6a41086a2007290300370300200320032903800e3703a00a200320032802e0063602c809200320032800e3063600cb090b200341e0066a41086a200341a00a6a41086a290300370300200320032903a00a3703e00620010d1b200341f0046a41086a200341e0066a41086a2903002213370300200320032903e00622143703f004200341980e6a20133703002003200f3703880e200320103703800e200320143703900e200d4101710d1c0240200341800e6a200341a00c6a412010cc080d00420021130240201220118450450d0042002111420021190c3f0b200341e0066a41c1dcc700410610c501200341c00f6a41acc8c700410710c501200341d8026a200341a00c6a10d50220032802e002220141206a2207417f4c0d140240024020070d004101210e0c010b20071032220e450d160b4100210d200341003602b806200320073602b4062003200e3602b006200341b0066a4100411010c80120032802b00620032802b80622076a220e20032900e006370000200e41086a200341e0066a41086a2900003700002003200741106a22073602b806200341b0066a2007411010c80120032802b00620032802b80622076a220e20032900c00f370000200e41086a200341c00f6a41086a2900003700002003200741106a22073602b80620032802d802210e200341b0066a2007200110c80120032802b006220720032802b80622046a200e200110c9081a2003200420016a22013602b806024020032802dc02450d00200e102c0b200341e0066a2007200110d60220032903e00621184200211a200342003703e006200341ac076a280200210e200341a8076a28020021040240024020184201510d0041012105420021194200211b4200211c420021154200211642002117420021140c010b20034198076a290300211b200341e0066a41306a2903002119200341e0066a41286a290300211a20034180076a2903002116200341e0066a41186a290300211520032903f006211420032903e80621174101210d4100210520032903a007211c0b200341d8026a41286a2019370300200341d8026a41306a201b370300200341d8026a41186a2016201120162015201256201620115620162011511b22061b22197d20152012201520061b221154ad7d22163703002003201a3703f8022003201520117d22153703e802200320173703d802200320143703e00202400240427f201720157c221220122017542206201420167c2006ad7c221220145420122014511b22061b221a4280c8afa025544100427f201220061b221b501b0d00200341e8026a290300211520034188036a290300211620034180036a290300211a200341f8026a290300211b20032903e002212520032903d80221244201211220032903f002211f0c010b02400240201720158420142016848450450d00420021120c010b42002112200341f0046a41186a22064200370300200341f0046a41106a22094200370300200341f0046a41086a220a4200370300200342003703f004200341e00d6a41d4dcc700410810c501200a200341e00d6a41086a221e290000370300200320032900e00d3703f004200341c00f6a41bba8c700410d10c5012006200341c00f6a41086a220b290000370300200920032900c00f370300200341d8006a200341f0046a412010d301200341d8006a41106a2903002115200329036021162003280258211d2006420037030020094200370300200a4200370300200342003703f004200341e00d6a41d4dcc700410810c501200a201e290000370300200320032900e00d3703f004200341c00f6a41bba8c700410d10c5012006200b290000370300200920032900c00f3703002003420020154200201d1b2215201b7d20164200201d1b2216201a54ad7d22252016201a7d2224201656202520155620252015511b22061b3703c80f20034200202420061b3703c00f200341f0046a4120200341c00f6a411010a702200341f80f6a201b370300200341f00f6a201a370300200b41013a0000200341d10f6a200341a00c6a41086a290300370000200341d90f6a200341a00c6a41106a290300370000200341e10f6a200341a00c6a41186a290300370000200341023602c00f200320032903a00c3700c90f200341c00f6a10c8020b0b20034188076a201b37030020034190076a201a370300200341f0066a202537030020034198076a2016370300200341f8066a20153703002003201f370380072003201c3703a007200320243703e8062003200e4100200d1b3602ac07200320044100200d1b3602a80720032012420151220dad3703e00602400240200d0d002007200110b4010c010b20072001200341e8066a10d8020b024020032802b406450d002007102c0b024020184201510d0020124201510d1f0b20184201520d3d20124201510d3d200341c00f6a41086a41043a0000200341d10f6a200341a00c6a41086a290300370000200341d90f6a200341b00c6a290300370000200341e10f6a200341b80c6a290300370000200320032903a00c3700c90f200341003602c00f200341c00f6a10c8020c3d0b200341800c6a410210d3020c3b0b200341800c6a41086a2207200141186a290000370300200341800c6a41106a2208200141206a290000370300200341800c6a41186a220c200141286a2d00003a00002003200141106a2900003703800c200320012800293602a00920032001412c6a2800003600a309200141386a290300210f200141306a2903002110200141c8006a2903002112200141c0006a2903002111200141d8006a2903002113200141d0006a29030021142001410c6a2800002106200141086a2d0000210d20012d000b210920012f0009210a200341800e6a41206a2201200241206a290200370300200341800e6a41186a220e200241186a290200370300200341800e6a41106a2204200241106a290200370300200341800e6a41086a2205200241086a290200370300200320022902003703800e02400240024002400240200d0e050001020304000b200341d40f6a4101360200200342013702c40f200341eccdc8003602c00f200341043602e406200341ec9cc8003602e0062003200341e0066a3602d00f200341c00f6a41cca7c7001046000b200341a00c6a41186a200c2d00003a0000200341a00c6a41106a2008290300370300200341a00c6a41086a2007290300370300200320032903800c3703a00c200341c00f6a41206a2001290300370300200341c00f6a41186a200e290300370300200341c00f6a41106a2004290300370300200341c00f6a41086a2005290300370300200320032903800e3703c00f200341e0066a200341c00f6a10c602200341f0046a41086a200341e9066a290000370300200341f0046a41106a200341f1066a290000370300200341f0046a41186a200341f9066a290000370300200320032900e1063703f00402400240024020032d00e0064101470d0041002102410221010c010b200341d8026a41186a200341f0046a41186a290300370300200341d8026a41106a200341f0046a41106a290300370300200341d8026a41086a200341f0046a41086a290300370300200320032903f0043703d802200341cf0a6a200341a00c6a41086a290300370000200341d70a6a200341a00c6a41106a290300370000200341df0a6a200341a00c6a41186a2d00003a0000200320032903a00c3700c70a200341c00f6a41086a200341c00a6a41086a290300370300200341c00f6a41106a200341c00a6a41106a290300370300200341c00f6a41186a200341c00a6a41186a290300370300200320063600c30a200320093a00c20a2003200a3b01c00a200320032903c00a3703c00f200341e0066a200341d8026a200341c00f6a2010200f410110db0220032d00e00622014104460d0120032902e406210f20032f00e10620032d00e3064110747241087421020b2000200f37002420004200370308200041206a2002200172360000200041186a41003a0000200042013703000c580b200042003703082000200328008909360019200041186a41003a00002000411c6a2003418c096a280000360000200042003703000c570b200341a00a6a41186a200c2d00003a0000200341a00a6a41106a2008290300370300200341a00a6a41086a2007290300370300200320032903800c3703a00a200341c00f6a41206a2001290300370300200341c00f6a41186a200e290300370300200341c00f6a41106a2004290300370300200341c00f6a41086a2005290300370300200320032903800e3703c00f200341c00f6a10da020d21200341cf0a6a200341a00a6a41086a290300370000200341d70a6a200341a00a6a41106a290300370000200341df0a6a200341a00a6a41186a2d00003a0000200320032903a00a3700c70a200341a00c6a41086a200341c00a6a41086a290300370300200341a00c6a41106a200341c00a6a41106a290300370300200341a00c6a41186a200341c00a6a41186a290300370300200320063600c30a200320093a00c20a2003200a3b01c00a200320032903c00a3703a00c200341800a6a41c1dcc700410610c501200341900a6a41acc8c700410710c501200341c00f6a200341a00c6a10d50220032802c80f220241206a2207417f4c0d140240024020070d004101210c0c010b20071032220c450d160b201120107c22134280c8afa0255441002012200f7c2013201154ad7c501b210141002108200341003602c80a200320073602c40a2003200c3602c00a200341c00a6a4100411010c80120032802c00a20032802c80a22076a220c20032900800a370000200c41086a200341800a6a41086a2900003700002003200741106a22073602c80a200341c00a6a2007411010c80120032802c00a20032802c80a22076a220c20032900900a370000200c41086a200341900a6a41086a2900003700002003200741106a22073602c80a20032802c00f210c200341c00a6a2007200210c80120032802c00a220720032802c80a220d6a200c200210c9081a2003200d20026a22023602c80a024020032802c40f450d00200c102c0b4200200f20011b210f4200201020011b2110200341e0066a2007200210d60220032903e006211742002118200342003703e006200341ac076a280200210c200341a8076a280200210d0240024020174201510d004101210e420021194200211a4200211b420021154200211342002116420021140c010b20034198076a290300211a20034190076a290300211920034188076a290300211820034180076a2903002113200341f8066a290300211520032903f006211420032903e8062116410121084100210e20032903a007211b0b4200201220011b21124200201120011b21112010201656200f201456200f20145122011b0d202010201654200f20145420011b450d3b200341f80d6a22014200370300200341e00d6a41106a22044200370300200341e00d6a41086a22054200370300200342003703e00d200341800a6a41d4dcc700410810c5012005200341800a6a41086a2209290000370300200320032900800a3703e00d200341900a6a41bba8c700410d10c5012001200341900a6a41086a220a290000370300200420032900900a370300200341d0016a200341e00d6a412010d301200341d0016a41106a290300211c20032903d801212520032802d0012106200142003703002004420037030020054200370300200342003703e00d200341800a6a41d4dcc700410810c50120052009290000370300200320032900800a3703e00d200341900a6a41bba8c700410d10c5012001200a290000370300200420032900900a37030020034200201c420020061b221c2016201054ad200f20147d7c7c2025420020061b2214201620107d222554ad7d2216201420257d22252014562016201c562016201c511b22011b3703c80f20034200202520011b3703c00f200341e00d6a4120200341c00f6a411010a7020c3b0b200341a00a6a41186a200c2d00003a0000200341a00a6a41106a2008290300370300200341a00a6a41086a2007290300370300200320032903800c3703a00a200341b0066a411f6a20123c0000200341b0066a410f6a200f370000200320113700c706200320103700b706200320032800a3093600b306200320032802a0093602b006200341c00f6a41206a2001290300370300200341c00f6a41186a200e290300370300200341c00f6a41106a2004290300370300200341c00f6a41086a2005290300370300200320032903800e3703c00f024002400240200341c00f6a10da02450d00410221020c010b200341f0046a410f6a200341a00a6a41086a29030037000020034187056a200341a00a6a41106a290300370000200341f0046a411f6a200341a00a6a41186a2d00003a0000200320032903a00a3700f704200341e0066a41086a200341f0046a41086a290300370300200341e0066a41106a200341f0046a41106a290300370300200341e0066a41186a200341f0046a41186a290300370300200320063600f304200320093a00f2042003200a3b01f004200320032903f0043703e006200341c00f6a41086a200341b0066a41086a290300370300200341c00f6a41106a200341b0066a41106a290300370300200341c00f6a41186a200341b0066a41186a290300370300200320032903b0063703c00f200341d8026a200341e0066a200341c00f6a20142013410110db0220032d00d80222024104460d0120032f00d90220032d00db0241107472210120032902dc02210f0b200020013b00212000200f37002420004200370308200041236a20014110763a0000200041206a20023a0000200041186a41003a0000200042013703000c560b20004200370308200020032800f009360019200041186a41003a00002000411c6a200341f3096a280000360000200042003703000c550b200341e00d6a41186a200c2d00003a0000200341e00d6a41106a2008290300370300200341e00d6a41086a2007290300370300200320032903800c3703e00d200341c00f6a41206a2001290300370300200341c00f6a41186a200e290300370300200341c00f6a41106a2004290300370300200341c00f6a41086a2005290300370300200320032903800e3703c00f200341e0066a200341c00f6a10c602200341f0046a41086a200341e9066a290000370300200341f0046a41106a200341f1066a290000370300200341f0046a41186a200341f9066a290000370300200320032900e1063703f00402400240024020032d00e0064101470d00410221020c010b200341d8026a41186a200341f0046a41186a290300370300200341d8026a41106a200341f0046a41106a290300370300200341d8026a41086a200341f0046a41086a290300370300200320032903f0043703d802200341cf0a6a200341e00d6a41086a290300370000200341d70a6a200341e00d6a41106a290300370000200341df0a6a200341e00d6a41186a2d00003a0000200320032903e00d3700c70a200341c00f6a41086a200341c00a6a41086a290300370300200341c00f6a41106a200341c00a6a41106a290300370300200341c00f6a41186a200341c00a6a41186a290300370300200320063600c30a200320093a00c20a2003200a3b01c00a200320032903c00a3703c00f200341e0066a200341d8026a200341c00f6a2010200f410010db0220032d00e00622024104460d0120032f00e10620032d00e30641107472210120032902e406210f0b200020013b00212000200f37002420004200370308200041236a20014110763a0000200041206a20023a0000200041186a41003a0000200042013703000c550b20004200370308200020032800d009360019200041186a41003a00002000411c6a200341d3096a280000360000200042003703000c540b2001410c6a2802002107200141086a28020021052001280204210d200341c00f6a41206a200241206a290200370300200341c00f6a41186a200241186a290200370300200341c00f6a41106a200241106a290200370300200341c00f6a41086a200241086a290200370300200320022902003703c00f024002400240200341c00f6a10cc020d002007410a4b0d01200341e00d6a41186a22084200370300200341e00d6a41106a22284200370300200341e00d6a41086a22014200370300200342003703e00d200341c00f6a41dcdcc700410a10c5012001200341c00f6a41086a2202290000370300200320032900c00f3703e00d200341c00f6a41b0e4c400410c10c50120082002290000370300202820032900c00f370300200341e00d6a412010dc0241ff0171220c4102460d02200c410171450d02200341e0046a410210dd020c390b200341023a00e0040c380b200341e0046a410310dd020c370b200842003703002028420037030020014200370300200342003703e00d200341c00f6a41dcdcc700410a10c50120012002290000370300200320032900c00f3703e00d200341c00f6a41b0e4c400410c10c501202841086a2002290000370000202820032900c00f370000200341013a00a00c200341e00d6a4120200341a00c6a410110a702200341a0096a41186a22014200370300200341a0096a41106a222a4200370300200341a0096a41086a22024200370300200342003703a009200341800a6a41c1dcc700410610c5012002200341800a6a41086a290000370300200320032900800a3703a009200341900a6a4196a4c600410610c5012001200341900a6a41086a290000370300202a20032900900a370300200341f0016a200341a0096a412010c60120032802f401410020032802f0011b2108200341a00a6a10de02024020032802a80a220220032802a40a470d00200341a00a6a200210df0220032802a80a21020b20032802a00a222b200241c4006c6a220141003a0000200120032f00d8023b000120012008360204200120032902c00f370208200141036a200341d8026a41026a2d00003a0000200141106a200341c00f6a41086a222c290200370200200141186a200341c00f6a41106a222d290200370200200141206a200341c00f6a41186a290200370200200141286a200341c00f6a41206a290200370200200141306a200341c00f6a41286a290200370200200141386a200341c00f6a41306a290200370200200141c0006a200341c00f6a41386a2802003602002003200241016a22093602a80a200d200741f0006c22016a211d024020070d00200d21070c350b200d41f4006a2108200141907f6a210c200341b0066a4107722126200341e00d6a4107722127200341d8026a410172210a200341a0096a41046a212e200341800c6a41086a212f200341800a6a41046a2130200341a0096a41086a2104200341c00f6a4104722131200341a0096a41186a210b200d21070340200728020421012007280200210e200341c00f6a200741086a41e80010c9081a200741f0006a21072001450d35200341e0066a200341c00f6a41e80010c9081a200320013602c40f2003200e3602c00f202c200341e0066a41e80010c9081a200b4200370300200341a0096a41106a221e420037030020044200370300200342003703a009200341800a6a41c1dcc700410610c5012004200341800a6a41086a2232290000370300200320032900800a3703a009200341900a6a4196a4c600410610c501202a41086a200341900a6a41086a2229290000370000202a20032900900a370000200341e8016a200341a0096a412010c60120032802e801210120032802ec012102200341a00c6a200341c00f6a102802400240200e450d00200e2002410020011b22334d0d01200341d8026a410510dd02200341f0046a41086a200341c00a6a41086a290200370300200341f0046a41106a200341c00a6a41106a2f01003b01002003200341d8026a41086a2800003600f309200320032800dd023602f009200320032902c00a3703f004200320032802f0093602e009200320032800f3093600e3090c360b200341d8026a410410dd02200341f0046a41086a200341c00a6a41086a290200370300200341f0046a41106a200341c00a6a41106a2f01003b01002003200341d8026a41086a2800003600f309200320032800dd023602f009200320032902c00a3703f004200320032802f0093602e009200320032800f3093600e3090c350b200341900a6a41c1dcc700410610c501200341e8086a41fda3c600410910c5012003200e417f6a3602800a200341a0096a200341800a6a410410c701200320303602ec0d200320043602e40d2003200341800a6a3602e80d2003200341a0096a3602e00d200341800c6a200341e00d6a107e20032802880c220141206a2202417f4c0d120240024020020d00410121060c010b200210322206450d140b200341003602e80d200320023602e40d200320063602e00d200341e00d6a4100411010c80120032802e00d20032802e80d22026a220620032900900a370000200641086a20292900003700002003200241106a22023602e80d200341e00d6a2002411010c80120032802e00d20032802e80d22026a220620032900e808370000200641086a200341e8086a41086a22342900003700002003200241106a22063602e80d20032802800c2102200341e00d6a2006200110c80120032802e00d220620032802e80d22356a2002200110c9081a2003203520016a22013602e80d024020032802840c450d002002102c0b200341d8026a2006200110c9012004200a41086a2235290000370300201e200a41106a2236290000370300200b200a41186a22372900003703002003200a2900003703a0090240024020032d00d8024101460d00200341800e6a41186a4200370300200341800e6a41106a4200370300200341800e6a41086a4200370300200342003703800e0c010b200341800e6a41186a200b290300370300200341800e6a41106a201e290300370300200341800e6a41086a2004290300370300200320032903a0093703800e0b024020032802e40d450d002006102c0b200341800e6a202d412010cc080d20200e2033490d21024002402009450d00200941c4006c2102202b41016a2101034002402001417f6a2d00004101470d0041012106200341a00c6a2001460d032001200341a00c6a412010cc08450d030b200141c4006a2101200241bc7f6a22020d000b0b410021060b200341800a6a41c1dcc700410610c501200341900a6a41fda3c600410910c5012003200e3602a009200341800c6a200341a0096a410410c7012003202e36028c0e2003202f3602840e2003200341a0096a3602880e2003200341800c6a3602800e200341e00d6a200341800e6a107e20032802e80d220141206a2202417f4c0d120240024020020d004101210e0c010b20021032220e450d140b200341003602880c200320023602840c2003200e3602800c200341800c6a4100411010c80120032802800c20032802880c22026a220e20032900800a370000200e41086a20322900003700002003200241106a22023602880c200341800c6a2002411010c80120032802800c20032802880c22026a220e20032900900a370000200e41086a20292900003700002003200241106a220e3602880c20032802e00d2102200341800c6a200e200110c80120032802800c220e20032802880c22296a2002200110c9081a2003202920016a22013602880c024020032802e40d450d002002102c0b200341d8026a200e200110c90120042035290000370300201e2036290000370300200b20372900003703002003200a2900003703a0090240024020032d00d8024101460d00200341800e6a41186a4200370300200341800e6a41106a4200370300200341800e6a41086a4200370300200342003703800e0c010b200341800e6a41186a200b290300370300200341800e6a41106a201e290300370300200341800e6a41086a2004290300370300200320032903a0093703800e0b024020032802840c450d00200e102c0b2006200341800e6a200341a00c6a412010cc0845720d22200341f0046a41086a2202200341c00a6a41086a2206290200370300200341f0046a41106a220e200341c00a6a41106a22292f01003b0100200320032802f0093602e009200320032800f3093600e309200320032902c00a3703f004200320032800e3093600e30d200320032802e0093602e00d202720032903f004370000202741086a2002290300370000202741106a200e2f01003b0000202620032903e00d370000202641086a200341e00d6a41086a290300370000202641106a200341e00d6a41106a290300370000202641186a200341e00d6a41186a2d00003a0000200341a00c6a200341c00f6a1028200341800e6a41186a22324200370300200341800e6a41106a22334200370300200341800e6a41086a22354200370300200342003703800e200341e8086a41186a22364200370300200341e8086a41106a2237420037030020344200370300200342003703e80841c80010322201450d13200341a0096a10cd022001410236022020014101360244200141186a200b290300370200200141106a201e290300370200200141086a2004290300370200200120032903a009370200200120032903e8083700242001412c6a2034290300370000200141346a20372903003700002001413c6a2036290300370000200320013602d80220034282808080203702dc02200341d8026a10e002200341d8026a41186a2032290300370300200341d8026a41106a2033290300370300200341d8026a41086a2035290300370300200320032903800e3703d802200341d8026a10e1022006200341a00c6a41086a2903003703002029200341a00c6a41106a290300370300200341c00a6a41186a221e200341a00c6a41186a2903003703002002200341b0066a41086a290300370300200e200341b0066a41106a290300370300200341f0046a41186a2234200341b0066a41186a290300370300200320032903a00c3703c00a200320032903b0063703f0040240200920032802a40a470d00200341a00a6a200910df0220032802a80a210920032802a00a212b0b202b200941c4006c6a220141013a0000200120032903c00a370001200141096a2006290300370000200141116a2029290300370000200141196a201e290300370000200141003a0021200120032903f0043700222001412a6a2002290300370000200141326a200e2903003700002001413a6a2034290300370000200320032802a80a41016a22093602a80a2031102b200c41907f6a210c200841f0006a21082007201d470d000c360b0b200341c00f6a200141086a41900210c9081a200341e0066a41206a200241206a290200370300200341e0066a41186a200241186a290200370300200341e0066a41106a200241106a290200370300200341e0066a41086a200241086a290200370300200320022902003703e0062000200341c00f6a200341e0066a10e2020c520b200141086a280200210b20012802042109200341f0046a200141106a41c00110c9081a200341b0066a41206a2201200241206a290200370300200341b0066a41186a2207200241186a290200370300200341b0066a41106a2208200241106a290200370300200341b0066a41086a220c200241086a290200370300200320022902003703b00602402009450d00200341c00a6a200341f0046a41c00110c9081a200341c00f6a41206a2001290300370300200341c00f6a41186a2007290300370300200341c00f6a41106a2008290300370300200341c00f6a41086a200c290300370300200320032903b0063703c00f200341e0066a200341c00f6a10c602200341e00d6a41086a200341e9066a290000370300200341e00d6a41106a200341f1066a290000370300200341e00d6a41186a200341f9066a290000370300200320032900e1063703e00d0240024020032d00e0064101460d00200341800c6a41186a2201200341e00d6a41186a2208290300370300200341800c6a41106a2202200341e00d6a41106a290300370300200341800c6a41086a2207200341e00d6a41086a290300370300200320032903e00d3703800c200341a00c6a200341c00a6a41c00110c9081a200341e0066a41186a2001290300370300200341e0066a41106a2002290300370300200341e0066a41086a2007290300370300200320032903800c3703e006200341c00f6a200341e0066a10e30220032d00c00f4101460d01410121014280808080f002210f419fa5c30021020c320b410221020240200b0d000c330b2009102c0c320b200341ef026a2201200341d90f6a290000370000200341d8026a41106a2202200341d20f6a290100370300200341e90d6a200341ca0f6a290100370000200341f10d6a200229030037000020082001290000370000200320032d00c10f3a00e00d200320032901c20f3700e10d200341800e6a200341a00c6a41c00110c9081a200341800a6a41ffdcc700410710c501200341900a6a4190b5c300410810c501200341c00f6a200341e00d6a10e40220032802c80f220141206a2202417f4c0d100240024020020d00410121070c010b200210322207450d120b200341003602a809200320023602a409200320073602a009200341a0096a4100411010c80120032802a00920032802a80922026a220720032900800a370000200741086a200341800a6a41086a2900003700002003200241106a22023602a809200341a0096a2002411010c80120032802a00920032802a80922026a220720032900900a370000200741086a200341900a6a41086a2900003700002003200241106a22073602a80920032802c00f2102200341a0096a2007200110c80120032802a009220720032802a80922086a2002200110c9081a2003200820016a22013602a809024020032802c40f450d002002102c0b200341c00f6a2007200110e50220032d00c00f2101200341d8026a200341c00f6a41017241c00110c9081a0240024020014101460d00200341003a00e0060c010b200341013a00e006200341e0066a410172200341d8026a41c00110c9081a0b024020032802a409450d002007102c0b200341e0066a410172210a200341c00f6a4101722101416821080340200341b0026a200341800e6a20084187d7c0006a280000220210a90220032802b0022107200320032802b402220c3602e002200320073602dc02200320023602d802200341a00a6a200341d8026a10e602200341c00f6a20032802a00a220d20032802a80a10c901200341e8086a41086a220e200141086a290000370300200341e8086a41106a2204200141106a290000370300200341e8086a41186a2205200141186a290000370300200320012900003703e8080240024020032d00c00f4101470d00200341a0096a41186a22062005290300370300200341a0096a41106a22052004290300370300200341a0096a41086a2204200e290300370300200320032903e8083703a009024020032802a40a450d00200d102c0b200341c00f6a41186a2006290300370300200341c00f6a41106a2005290300370300200341c00f6a41086a2004290300370300200320032903a0093703c00f200341c00f6a200341e00d6a412010cc08450d01410221014280808080d001210f4192a5c30021020c330b20032802a40a450d00200d102c0b0240024020032d00e0064101470d00200341a8026a200a200210a90220032802a802220d450d000240200c20032802ac02220e470d002007200d460d022007200d200c10cc08450d020b2003200e3602c80f2003200d3602c40f200320023602c00f200341d8026a200341c00f6a10e60220032802d802220d20032802e00210b40120032802dc02450d00200d102c0b2003200341e00d6a3602a0092003200c3602c80f200320073602c40f200320023602c00f200341d8026a200341c00f6a10e60220032802d802220220032802e002200341a0096a10cc0120032802dc02450d002002102c0b200841046a22080d000b200341800a6a41ffdcc700410710c501200341900a6a4190b5c300410810c501200341c00f6a200341e00d6a10e40220032802c80f220141206a2202417f4c0d100240024020020d00410121070c010b200210322207450d120b200341003602e002200320023602dc02200320073602d802200341d8026a4100411010c80120032802d80220032802e00222026a220720032900800a370000200741086a200341800a6a41086a2900003700002003200241106a22023602e002200341d8026a2002411010c80120032802d80220032802e00222026a220720032900900a370000200741086a200341900a6a41086a2900003700002003200241106a22073602e00220032802c00f2102200341d8026a2007200110c80120032802d802220720032802e00222086a2002200110c9081a2003200820016a22083602e002024020032802c40f450d002002102c0b200341003602c80f200342013703c00f200341c00f6a41004120102f20032802c00f20032802c80f22026a220120032903800e370000200141086a200341800e6a41086a290300370000200141106a200341800e6a41106a290300370000200141186a200341800e6a41186a2903003700002003200241206a22013602c80f200341c00f6a20014120102f20032802c00f20032802c80f22026a220120032903a00e370000200141086a200341a80e6a290300370000200141106a200341b00e6a290300370000200141186a200341b80e6a2903003700002003200241206a22013602c80f200341c00f6a20014120102f20032802c00f20032802c80f22026a220120032903c00e370000200141086a200341c80e6a290300370000200141106a200341d00e6a290300370000200141186a200341d80e6a2903003700002003200241206a22013602c80f200341c00f6a20014120102f20032802c00f20032802c80f22026a220120032903e00e370000200141086a200341e80e6a290300370000200141106a200341f00e6a290300370000200141186a200341f80e6a2903003700002003200241206a22013602c80f200341c00f6a20014120102f20032802c00f20032802c80f22026a220120032903800f370000200141086a200341880f6a290300370000200141106a200341900f6a290300370000200141186a200341980f6a2903003700002003200241206a22013602c80f200341c00f6a20014120102f20032802c00f220220032802c80f220c6a220120032903a00f370000200141086a200341a80f6a290300370000200141106a200341b00f6a290300370000200141186a200341b80f6a2903003700002003200c41206a22013602c80f200720082002200110a702024020032802c40f450d002002102c0b024020032802dc02450d002007102c0b024020032d00e0060d00200341800c6a10e7020b0240200b450d002009102c0b20004200370308200020032800f009360019200041186a41003a00002000411c6a200341f3096a280000360000200042003703000c520b200341c00f6a41206a2001290300370300200341c00f6a41186a2007290300370300200341c00f6a41106a2008290300370300200341c00f6a41086a200c290300370300200320032903b0063703c00f200341e0066a200341c00f6a10c602200341e8086a41086a200341e9066a290000370300200341e8086a41106a200341f1066a290000370300200341e8086a41186a200341f9066a290000370300200320032900e1063703e808024002400240024020032d00e0064101460d00200341c00a6a41186a200341e8086a41186a290300220f370300200341c00a6a41106a200341e8086a41106a2903002210370300200341c00a6a41086a200341e8086a41086a2903002211370300200320032903e80822123703c00a200341e0066a41186a200f370300200341e0066a41106a2010370300200341e0066a41086a2011370300200320123703e006200341c00f6a200341e0066a10e30220032d00c00f4101470d01200341ef026a2201200341d90f6a290000370000200341d8026a41106a2202200341d20f6a290100370300200341a90c6a200341ca0f6a290100370000200341b10c6a2002290300370000200341a00c6a41186a2001290000370000200320032d00c10f3a00a00c200320032901c20f3700a10c200341800a6a41ffdcc700410710c501200341900a6a4190b5c300410810c501200341c00f6a200341a00c6a10e40220032802c80f220141206a2202417f4c0d130240024020020d00410121070c010b200210322207450d150b200341003602e80d200320023602e40d200320073602e00d200341e00d6a4100411010c80120032802e00d20032802e80d22026a220720032900800a370000200741086a200341800a6a41086a2900003700002003200241106a22023602e80d200341e00d6a2002411010c80120032802e00d20032802e80d22026a220720032900900a370000200741086a200341900a6a41086a2900003700002003200241106a22023602e80d20032802c00f2107200341e00d6a2002200110c80120032802e00d220220032802e80d22086a2007200110c9081a2003200820016a22013602e80d024020032802c40f450d002007102c0b200341c00f6a2002200110e502024020032d00c00f2207450d002002200110b4010b20032d00c10f2101200341d8026a200341c00f6a41027241bf0110c9081a024020074101470d00200341800e6a200341d8026a41bf0110c9081a024020032802e40d450d002002102c0b200320013a00e006200341e0066a410172200341800e6a41bf0110c9081a200341a0026a200341e0066a41e7e485f30610a902200320032903a0023702c40f200341e7e485f3063602c00f200341d8026a200341c00f6a10e60220032802d802220120032802e00210b401024020032802dc02450d002001102c0b20034198026a200341e0066a41e2c289ab0610a90220032003290398023702c40f200341e2c289ab063602c00f200341d8026a200341c00f6a10e60220032802d802220120032802e00210b401024020032802dc02450d002001102c0b20034190026a200341e0066a41e9dabdf30610a90220032003290390023702c40f200341e9dabdf3063602c00f200341d8026a200341c00f6a10e60220032802d802220120032802e00210b401024020032802dc02450d002001102c0b20034188026a200341e0066a41f0c2c98b0610a90220032003290388023702c40f200341f0c2c98b063602c00f200341d8026a200341c00f6a10e60220032802d802220120032802e00210b401024020032802dc02450d002001102c0b20034180026a200341e0066a41e1e69df30610a90220032003290380023702c40f200341e1e69df3063602c00f200341d8026a200341c00f6a10e60220032802d802220120032802e00210b401024020032802dc02450d002001102c0b200341f8016a200341e0066a41e1ea91cb0610a902200320032903f8013702c40f200341e1ea91cb063602c00f200341d8026a200341c00f6a10e60220032802d802220120032802e00210b401024020032802dc02450d002001102c0b200341c00a6a10e802200041186a41003a000020004200370308200020032800d0093600192000411c6a200341d3096a280000360000200042003703000c560b024020032802e40d450d002002102c0b410321014280808080e000210f41c2a5c30021020c020b410221020c020b410121014280808080f002210f419fa5c30021020b200f2002ad84210f2001410874410a722101410321020b200020013b00212000200f37002420004200370308200041236a20014110763a0000200041206a20023a0000200041186a41003a0000200042013703000c510b2001411c6a2802002109200141186a2802002104200141146a2802002105200141106a28020021072001410c6a2802002106200141086a2802002108200341d8026a200141206a41800210c9081a200341a00c6a41206a2201200241206a290200370300200341a00c6a41186a220c200241186a290200370300200341a00c6a41106a220d200241106a290200370300200341a00c6a41086a220e200241086a290200370300200320022902003703a00c024002400240024020080e0400010203000b200341c00f6a41146a4101360200200342013702c40f200341eccdc8003602c00f200341043602e406200341ec9cc8003602e0062003200341e0066a3602d00f200341c00f6a418889c6001046000b200341e0066a200341d8026a41800210c9081a200341c00f6a41206a2001290300370300200341c00f6a41186a200c290300370300200341c00f6a41106a200d290300370300200341c00f6a41086a200e290300370300200320032903a00c3703c00f200341c00a6a200341c00f6a10c602200341e8086a41086a200341c90a6a2201290000370300200341e8086a41106a200341d10a6a2202290000370300200341e8086a41186a200341d90a6a2208290000370300200320032900c10a3703e80802400240024020032d00c00a4101470d00200341a00e6a41023a0000200341980e6a41003a0000200342003703880e200342013703800e02402004450d002004410c6c21022007210103400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b02402005450d002007450d002005410c6c450d002007102c0b200341a80e6a2102200341880e6a210141002107410221080c010b200341a0096a41186a200341e8086a41186a290300220f370300200341a0096a41106a200341e8086a41106a2903002210370300200341a0096a41086a200341e8086a41086a2903002211370300200320032903e80822123703a0092008200f3700002002201037000020012011370000200320123700c10a200341013a00c00a200341c00f6a200341e0066a41800210c9081a200341fc046a2004360200200341f0046a41086a20053602002003200936028005200320073602f404200320063602f004200341800e6a200341c00a6a200341c00f6a200341f0046a10e90220032903800e4201520d01200341a80e6a2102200341800e6a41086a2101200341a00e6a2d0000210820032d00980e21070b200320012800113602f0092003200141146a2800003600f30920012f0019210c20012d001b210d200128001c210e200228000021022001280224210120032903880e210f20032903900e2110200041186a20073a0000200041106a20103703002000200f370308200020032802f0093600192000411c6a20032800f3093600002000412c6a2001360200200041286a20023600002000200e3600242000200d3a00232000200c3b0021200041206a20083a0000200042013703000c530b200320032800990e3602f0092003200341800e6a411c6a2800003600f30920032903880e210f20032903900e2110200041186a20032d00980e3a0000200041106a20103703002000200f370308200020032802f0093600192000411c6a20032800f309360000200042003703000c520b200341e0066a200341d8026a41800210c9081a200341c00f6a41206a2001290300370300200341c00f6a41186a200c290300370300200341c00f6a41106a200d290300370300200341c00f6a41086a200e290300370300200320032903a00c3703c00f024002400240200341c00f6a10cc02450d00200341a00e6a41023a0000200341980e6a41003a0000200342003703880e200342013703800e02402004450d002004410c6c21022007210103400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b02402005450d002007450d002005410c6c450d002007102c0b200341a80e6a2102200341880e6a210141002107410221080c010b200341c00f6a10cd02200341d90a6a200341c00f6a41186a290300370000200341d10a6a200341c00f6a41106a290300370000200341c90a6a200341c00f6a41086a290300370000200341013a00c00a200320032903c00f3700c10a200341c00f6a200341e0066a41800210c9081a200341fc046a2004360200200341f0046a41086a20053602002003200936028005200320073602f404200320063602f004200341800e6a200341c00a6a200341c00f6a200341f0046a10e90220032903800e4201520d01200341a80e6a2102200341800e6a41086a2101200341a00e6a2d0000210820032d00980e21070b200320012800113602e0042003200141146a2800003600e30420012f0019210c20012d001b210d200128001c210e200228000021022001280224210120032903880e210f20032903900e2110200041186a20073a0000200041106a20103703002000200f370308200020032802e0043600192000411c6a20032800e3043600002000412c6a2001360200200041286a20023600002000200e3600242000200d3a00232000200c3b0021200041206a20083a0000200042013703000c520b200320032800990e3602e0042003200341800e6a411c6a2800003600e30420032903880e210f20032903900e2110200041186a20032d00980e3a0000200041106a20103703002000200f370308200020032802e0043600192000411c6a20032800e304360000200042003703000c510b200341c00f6a41206a2001290300370300200341c00f6a41186a200c290300370300200341c00f6a41106a200d290300370300200341c00f6a41086a200e290300370300200320032903a00c3703c00f0240200341c00f6a10da02450d002000420037002420004200370308200041206a41023a0000200041186a41003a0000200042013703000c510b200341e8086a41186a22014200370300200341f8086a22024200370300200341e8086a41086a22084200370300200342003703e808200341800a6a41b4f0c500410f10c5012008200341800a6a41086a290000370300200320032900800a3703e808200341900a6a418884c600410710c5012001200341900a6a41086a290000370300200220032900900a370300200341e8086a41202006200710ea02200041186a41003a000020004200370308200020032800d0093600192000411c6a200341d3096a280000360000200042003703000c500b200141246a280200210c2001411c6a2802002107200141186a2802002104200141146a2802002108200141106a28020021062001410c6a2802002105200141086a280200210e200341c00f6a41206a200241206a290200370300200341c00f6a41186a200241186a290200370300200341c00f6a41106a200241106a290200370300200341c00f6a41086a200241086a290200370300200320022902003703c00f024002400240200341c00f6a10cc02450d004200210f4102210c420021100c010b200341e8086a41186a22014200370300200341e8086a41106a22024200370300200341e8086a41086a220d4200370300200342003703e808200341800a6a41ffdcc700410710c501200d200341800a6a41086a290000370300200320032900800a3703e808200341900a6a41b8b3c300410c10c5012001200341900a6a41086a290000370300200220032900900a370300200341b8026a200341e8086a412010c601200341c00f6a20032802bc02410020032802b8021b220a200c10eb0220032802c00f220120032802c80f10ce02210d024020032802c40f450d002001102c0b200341800e6a10ec02200d417f7320032802800e2209200c4105746a410020032802880e200c4b1b2201410047710d01024020032802840e41ffffff3f71450d002009102c0b4280808080b0024280808080a001200d1b21104183f3c300ad41f9f2c300ad200d1b210f4103210c0b02402005450d00200e450d00200e102c0b02402007450d002007410c6c21022008210103400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b02402004450d002008450d002004410c6c450d002008102c0b20004200370308200041236a41003a000020002010200f84370024200041206a200c3a0000200041186a41003a00002000200d410874410c723b0021200042013703000c500b200141086a290000210f200141106a290000211020012900002111200341a0096a41186a200141186a2900002212370300200341a0096a41106a2010370300200341a0096a41086a200f370300200320113703a009200341cd0f6a200f370000200341d50f6a2010370000200341dd0f6a2012370000200341003a00c40f200341073602c00f200320113700c50f200341c00f6a10c802200341003602e002200342013703d802200e2006200341d8026a10bb01200341d8026a2007108f0102402007450d0020082007410c6c6a21022008210103402001280200200141086a280200200341d8026a10bb012001410c6a22012002470d000b0b200341e0066a200a200c10eb0220032802e002220141046a2202417f4c0d0d20032802d802210c20032802e806210620032802e006210d02400240024002400240024020020d00200341003602c80f200342013703c00f0c010b20021032220a450d13200341003602c80f200320023602c40f2003200a3602c00f200141c000490d01200141808001490d022001418080808004490d030b200341c00f6a41004101102f20032802c00f20032802c80f22026a41033a00002003200241016a22023602c80f200341c00f6a20024104102f20032802c00f20032802c80f22026a20013600002003200241046a22023602c80f200341c00f6a210a0c030b200320014102743a00a00c200341c00f6a41004101102f20032802c00f20032802c80f22026a20032d00a00c3a00002003200241016a22023602c80f200341c00f6a210a0c020b200341c00f6a41004102102f20032802c00f20032802c80f22026a20014102744101723b00002003200241026a22023602c80f200341c00f6a210a0c010b200341c00f6a41004104102f20032802c00f20032802c80f22026a20014102744102723600002003200241046a22023602c80f200341c00f6a210a0b200a20022001102f20032802c00f220220032802c80f220a6a200c200110c9081a2003200a20016a22013602c80f200d20062002200110a702024020032802c40f450d002002102c0b024020032802e406450d00200d102c0b024020032802dc02450d00200c102c0b024020032802840e41ffffff3f71450d002009102c0b02402005450d00200e450d00200e102c0b02402007450d002007410c6c21022008210103400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b02402004450d002008450d002004410c6c450d002008102c0b20004200370308200020032800d009360019200041186a41003a00002000411c6a200341d3096a280000360000200042003703000c4f0b200341e0066a41106a200141186a290300370300200341e0066a41086a200141106a2903003703002003200141086a2903003703e006200341c00f6a41206a200241206a290200370300200341c00f6a41186a200241186a290200370300200341c00f6a41106a200241106a290200370300200341c00f6a41086a200241086a290200370300200320022902003703c00f2000200341e0066a200341c00f6a10ed020c4e0b200341e0066a41106a200141146a290200370300200341e0066a41086a2001410c6a2207290200370300200320012902043703e006200341c00f6a41206a200241206a290200370300200341c00f6a41186a200241186a290200370300200341c00f6a41106a200241106a290200370300200341c00f6a41086a200241086a290200370300200320022902003703c00f200341800e6a41086a2007280200360200200320012902043703800e200341d8026a41086a200341e0066a41146a280200360200200320032902ec063703d802200341a00c6a200341c00f6a200341800e6a200341d8026a10ee02024020032d00a00c22014104460d0020032902a40c210f20032f00a10c2102200041236a20032d00a30c3a0000200020023b00212000200f370024200041206a20013a0000200041186a41003a000020004200370308200042013703000c4e0b20004200370308200020032800d009360019200041186a41003a00002000411c6a200341d3096a280000360000200042003703000c4d0b200141106a28020021052001410c6a2802002104200141086a280200210e20012802042101200341e0066a41206a2207200241206a290200370300200341e0066a41186a2208200241186a290200370300200341e0066a41106a220c200241106a290200370300200341e0066a41086a220d200241086a290200370300200320022902003703e0060240024002402001417f6a0e03000102000b200341c00f6a41206a2007290300370300200341c00f6a41186a2008290300370300200341c00f6a41106a200c290300370300200341c00f6a41086a200d290300370300200320032903e0063703c00f200341c0026a200341c00f6a10ef0220032802c0020d1d024020032802c402200e2004200510f002220141ff01714110470d00200341043a00d8020c2c0b200341d8026a200110f10220032d00d80222014104460d2b0c2a0b200341c00f6a41206a2007290300370300200341c00f6a41186a2008290300370300200341c00f6a41106a200c290300370300200341c00f6a41086a200d290300370300200320032903e0063703c00f200341c8026a200341c00f6a10ef0220032802c8020d1d024020032802cc02200e10f202220141ff01714110470d00200341043a00d8020c290b200341d8026a200110f10220032d00d80222014104460d280c270b200341c00f6a41206a2007290300370300200341c00f6a41186a2008290300370300200341c00f6a41106a200c290300370300200341c00f6a41086a200d290300370300200320032903e0063703c00f200341d0026a200341c00f6a10ef0220032802d0020d1d0240024020032802d4022202200e46220c0d00410d210120022004470d010b200341800a6a4187dec700410410c501200341900a6a41acb1c500410c10c501200341003602e002200342013703d802200341d8026a41004104102f20032802d80220032802e00222016a200e3600002003200141046a22013602e002200341d8026a20014104102f20032802d802220120032802e00222076a20043600002003200741046a22073602e002200341c00a6a2001200710c701200341c00f6a410c6a200120076a360200200320013602c80f2003200341c80a6a3602c40f2003200341c00a6a3602c00f200341800e6a200341c00f6a107e024020032802dc02450d002001102c0b20032802880e220141206a2207417f4c0d0b0240024020070d00410121080c010b200710322208450d0d0b200341003602e002200320073602dc02200320083602d802200341d8026a4100411010c80120032802d80220032802e00222076a220820032900800a370000200841086a200341800a6a41086a2900003700002003200741106a22073602e002200341d8026a2007411010c80120032802d80220032802e00222076a220820032900900a370000200841086a200341900a6a41086a2900003700002003200741106a22083602e00220032802800e2107200341d8026a2008200110c80120032802d802220820032802e002220d6a2007200110c9081a2003200d20016a22013602e002024020032802840e450d002007102c0b200341c00f6a2008200110f30220032d00f40f2107024020032802dc02450d002008102c0b410e2101200741ff01714102460d00200341800a6a4187dec700410410c501200341900a6a41f8afc500411810c501200341003602e002200342013703d802200341d8026a41004104102f20032802d80220032802e00222016a200e3600002003200141046a22013602e002200341d8026a20014104102f20032802d802220120032802e00222076a20043600002003200741046a22073602e002200341a0096a2001200710c701200341cc0f6a200120076a360200200320013602c80f2003200341a8096a3602c40f2003200341a0096a3602c00f200341800e6a200341c00f6a107e024020032802dc02450d002001102c0b20032802880e220141206a2207417f4c0d0b0240024020070d004101210d0c010b20071032220d450d0d0b41002108200341003602e002200320073602dc022003200d3602d802200341d8026a4100411010c80120032802d80220032802e00222076a220d20032900800a370000200d41086a200341800a6a41086a2900003700002003200741106a22073602e002200341d8026a2007411010c80120032802d80220032802e00222076a220d20032900900a370000200d41086a200341900a6a41086a2900003700002003200741106a220d3602e00220032802800e2107200341d8026a200d200110c80120032802d802220d20032802e00222056a2007200110c9081a2003200520016a22013602e002024020032802840e450d002007102c0b200341c00f6a200d200110b301024020032802c00f2201450d004101210820032802c40f450d002001102c0b024020032802dc02450d00200d102c0b410f210120080d00200341800a6a4187dec700410410c501200341900a6a41f8afc500411810c501200341003602e002200342013703d802200341d8026a41004104102f20032802d80220032802e00222016a200e3600002003200141046a22013602e002200341d8026a20014104102f20032802d802220120032802e00222076a20043600002003200741046a22073602e002200341800c6a2001200710c701200341cc0f6a200120076a360200200320013602c80f2003200341880c6a3602c40f2003200341800c6a3602c00f200341800e6a200341c00f6a107e024020032802dc02450d002001102c0b20032802880e220141206a2207417f4c0d0b0240024020070d00410121080c010b200710322208450d0d0b200341003602c80f200320073602c40f200320083602c00f200341c00f6a4100411010c80120032802c00f20032802c80f22076a220820032900800a370000200841086a200341800a6a41086a2900003700002003200741106a22073602c80f200341c00f6a2007411010c80120032802c00f20032802c80f22076a220820032900900a370000200841086a200341900a6a41086a2900003700002003200741106a22083602c80f20032802800e2107200341c00f6a2008200110c80120032802c00f220820032802c80f220d6a2007200110c9081a2003200d20016a22013602c80f024020032802840e450d002007102c0b2008200141c4b5c800410010a702024020032802c40f450d002008102c0b200341a0096a41186a22074200370300200341a0096a41106a22084200370300200341a0096a41086a22014200370300200342003703a009200341900a6a4187dec700410410c5012001200341900a6a41086a220d290000370300200320032900900a3703a009200341e8086a41d8b0c500411c10c5012007200341e8086a41086a2201290000370300200820032900e808370300200341003602e002200342013703d802200341d8026a41004104102f20032802d80220032802e00222076a200e3600002003200741046a22073602e002200341d8026a20074104102f20032802d80220032802e00222076a20043600002003200741046a22083602e002200341c00f6a41086a22072008360200200320032903d8023703c00f200341a0096a4120200341c00f6a10f402200341e8086a41186a22084200370300200341e8086a41106a2205420037030020014200370300200342003703e808200341800a6a41ac95c400410d10c5012001200341800a6a41086a290000370300200320032900800a3703e808200341900a6a41c695c400410c10c5012008200d290000370300200520032900900a370300200341c00f6a200341e8086a10f502200341c0106a28020021012003280298102108200341c00f6a410c6a20043602002007200e360200200341003602e002200342013703d802200341093a00c00f200320023602c40f200341c00f6a200341d8026a10f602200341c00f6a10f702200720032802e002360200200320032903d8023703c00f4100200120084102461b2004200e200c1b200341c00f6a10c4011a200341043a00a00c0c260b200341a00c6a200110f10220032d00a00c22014104460d250c240b200341e0066a41186a2001411c6a290200370300200341e0066a41106a200141146a290200370300200341e0066a41086a2001410c6a290200370300200320012902043703e006200341c00f6a41206a200241206a290200370300200341c00f6a41186a200241186a290200370300200341c00f6a41106a200241106a290200370300200341c00f6a41086a200241086a290200370300200320022902003703c00f2000200341e0066a200341c00f6a10f8020c4b0b200141286a280200211d200141246a280200210a200141206a28020021092001411c6a2802002104200141186a280200210b200141146a2802002105200141106a280200210e2001410c6a2802002106200141086a2802002107200341e0066a2001412c6a41d40110c9081a200341800e6a41206a2201200241206a290200370300200341800e6a41186a2208200241186a290200370300200341800e6a41106a220c200241106a290200370300200341800e6a41086a220d200241086a290200370300200320022902003703800e02400240024002402007417f6a0e0400010203000b200341c00f6a41206a2001290300370300200341c00f6a41186a2008290300370300200341c00f6a41106a200c290300370300200341c00f6a41086a200d290300370300200320032903800e3703c00f024002400240200341c00f6a10da02450d004182b4082101420021104200210f0c010b4183b408210142808080809002210f0240200a41084f0d0041acf5c400ad21100c010b200441b6f7c400460d0120042900004280c2cdeb16510d0141acf5c400ad21100b02402005450d00200e450d00200e102c0b02402009450d002004450d002004102c0b200042003703082000200f201084370024200041206a2001360000200041186a41003a0000200042013703000c4e0b200341d40f6a200a360200200341d00f6a20093602002003201d3602d80f200320043602cc0f2003200b3602c80f200320053602c40f2003200e3602c00f2006200341c00f6a10f902200041186a41003a00002000420037030820002003280089093600192000411c6a2003418c096a280000360000200042003703000c4d0b200341c00f6a41206a2001290300370300200341c00f6a41186a2008290300370300200341c00f6a41106a200c290300370300200341c00f6a41086a200d290300370300200320032903800e3703c00f0240200341c00f6a10da02450d0020004200370308200041206a41023a0000200041186a41003a0000200042013703000c4d0b200610fa02200041186a41003a000020004200370308200020032800b0063600192000411c6a200341b3066a280000360000200042003703000c4c0b200341c00f6a41186a201d360200200341c00f6a41146a200a360200200341c00f6a41106a2009360200200341c00f6a410c6a2004360200200341c00f6a41086a200b360200200320053602c40f2003200e3602c00f200341c00f6a411c6a200341e0066a41d40110c9081a200341d8026a41206a2001290300370300200341d8026a41186a2008290300370300200341d8026a41106a200c290300370300200341d8026a41086a200d290300370300200320032903800e3703d80202400240024002400240200341d8026a10da02450d004200210f410221020c010b200610fb020d014280808080f001210f410321020b200341c00f6a10fc0241f4d1c400ad2110410021010c010b200341e8086a41186a22014200370300200341f8086a22024200370300200341e8086a41086a22074200370300200342003703e808200341800a6a41ac95c400410d10c5012007200341800a6a41086a290000370300200320032900800a3703e808200341900a6a41c695c400410c10c5012001200341900a6a41086a290000370300200220032900900a370300200341d8026a200341e8086a10f502200341d8036a280200210220032802b0032107200341003602e002200342013703d802200341003a00a00c41012101200341d8026a41004101102f20032802d80220032802e0026a20032d00a00c3a0000200320032802e00241016a3602e002200341c00f6a200341d8026a10f6024100200220074102461b2006200341d8026a10c4012102200341c00f6a10fc022002450d01418cd2c400ad2110410321024280808080d002210f0b20004200370308200041236a41003a0000200041206a20023a0000200041186a41003a000020002001410874411a723b00212000200f4280808080f00383201084370024200042013703000c4c0b20004200370308200020032800f009360019200041186a41003a00002000411c6a200341f3096a280000360000200042003703000c4b0b200341c00f6a41206a2001290300370300200341c00f6a41186a2008290300370300200341c00f6a41106a200c290300370300200341c00f6a41086a200d290300370300200320032903800e3703c00f200341c00f6a10da020d1c2006200e2005200b10f002220141ff01714110470d1d0240200e200610f202220141ff01714110470d00200341043a00d8020c210b200341d8026a200110f1020c1e0b410221010c480b410221010c460b410221010c440b419cddc300413041ccddc300103c000b410221070c410b200341023a0090090c3f0b200341e0096a410110d3020c360b200341e0096a410510d3020c350b103b000b1039000b200341c80f6a41033a0000200341d10f6a20032903a809370000200341d90f6a200341b0096a290300370000200341e10f6a200341b8096a290300370000200320032903a0093700c90f200341003602c00f200341c00f6a10c8020c330b200341e0096a410210d3020c310b200341800e6a410110d3020c2a0b200341800e6a410510d3020c290b410221070c2c0b2000420037002420004200370308200041206a41023a0000200041186a41003a0000200042013703000c3a0b200341800c6a410110d3020c1f0b200341800c6a410510d3020c1e0b200341c00f6a41086a41033a0000200341d10f6a200341a00c6a41086a290300370000200341d90f6a200341b00c6a290300370000200341e10f6a200341b80c6a290300370000200320032903a00c3700c90f200341003602c00f200341c00f6a10c8020c1e0b410221070c210b200341f80d6a22014200370300200341e00d6a41106a22044200370300200341e00d6a41086a22054200370300200342003703e00d200341800a6a41d4dcc700410810c5012005200341800a6a41086a2209290000370300200320032900800a3703e00d200341900a6a41bba8c700410d10c5012001200341900a6a41086a220a290000370300200420032900900a370300200341b8016a200341e00d6a412010d301200341b8016a41106a290300211c20032903c001212520032802b8012106200142003703002004420037030020054200370300200342003703e00d200341800a6a41d4dcc700410810c50120052009290000370300200320032900800a3703e00d200341900a6a41bba8c700410d10c5012001200a290000370300200420032900900a3703002003427f201c420020061b221c200f20147d2010201654ad7d7c2025420020061b2214201020167d7c22162014542201ad7c221420012014201c542014201c511b22011b3703c80f2003427f201620011b3703c00f200341e00d6a4120200341c00f6a411010a7020c1a0b20004200370308200041206a41023a0000200041186a41003a0000200042013703000c340b200341d8026a410110dd02200341f0046a41086a200341c00a6a41086a290200370300200341f0046a41106a200341c00a6a41106a2f01003b01002003200341d8026a41086a2800003600f309200320032800dd023602f009200320032902c00a3703f004200320032802f0093602e009200320032800f3093600e3090c130b200341d8026a410710dd02200341f0046a41086a200341c00a6a41086a290200370300200341f0046a41106a200341c00a6a41106a2f01003b01002003200341d8026a41086a2800003600f309200320032800dd023602f009200320032902c00a3703f004200320032802f0093602e009200320032800f3093600e3090c120b200341d8026a410610dd02200341f0046a41086a200341c00a6a41086a290200370300200341f0046a41106a200341c00a6a41106a2f01003b01002003200341d8026a41086a2800003600f309200320032800dd023602f009200320032902c00a3703f004200320032802f0093602e009200320032800f3093600e3090c110b41022101200341023a00d8020c0c0b41022101200341023a00d8020c090b41022101200341023a00a00c0c060b41022101200341023a00d8020c020b200341d8026a200110f1020b20032d00d80222014104460d010b20032902dc02210f20032f00d9022102200041236a20032d00db023a0000200020023b00212000200f370024200041206a20013a0000200041186a41003a0000200042003703084201210f0c010b4200210f20004200370308200020032800d009360019200041186a41003a00002000411c6a200341d3096a2800003600000b2000200f3703000c280b20032902a40c210f20032f00a10c2102200041236a20032d00a30c3a0000200020023b00212000200f370024200041206a20013a0000200041186a41003a000020004200370308200042013703000c270b20004200370308200020032800d009360019200041186a41003a00002000411c6a200341d3096a280000360000200042003703000c260b20032902dc02210f20032f00d9022102200041236a20032d00db023a0000200020023b00212000200f370024200041206a20013a0000200041186a41003a000020004200370308200042013703000c250b20004200370308200020032800f009360019200041186a41003a00002000411c6a200341f3096a280000360000200042003703000c240b20032902dc02210f20032f00d9022102200041236a20032d00db023a0000200020023b00212000200f370024200041206a20013a0000200041186a41003a000020004200370308200042013703000c230b20004200370308200020032800b006360019200041186a41003a00002000411c6a200341b3066a280000360000200042003703000c220b200f2002ad84210f2001410874410a72210141032102200b450d002009102c0b200020013b00212000200f37002420004200370308200041236a20014110763a0000200041206a20023a0000200041186a41003a0000200042013703000c200b20032800d902210120032d00d8022102200341e8046a20032800e309360000200320013600e104200320023a00e004200320032802e0093600e5042031102b0240201d2007460d0003402008102b200841f0006a2108200c41907f6a220c0d000b0b02402005450d00200541f0006c450d00200d102c0b20032802a40a2201450d03200141c4006c450d0320032802a00a102c0c030b201d2007460d000340200741046a102b201d200741f0006a2207470d000b0b02402005450d00200541f0006c450d00200d102c0b200341f80d6a4200370300200341f00d6a4200370300200341e00d6a41086a22014200370300200342003703e00d200341c00f6a41dcdcc700410a10c5012001200341c00f6a41086a2202290000370300200320032900c00f3703e00d200341c00f6a41d3dec400410610c501202841086a2002290000370000202820032900c00f370000200341c00f6a20032802a00a2202200910fd02200341e00d6a412020032802c00f220120032802c80f10a702024020032802c40f450d002001102c0b200341043a00e00420032802a40a2201450d01200141c4006c450d012002102c0c010b02402007450d00200741f0006c2102200d41046a210103402001102b200141f0006a2101200241907f6a22020d000b0b2005450d00200d450d00200541f0006c450d00200d102c0b024020032d00e00422014104460d0020032902e404210f20032f00e1042102200041236a20032d00e3043a0000200020023b00212000200f370024200041206a20013a0000200041186a41003a000020004200370308200042013703000c1c0b20004200370308200020032800d009360019200041186a41003a00002000411c6a200341d3096a280000360000200042003703000c1b0b0240024020112015562012201356201220135122011b0d002011201554201220135420011b450d01200341f80d6a22014200370300200341e00d6a41106a22044200370300200341e00d6a41086a22054200370300200342003703e00d200341800a6a41d4dcc700410810c5012005200341800a6a41086a2209290000370300200320032900800a3703e00d200341900a6a41bba8c700410d10c5012001200341900a6a41086a220a290000370300200420032900900a370300200341a0016a200341e00d6a412010d301200341a0016a41106a290300211420032903a801211620032802a0012106200142003703002004420037030020054200370300200342003703e00d200341800a6a41d4dcc700410810c50120052009290000370300200320032900800a3703e00d200341900a6a41bba8c700410d10c5012001200a290000370300200420032900900a370300200342002014420020061b22142015201154ad201220137d7c7c2016420020061b2213201520117d221654ad7d2215201320167d2216201356201520145620152014511b22011b3703c80f20034200201620011b3703c00f200341e00d6a4120200341c00f6a411010a7020c010b200341f80d6a22014200370300200341e00d6a41106a22044200370300200341e00d6a41086a22054200370300200342003703e00d200341800a6a41d4dcc700410810c5012005200341800a6a41086a2209290000370300200320032900800a3703e00d200341900a6a41bba8c700410d10c5012001200341900a6a41086a220a290000370300200420032900900a37030020034188016a200341e00d6a412010d30120034188016a41106a290300211420032903900121162003280288012106200142003703002004420037030020054200370300200342003703e00d200341800a6a41d4dcc700410810c50120052009290000370300200320032900800a3703e00d200341900a6a41bba8c700410d10c5012001200a290000370300200420032900900a3703002003427f2014420020061b2214201220137d2011201554ad7d7c2016420020061b2213201120157d7c22152013542201ad7c22132001201320145420132014511b22011b3703c80f2003427f201520011b3703c00f200341e00d6a4120200341c00f6a411010a7020b20034180036a2204201937030020034188036a2205201a370300200320183703f802200320123703f002200320113703e802200320103703d8022003200f3703e00202400240427f201020117c221320132010542201200f20127c2001ad7c2213200f542013200f511b22011b22144280c8afa025544100427f201320011b2215501b0d00200341e8026a29030021142005290300211520042903002116200341f8026a290300211820032903e002211920032903d802211a4201211320032903f002211c0c010b024002402010201184200f2012848450450d00420021130c010b42002113200341e8086a41186a22014200370300200341e8086a41106a22044200370300200341e8086a41086a22054200370300200342003703e808200341800a6a41d4dcc700410810c5012005200341800a6a41086a2209290000370300200320032900800a3703e808200341900a6a41bba8c700410d10c5012001200341900a6a41086a220a290000370300200420032900900a370300200341f0006a200341e8086a412010d301200341f0006a41106a29030021162003290378211820032802702106200142003703002004420037030020054200370300200342003703e808200341800a6a41d4dcc700410810c50120052009290000370300200320032900800a3703e808200341900a6a41bba8c700410d10c5012001200a290000370300200420032900900a370300200342002016420020061b221620157d2018420020061b2218201454ad7d2219201820147d221a201856201920165620192016511b22011b3703c80f20034200201a20011b3703c00f200341e8086a4120200341c00f6a411010a702200341f80f6a2015370300200341f00f6a2014370300200341c00f6a41086a41013a0000200341d10f6a200341a00c6a41086a290300370000200341d90f6a200341a00c6a41106a290300370000200341e10f6a200341a00c6a41186a290300370000200341023602c00f200320032903a00c3700c90f200341c00f6a10c8020b0b20034188076a201837030020034190076a2016370300200341f0066a201937030020034198076a2015370300200341f8066a20143703002003201c370380072003201b3703a0072003201a3703e8062003200c410020081b3602ac072003200d410020081b3602a807200320134201512201ad3703e0060240024020010d002007200210b4010c010b20072002200341e8066a10d8020b024020032802c40a450d002007102c0b02400240024020174201510d0020134201510d010b20174201520d0120134201510d01200341c00f6a41086a41043a0000200341d10f6a200341a00c6a41086a290300370000200341d90f6a200341b00c6a290300370000200341e10f6a200341b80c6a290300370000200320032903a00c3700c90f200341003602c00f200341c00f6a10c8020c010b200341c00f6a41086a41033a0000200341d10f6a200341a00c6a41086a290300370000200341d90f6a200341b00c6a290300370000200341e10f6a200341b80c6a290300370000200320032903a00c3700c90f200341003602c00f200341c00f6a10c8020b0240200e450d00200341f80f6a200f370300200341f00f6a2010370300200341c00f6a41086a41003a0000200341d10f6a200341a00c6a41086a290300370000200341d90f6a200341b00c6a290300370000200341e10f6a200341b80c6a290300370000200341023602c00f200320032903a00c3700c90f200341c00f6a10c8020b20034188106a201237030020034180106a2011370300200341f80f6a200f370300200341f00f6a2010370300200341c00f6a41086a41033a0000200341d10f6a200341a00c6a41086a290300370000200341d90f6a200341b00c6a290300370000200341e10f6a200341a00c6a41186a290300370000200341023602c00f200320032903a00c3700c90f200341c00f6a10c802200041186a41003a000020004200370308200020032800b0063600192000411c6a200341b0066a41036a280000360000200042003703000c1a0b024020032d00800c22074104470d004101210141022107201221130c030b20032f00810c20032d00830c41107472210120032902840c210f0c030b2005450d00200341f80f6a2014370300200341f00f6a2017370300200341c00f6a41086a41003a0000200341d10f6a200341a00c6a41086a290300370000200341d90f6a200341b00c6a290300370000200341e10f6a200341b80c6a290300370000200341023602c00f200320032903a00c3700c90f200341c00f6a10c8020b20034188056a22014200370300200341f0046a41106a22074200370300200341f0046a41086a220d4200370300200342003703f004200341e00d6a41d4dcc700410810c501200d200341e00d6a41086a2204290000370300200320032900e00d3703f004200341c00f6a41bba8c700410d10c5012001200341c00f6a41086a2205290000370300200720032900c00f370300200341c0006a200341f0046a412010d301200341c0006a41106a2903002112200329034821142003280240210e2001420037030020074200370300200d4200370300200342003703f004200341e00d6a41d4dcc700410810c501200d2004290000370300200320032900e00d3703f004200341c00f6a41bba8c700410d10c50120012005290000370300200720032900c00f3703002003420020124200200e1b221220197d20144200200e1b2214201154ad7d2215201420117d2211201456201520125620152012511b22011b3703c80f20034200201120011b3703c00f200341f0046a4120200341c00f6a411010a702200341a00a6a41086a200341900e6a220141086a290300370300200341043a00800c200320012903003703a00a4100210141012107420021110b200341e00f6a20032903a00a370300200341f40f6a20032800cb09360000200341e80f6a200341a80a6a290300370300200341d80f6a200f370300200320133703c00f200320073a00f00f200320032802c8093600f10f200320113703c80f200320103703d00f024002402001450d002008200c10b4010c010b2008200c200341c00f6a10d4020b20032f00810c20032d00830c41107472210120032902840c210f410421070b024020032802a409450d002008102c0b20074104460d010b200020013b00212000200f37002420004200370308200041236a20014110763a0000200041206a20073a0000200041186a41003a0000200042013703000c140b200341e80f6a2002360200200341cd0f6a200341a80c6a290300370000200341d50f6a200341b00c6a290300370000200341dd0f6a200341a00c6a41186a290300370000200341023a00c40f200341013602c00f200320032903a00c3700c50f200341c00f6a10c802200041186a41003a000020004200370308200020032800d0093600192000411c6a200341d3096a280000360000200042003703000c130b20032d00800e22074104470d010b2008200c10b40120032f00810e20032d00830e41107472210120032902840e210f410421070c010b20032f00810e20032d00830e41107472210120032902840e210f0b024020032802a40c450d002008102c0b20074104460d010b200020013b00212000200f37002420004200370308200041236a20014110763a0000200041206a20073a0000200041186a41003a0000200042013703000c0e0b200341c80f6a2002360200200341013a00c40f200341013602c00f200341c00f6a10c802200041186a41003a000020004200370308200020032800b0063600192000411c6a200341b3066a280000360000200042003703000c0d0b024020032d00e00922014104470d0041012108410221012014210f201321100c030b20032f00e10920032d00e30941107472210720032902e409210f0c030b02402009450d00200341f80f6a2015370300200341f00f6a2016370300200341c80f6a41003a0000200341d10f6a20032903a809370000200341d90f6a200341b0096a290300370000200341e10f6a200341b8096a290300370000200341023602c00f200320032903a0093700c90f200341c00f6a10c8020b200341e00d6a41186a200341800c6a41186a2903002213370300200341e00d6a41106a200341800c6a41106a2903002214370300200341e00d6a41086a200341800c6a41086a2903002215370300200320032903800c22163703e00d20034198106a201937030020034190106a2018370300200341c00f6a41086a41073a0000200341d10f6a2015370000200341d90f6a2014370000200341e10f6a2013370000200341f10f6a20032903a809370000200341f90f6a200341a0096a41106a29030037000020034181106a200341a0096a41186a290300370000200341023602c00f200320163700c90f200320032903a0093700e90f200341013a008910201120197d2012201854ad7d2114201220187d2113200341c00f6a10c8020b200341a80a6a200341b8096a290300370300200320032903b0093703a00a200341043a00e0094200201120147d2012201354ad7d2214201220137d2213201256201420115620142011511b22011b21114200201320011b211241002101410021080b200341e00f6a20032903a00a370300200341f40f6a20032800cb09360000200341e80f6a200341a80a6a290300370300200341d80f6a2010370300200320123703c00f200320013a00f00f200320032802c8093600f10f200320113703c80f2003200f3703d00f024002402008450d002002200710b4010c010b20022007200341c00f6a10d4020b20032f00e10920032d00e30941107472210720032902e409210f410421010b024020032802d409450d002002102c0b20014104470d01200341cd0f6a20032903a809370000200341e80f6a2004360200200341d50f6a200341b0096a290300370000200341dd0f6a200341b8096a290300370000200341003a00c40f200341013602c00f200320032903a0093700c50f200341c00f6a10c802200341043a0090090b200042003703082000200328008909360019200041186a41003a00002000411c6a2003418c096a280000360000200042003703000c070b2003200f37029409200320013a009009200320073b009109200320074110763a0093090b200329029409210f0b20032802900921012000200f370024200041206a2001360000200041186a41003a000020004200370308200042013703000c040b200020013b00212000200f37002420004200370308200041236a20014110763a0000200041206a20073a0000200041186a41003a0000200042013703000c030b200320032800a00c3602e0042003200341a30c6a2800003600e304200041186a41003a000020004200370308200020032802e0043600192000411c6a20032800e304360000200041286a410b360000200041b4bfc4003600242000411b3b0021200041206a20013a0000200042013703000c020b20071083022007102c2003200341f3046a2800003600e30d200320032800f0043602e00d200041186a41003a000020004200370308200020032802e00d3600192000411c6a20032800e30d360000200041286a410b360000200041b4bfc4003600242000411b3b0021200041206a20013a0000200042013703000c010b20071083022007102c2003200341f3046a2800003600e30d200320032800f0043602e00d200041186a41003a000020004200370308200020032802e00d3600192000411c6a20032800e30d360000200041286a410b360000200041b4bfc4003600242000411b3b0021200041206a20013a0000200042013703000b200341f0116a24000b820101027f024020002802082201450d0020002802002102200141186c210103400240200241046a280200450d002002280200102c0b0240200241106a280200450d002002410c6a280200102c0b200241186a2102200141686a22010d000b0b024020002802042202450d0020002802002201450d00200241186c450d002001102c0b0bf80301077f024020002802082201450d0020002802002202200141b4026c6a2103034002402002220441ec016a2802002201450d0020042802e40121022001410c6c210103400240200241046a280200450d002002280200102c0b2002410c6a2102200141746a22010d000b0b0240200441e8016a2802002202450d0020042802e4012201450d002002410c6c450d002001102c0b0240200441f8016a2802002202450d0020024104742101200441f0016a28020041046a210203400240200241046a280200450d002002280200102c0b200241106a2102200141706a22010d000b0b0240200441f4016a2802002202450d0020042802f0012201450d002002410474450d002001102c0b0240200441fc016a2802002201450d0020044180026a2802002202200520021b21052002450d002005450d002001102c0b02402004418c026a2802002202450d0020044188026a2802002201450d002002450d002001102c0b0240200441a0026a2802002202450d00200241c1006c450d00200428029c02102c0b200441b4026a2102200441ac026a410036020020042802a8022106200441013602a802200441b0026a2802002201200720011b210702402001450d002007450d002006102c0b20022003470d000b0b024020002802042202450d0020002802002201450d00200241b4026c450d002001102c0b0ba70201027f02402001450d0020014198026c2102410021010340024002400240024002400240024002400240200020016a22032802000e0b0808080800010203040506070b200341086a280200450d07200341046a280200102c0c070b200341086a280200450d06200341046a280200102c0c060b200341086a10f5060c050b200341086a10f5060c040b200341086a280200450d03200341046a280200102c0c030b0240200341086a280200450d00200341046a280200102c0b200341106a2d00004106490d02200341186a280200450d02200341146a280200102c0c020b200341086a10f5060c010b200341086a10f506200341f0016a2d00004106490d00200341f8016a280200450d00200341f4016a280200102c0b200220014198026a2201470d000b0b0b850501047f02402001450d0020014188026c21024100210303400240024002400240024002400240200020036a22012802000e06060001020304050b200141046a22042802002001410c6a28020010c3020240200141086a2802002205450d0020054198026c450d002004280200102c0b200141106a10f5060c050b200141046a22042802002001410c6a28020010c3020240200141086a2802002205450d0020054198026c450d002004280200102c0b200141206a10f506200141106a2205280200200141186a28020010c402200141146a2802002201450d0420014188026c450d042005280200102c0c040b200141046a22042802002001410c6a28020010c3020240200141086a2802002205450d0020054198026c450d002004280200102c0b200141106a2205280200200141186a28020010c302200141146a2802002201450d0320014198026c450d032005280200102c0c030b200141046a22042802002001410c6a28020010c3020240200141086a2802002205450d0020054198026c450d002004280200102c0b200141206a10f506200141106a2205280200200141186a28020010c402200141146a2802002201450d0220014188026c450d022005280200102c0c020b200141046a22042802002001410c6a28020010c3020240200141086a2802002205450d0020054198026c450d002004280200102c0b200141206a10f506200141106a2205280200200141186a28020010c402200141146a2802002201450d0120014188026c450d012005280200102c0c010b200141186a10f506200141046a22052802002001410c6a28020010c302200141086a2802002201450d0020014198026c450d002005280200102c0b200220034188026a2203470d000b0b0b960401027f0240024002400240024002400240024020002d00000e0700010203040506070b200041046a2802002000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041106a280200200041186a28020010c402200041146a2802002201450d0620002802102200450d0620014188026c450d062000102c0f0b200041046a2802002000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041106a280200200041186a28020010c402200041146a2802002201450d0520002802102200450d0520014188026c450d052000102c0f0b200041046a2802002000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041106a280200200041186a28020010c402200041146a2802002201450d0420002802102200450d0420014188026c450d042000102c0f0b200041046a2802002000410c6a28020010c302200041086a2802002201450d0320002802042200450d0320014198026c450d032000102c0f0b200041086a2802002201450d02200041046a2802002200450d022001450d022000102c0f0b200041086a10f506200041046a220028020010c5022000280200102c0f0b200041086a10f506200041046a220028020010c5022000280200102c0b0bbe06030d7f017e037f230041306b220224002002200141026a2f01003b012e2002200141066a2f01003b012c20022001410a6a2f01003b012a200141046a2d00002103200141056a2d00002104200141086a2d00002105200141096a2d000021062001410c6a2d000021072001410d6a2d0000210820012d0001210920012d0000210a20022001410e6a2f01003b0128200141116a2d0000210b200141106a2d0000210c2002200141126a2f01003b0126200141156a2d0000210d200141146a2d0000210e2002200141166a2f01003b01242001411a6a290100210f200141196a2d00002110200141186a2d000021112001280224210120022f012e211202400240200a0d0020012001280200417f6a220a360200200220123b0122200220022f012c3b0120200220022f012a3b011e200220022f01283b011c200220022f01263b011a200220022f01243b01182002200f3703080240200a0d002001280208200128020c2802001102000240200128020c280204450d002001280208102c0b200141046a220a200a280200417f6a220a360200200a0d002001102c0b0240200941ff01714101460d00200041013a00000c020b200020022f01223b0001200041046a20043a0000200041036a20033a0000200041086a20063a0000200041076a20053a0000200041056a20022f01203b00002000410c6a20083a00002000410b6a20073a0000200041096a20022f011e3b0000200041106a200b3a00002000410f6a200c3a00002000410d6a20022f011c3b0000200041146a200d3a0000200041136a200e3a0000200041116a20022f011a3b0000200041186a20103a0000200041176a20113a0000200041003a0000200041156a20022f01183b0000200041196a20022903083700000c010b200220123b0120200220022f012c3b011e200220022f012a3b011c200220022f01283b011a200220022f01263b01182002200f37020c200220103a000b200220113a000a200220022f01243b0108200041013a000020012001280200417f6a220036020020000d002001280208200128020c2802001102000240200128020c280204450d002001280208102c0b200141046a22002000280200417f6a220036020020000d002001102c0b200241306a24000bfd0202057f017e230041306b22022400200241086a41206a2203200141206a280200360200200241086a41186a2204200141186a290200370300200241086a41106a2205200141106a290200370300200241086a41086a2206200141086a290200370300200220012902003703080240411010322201450d00200020022903082207370200200141a0d7c00036020c20014101360208200142818080801037020020002001360224200041086a2006290300370200200041106a2005290300370200200041186a2004290300370200200041206a2003280200360200024020002d00012007a741ff017172450d00411010322203450d0120034188d7c00036020c20034101360208200342818080801037020020012001280200417f6a2204360200024020040d002001280208200128020c2802001102000240200128020c280204450d002001280208102c0b200141046a22042004280200417f6a220436020020040d002001102c0b200020033602240b200241306a24000f0b1039000bcb0b010c7f230041a0036b22012400200141e0026a22024200370300200141d8026a22034200370300200141c8026a41086a22044200370300200142003703c802200141e8026a41c1dcc700410610c5012004200141e8026a41086a2205290000370300200120012900e8023703c802200141e8026a4196a4c600410610c50120022005290000370300200320012900e802370300200141106a200141c8026a412010c601024002402001280210450d002001280214450d00200141e0026a22064200370300200141d8026a22074200370300200141c8026a41086a22024200370300200142003703c802200141e8026a41c1dcc700410610c5012002200141e8026a41086a2204290000370300200120012900e8023703c802200141e8026a41b0d1c600410e10c501200341086a22082004290000370000200320012900e802370000200141203602fc022001200141c8026a3602f80220014180036a200141c8026a412010b3010240024020012802800322090d00410321050c010b200128028403210a02400240024020014180036a41086a280200220b450d00410121050240024020092d00000e03000401020b200b417f6a4104490d012009280001210c410021050c030b410221050c010b200141003602f002200142013703e8022001410f360294032001200141f8026a360290032001200141e8026a36029c032001412c6a41013602002001420137021c200141b4bcc300360218200120014190036a3602282001419c036a41dcb7c000200141186a103e1a20013502f00242208620013502e802841000024020012802ec02450d0020012802e802102c0b410321050b0b200a450d002009102c0b200141003602d002200142013703c802200141c8026a4100410010d601200141b4026a200c36020020014102200520054103461b22053602b002200141186a200041980210c9081a200141c0026a20012802d002360200200120012903c8023703b802200642003703002007420037030020024200370300200142003703c802200141e8026a41c1dcc700410610c50120022004290000370300200120012900e8023703c802200141e8026a4190cfc600410a10c50120082004290000370000200320012900e802370000200141086a200141c8026a412010c601024002400240200128020c410020012802081b220241016a22002002490d00200141b8026a210c200141e0026a22064200370300200141d8026a22074200370300200141c8026a41086a22044200370300200142003703c802200141e8026a41c1dcc700410610c5012004200141e8026a41086a2202290000370300200120012900e8023703c802200141e8026a4190cfc600410a10c501200341086a22082002290000370000200320012900e802370000200120003602e802200141c8026a4120200141e8026a410410a702200642003703002007420037030020044200370300200142003703c802200141e8026a41c1dcc700410610c50120042002290000370300200120012900e8023703c802200141e8026a41baa4c600410610c50120082002290000370000200320012900e802370000200141003602880320014201370380030240024020050e03030001040b20014180036a41004101102f2001280280032001280288036a41013a0000200120012802880341016a360288030c030b20014180036a41004101102f2001280280032001280288036a41023a0000200120012802880341016a360288030c020b200141186a10f4050c030b20014180036a41004101102f2001280280032001280288036a41003a0000200120012802880341016a22033602880320012802b402210420014180036a20034104102f2001280280032001280288036a2004360000200120012802880341046a360288030b200141186a20014180036a10ec0720014180036a200c10b307200220014180036a41086a28020036020020012001290380033703e802200141c8026a4120200141e8026a10f402200141186a10f4050c010b200010f3050b200141a0036a24000ba90101047f230041106b220324000240412010322204450d002003422037020420032004360200200341004120102f20032802002205200328020822066a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200641206a2202360208200020012005200210a70202402003280204450d002005102c0b200341106a24000f0b1039000bb54106057f017e0e7f027e027f067e230041b0036b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a0e0a00010203090807060504000b20022d0001210420022d00002101200228022422022002280200417f6a22053602000240024020010d00024020050d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200441ff01710d012000420037030820002003280078360019200041186a41003a00002000411c6a200341fb006a280000360000200042003703000c170b20050d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b20034190036a41026a200341286a41026a2d000022023a0000200320032f002822013b019003200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c150b20022d0001210620022d00002105200228022422022002280200417f6a2204360200200141086a2802002107200128020421010240024020050d00024020040d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22052005280200417f6a220536020020050d002002102c0b200641ff01714101470d0102402007450d002001450d002001102c0b2000420037030820002003280078360019200041186a41003a00002000411c6a200341fb006a280000360000200042003703000c160b20040d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22052005280200417f6a220536020020050d002002102c0b02402007450d002001450d002001102c0b20034190036a41026a200341286a41026a2d000022023a0000200320032f002822013b019003200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c140b200141086a290300210820022d0001210420022d00002101200228022422022002280200417f6a220536020002400240024020010d00024020050d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200441ff01710d014108103222020d020c170b20050d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200341a0036a41026a20034190036a41026a2d000022023a0000200320032f00900322013b01a003200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c140b2003420837027c20032002360278200341f8006a41004108102f2003280278220220032802800122016a20083700002003200141086a22013602800141deecc600410a2002200110a7020240200328027c450d002002102c0b200041186a41003a000020004200370308200020032800283600192000411c6a2003412b6a280000360000200042003703000c130b20022d0001210920022d00002104200228022422022002280200417f6a2207360200200141086a28020021062001280204210502400240024020040d002001410c6a2802002104024020070d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200941ff0171450d02410221010c010b4102210120070d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22042004280200417f6a220436020020040d002002102c0b0c120b200341e0006a41002902ecde47370300200341d8006a41002902e4de47370300200341d0006a41002902dcde47370300200341c8006a41002902d4de47370300200341c0006a41002902ccde47370300200341386a41002902c4de47370300200341286a41086a41002902bcde47370300200341002902b4de47370328200341a0036a2004ad4220862005ad84100310fc0720032802a0032202450d0d20032802a40321012003200341a0036a41086a28020036021c2003200236021820034190036a200341186a108a022003280290032207450d0c20034198036a220a280200210b200328029403210920034190036a200341186a108a020240024002400240200328029003220c450d00200328029403210d200328021c220e4104490d01200a280200210f2003280218220a28000021102003200a41046a3602182003200e417c6a221136021c20114104490d022003200a41086a360218200a28000421122003200e41786a221136021c20114104490d0b2003200e41746a36021c2003200a410c6a360218200a28000821132003200341186a10870220032802000d0e20032802042211200328021c410c6e220a200a20114b1bad420c7e2208422088a7450d030c140b20090d0e0c0f0b0240200d450d00200c102c0b20090d0d0c0e0b0240200d450d00200c102c0b20090d0c0c0d0b2008a7220a417f4c0d1002400240200a0d00410421140c010b200a10322214450d140b200a410c6ead210802402011450d000340200341003a009803200328021c220a450d0b2003280218220e2d000021152003200a417f6a221636021c200320153a009003200341013a0098032003200e41016a3602182016450d0a2003280218220e2d000021152003200a417e6a221636021c2003200e41016a360218200341023a009803200320153a0091032016450d0a2003280218220e2d000021152003200a417d6a221636021c2003200e41016a360218200341033a009803200320153a0092032016450d0a2003280218220e2d000021152003200a417c6a221636021c2003200e41016a360218200341043a009803200320153a0093032016450d0a2003280218220e2d000021152003200a417b6a221636021c2003200e41016a360218200341053a009803200320153a0094032016450d0a2003280218220e2d000021152003200a417a6a221636021c2003200e41016a360218200341063a009803200320153a0095032016450d0a2003280218220e2d000021152003200a41796a221636021c2003200e41016a360218200341073a009803200320153a0096032016450d0a20032003280218220e2d00003a0097032003200e41016a3602182003200a41786a221536021c20154104490d0b2003290390032117200e28000121152003200a41746a36021c2003200e41056a36021802402008422088a7220a2008a7470d00200a41016a220e200a490d13200a4101742216200e200e2016491b220e4104200e41044b1bad420c7e2218422088a70d1341000d132018a7220e4100480d13200a410c6c2019200a1b211902400240024020144100200a1b220a0d00200e0d01410421140c020b024020190d00200e0d01410421140c020b200a2019200e10352214450d180c010b200e10322214450d170b200842808080807083200e410c6ead8421080b20142008422088a7410c6c6a220a2015360208200a201737020020084280808080107c21082011417f6a22110d000b0b2014450d0a2008a7210a0240200328021c41044f0d000240200a450d00200a410c6c450d002014102c0b0240200d450d00200c102c0b2009450d0d0c0c0b2008422088a7210e2003280218280000211102402001450d002002102c0b200341b0016a200e360200200341ac016a200a360200200341a8016a201436020020034194016a200f36020020034190016a200d3602002003418c016a200c360200200341f8006a410c6a200b360200200341f8006a41086a2009360200200320113602b401200341013602a401200320133602a0012003201236029c01200320103602980120034101360288012003200736027c2003410136027802400240200b200341286a410c6a200341286a41086a20032802284101461b280200470d00200328022c22022007460d0120072002200b10cc08450d010b200341e8006a410110a2050c070b02402012200328024c4b0d00200341e8006a410210a2050c070b200341043a0068200341f8006a10ff02200341286a10ff02200341266a20032d006b3a0000200320032f00693b01240c0f0b2002411a6a2901002108200241196a2d00002107200241186a2d00002106200241166a2f01002109200241156a2d0000210c200241146a2d0000210a200241126a2f0100210d200241116a2d0000210e200241106a2d0000210b2002410e6a2f010021112002410d6a2d0000210f2002410c6a2d000021102002410a6a2f01002114200241096a2d00002112200241086a2d00002115200241066a2f01002116200241056a2d00002119200241046a2d00002113200241026a2f0100211a20022d0001210420022d00002101200228022422022002280200417f6a22053602000240024002400240024002400240024020010d00024020050d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200441ff01714101470d0120032008370340200320073a003f200320063a003e200320093b013c2003200c3a003b2003200a3a003a2003200d3b01382003200e3a00372003200b3a0036200320113b01342003200f3a0033200320103a0032200320143b0130200320123a002f200320153a002e200320163b012c200320193a002b200320133a002a2003201a3b012820034190036a41c1dcc700410610c501200341f8006a41acc8c700410710c501200341a0036a200341286a10d50220032802a803220241206a2201417f4c0d170240024020010d00410121050c010b200110322205450d1b0b200341003602702003200136026c20032005360268200341e8006a4100411010c8012003280268200328027022016a2205200329009003370000200541086a20034190036a41086a2900003700002003200141106a2201360270200341e8006a2001411010c8012003280268200328027022016a22052003290078370000200541086a200341f8006a41086a2900003700002003200141106a220536027020032802a0032101200341e8006a2005200210c80120032802682205200328027022046a2001200210c9081a2003200420026a2202360270024020032802a403450d002001102c0b200341f8006a2005200210d602200341b8016a290300211b200341b0016a290300211c200341a8016a290300211d200341a0016a290300211e20034198016a290300211f20034190016a2903002120200341f8006a41106a2903002117200341c4016a28020021022003290380012118200329037821080240200328026c450d002005102c0b0240200842015222010d0020020d030b0240024020010d0020182017844200520d010b20084201520d05201e202084201c84201d201f84201b8484500d050b200341186a410410a2050c030b20050d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200341023a00180c040b200341186a410510a2050b20032d00184104460d01200329021c21080c020b20034190036a41c1dcc700410610c501200341f8006a41acc8c700410710c501200341a0036a200341286a10d50220032802a803220241206a2201417f4c0d120240024020010d00410121050c010b200110322205450d160b200341003602702003200136026c20032005360268200341e8006a4100411010c8012003280268200328027022016a2205200329009003370000200541086a20034190036a41086a2900003700002003200141106a2201360270200341e8006a2001411010c8012003280268200328027022016a22052003290078370000200541086a200341f8006a41086a2900003700002003200141106a220536027020032802a0032101200341e8006a2005200210c80120032802682205200328027022046a2001200210c9081a2003200420026a2202360270024020032802a403450d002001102c0b2005200210ce0221020240200328026c450d002005102c0b02402002450d0020034190036a41c1dcc700410610c501200341f8006a41acc8c700410710c501200341a0036a200341286a10d50220032802a803220241206a2201417f4c0d130240024020010d00410121050c010b200110322205450d170b200341003602702003200136026c20032005360268200341e8006a4100411010c8012003280268200328027022016a2205200329009003370000200541086a20034190036a41086a2900003700002003200141106a2201360270200341e8006a2001411010c8012003280268200328027022016a22052003290078370000200541086a200341f8006a41086a2900003700002003200141106a220136027020032802a0032105200341e8006a2001200210c80120032802682201200328027022046a2005200210c9081a2003200420026a2202360270024020032802a403450d002005102c0b200341f8006a2001200210d6020240200329037842015222050d002001200210b4010b2005200341c4016a280200457221020240200328026c450d002001102c0b20020d0041002802d8d2484104490d002003413c3602a403200341faecc6003602a00341002802d4d248210241002802d0d248210141002802dcd2482105200341b8016a41be09360200200341b0016a42dd80808010370300200341ac016a41b8a2c600360200200341a4016a420c370200200341a0016a41bcedc60036020020034198016a420137030020034188016a420137030020034180016a410636020020034194016a20034190036a360200200341b4b5c80036028401200341b6edc60036027c200341043602782003410436029403200241e0a3c000200541024622051b28021021022003200341a0036a36029003200141f8a3c00020051b200341f8006a20021103000b200341f8006a41086a41043a000020034189016a200341286a41086a29030037000020034191016a200341386a29030037000020034199016a200341c0006a290300370000200320032903283700810120034100360278200341f8006a10c802200341043a00180b420021082000420037030820002003280078360019200041186a41003a00002000411c6a200341fb006a2800003600000c010b2003280218210220002008370024200041206a2002360000200041186a41003a000020004200370308420121080b200020083703000c110b20022d0001210920022d00002104200228022422022002280200417f6a2207360200200141086a2802002106200128020421050240024020040d002001410c6a2802002101024020070d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22042004280200417f6a220436020020040d002002102c0b200941ff01710d0120052001109d0402402006450d002005450d002005102c0b2000420037030820002003280078360019200041186a41003a00002000411c6a200341fb006a280000360000200042003703000c120b20070d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b02402006450d002005450d002005102c0b20034190036a41026a200341286a41026a2d000022023a0000200320032f002822013b019003200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c100b20022d0001210c20022d00002106200228022422022002280200417f6a22093602002001410c6a2802002104200141086a2802002107200128020421050240024020060d00024020090d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200c41ff01710d0102402004450d0020052004410c6c6a21012005210203402002280200200241086a28020010b4012002410c6a22022001470d000b2004410c6c21012005210203400240200241046a280200450d002002280200102c0b2002410c6a2102200141746a22010d000b0b02402007450d002005450d002007410c6c450d002005102c0b2000420037030820002003280078360019200041186a41003a00002000411c6a200341fb006a280000360000200042003703000c110b20090d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b02402004450d002004410c6c21012005210203400240200241046a280200450d002002280200102c0b2002410c6a2102200141746a22010d000b0b02402007450d002005450d002007410c6c450d002005102c0b20034190036a41026a200341286a41026a2d000022023a0000200320032f002822013b019003200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0f0b20034180016a2001410c6a28020036020020022d0000210520022d00012107200228022422022002280200417f6a2204360200200320012902043703780240024020050d00024020040d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200741ff01710d0102402003280280012201450d0020032802782202200141186c6a210103402002280200200241086a2802002002410c6a280200200241146a28020010a702200241186a22022001470d000b0b200341f8006a10c102200041186a41003a000020004200370308200020032800283600192000411c6a2003412b6a280000360000200042003703000c100b20040d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200341f8006a10c102200341a0036a41026a20034190036a41026a2d000022023a0000200320032f00900322013b01a003200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0e0b2001410c6a2802002106200141086a28020021092001280204210720022d0001210420022d00002101200228022422022002280200417f6a2205360200024002400240024020010d00024020050d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200441ff01710d0120074101460d0241edecc600410d10b4010c030b20050d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200341a0036a41026a20034190036a41026a2d000022023a0000200320032f00900322013b01a003200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0f0b200341003602800120034201370378200341f8006a41004104102f200328027820032802800122026a20093600002003200241046a220236028001200341f8006a20024104102f2003280278220220032802800122016a20063600002003200141046a22013602800141edecc600410d2002200110a702200328027c450d002002102c0b20034184016a200636020020034180016a20093602002003200736027c200341043a0078200341f8006a109a06200041186a41003a000020004200370308200020032800283600192000411c6a2003412b6a280000360000200042003703000c0d0b20022d0001210920022d00002104200228022422022002280200417f6a2207360200200141086a2802002106200128020421050240024020040d002001410c6a2802002101024020070d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22042004280200417f6a220436020020040d002002102c0b200941ff01710d0141e8ecc60041052005200110a70220034180016a41023a000020034100360278200341f8006a10c80202402006450d002005450d002005102c0b2000420037030820002003280028360019200041186a41003a00002000411c6a2003412b6a280000360000200042003703000c0e0b20070d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b02402006450d002005450d002005102c0b200341a0036a41026a20034190036a41026a2d000022023a0000200320032f00900322013b01a003200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0c0b200341f8006a10ff020c070b0240200d450d00200c102c0b20090d030c040b200341003a0098030b2008a7220a450d002014450d00200a410c6c450d002014102c0b0240200d450d00200c102c0b2009450d010b2007102c0b2001450d002002102c0b200341e8006a410310a2050b200341286a10ff02200341246a41026a220220032d006b3a0000200320032f00693b012420032d006822014104460d00200329026c2108200341146a41026a20022d00003a0000200320032f01243b01140c020b41e8ecc60041052005200410a70220034180016a41023a000020034100360278200341f8006a10c80202402006450d002005450d002005102c0b2000420037030820002003280009360019200041186a41003a00002000411c6a2003410c6a280000360000200042003703000c020b103b000b02402006450d002005450d002005102c0b200341106a41026a200341146a41026a2d000022023a0000200320032f011422053b0110200041206a20013a0000200041186a41003a000020004200370308200020053b0021200041236a20023a000020002008370024200042013703000b200341b0036a24000f0b1039000bfc4608017f017e057f017e017f037e147f017e230041f0076b22042400200441206a41186a20024180026a290000370300200441206a41106a200241f8016a290000370300200441206a41086a200241f0016a290000370300200420022900e80137032020022903002105200441d8056a200241880210c9081a0240024002400240024002400240024002400240200441d8056a10270d00200441d8056a410110a90520004201370300200041286a200441d8056a41206a290300370300200041206a200441d8056a41186a290300370300200041186a200441d8056a41106a290300370300200041106a200441d8056a41086a290300370300200020042903d8053703080c010b2003280210210620032802002107200441d8056a41186a22024200370300200441d8056a41106a22084200370300200441d8056a41086a22094200370300200442003703d805200441e0016a41c7dcc700410410c5012009200441e0016a41086a220a290000370300200420042900e0013703d805200441e0016a41bcd6c500410b10c5012002200a290000370300200820042900e001370300200441106a200441d8056a10cf0202402007420020052004290318420020042802101b7d220b200b2005561b220b42d80480a7417f200b428080808080cb00541b470d0020044184036a200441206a41086a2903003702002004418c036a200441206a41106a29030037020020044194036a200441206a41186a290300370200200441e2c289ab063602f802200420042903203702fc0220044190016a41106a200341106a28020036020020044190016a41086a200341086a2902003703002004200329020037039001200441c8036a200441f8026a20044190016a10ce06200428028804450d02200441d8056a41066a200441c8036a41d00010c9081a200441e0016a200441d8056a41d60010c9081a200441c0006a200441e0016a41066a41d00010c9081a20044190016a200441c0006a41d00010c9081a4101210341002109024020012d00004101470d00200441d8056a41186a2202200141196a290000370300200441d8056a41106a2208200141116a290000370300200441d8056a41086a2209200141096a290000370300200420012900013703d805412010322203450d09200320042903d805370000200341186a2002290300370000200341106a2008290300370000200341086a2009290300370000410121090b200420053703e001200441e0016a41086a20044190016a41d00010c9082102200420063602bc02200420073602b80241d00010322208450d0820044198046a41086a2201200241086a29030037030020044198046a41106a220a200241106a29030037030020044198046a41186a220c200241186a2903003703002004200229030037039804200441e0016a41286a290300210b20044190026a290300210d200441e0016a41386a290300210e200441a0026a290300210f200441d8056a200441e0016a41c8006a10a502200841386a200f3703002008200e370330200841286a200d3703002008200b370320200841186a200c290300370300200841106a200a290300370300200841086a20012903003703002008200429039804370300200820042903d805370340200841c8006a200441d8056a41086a280200360200200420093602c802200420093602c402200420033602c002410810322202450d08200442083702cc05200420023602c805200441c8056a41004108102f20042802c80520042802d00522026a20053700002004200241086a3602d005200441f8026a41eddcc700410810c501200441c8036a41d4d0c000411210c501200441d8056a41ddd5c00010a10220042802e005220241206a2203417f4c0d050240024020030d00410121010c010b200310322201450d090b20044100360290052004200336028c05200420013602880520044188056a4100411010c80120042802880520042802900522036a220120042900f802370000200141086a200441f8026a41086a2900003700002004200341106a22033602900520044188056a2003411010c80120042802880520042802900522036a220120042900c803370000200141086a200441c8036a41086a2900003700002004200341106a22013602900520042802d805210320044188056a2001200210c801200428028805220120042802900522096a2003200210c9081a2004200920026a220236029005024020042802dc05450d002003102c0b200441d8056a2001200210f60420042902dc05420020042802d80522021b210b2002410120021b210c0240200428028c05450d002001102c0b2004200b4220883e02dc042004200c3602d804200441086a200441d8046a10870220042802080d03200428020c221020042802dc0441286e2202200220104b1bad42287e220d422088a70d05200da72202417f4c0d050240024020020d00410821110c010b200210322211450d090b200441003602f004200420113602e8042004200241286e22023602ec04410021120240024002402010450d0041002113034020042802dc0422034108490d03201341016a211320042802d8042209290000210d2004200341786a220a3602dc042004200941086a3602d80441002102200441003a00f805200341776a21030340200a2002460d03200441d8056a20026a200920026a220141086a2d00003a00002004200141096a3602d8042004200241016a22013a00f805200420033602dc042003417f6a21032001210220014120470d000b200441c8036a41186a2202200441d8056a41186a290300370300200441c8036a41106a2203200441d8056a41106a290300370300200441c8036a41086a2209200441d8056a41086a290300370300200420042903d8053703c803200141ff01714120490d0320044188056a41086a2009290300220e370300200441d0026a41186a22012002290300370300200441d0026a41106a22022003290300370300200441d0026a41086a2203200e370300200420042903c803220e370388052004200e3703d002200441b8046a41186a22092001290300370300200441b8046a41106a22012002290300370300200441b8046a41086a220a2003290300370300200420042903d0023703b8040240201220042802ec04470d00200441e8046a201210940520042802f004211220042802e80421110b2011201241286c6a2202200d370300200220042903b804370308200241106a200a290300370300200241186a2001290300370300200241206a20092903003703002004201241016a22123602f00420132010470d000b20042802ec04210220042802e80421110b2002410020111b21092012410020111b21012011410820111b21030c060b200241ff0171450d00200441003a00f8050b20042802ec042202450d03200241286c450d0320042802e804102c0c030b200441d8056a410210a90520004201370300200041286a200441d8056a41206a290300370300200041206a200441d8056a41186a290300370300200041186a200441d8056a41106a290300370300200041106a200441e0056a290300370300200020042903d8053703080b2003280204210102402003410c6a2802002202450d002002410c6c21002001210203400240200241046a280200450d002002280200102c0b2002410c6a2102200041746a22000d000b0b200341086a2802002202450d052002410c6c450d052001102c0c050b200441d8056a410210a90520004201370300200041286a200441d8056a41206a290300370300200041206a200441d8056a41186a290300370300200041186a200441d8056a41106a290300370300200041106a200441d8056a41086a290300370300200020042903d8053703080c040b4108210341002101410021090b200441d8056a41ddd5c000200441c8056a10a002200441c8036a20042802d805220a20042802e00510fc0420042902cc03420020042802c80322021b210d2002410120021b2114024020042802dc05450d00200a102c0b200441d0026a41206a2001360200200441ec026a2009360200200441d0026a41106a200d370300200441d0026a41086a200441c8056a41086a280200360200200420042903c8053703d002200420033602e802200420143602dc02200d422088210d0240200ba7450d00200c102c0b200da72115200441d8056a41086a200841086a290300370300200441d8056a41106a200841106a290300370300200441d8056a41186a200841186a290300370300200441d8056a41206a200841206a290300370300200441d8056a41286a2202200841286a290300370300200441d8056a41306a2203200841306a290300370300200441d8056a41386a2201200841386a290300370300200441c8036a41086a200841cc006a280200360200200420082903003703d805200420082902443703c80302400240200828024022090d00410021090c010b20044188056a41386a220a200129030037030020044188056a41306a2201200329030037030020044188056a41286a2203200229030037030020044188056a41206a2202200441d8056a41206a29030037030020044188056a41186a220c200441d8056a41186a29030037030020044188056a41106a2211200441d8056a41106a29030037030020044188056a41086a2212200441d8056a41086a290300370300200441e8046a41086a2210200441c8036a41086a280200360200200420042903d80537038805200420042903c8033703e804200441f8026a41386a200a290300370300200441f8026a41306a2001290300370300200441f8026a41286a2003290300370300200441f8026a41186a200c290300370300200441f8026a41106a2011290300370300200441f8026a41086a2012290300370300200441b8036a2009360200200420022903003703980320042004290388053703f802200441bc036a220220042903e804370200200241086a2010280200360200410810322202450d04200442083702dc05200420023602d805200441d8056a41004108102f20042802d805220120042802e00522026a2005370000200441d8056a410c6a220341002900ddd540370000200341086a41002900e5d5403700002004200241086a3602e0052004200441f8026a3602f405200441b8046a200441d8056a10bf06024020042802dc05450d002001102c0b200441d8056a200441b8046a10a20220042802d805220320042802e00510ce022102024020042802dc05450d002003102c0b02400240024020020d00200441c8036a200441f8026a41d00010c9081a20044198046a200441c0026a10a602200441d8056a200441c8036a41d00010c9081a200441d8056a41d0006a220241086a20044198046a41086a2802003602002002200429039804370200200441c8036a200441b8046a10a20220042802c803220220042802d003200441d8056a109205024020042802cc03450d002002102c0b0240200428029c062202450d00200241306c450d00200428029806102c0b024020042802ac0641ffffff3f71450d0020042802a806102c0b200441c8036a41186a2211200441b8046a41186a290300370300200441c8036a41106a2212200441b8046a41106a290300370300200441c8036a41086a2210200441b8046a41086a290300370300200420042903b8043703c8034100210220042802e802210a0240024020042802f002220c0e020103000b41002102200c2103034020022003410176220120026a2209200a200941286c6a2903002005561b2102200320016b220341014b0d000c030b0b200441d8056a41186a2011290300370300200441d8056a41106a2012290300370300200441d8056a41086a2010290300370300200420042903c8033703d805410021030c020b4100210920042802bc032202450d02200241306c450d0220042802b803102c0c020b200a200241286c6a290300210b200441d8056a41186a2011290300370300200441d8056a41106a2012290300370300200441d8056a41086a2010290300370300200420042903c8033703d805200c20022002200b2005546a200b2005511b22034f0d002003200c1044000b0240200c20042802ec02470d00200441d0026a41186a200c10940520042802e402211520042802e802210a0b200a200341286c6a220241286a2002200c20036b41286c10ca081a20022005370300200220042903d805370308200241106a200441d8056a41086a2203290300370300200241186a200441d8056a41106a2201290300370300200241206a200441d8056a41186a220a290300370300410121092004200c41016a3602f002200a200441c8036a41186a2903003703002001200441c8036a41106a2903003703002003200441c8036a41086a290300370300200420042903c8033703d8050240201520042802e002470d00200441d0026a410c6a2015410110d60120042802e40221150b20042802dc02221420154105746a220220042903d805370000200241186a200a290300370000200241106a2001290300370000200241086a20032903003700002004201541016a22153602e4020b200841d0006a220220026b220341d0006d210102402003450d00200141d0006c2103200241c0006a210203400240200241046a2802002201450d00200141306c450d002002280200102c0b200241d0006a2102200341b07f6a22030d000b0b2008102c024020090d00200441d0026a10d4074100210c0c020b0240024002402015450d00201541057421082004419c066a2102201421030340200441c8056a200310a202200441d8056a20042802c805220920042802d00510e804200441c8036a41086a220a200441d8056a41086a290300370300200441c8036a41106a220c200441d8056a41106a290300370300200441c8036a41186a2211200441d8056a41186a290300370300200441c8036a41206a2212200441d8056a41206a290300370300200441c8036a41286a2210200441d8056a41286a290300370300200441c8036a41306a2213200441d8056a41306a290300370300200441c8036a41386a2216200441d8056a41386a290300370300200441b8046a41086a2217200241086a290200370300200441b8046a41106a2218200241106a290200370300200441b8046a41186a2219200241186a280200360200200420042903d8053703c803200420022902003703b80402402004280298062201450d00200441f8026a41386a2016290300370300200441f8026a41306a2013290300370300200441f8026a41286a2010290300370300200441f8026a41206a2012290300370300200441f8026a41186a2011290300370300200441f8026a41106a200c290300370300200441f8026a41086a200a29030037030020044198046a41086a201729030037030020044198046a41106a201829030037030020044198046a41186a2019280200360200200420042903c8033703f802200420042903b804370398040b024020042802cc05450d002009102c0b20010d02200341206a2103200841606a22080d000b0b4108210c4200210d0c010b20044188056a41386a2202200441f8026a41386a29030037030020044188056a41306a2209200441f8026a41306a29030037030020044188056a41286a220a200441f8026a41286a29030037030020044188056a41206a220c200441f8026a41206a29030037030020044188056a41186a2211200441f8026a41186a29030037030020044188056a41106a2212200441f8026a41106a29030037030020044188056a41086a2210200441f8026a41086a290300370300200441e8046a41086a221320044198046a41086a290300370300200441e8046a41106a221620044198046a41106a290300370300200441e8046a41186a221720044198046a41186a280200360200200420042903f8023703880520042004290398043703e80441e0001032221a450d04201a200429038805370300201a2001360240201a20042903e804370244201a41386a2002290300370300201a41306a2009290300370300201a41286a200a290300370300201a41206a200c290300370300201a41186a2011290300370300201a41106a2012290300370300201a41086a2010290300370300201a41cc006a2013290300370200201a41d4006a2016290300370200201a41dc006a201728020036020020044281808080103702dc042004201a3602d804024020084120460d00200341206a2111201420154105746a221b41606a211c200441d8056a41c4006a21024101211d0340201121030340200441c8056a200310a202200441d8056a20042802c805220c20042802d00510e804200441c8036a41086a2208200441d8056a41086a2219290300370300200441c8036a41106a2209200441d8056a41106a2215290300370300200441c8036a41186a220a200441d8056a41186a2214290300370300200441c8036a41206a2211200441d8056a41206a221e290300370300200441c8036a41286a2212200441d8056a41286a221f290300370300200441c8036a41306a2210200441d8056a41306a2220290300370300200441c8036a41386a2213200441d8056a41386a2221290300370300200441b8046a41086a2216200241086a290200370300200441b8046a41106a2217200241106a290200370300200441b8046a41186a2218200241186a280200360200200420042903d8053703c803200420022902003703b80402402004280298062201450d00200441f8026a41386a2013290300370300200441f8026a41306a2010290300370300200441f8026a41286a2012290300370300200441f8026a41206a2011290300370300200441f8026a41186a200a290300370300200441f8026a41106a2009290300370300200441f8026a41086a200829030037030020044198046a41086a201629030037030020044198046a41106a201729030037030020044198046a41186a2018280200360200200420042903c8033703f802200420042903b804370398040b024020042802cc05450d00200c102c0b024020010d00201b200341206a2203470d010c030b0b20044188056a41386a220c200441f8026a41386a29030037030020044188056a41306a2211200441f8026a41306a29030037030020044188056a41286a2212200441f8026a41286a29030037030020044188056a41206a2210200441f8026a41206a29030037030020044188056a41186a2213200441f8026a41186a29030037030020044188056a41106a2216200441f8026a41106a29030037030020044188056a41086a2217200441f8026a41086a290300370300200441e8046a41086a221820044198046a41086a290300370300200441e8046a41106a222220044198046a41106a290300370300200441e8046a41186a222320044198046a41186a280200360200200420042903f8023703880520042004290398043703e804201920172903003703002015201629030037030020142013290300370300201e2010290300370300201f2012290300370300202020112903003703002021200c29030037030020042004290388053703d8052008201829030037030020092022290300370300200a2023280200360200200420042903e8043703c8030240201d20042802dc04470d00200441d8046a201d410110940220042802d804211a0b200341206a2111201a201d41e0006c6a220c20042903d805370300200c41106a2015290300370300200c41086a20192903003703002020290300210b2021290300210d201f290300210e201e290300210f20142903002124200c41c0006a2001360200200c41186a2024370300200c41206a200f370300200c41286a200e370300200c41c4006a20042903c803370200200c41386a200d370300200c41306a200b370300200c41cc006a2008290300370200200c41d4006a2009290300370200200c41dc006a200a2802003602002004201d41016a221d3602e004201c2003470d000b0b20042802d804210c20042902dc04210d0b200441d8056a41206a200441d0026a41206a2802002203360200200441d8056a41186a200441d0026a41186a290300220b370300200441d8056a41106a200441d0026a41106a290300370300200441d8056a41086a200441d0026a41086a290300370300200420042903d0023703d805200341286c4104722202417f4c0d00200210322201450d03200441003602a0042004200236029c04200420013602980420044198046a2003108f0102402003450d00200ba72202200341286c6a210a20042802a004210303402002290300210b20044198046a20034108102f20042802980420042802a00422036a200b3700002004200341086a22083602a004412010322203450d05200442203702cc03200420033602c803200441c8036a41004120102f20042802c803220120042802d00322096a2203200241086a290000370000200341086a200241106a290000370000200341106a200241186a290000370000200341186a200241206a2900003700002004200941206a22033602d00320044198046a20082003102f20042802980420042802a00422086a2001200310c9081a2004200820036a22033602a004024020042802cc03450d002001102c0b200241286a2202200a470d000b0b200441f8026a41eddcc700410810c501200441c8036a41d4d0c000411210c50120044188056a41ddd5c00010a102200428029005220241206a2203417f4c0d000240024020030d00410121010c010b200310322201450d040b200441003602c004200420033602bc04200420013602b804200441b8046a4100411010c80120042802b80420042802c00422036a220120042900f802370000200141086a200441f8026a41086a2900003700002004200341106a22033602c004200441b8046a2003411010c80120042802b80420042802c00422036a220120042900c803370000200141086a200441c8036a41086a2900003700002004200341106a22013602c0042004280288052103200441b8046a2001200210c80120042802b804220120042802c00422086a2003200210c9081a2004200820026a22023602c0040240200428028c05450d002003102c0b2001200220044198046a108a03024020042802bc04450d002001102c0b0240200428029c04450d00200428029804102c0b200441c8036a41ddd5c000200441d8056a10a00220042802c803220220042802d003200441e4056a108d05024020042802cc03450d002002102c0b200441d8056a10d4070c010b103b000b024020042802c40241ffffff3f71450d0020042802c002102c0b0240200c0d000240200441ac026a2802002202450d00200241306c450d00200441a8026a280200102c0b200441d8056a410310a90520004201370300200041286a200441d8056a41206a290300370300200041206a200441d8056a41186a290300370300200041186a200441d8056a41106a290300370300200041106a200441e0056a290300370300200020042903d8053703080c010b20064101200641014b1b2202418094ebdc036e2002418094ebdc03704100476a22034101200341014b1b220320024b0d022004410036028003200442043703f802200441f8026a4100200d422088a722081095022002200841036c220120022001491b20036ead428094ebdc037e200220036ead8042ffffffff0f83220b200b7e220b42808090bbbad6adf00d200b42808090bbbad6adf00d541b428094ebdc0380210b20042802800321090240024020080d0020042802f802210a0c010b200ba7210120042802f802220a20094102746a210220082103034020022001360200200241046a21022003417f6a22030d000b200920086a21090b2004200936028003200c2008200a2009200710a3022102410810322203450d01200442083702cc03200420033602c803200441c8036a41004108102f20042802c80320042802d00322036a2005370000200441c8036a41146a41002900e5d5403702002004200341086a3602d003200441002900ddd5403702d403200441e4056a20042903d003370200200441d8056a41146a200441d8036a290300370200200441f4056a200441e0036a280200360200200441f8056a20023a0000200441043602d805200420042903c8033702dc05200441d8056a10c802024020042802fc0241ffffffff0371450d00200a102c0b02402008450d00200841e0006c2103200c41d4006a210203400240200241706a2802002201450d00200141306c450d002002416c6a280200102c0b0240200228020041ffffff3f71450d002002417c6a280200102c0b200241e0006a2102200341a07f6a22030d000b0b0240200da72202450d00200241e0006c450d00200c102c0b0240200441ac026a2802002202450d00200241306c450d00200441a8026a280200102c0b2000420037030820004200370300200041186a41013a0000200441f0076a24000f0b200441f0076a24000f0b1039000b41f0bcc300411941f8acc800103c000bcc0101037f200028022422012001280200417f6a220236020020002d0001210302400240024020002d00000d004100210020020d022001280208200128020c2802001102000240200128020c280204450d002001280208102c0b200141046a22022002280200417f6a22023602002002450d010c020b4101210020020d012001280208200128020c2802001102000240200128020c280204450d002001280208102c0b200141046a22022002280200417f6a220236020020020d010b2001102c0b200341ff01714102472000720bc90803067f017e027f230041e0016b22012400200141c0006a41186a22024200370300200141c0006a41106a22034200370300200141c0006a41086a2204420037030020014200370340200141306a41dcdcc700410a10c5012004200141306a41086a220529000037030020012001290030370340200141306a41cddec400410610c5012002200529000037030020032001290030370300200141e8006a200141c0006a412010c90120012d00682105200220014181016a2900003703002003200141f9006a2900003703002004200141f1006a290000370300200120012900693703400240024020054101470d0020002001290340370000200041186a2002290300370000200041106a2003290300370000200041086a20042903003700000c010b200110890702400240200128020841246c2203450d002001280200220220036a2203415c6a21060340024020022d00004101460d002003200241246a2202470d010c020b200241016a2800002104200241086a28020021052001200241106a280200360244200120053602400240200441c28289aa04460d0020062002462104200241246a21022004450d010c020b0b200141e8006a200141c0006a102920012903684203510d00200141e8006a41106a22022802002103200141e8006a41186a2204420037030020024200370300200141e8006a41086a420037030020014200370368200141e8006a41ffdcc700410710c501200141c0006a418893c700410a10c5012004200141c0006a41086a29000037030020022001290040370300200141c0006a200141e8006a10e1014101210420012802402202410120021b2105024020032001290244420020021b2207422088a74f0d00200141106a41186a200520034105746a220241186a290000370300200141106a41106a200241106a290000370300200141106a41086a200241086a29000037030020012002290000370310410021040b02402007a72202450d00200241ffffff3f71450d002005102c0b2004450d010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700002001102b0c010b200141e8006a41186a2202200141106a41186a290300370300200141e8006a41106a2203200141106a41106a290300370300200141e8006a41086a2204200141106a41086a290300370300200120012903103703682001200141e8006a360264200141c0006a41186a22054200370300200141c0006a41106a22064200370300200141c0006a41086a2208420037030020014200370340200141306a41dcdcc700410a10c5012008200141306a41086a220929000037030020012001290030370340200141306a41cddec400410610c5012005200929000037030020062001290030370300200141c0006a4120200141e4006a10cc01200041186a2002290300370000200041106a2003290300370000200041086a2004290300370000200020012903683700002001102b0b200141e0016a24000b11002001ad4220862000ad8410214101460b900204017f017e017f017e230041d0006b220224002002412036020420022001360200200241086a2001412010b30102400240200228020822010d00420021030c010b200228020c210402400240200241086a41086a2802004108490d0020012900002105420121030c010b20024100360220200242013703182002410f36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c200241b4bcc3003602382002200241286a360248200241346a41dcb7c000200241386a103e1a200235022042208620023502188410000240200228021c450d002002280218102c0b420021030b2004450d002001102c0b2000200537030820002003370300200241d0006a24000b8e0301057f230041d0006b22022400200241de96c800410710c501200241106a41c097c800410810c5012002200136022c200241306a2002412c6a410410c904200241cc006a2002412c6a41046a3602002002200241c0006a36024420022002412c6a3602482002200241306a360240200241206a200241c0006a107e024002402002280228220341206a2201417f4c0d000240024020010d00410121040c010b200110322204450d020b2000200136020420002004360200200041086a2201410036020020004100411010c8012000280200200128020022046a220520022900003700002001200441106a2204360200200541086a200241086a29000037000020002004411010c8012000280200200128020022046a220520022900103700002001200441106a2206360200200541086a200241106a41086a2900003700002002280220210420002006200310c8012000280200200128020022006a2004200310c9081a2001200020036a36020002402002280224450d002004102c0b200241d0006a24000f0b103b000b1039000b8d0b02027f067e230041d0016b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00200041023a00300c010b200341186a280200210220032802142104200341003a008801024002402002450d00200320012d00003a0068200341013a008801024020024101460d00200320012d00013a0069200341023a00880120024102460d00200320012d00023a006a200341033a00880120024103460d00200320012d00033a006b200341043a00880120024104460d00200320012d00043a006c200341053a00880120024105460d00200320012d00053a006d200341063a00880120024106460d00200320012d00063a006e200341073a00880120024107460d00200320012d00073a006f200341083a00880120024108460d00200320012d00083a0070200341093a00880120024109460d00200320012d00093a00712003410a3a0088012002410a460d00200320012d000a3a00722003410b3a0088012002410b460d00200320012d000b3a00732003410c3a0088012002410c460d00200320012d000c3a00742003410d3a0088012002410d460d00200320012d000d3a00752003410e3a0088012002410e460d00200320012d000e3a00762003410f3a0088012002410f460d00200320012d000f3a0077200341103a00880120024110460d00200320012d00103a0078200341113a00880120024111460d00200320012d00113a0079200341123a00880120024112460d00200320012d00123a007a200341133a00880120024113460d00200320012d00133a007b200341143a00880120024114460d00200320012d00143a007c200341153a00880120024115460d00200320012d00153a007d200341163a00880120024116460d00200320012d00163a007e200341173a00880120024117460d00200320012d00173a007f200341183a00880120024118460d00200320012d00183a008001200341193a00880120024119460d00200320012d00193a0081012003411a3a0088012002411a460d00200320012d001a3a0082012003411b3a0088012002411b460d00200320012d001b3a0083012003411c3a0088012002411c460d00200320012d001c3a0084012003411d3a0088012002411d460d00200320012d001d3a0085012003411e3a0088012002411e460d00200320012d001e3a0086012003411f3a0088012002411f460d00200341c8006a41106a200341e8006a41106a290300370300200341c8006a41086a200341e8006a41086a290300370300200320012d001f3a008701200341c8006a41186a200341e8006a41186a290300370300200341203a0088012003200329036822053703900120032005370348200241606a22024110490d0120024110460d01200141286a290000210520012900202106410021020240024020012d00300e020100030b410121020b200341206a41186a200341c8006a41186a2903002207370300200341206a41106a200341c8006a41106a2903002208370300200341206a41086a200341c8006a41086a290300220937030020032003290348220a370320200320032800413602682003200341c4006a28000036006b20002005370308200020063703002000200a370310200041186a2009370300200041206a2008370300200041286a2007370300200041346a200328006b360000200020032802683600310c020b200341003a0088010b200341003602980120034201370390012003410f36024c2003200341086a360248200320034190016a360220200341fc006a41013602002003420137026c200341b4bcc3003602682003200341c8006a360278200341206a41dcb7c000200341e8006a103e1a2003350298014220862003350290018410000240200328029401450d00200328029001102c0b410221020b200020023a00302004450d002001102c0b200341d0016a24000b821507067f027e037f097e027f017e017f23004180046b22042400200441306a41c1dcc700410610c501200441e8016a41acc8c700410710c50120044190016a200110d502024002400240024002400240200428029801220541206a2206417f4c0d000240024020060d00410121070c010b200610322207450d020b41002108200441003602282004200636022420042007360220200441206a4100411010c8012004280220200428022822066a22072004290030370000200741086a200441306a41086a2900003700002004200641106a2206360228200441206a2006411010c8012004280220200428022822066a220720042900e801370000200741086a200441e8016a41086a2900003700002004200641106a22063602282004280290012107200441206a2006200510c80120042802202206200428022822096a2007200510c9081a2004200920056a22053602280240200428029401450d002007102c0b200441306a2006200510d6022004290330210a4200210b20044200370330200441fc006a280200210c200441f8006a280200210d02400240200a4201510d004101210e4200210f4200211042002111420021124200211342002114420021150c010b200441e8006a2903002110200441e0006a290300210f200441d8006a290300210b200441d0006a2903002113200441c8006a29030021122004290340211520042903382114410121084100210e200429037021110b201420027d2216201456201520037d2014200254ad7d221720155620172015511b0d02024002400240201220027c22152012542207201320037c2007ad7c221420135420142013511b0d002002200384500d0220044190016a41c1dcc700410610c501200441e8016a41acc8c700410710c501200441d8016a200110d50220042802e001220741206a2209417f4c0d030240024020090d00410121180c010b200910322218450d050b200441003602d001200420093602cc01200420183602c801200441c8016a4100411010c80120042802c80120042802d00122096a2218200429009001370000201841086a20044190016a41086a2900003700002004200941106a22093602d001200441c8016a2009411010c80120042802c80120042802d00122096a221820042900e801370000201841086a200441e8016a41086a2900003700002004200941106a22183602d00120042802d8012109200441c8016a2018200710c80120042802c801221820042802d00122196a2009200710c9081a2004201920076a22073602d001024020042802dc01450d002009102c0b200441e8016a2018200710d60220044198026a290300420020042903e80142015122071b211320044190026a290300420020071b2112024020042802cc01450d002018102c0b02402012201656201320175620132017511b0d00200441043a0080010c080b20044180016a410210d70220152112201421130c010b20044180016a410310d7020b20162114201721150c040b200441043a0080010c040b103b000b1039000b20044180016a410410d7020b024020042d0080014104470d00201421162015211720132114201221150c010b20042902840122174280807c8321132017420888a7210820042802800121052017a72109410121070c010b200441b8016a2209200f370300200441a8016a2014370300200441c0016a221820103703002004200b3703b001200420153703a0012004201637039001200420173703980102400240427f201620157c221320132016542207201720147c2007ad7c221320175420132017511b22071b22124280c8afa025544100427f201320071b2213501b0d00200441a0016a29030021142018290300211520092903002113200441b0016a2903002112200429039801210b200429039001210f4201211020042903a801211a0c010b02400240201620158420172014848450450d00420021100c010b42002110200441e8016a41186a22094200370300200441e8016a41106a22184200370300200441e8016a41086a22074200370300200442003703e801200441d8016a41d4dcc700410810c5012007200441d8016a41086a2219290000370300200420042900d8013703e801200441d8016a41bba8c700410d10c50120092019290000370300201820042900d801370300200441086a200441e8016a412010d301200441086a41106a2903002114200429031021152004280208211b200942003703002018420037030020074200370300200442003703e801200441d8016a41d4dcc700410810c50120072019290000370300200420042900d8013703e801200441d8016a41bba8c700410d10c50120092019290000370300201820042900d8013703002004420020144200201b1b221420137d20154200201b1b2215201254ad7d220b201520127d220f201556200b201456200b2014511b22091b3703e00120044200200f20091b3703d801200441e8016a4120200441d8016a411010a702200441a0026a201337030020044198026a2012370300200741013a0000200441f9016a200141086a29000037000020044181026a200141106a29000037000020044189026a200141186a290000370000200441023602e801200420012900003700f101200441e8016a10c8020b0b200a4201512109200441d8006a2012370300200441e0006a2013370300200441c0006a200b370300200441e8006a2015370300200441c8006a20143703002004201a370350200420113703702004200f370338410021072004200c410020081b36027c2004200d410020081b360278200420104201512208ad3703300240024020080d002006200510b401420021132016211420172115410021080c010b20062005200441386a10d802420021134101210820162114201721150b0b02402004280224450d002006102c0b0240024002400240024020070d000240200841ff01712205450d00200941ff0171450d020b20050d02200941ff0171450d02200441e8016a41086a41043a0000200441f9016a200141086a29000037000020044181026a200141106a29000037000020044189026a200141186a290000370000200441003602e801200420012900003700f101200441e8016a10c8020c020b200541ff01714104460d02200020053a0000200041036a20054118763a0000200020054108763b0001200041046a2008ad42ff01834208862009ad42ff0183842013843700000c030b200441e8016a41086a41033a0000200441f9016a200141086a29000037000020044181026a200141106a29000037000020044189026a200141186a290000370000200441003602e801200420012900003700f101200441e8016a10c8020b200e450d00200441a0026a201537030020044198026a2014370300200441e8016a41086a41003a0000200441f9016a200141086a29000037000020044181026a200141106a29000037000020044189026a200141186a290000370000200441023602e801200420012900003700f101200441e8016a10c8020b200441a0026a200337030020044198026a2002370300200441e8016a41086a41053a0000200441f9016a200141086a29000037000020044181026a200141106a29000037000020044189026a200141186a290000370000200441023602e801200420012900003700f101200441e8016a10c802200041043a00000b20044180046a24000bf10101047f230041c0006b2202240041fcfdc70021034109210441042105024002400240024002400240200141ff01710e06000102030405000b2002411c6a41013602002002420137020c200241eccdc80036020820024104360224200241c0fcc7003602202002200241206a360218200241086a41c8fcc7001046000b41f1fdc7002103410b2104410021050c030b41e9fdc700210341082104410121050c020b41e4fdc700210341052104410221050c010b41d9fdc7002103410b2104410321050b20004183063b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b980202037f027e230041106b220324000240411110322204450d002003421137020420032004360200200341004120102f2003280200200328020822056a22042002290010370000200441086a200241186a290000370000200441106a200241206a290000370000200441186a200241286a2900003700002003200541206a2204360208200241086a290300210620022903002107200320044110102f2003280200200328020822046a22052006370008200520073700002003200441106a220436020820022d00302105200320044101102f20032802002202200328020822046a20053a00002003200441016a2204360208200020012002200410a70202402003280204450d002002102c0b200341106a24000f0b1039000bde0101047f230041306b220224000240412010322203450d002002422037020420022003360200200241004120102f20022802002203200228020822046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360208200241106a2003200110c9042002412c6a200320016a360200200220033602282002200241106a41106a3602242002200241106a3602202000200241206a107e02402002280204450d002003102c0b200241306a24000f0b1039000bd20303027f017e017f230041d0006b220324002003200236020420032001360200200341086a2001200210b30102400240200328020822010d00200042003703000c010b200328020c2102024002400240200341106a28020022044104490d002004417c714104460d00200441786a4110490d00200441686a4110490d00200441586a4110490d00200441486a410f4b0d010b20034100360220200342013703182003410f36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c200341b4bcc3003602382003200341286a360248200341346a41dcb7c000200341386a103e1a200335022042208620033502188410000240200328021c450d002003280218102c0b420021050c010b2001280000210420012800042106200141106a290000210520002001290008370308200041386a2001290038370300200041286a2001290028370300200041186a2001290018370300200041106a2005370300200041cc006a2006360200200041c8006a2004360200200041c0006a200141c0006a290000370300200041306a200141306a290000370300200041206a200141206a290000370300420121050b200020053703002002450d002001102c0b200341d0006a24000bb00201047f230041c0006b2202240041c4aac7002103410b210441072105024002400240024002400240024002400240200141ff01710e09000102030405060708000b2002411c6a41013602002002420137020c200241eccdc80036020820024104360224200241c0fcc7003602202002200241206a360218200241086a41c4a9c7001046000b41b6aac7002103410e2104410021050c060b41a1aac700210341152104410121050c050b4199aac700210341082104410221050c040b4186aac700210341132104410321050c030b41f4a9c700210341122104410421050c020b41eba9c700210341092104410521050c010b41d4a9c700210341172104410621050b20004183083b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000ba30101037f230041106b22032400200341003602082003420137030020022802402104200341004104102f2003280200200328020822056a20043600002003200541046a220436020820022802442105200320044104102f2003280200200328020822046a20053600002003200441046a360208200320021087052000200120032802002202200328020810a70202402003280204450d002002102c0b200341106a24000bdb0f07067f027e017f077e017f037e047f230041e0036b2203240002402001200284500d00200341306a41c1dcc700410610c501200341c8016a41acc8c700410710c50120034180016a200010d5020240024002400240200328028801220441206a2205417f4c0d000240024020050d00410121060c010b200510322206450d020b41002107200341003602282003200536022420032006360220200341206a4100411010c8012003280220200328022822056a22062003290030370000200641086a200341306a41086a2900003700002003200541106a2205360228200341206a2005411010c8012003280220200328022822056a220620032900c801370000200641086a200341c8016a41086a2900003700002003200541106a22053602282003280280012106200341206a2005200410c80120032802202205200328022822086a2006200410c9081a2003200820046a22043602280240200328028401450d002006102c0b200341306a2005200410d602200329033021094200210a20034200370330200341fc006a2802002106200341f8006a28020021080240024020094201510d004101210b4200210c4200210d4200210e4200210f4200211042002111420021120c010b200341e8006a290300210d200341306a41306a290300210c200341306a41286a290300210a200341d0006a2903002110200341306a41186a290300210f2003290340211220032903382111410121074100210b2003290370210e0b20034180016a41286a200c37030020034180016a41306a200d37030020034180016a41186a201020022010200f200156201020025620102002511b22131b220c7d200f2001200f20131b220154ad7d220d3703002003200a3703a0012003200f20017d220a370390012003427f2012200c7c201120017c220f2011542213ad7c22022013200220125420022012511b22131b2202370388012003427f200f20131b220f3703800102400240427f200f200a7c22102010200f5422132002200d7c2013ad7c221020025420102002511b22131b22124280c8afa025544100427f201020131b2211501b0d0020034190016a2903002112200341b0016a2903002111200341a8016a290300210a200341a0016a290300210d200329038801211420032903800121154201211020032903980121160c010b02400240200f200a842002200d848450450d00420021100c010b42002110200341c8016a41186a22174200370300200341c8016a41106a22184200370300200341c8016a41086a22134200370300200342003703c801200341b8016a41d4dcc700410810c5012013200341b8016a41086a2219290000370300200320032900b8013703c801200341b8016a41bba8c700410d10c50120172019290000370300201820032900b801370300200341086a200341c8016a412010d301200341086a41106a290300210a2003290310210d2003280208211a201742003703002018420037030020134200370300200342003703c801200341b8016a41d4dcc700410810c50120132019290000370300200320032900b8013703c801200341b8016a41bba8c700410d10c50120172019290000370300201820032900b80137030020034200200a4200201a1b220a20117d200d4200201a1b220d201254ad7d2214200d20127d2215200d562014200a562014200a511b22171b3703c00120034200201520171b3703b801200341c8016a4120200341b8016a411010a70220034180026a2011370300200341f8016a2012370300201341013a0000200341d9016a200041086a290000370000200341e1016a200041106a290000370000200341e9016a200041186a290000370000200341023602c801200320002900003700d101200341c8016a10c8020b0b200341d8006a200d370300200341e0006a200a370300200341c0006a2014370300200341e8006a2011370300200341c8006a2012370300200320163703502003200e3703702003201537033820032006410020071b36027c20032008410020071b360278200320104201512207ad3703300240024020070d002005200410b4010c010b20052004200341386a10d8020b02402003280224450d002005102c0b024020094201510d0020104201510d030b20094201520d0320104201510d03200341c8016a41086a41043a0000200341d9016a200041086a290000370000200341e1016a200041106a290000370000200341e9016a200041186a290000370000200341003602c801200320002900003700d101200341c8016a10c8020c030b103b000b1039000b200341c8016a41086a41033a0000200341d9016a200041086a290000370000200341e1016a200041106a290000370000200341e9016a200041186a290000370000200341003602c801200320002900003700d101200341c8016a10c8020b0240200b450d0020034180026a2002370300200341f8016a200f370300200341c8016a41086a41003a0000200341d9016a200041086a290000370000200341e1016a200041106a290000370000200341e9016a200041186a290000370000200341023602c801200320002900003700d101200341c8016a10c8020b20034180026a200c370300200341f8016a2001370300200341c8016a41086a41063a0000200341d9016a200041086a290000370000200341e1016a200041106a290000370000200341e9016a200041186a290000370000200341023602c801200320002900003700d101200341c8016a10c8020b200341e0036a24000bcc0101037f200028022422012001280200417f6a220236020020002d0001210302400240024020002d00000d004100210020020d022001280208200128020c2802001102000240200128020c280204450d002001280208102c0b200141046a22022002280200417f6a22023602002002450d010c020b4101210020020d012001280208200128020c2802001102000240200128020c280204450d002001280208102c0b200141046a22022002280200417f6a220236020020020d010b2001102c0b200341ff01714100472000720bdc2b0a067f027e057f057e027f027e027f087e047f027e230041d0056b220624000240024002400240024002400240024002400240024002402003200484500d0020012002460d0020012002412010cc08450d00200641d0016a41c1dcc700410610c501200641a8036a41acc8c700410710c501200641b8036a200210d50220062802c003220741206a2208417f4c0d010240024020080d00410121090c010b200810322209450d030b200641003602382006200836023420062009360230200641306a4100411010c8012006280230200628023822086a220920062900d001370000200941086a200641d0016a41086a2900003700002006200841106a2208360238200641306a2008411010c8012006280230200628023822086a220920062900a803370000200941086a200641a8036a41086a2900003700002006200841106a220936023820062802b8032108200641306a2009200710c801200628023022092006280238220a6a2008200710c9081a2006200a20076a220b360238024020062802bc03450d002008102c0b200641c0006a2009200b10d6022006290340210c4200210d200642003703402006418c016a280200210e20064188016a280200210f02400240200c42015122100d00200641c8016a4200370300200641c0016a4200370300200641b8016a4200370300200641b0016a420037030020064190016a41186a4200370300200641a0016a420037030020064198016a42003703002006420037039001410021114101211242002113420021140c010b200641c0006a41186a290300210c2006290350211420062903482113200641c0006a41286a2903002115200641c0006a41306a2903002116200629038001210d2006290360211720064190016a41306a200641f8006a29030037030020064190016a41286a2016370300200641b0016a2015370300200641a0016a200c370300200620173703a801200620143703980120062013370390012006200d3703c80141012111410021120b200641d0026a41c1dcc700410610c501200641b8036a41acc8c700410710c501200641f0016a200110d50220062802f801220741206a2208417f4c0d010240024020080d004101210a0c010b20081032220a450d030b41002118200641003602e801200620083602e4012006200a3602e001200641e0016a4100411010c80120062802e00120062802e80122086a220a20062900d002370000200a41086a200641d0026a41086a2900003700002006200841106a22083602e801200641e0016a2008411010c80120062802e00120062802e80122086a220a20062900b803370000200a41086a200641b8036a41086a2900003700002006200841106a22083602e80120062802f001210a200641e0016a2008200710c80120062802e001220820062802e80122196a200a200710c9081a2006201920076a22073602e801024020062802f401450d00200a102c0b200641f0016a2008200710d60220062903f001211a4200211b200642003703f001200641bc026a2802002119200641b8026a280200211c02400240201a4201510d004101211d4201211e4200211f4200212042002121420021224200212342002116420021170c010b20064188026a2903002123200629038002211720062903f8012116200641a8026a2903002121200641a0026a290300212020064198026a290300211f200629039002211b410121184200211e4100211d20062903b00221220b201620037d2224201656201720047d2016200354ad7d220c201756200c2017511b0d03201320037c2225201354220a201420047c200aad7c221520145420152014511b0d0420062025370390012006201537039801024002400240427f202520062903a0017c22162016202554220a2015200641a8016a2903007c200aad7c221620155420162015511b220a1b4280c8afa025544100427f2016200a1b501b0d00200641d0026a41c1dcc700410610c501200641b8036a41acc8c700410710c501200641a8036a200110d50220062802b003220a41206a2226417f4c0d040240024020260d00410121270c010b202610322227450d060b200641003602d801200620263602d401200620273602d001200641d0016a4100411010c80120062802d00120062802d80122266a222720062900d002370000202741086a200641d0026a41086a2900003700002006202641106a22263602d801200641d0016a2026411010c80120062802d00120062802d80122266a222720062900b803370000202741086a200641b8036a41086a2900003700002006202641106a22273602d80120062802a8032126200641d0016a2027200a10c80120062802d001222720062802d80122286a2026200a10c9081a20062028200a6a220a3602d801024020062802ac03450d002026102c0b200641b8036a2027200a10d602200641e8036a290300420020062903b803420151220a1b2116200641e0036a2903004200200a1b2117024020062802d401450d002027102c0b20172024562016200c562016200c511b0d012006200629009903370388032006200641a0036a28000036008f030c020b200641c0026a410510d7020c090b20064198036a410210d702200620062900990337038803200620064198036a41086a28000036008f0320062d009803220a4104470d060b024002402005450d00200641d0026a41c1dcc700410610c501200641b8036a41acc8c700410710c501200641a8036a200110d50220062802b003220541206a220a417f4c0d0302400240200a0d00410121260c010b200a10322226450d050b200641003602d8012006200a3602d401200620263602d001200641d0016a4100411010c80120062802d00120062802d801220a6a222620062900d002370000202641086a200641d0026a41086a2900003700002006200a41106a220a3602d801200641d0016a200a411010c80120062802d00120062802d801220a6a222620062900b803370000202641086a200641b8036a41086a2900003700002006200a41106a22263602d80120062802a803210a200641d0016a2026200510c80120062802d001222620062802d80122276a200a200510c9081a2006202720056a22053602d801024020062802ac03450d00200a102c0b200641b8036a2026200510d60220064184046a280200210520062903b8032116024020062802d401450d002026102c0b202442ffc7afa02556200c420052200c501b0d0120164201520d012005450d010c080b20244280c8afa025544100200c501b0d070b200641043a00c0020c080b200041043a00000c0a0b103b000b1039000b200641c0026a410410d7022013212520142115201621242017210c0c030b200641c0026a410310d70220132125201421150c020b200641c0026a41086a200628008f033600002006200a3a00c00220062006290388033700c1020c030b200641c0026a410610d7020b20062d00c0024104470d010b200641f0026a201f370300200641f8026a202037030020064180036a20213703002006201b3703e802200620233703e002200620243703d0022006200c3703d80202400240427f202420237c221620162024542205200c201b7c2005ad7c2216200c542016200c511b22051b22174280c8afa025544100427f201620051b2216501b0d00200641e0026a290300211620062903d802211720062903d0022114420121130c010b024002402024202384200c201b848450450d00420021130c010b42002113200641b8036a41186a220a4200370300200641b8036a41106a22264200370300200641b8036a41086a22054200370300200642003703b803200641d0016a41d4dcc700410810c5012005200641d0016a41086a2228290000370300200620062900d0013703b803200641a8036a41bba8c700410d10c501200a200641a8036a41086a2229290000370300202620062900a803370300200641186a200641b8036a412010d301200641186a41106a29030021142006290320212320062802182127200a42003703002026420037030020054200370300200642003703b803200641d0016a41d4dcc700410810c50120052028290000370300200620062900d0013703b803200641a8036a41bba8c700410d10c501200a2029290000370300202620062900a803370300200642002014420020271b221420167d2023420020271b2223201754ad7d222a202320177d222b202356202a201456202a2014511b220a1b3703b00320064200202b200a1b3703a803200641b8036a4120200641a8036a411010a702200641f0036a2016370300200641e8036a2017370300200541013a0000200641c9036a200141086a290000370000200641d1036a200141106a290000370000200641d9036a200141186a290000370000200641023602b803200620012900003700c103200641b8036a10c8020b0b201a420151210520064198026a201f370300200641a0026a202037030020064180026a2017370300200641a8026a202137030020064188026a20163703002006201b37039002200620223703b002200620143703f8014100210a20062019410020181b3602bc022006201c410020181b3602b802200620134201512218ad3703f0010240024020180d002008200710b40142002116410021180c010b20082007200641f8016a10d80242002116410121180b0c010b20062902c402220c4280807c832116200c420888a7211820062802c0022107200ca721054101210a0b024020062802e401450d002008102c0b0240024002400240200a0d000240201841ff01712207450d00200541ff0171450d020b20070d02200541ff0171450d02200641b8036a41086a41043a0000200641c9036a200141086a290000370000200641d1036a200141106a290000370000200641d9036a200141186a290000370000200641003602b803200620012900003700c103200641b8036a10c8020c020b2018ad42ff01834208862005ad42ff018384201684211e200741807e7121080c020b200641b8036a41086a41033a0000200641c9036a200141086a290000370000200641d1036a200141106a290000370000200641d9036a200141186a290000370000200641003602b803200620012900003700c103200641b8036a10c8020b4104210741002108201d450d00200641f0036a200c370300200641e8036a202437030041002108200641b8036a41086a41003a0000200641c9036a200141086a290000370000200641d1036a200141106a290000370000200641d9036a200141186a290000370000200641023602b803200620012900003700c103200641b8036a10c8024201211e0b200641d0026a41206a220520064190016a41306a290300370300200641d0026a41186a220a20064190016a41286a290300370300200641e0026a221820064190016a41206a290300370300200641d8026a221920064190016a41186a290300370300200620062903a0013703d00202400240200741ff017122074104460d00201e4280807c83210c20082007722107201e420888a72105201ea72110410121080c010b200641f0016a41186a20192903002216370300200641f0016a41206a2018290300370300200641f0016a41286a200a290300370300200641f0016a41306a2005290300370300200620062903d002221737038002200620253703f001200620153703f80102400240427f202520177c220c200c2025542207201520167c2007ad7c220c201554200c2015511b22071b22244280c8afa025544100427f200c20071b220c501b0d0020064180026a290300210c200641a0026a290300211620064198026a290300211720064190026a290300212420062903f801211420062903f001211b42012113200629038802211e0c010b02400240202520178420152016848450450d00420021130c010b42002113200641b8036a41186a22084200370300200641b8036a41106a22054200370300200641b8036a41086a22074200370300200642003703b803200641a8036a41d4dcc700410810c5012007200641a8036a41086a220a290000370300200620062900a8033703b803200641a8036a41bba8c700410d10c5012008200a290000370300200520062900a8033703002006200641b8036a412010d301200641106a29030021162006290308211720062802002118200842003703002005420037030020074200370300200642003703b803200641a8036a41d4dcc700410810c5012007200a290000370300200620062900a8033703b803200641a8036a41bba8c700410d10c5012008200a290000370300200520062900a803370300200642002016420020181b2216200c7d2017420020181b2217202454ad7d2214201720247d221b201756201420165620142016511b22081b3703b00320064200201b20081b3703a803200641b8036a4120200641a8036a411010a702200641f0036a200c370300200641e8036a2024370300200741013a0000200641c9036a200241086a290000370000200641d1036a200241106a290000370000200641d9036a200241186a290000370000200641023602b803200620022900003700c103200641b8036a10c8020b0b200641e8006a2024370300200641f0006a2017370300200641d0006a2014370300200641f8006a2016370300200641d8006a200c3703002006201e3703602006200d370380012006201b370348410021082006200e410020111b36028c012006200f410020111b36028801200620134201512207ad3703400240024020070d002009200b10b4014200210c410021050c010b2009200b200641c8006a10d8024200210c410121050b0b02402006280234450d002009102c0b024002400240024020080d000240200541ff01712207450d00201041ff0171450d020b20070d02201041ff0171450d02200641b8036a41086a41043a0000200641c9036a200241086a290000370000200641d1036a200241106a290000370000200641d9036a200241186a290000370000200641003602b803200620022900003700c103200641b8036a10c8020c020b200741ff01714104460d02200020073a0000200041036a20074118763a0000200020074108763b0001200041046a2005ad42ff01834208862010ad42ff018384200c843700000c030b200641b8036a41086a41033a0000200641c9036a200241086a290000370000200641d1036a200241106a290000370000200641d9036a200241186a290000370000200641003602b803200620022900003700c103200641b8036a10c8020b2012450d00200641f0036a2015370300200641e8036a2025370300200641b8036a41086a41003a0000200641c9036a200241086a290000370000200641d1036a200241106a290000370000200641d9036a200241186a290000370000200641023602b803200620022900003700c103200641b8036a10c8020b20064190046a200437030020064188046a2003370300200641b8036a41086a41023a0000200641c9036a200141086a290000370000200641d1036a200141106a290000370000200641d9036a200141186a290000370000200641e9036a200241086a290000370000200641f1036a200241106a290000370000200641f9036a200241186a290000370000200641023602b803200620012900003700c103200620022900003700e103200641b8036a10c802200041043a00000b200641d0056a24000b830201027f230041d0006b220224002002200136020420022000360200200241086a2000200110b30102400240200228020822010d00410221000c010b200228020c210302400240200241106a280200450d0041002100024020012d00000e020200010b410121000c010b20024100360220200242013703182002410f36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c200241b4bcc3003602382002200241286a360248200241346a41dcb7c000200241386a103e1a200235022042208620023502188410000240200228021c450d002002280218102c0b410221000b2003450d002001102c0b200241d0006a240020000b9b0201047f230041c0006b2202240041a8e0c4002103410621044108210502400240024002400240024002400240200141ff01710e080001020304050607000b2002413c6a41013602002002420137022c200241eccdc80036022820024104360224200241c0fcc7003602202002200241206a360238200241286a41dcdec4001046000b4196e0c400210341122105410021040c050b4186e0c400210341102105410121040c040b41f9dfc4002103410d2105410221040c030b41eddfc4002103410c2105410321040c020b41e1dfc4002103410c2105410421040c010b41cddfc400210341142105410521040b200041830c3b0100200041086a2005360200200041046a2003360200200041026a20043a0000200241c0006a24000ba21707077f017e0c7f017e027f017e077f23004190046b22012400200141286a22024200370300200141206a22034200370300200141106a41086a420037030020014200370310200141106a41dcdcc700410a10c501200141a8036a41d3dec400410610c5012002200141a8036a41086a290000370300200320012900a803370300200141203602342001200141106a360230200141386a200141106a412010b30102400240200128023822040d00410021050c010b200128023c21062001200141386a41086a28020036024c20012004360248200141086a200141c8006a1087020240024020012802080d00024002400240200128020c2207200128024c41c4006e2202200220074b1bad42c4007e2208422088a70d002008a72202417f4c0d0002400240024020020d00410421050c010b200210322205450d010b20014100360258200120053602502001200241c4006e360254024002402007450d00200141a8036a41077221094100210a4100210b03400240024002400240200128024c220c450d002001280248220d2d000021022001200c417f6a220e36024c2001200d41016a3602480240024020020e020001020b200e4104490d012001419c026a41026a200141d0036a41026a2d00003a000020014180026a41086a200141f0036a41086a29020037030020014180026a41106a200141f0036a41106a29020037030020014180026a41186a200141f0036a41186a2d00003a0000200141e0016a41086a200141a8036a41086a290100370300200141e0016a41106a200141a8036a41106a290100370300200141e0016a41186a200141a8036a41186a290100370300200120012f00d0033b019c02200120012902f00337038002200120012901a8033703e001200d280001210f2001200c417b6a36024c2001200d41056a36024841002110410021030c040b41002103200141003a00c803200c417e6a211002400340200e20032202460d01200141a8036a20026a200d20026a220341016a2d00003a00002001200341026a3602482001200241016a22033a00c8032001201036024c2010417f6a211020034120460d030c000b0b200241ff0171450d02200141003a00c8030c020b200141dc016a41026a2001419c026a41026a2d00003a0000200141c0016a41086a20014180026a41086a290300370300200141c0016a41106a20014180026a41106a290300370300200141c0016a41186a20014180026a41186a2d00003a0000200141a0016a41086a200141e0016a41086a290300370300200141a0016a41106a200141e0016a41106a290300370300200141a0016a41186a200141e0016a41186a290300370300200120012f019c023b01dc0120012001290380023703c001200120012903e0013703a0010c050b200141c0026a41026a221120012d00aa0322123a0000200141e8026a41026a20123a0000200141f0036a41086a2213200941086a2900002208370300200141f0036a41106a2214200941106a2900002215370300200141f0036a41186a2216200941186a2d000022123a0000200120012f01a80322173b01c002200120173b01e8022001200929000022183703f00320012800ab032119200141d0036a41186a221720123a0000200141d0036a41106a22122015370300200141d0036a41086a221a2008370300200120183703d003200341ff0171411f4d0d00200141e4026a41026a20112d000022113a000020014188036a41086a221b201a290300220837030020014188036a41106a221c2012290300221537030020014188036a41186a221d20172d000022123a0000200141bc026a41026a221a20113a0000200120012f01c00222173b01e402200120012903d003221837038803200120173b01bc02200141a0026a41186a221720123a0000200141a0026a41106a22112015370300200141a0026a41086a221e2008370300200120183703a002200e2003460d00200d20036a220e41016a2d0000210d2001201036024c2001200e41026a36024841002110410021120240024002400240200d0e020100040b4100210d200141003a00c8032003200c6b41026a2112200c20026b417c6a210203402012200d6a450d02200141a8036a200d6a200e200d6a220341026a2d00003a00002001200341036a3602482001200d41016a22033a00c8032001200236024c2002417f6a21022003210d20034120470d000b2016200141a8036a41186a2903003703002014200141a8036a41106a2903003703002013200141a8036a41086a290300370300200120012903a8033703f003200341ff01714120490d02201b20132903002208370300200141e8026a41186a22022016290300370300200141e8026a41106a22032014290300370300200141e8026a41086a220d2008370300200120012903f003220837038803200120083703e802200141c0026a41186a2002290300370300200141c0026a41106a2003290300370300200141c0026a41086a200d290300370300200120012903e8023703c002410121120b200141e0016a41186a200141c0026a41186a290300370300200141e0016a41106a200141c0026a41106a290300370300200141e0016a41086a200141c0026a41086a2903003703002001419c026a41026a201a2d00003a000020014180026a41086a201e29030037030020014180026a41106a201129030037030020014180026a41186a20172d00003a0000200120012903c0023703e001200120012f01bc023b019c02200120012903a00237038002410121032012211f2019210f0c030b200d41ff0171450d00200141003a00c8030b200141e8026a41186a201d290300370300200141e8026a41106a201c2903003703000b41022103410121100b200141dc016a41026a22022001419c026a41026a2d00003a0000200141c0016a41086a220d20014180026a41086a290300370300200141c0016a41106a220e20014180026a41106a290300370300200141c0016a41186a220c20014180026a41186a2d00003a0000200141a0016a41086a2212200141e0016a41086a290300370300200141a0016a41106a2217200141e0016a41106a290300370300200141a0016a41186a2211200141e0016a41186a290300370300200120012f019c023b01dc0120012001290380023703c001200120012903e0013703a00120100d02200b41016a210b2001419c016a41026a221020022d00003a000020014180016a41086a221a200d29030037030020014180016a41106a220d200e29030037030020014180016a41186a220e200c2d00003a0000200141e0006a41086a220c2012290300370300200141e0006a41106a22122017290300370300200141e0006a41186a22172011290300370300200120012f01dc013b019c01200120012903c00137038001200120012903a0013703600240200a2001280254470d00200141d0006a200a10df022001280258210a200128025021050b2005200a41c4006c6a220220033a00002002200f360004200241036a20102d00003a0000200220012f019c013b0001200e2d00002103200d2903002108201a290300211520012903800121182002201f3a002120022018370008200241106a2015370000200241186a2008370000200241206a20033a0000200220012903603700222002413a6a2017290300370000200241326a20122903003700002002412a6a200c2903003700002001200a41016a220a360258200b2007470d000b200128025021050b200129025421082005450d050c060b20012802542202450d03200241c4006c0d020c030b1039000b103b000b2001280250102c0b0b41002105200141003602f803200142013703f0032001410f3602d4032001200141306a3602d0032001200141f0036a36028803200141bc036a4101360200200142013702ac03200141b4bcc3003602a8032001200141d0036a3602b80320014188036a41dcb7c000200141a8036a103e1a20013502f80342208620013502f00384100020012802f403450d0020012802f003102c0b2006450d002004102c0b0240024020050d0020004100360208200042043702000c010b20002008370204200020053602000b20014190046a24000bd40103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42c4007e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b200141c4006c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241c4006e3602000b0f0b2005450d001039000b103b000b830b020f7f057e230041e0036b22012400200141e0006a22024200370300200141c8006a41106a22034200370300200141c8006a41086a420037030020014200370348200141c8006a41e6dcc700410710c501200141286a4188bbc200410910c5012002200141286a41086a29000037030020032001290028370300200141a8036a200141c8006a10cb03024002400240024020012903a8034202510d00200141a8036a41106a2802002102200028020821032000280204210420002802002105200141286a41e6dcc700410710c501200141a8036a419b92c100411010c501200120023602dc03200141086a200141dc036a410410c701200141d4006a200141dc036a41046a3602002001200141086a41086a36024c2001200141dc036a3602502001200141086a360248200141186a200141c8006a107e2001280220220041206a2202417f4c0d020240024020020d00410121060c010b200210322206450d040b200141003602102001200236020c20012006360208200141086a4100411010c8012001280208200128021022026a22062001290028370000200641086a200141286a41086a2900003700002001200241106a2202360210200141086a2002411010c8012001280208200128021022026a220620012900a803370000200641086a200141a8036a41086a22062900003700002001200241106a220736021020012802182102200141086a2007200010c80120012802082208200128021022076a2002200010c9081a2001200720006a22093602100240200128021c450d002002102c0b200141c8006a2008200910cc032006200141c8006a410c6a2902003703002001200129024c3703a8030240024020012802484101460d00200141186a410c6a4100360200200142003703180c010b200141186a41086a200141a8036a41086a290300370300200120012903a8033703180b02402003450d00200341246c2106200141c8006a41106a2107200141186a410472210a200141ce036a210b200521000340200041206a2802002103200141286a41186a220c200041186a290000370300200141286a41106a220d200041106a290000370300200141286a41086a220e200041086a2900003703002001200029000037032802400240200128021c2202450d002001280220210f0c010b41940310322202450d064100210f20024100360200200220012902a803370204200241003b01322002410c6a200141a8036a41086a290200370200200241146a200141a8036a41106a2902003702002002411c6a200141a8036a41186a290200370200200241246a200141a8036a41206a2902003702002002412a6a200b290100370100200241346a200141c8006a41e00210c9081a200141003602202001200236021c0b200141c8006a200f2002200141286a1090020240024020012802484101470d00200141a8036a41086a200e2903002210370300200141a8036a41106a200d2903002211370300200141a8036a41186a200c29030022123703002001200129032822133703a803200129024c21142001280254210220072013370200200741086a2010370200200741106a2011370200200741186a20123702002001200a3602542001200236025020012014370348200141c8006a410010cd0321020c010b200128025020012802544102746a41046a21020b200041246a21002002200228020020036a3602002001200128021820036a3602182006415c6a22060d000b0b02402004450d00200441246c450d002005102c0b200141d4006a200141186a41086a2903003702002001200129031837024c2001410136024820082009200141c8006a41047210ce03200141c8006a41086a10cf03200128020c450d012008102c0c010b20002802042202450d00200241246c450d002000280200102c0b200141e0036a24000f0b103b000b1039000b8b0601067f23004190016b22012400200141d8006a41186a22024200370300200141d8006a41106a22034200370300200141d8006a41086a2204420037030020014200370358200141d8006a41ffdcc700410710c50120014180016a41b8b3c300410c10c501200220014180016a41086a2900003703002003200129008001370300200141106a200141d8006a412010c60120012802142105200128021021062002200041186a2900003703002003200041106a2900003703002004200041086a29000037030020012000290000370358200141286a418dddc700410810c501200141386a41abedc300410e10c50120012005410020061b36027c200141186a200141fc006a410410c70120014180016a410c6a200141fc006a41046a3602002001200141186a41086a360284012001200141fc006a360288012001200141186a36028001200141c8006a20014180016a107e20014180016a200141d8006a10e402024002402001280250220020012802880122026a41206a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b200141003602202001200336021c20012004360218200141186a4100411010c8012001280218200128022022036a22042001290028370000200441086a200141286a41086a2900003700002001200341106a2203360220200141186a2003411010c8012001280218200128022022036a22042001290038370000200441086a200141386a41086a2900003700002001200341106a220436022020012802482103200141186a2004200010c8012001280218200128022022046a2003200010c9081a2001200420006a22003602202001280280012104200141186a2000200210c80120012802182200200128022022056a2004200210c9081a2001200520026a22023602200240200128028401450d002004102c0b0240200128024c450d002003102c0b200141086a2000200210c6012001200128020c41016a410120012802081b36025820002002200141d8006a410410a7020240200128021c450d002000102c0b20014190016a24000f0b103b000b1039000bff8a0308017f027e067f027e017f057e117f037e230041e00a6b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00000e19000102030405060708090a0b0c0d0e0f101112131d1c1b1a19000b200341dc086a4101360200200342013702cc08200341eccdc8003602c808200341043602ec04200341ec9cc8003602e8042003200341e8046a3602d808200341c8086a41dc85c3001046000b200141d0006a2903002104200141c8006a290300210520034198046a41186a200141196a29000037030020034198046a41106a200141116a29000037030020034198046a41086a200141096a2900003703002003200129000137039804200341e8076a41206a200141c1006a2d00003a0000200341e8076a41186a200141396a290000370300200341e8076a41106a200141316a290000370300200341e8076a41086a200141296a2900003703002003200141216a2900003703e807200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c808200341e8046a200341c8086a10c602200341b8076a41086a2202200341e8046a41096a290000370300200341b8076a41106a2201200341e8046a41116a290000370300200341b8076a41186a2206200341e8046a41196a290000370300200320032900e9043703b80720032d00e8044101460d16200341c0046a41186a2006290300370300200341c0046a41106a2001290300370300200341c0046a41086a2002290300370300200320032903b8073703c00420034198086a41e6dcc700410710c501200341d8066a419099c100410610c501200341c8086a200341c0046a10e40220032802d008220241206a2201417f4c0d2f0240024020010d00410121060c010b200110322206450d310b200341003602f004200320013602ec04200320063602e804200341e8046a4100411010c80120032802e80420032802f00422016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602f004200341e8046a2001411010c80120032802e80420032802f00422016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602f00420032802c8082101200341e8046a2006200210c80120032802e804220620032802f00422076a2001200210c9081a2003200720026a22023602f004024020032802cc08450d002001102c0b2006200210ce022102024020032802ec04450d002006102c0b02402002450d00200341f8066a410310a8040c3b0b200341e8046a41086a20034198046a41086a290300370300200341e8046a41106a20034198046a41106a290300370300200341e8046a41186a20034198046a41186a29030037030020032003290398043703e80420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341c8086a200341e8046a10d50220032802d008220241206a2201417f4c0d2f0240024020010d00410121060c010b200110322206450d310b200341003602c007200320013602bc07200320063602b807200341b8076a4100411010c80120032802b80720032802c00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602c007200341b8076a2001411010c80120032802b80720032802c00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602c00720032802c8082101200341b8076a2006200210c80120032802b807220620032802c00722076a2001200210c9081a2003200720026a22023602c007024020032802cc08450d002001102c0b2006200210ce022102024020032802bc07450d002006102c0b02402002450d00200341f8066a410410a8040c3b0b0240200542ffc7afa0255620044200522004501b0d00200341f8066a410810a8040c3b0b2003200341e8046a3602a80620034198086a41e6dcc700410710c501200341d8066a419099c100410610c501200341c8086a200341c0046a10e40220032802d008220241206a2201417f4c0d2f0240024020010d00410121060c010b200110322206450d310b200341003602c007200320013602bc07200320063602b807200341b8076a4100411010c80120032802b80720032802c00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602c007200341b8076a2001411010c80120032802b80720032802c00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602c00720032802c8082101200341b8076a2006200210c80120032802b807220620032802c00722076a2001200210c9081a2003200720026a22023602c007024020032802cc08450d002001102c0b20062002200341a8066a10cc01024020032802bc07450d002006102c0b200341c8086a41206a200341e8076a41206a2d00003a0000200341c8086a41186a200341e8076a41186a290300370300200341c8086a41106a200341e8076a41106a290300370300200341c8086a41086a200341e8076a41086a290300370300200320032903e8073703c80820034198086a41e6dcc700410710c501200341d8066a41e0b9c200410510c501200341b8076a200341c0046a10e40220032802c007220241206a2201417f4c0d2f0240024020010d00410121060c010b200110322206450d310b200341003602b006200320013602ac06200320063602a806200341a8066a4100411010c80120032802a80620032802b00622016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602b006200341a8066a2001411010c80120032802a80620032802b00622016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602b00620032802b8072101200341a8066a2006200210c80120032802a806220620032802b00622076a2001200210c9081a2003200720026a22023602b006024020032802bc07450d002001102c0b20062002200341c8086a10aa04024020032802ac06450d002006102c0b200341c0046a10e702200341f0066a22024200370300200341e8066a22014200370300200341d8066a41086a22064200370300200342003703d80620034198086a41e6dcc700410710c501200620034198086a41086a220729000037030020032003290098083703d806200341a8066a41ccbac200410a10c5012002200341a8066a41086a2208290000370300200120032900a806370300200341086a200341d8066a412010c601200328020c21092003280208210a200242003703002001420037030020064200370300200342003703d80620034198086a41e6dcc700410710c5012006200729000037030020032003290098083703d806200341a8066a41a0b7c200410c10c50120022008290000370300200120032900a8063703002003200341d8066a412010c6012003280204210720032802002108200341b8076a41c1dcc700410610c501200341c8086a41acc8c700410710c501200341a8066a200341c0046a10d50220032802b006220241206a2201417f4c0d2f0240024020010d004101210b0c010b20011032220b450d310b20094100200a1b2206200741d40020081b6b220820064b2109200341003602a0072003200136029c072003200b3602980720034198076a4100411010c80120032802980720032802a00722016a220720032900b807370000200741086a200341b8076a41086a2900003700002003200141106a22013602a00720034198076a2001411010c80120032802980720032802a00722016a220720032900c808370000200741086a200341c8086a41086a2900003700002003200141106a22073602a00720032802a806210120034198076a2007200210c801200328029807220720032802a007220a6a2001200210c9081a2003200a20026a220a3602a007024020032802ac06450d002001102c0b4100200820091b2102200341c8086a2007200a10d602200341c8086a41106a290300420020032903c80842015122011b210c20032903d008420020011b210d0240200328029c07450d002007102c0b200341c8086a41086a41063a0000200341d9086a200341c0046a41086a2201290300370000200341e1086a200341c0046a41106a2207290300370000200341e9086a200341c0046a41186a220829030037000020034180096a2209200c2004200d200554200c200454200c2004511b220a1b2204370300200341f8086a200d2005200a1b2205370300200341033602c808200320032903c0043700d108200341c8086a10c802200341a8066a41186a220a2008290300370300200341a8066a41106a220b2007290300370300200341a8066a41086a220e2001290300370300200320032903c0043703a806200341003602c007200342043703b807200341b8076a41004100200620026b2208200820064b1b10950220032802c00721070240200620024d0d0020032802b80720074102746a2101034020012002360200200141046a21012006200241016a2202470d000b200820076a21070b200341c8086a41186a2004370300200341f0086a4100360200200341fc086a200736020020034188096a200e29030037030020034190096a200b29030037030020034198096a200a290300370300200320053703d808200320053703c808200320032903a80637038009200342083703e808200320032903b8073702f408200320043703d008200342f3e885db96cddbb3203703980720034198076a20092005200410ab0420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341b8076a200341e8046a10d50220032802c007220241206a2201417f4c0d2f0240024020010d00410121060c010b200110322206450d310b200341003602b006200320013602ac06200320063602a806200341a8066a4100411010c80120032802a80620032802b00622016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602b006200341a8066a2001411010c80120032802a80620032802b00622016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602b00620032802b8072101200341a8066a2006200210c80120032802a806220620032802b00622076a2001200210c9081a2003200720026a22023602b006024020032802bc07450d002001102c0b20062002200341c8086a10ac04024020032802ac06450d002006102c0b024020032802ec082202450d00200241186c450d0020032802e808102c0b0240200341f8086a28020041ffffffff0371450d0020032802f408102c0b200341043a00f8060c3c0b200141106a2903002104200141086a2903002105200341e8076a41206a2208200241206a280200360200200341e8076a41186a2209200241186a290200370300200341e8076a41106a220a200241106a290200370300200341e8076a41086a220b200241086a290200370300200320022902003703e80720022802242102200341d8066a41186a22014200370300200341d8066a41106a22064200370300200341d8066a41086a22074200370300200342003703d80620034198086a41e6dcc700410710c501200720034198086a41086a29000037030020032003290098083703d806200341a8066a41a08ec100411110c5012001200341a8066a41086a2207290000370300200620032900a806370300200341106a200341d8066a10890402400240024002402003280210417d710d00200341c8086a41206a2008280200360200200341c8086a41186a2009290300370300200341c8086a41106a200a290300370300200341c8086a41086a200b290300370300200320032903e8073703c808200320023602ec08200341e8046a200341c8086a10c6022007200341f1046a290000370300200341a8066a41106a200341e8046a41116a290000370300200341a8066a41186a20034181056a290000370300200320032900e9043703a80620032d00e8044101470d01200341023a00e8030c030b200341e8036a411d10a80420022002280200417f6a220136020020010d012002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d012002102c0c010b20034198076a41186a200341a8066a41186a29030037030020034198076a41106a200341a8066a41106a29030037030020034198076a41086a200341a8066a41086a290300370300200320032903a8063703980720034198086a41e6dcc700410710c501200341d8066a419099c100410610c501200341c8086a20034198076a10e40220032802d008220241206a2201417f4c0d300240024020010d00410121060c010b200110322206450d320b41002107200341003602b006200320013602ac06200320063602a806200341a8066a4100411010c80120032802a80620032802b00622016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602b006200341a8066a2001411010c80120032802a80620032802b00622016a220620032900d806370000200641086a200341d8066a41086a22082900003700002003200141106a22063602b00620032802c8082101200341a8066a2006200210c80120032802a806220620032802b00622096a2001200210c9081a2003200920026a22023602b006024020032802cc08450d002001102c0b200341c8086a2006200210c9012008200341c8086a41096a290000370300200341d8066a41106a200341c8086a41116a290000370300200341f0066a2201200341e1086a290000370300200320032900c9083703d806024020032d00c8084101470d00200341f0046a200341d8066a41096a290000370300200341f8046a200341d8066a41116a290000370300200341ff046a2001290000370000200320032900d9063703e80420032d00d8062102410121070b024020032802ac06450d002006102c0b02402007450d00200341f8066a41176a2201200341e8046a41176a290000370000200341f8066a41106a2206200341e8046a41106a290300370300200341b8076a41086a200341e8046a41086a290300220c370300200341b8076a41106a22072006290300370300200341b8076a41176a22062001290000370000200320032903e804220d3703b807200320023a009804200341b0046a2006290000370000200341a9046a2007290300370000200341a1046a200c3700002003200d3700990420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341b8076a20034198046a10d50220032802c007220241206a2201417f4c0d310240024020010d00410121060c010b200110322206450d330b2003410036028007200320013602fc06200320063602f806200341f8066a4100411010c80120032802f80620032802800722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a220136028007200341f8066a2001411010c80120032802f80620032802800722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602800720032802b8072101200341f8066a2006200210c80120032802f806220620032802800722076a2001200210c9081a2003200720026a220236028007024020032802bc07450d002001102c0b200341c8086a2006200210d803200341b8076a41086a20034184096a290200370300200341b8076a41106a2003418c096a290200370300200341b8076a41186a220220034194096a290200370300200341b8076a41206a22012003419c096a2802003602002003200341fc086a2902003703b807024002400240024020032802e8082207450d00200341c8086a41186a290300210c200341c8086a41086a290300210d200341f8086a2802002108200341f4086a2802002109200341f0086a280200210a20032903d808210f20032903c808211020032802ec08210b200341a8066a41206a2001280200360200200341a8066a41186a2002290300370300200341a8066a41106a2202200341b8076a41106a290300370300200341a8066a41086a2201200341b8076a41086a290300370300200320032903b8073703a806024020032802fc06450d002006102c0b200341c0046a41086a22062001290300370300200341c0046a41106a22012002290300370300200341c0046a41186a2202200341a8066a41186a290300370300200341c0046a41206a220e200341a8066a41206a280200360200200341e8046a41186a200c37030020034198056a200836020020034190056a200a3602002003418c056a200b360200200320032903a8063703c0042003200f3703f804200320103703e804200320093602940520032007360288052003200d3703f004200341bc056a200e280200360200200341b4056a2002290300370200200341ac056a2001290300370200200341a4056a20062903003702002003419c056a20032903c004370200200341b8076a41c1dcc700410610c501200341c8086a41acc8c700410710c501200341a8066a20034198076a10d50220032802b006220241206a2201417f4c0d350240024020010d00410121060c010b200110322206450d370b200341003602c804200320013602c404200320063602c004200341c0046a4100411010c80120032802c00420032802c80422016a220620032900b807370000200641086a200341b8076a41086a2900003700002003200141106a22013602c804200341c0046a2001411010c80120032802c00420032802c80422016a220620032900c808370000200641086a200341c8086a41086a2900003700002003200141106a22063602c80420032802a8062101200341c0046a2006200210c80120032802c004220620032802c80422076a2001200210c9081a2003200720026a22023602c804024020032802ac06450d002001102c0b200341c8086a2006200210d602200341c8086a41106a290300420020032903c80842015122021b210c20032903d008420020021b210d024020032802c404450d002006102c0b200d20032903e804220f7d2210200d56200c200341f0046a29030022117d200d200f54ad7d220d200c56200d200c511b450d010240200328028c052202450d00200241186c450d00200328028805102c0b20032802980541ffffffff0371450d02200328029405102c0c020b024020032802fc06450d002006102c0b200341e8036a410110a8040c040b200341e8046a41186a22022903002112200320032903f8042213200520102010200556200d200456200d2004511b22011b22057c220c3703f804200220122004200d20011b22047c200c201354ad7c220d37030020032005200f7c220f3703e8042003200420117c200f200554ad7c3703f004200c4280c8afa025544100200d501b0d01200341c8086a41386a2004370300200341f8086a2005370300200341c8086a41086a41063a0000200341d9086a20034198076a41086a290300370000200341e1086a200341a8076a290300370000200341e9086a20034198076a41186a290300370000200341033602c80820032003290398073700d108200341c8086a10c802200342f3e885db96cddbb3203703a806200341a8066a200341e8046a41386a20032903e804200341e8046a41086a29030010ab0420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341c8086a20034198046a10d50220032802d008220241206a2201417f4c0d330240024020010d00410121060c010b200110322206450d350b200341003602c007200320013602bc07200320063602b807200341b8076a4100411010c80120032802b80720032802c00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602c007200341b8076a2001411010c80120032802b80720032802c00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602c00720032802c8082101200341b8076a2006200210c80120032802b807220620032802c00722076a2001200210c9081a2003200720026a22023602c007024020032802cc08450d002001102c0b20062002200341e8046a10ac04024020032802bc07450d002006102c0b0240200328028c052202450d00200241186c450d00200328028805102c0b20032802980541ffffffff0371450d00200328029405102c0b200341043a00e8030c3c0b200341e8036a410810a8040240200328028c052202450d00200241186c450d00200328028805102c0b20032802980541ffffffff0371450d01200328029405102c0c010b200341e8036a410210a8040b20032d00e8034104460d3920032902ec0321040b20032802e803210220002004370024200041206a2002360000200041186a41003a000020004200370308200042013703000c3c0b200141106a2903002104200141086a2903002105200341e8076a41206a2208200241206a280200360200200341e8076a41186a2209200241186a290200370300200341e8076a41106a220a200241106a290200370300200341e8076a41086a220b200241086a290200370300200320022902003703e80720022802242102200341d8066a41186a22064200370300200341d8066a41106a22014200370300200341d8066a41086a22074200370300200342003703d80620034198086a41e6dcc700410710c501200720034198086a41086a29000037030020032003290098083703d806200341a8066a41a08ec100411110c5012006200341a8066a41086a2207290000370300200120032900a806370300200341206a200341d8066a108904024002402003280220417d710d00200341c8086a41206a2008280200360200200341c8086a41186a2009290300370300200341c8086a41106a200a290300370300200341c8086a41086a200b290300370300200320032903e8073703c808200320023602ec08200341e8046a200341c8086a10c6022007200341f1046a290000370300200341a8066a41106a200341e8046a41116a290000370300200341a8066a41186a20034181056a290000370300200320032900e9043703a80620032d00e8044101470d01200341023a00f8060c370b200341f8066a411d10a80420022002280200417f6a220136020020010d352002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d352002102c0c350b20034198046a41186a200341a8066a41186a29030037030020034198046a41106a200341a8066a41106a29030037030020034198046a41086a200341a8066a41086a290300370300200320032903a8063703980420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341b8076a20034198046a10d50220032802c007220241206a2206417f4c0d2d0240024020060d00410121070c010b200610322207450d2f0b200341003602a0072003200636029c07200320073602980720034198076a4100411010c80120032802980720032802a00722066a2207200329009808370000200741086a20034198086a41086a2900003700002003200641106a22063602a00720034198076a2006411010c80120032802980720032802a00722066a220720032900d806370000200741086a200341d8066a41086a2900003700002003200641106a22073602a00720032802b807210620034198076a2007200210c801200328029807220720032802a00722086a2006200210c9081a2003200820026a22023602a007024020032802bc07450d002006102c0b200341c8086a2007200210d803200341b8076a41086a20034184096a290200370300200341b8076a41106a2003418c096a290200370300200341b8076a41186a220920034194096a290200370300200341b8076a41206a220a2003419c096a2802003602002003200341fc086a2902003703b8070240024020032802e8082206450d00200341c8086a41186a290300210c200341c8086a41086a290300210f200341f8086a280200210b200341f4086a280200210e200341f0086a280200210820032903d808210d20032903c808211020032802ec082102200341a8066a41206a200a280200360200200341a8066a41186a2009290300370300200341a8066a41106a2209200341b8076a41106a290300370300200341a8066a41086a220a200341b8076a41086a290300370300200320032903b8073703a8060240200328029c07450d002007102c0b200341c0046a41086a2207200a290300370300200341c0046a41106a220a2009290300370300200341c0046a41186a2209200341a8066a41186a290300370300200341c0046a41206a2214200341a8066a41206a280200360200200341e8046a41186a200c37030020034198056a200b36020020034190056a20083602002003418c056a2002360200200320032903a8063703c0042003200d3703f804200320103703e8042003200e3602940520032006360288052003200f3703f004200341bc056a2014280200360200200341b4056a2009290300370200200341ac056a200a290300370200200341a4056a20072903003702002003419c056a20032903c0043702002008411f4b0d010240200d2005200d200554200c200454200c2004511b22071b2205200c200420071b220484500d00200341e8046a41186a4200200c20047d200d200554ad7d220f200d20057d22104280c8afa025544100200f501b22021b37030020034200201020021b3703f804200341d8066a41186a4200370300200341e8066a4200370300200341d8066a41086a22074200370300200342003703d80620034198086a41e6dcc700410710c501200720034198086a41086a29000037030020032003290098083703d806200341a8066a41ccbac200410a10c501200141086a200341a8066a41086a290000370000200120032900a806370000200341186a200341d8066a412010c601200c200420021b2104200d200520021b2105200328021c411c6a411c20032802181b210102402003280290052202200328028c05470d00200341e8046a41206a200210ad04200328029005210220032802880521060b2006200241186c6a22022004370308200220053703002002200136021041012106200320032802900541016a36029005200342f3e885db96cddbb3203703a806200341a8066a200341a0056a20032903e804200341e8046a41086a29030010ab0420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341c8086a20034198046a10d50220032802d008220241206a2201417f4c0d3002402001450d00200110322206450d320b200341003602c007200320013602bc07200320063602b807200341b8076a4100411010c80120032802b80720032802c00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602c007200341b8076a2001411010c80120032802b80720032802c00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602c00720032802c8082101200341b8076a2006200210c80120032802b807220620032802c00722076a2001200210c9081a2003200720026a22023602c007024020032802cc08450d002001102c0b20062002200341e8046a10ac04024020032802bc07450d002006102c0b20034180096a2004370300200341f8086a2005370300200341d0086a41073a0000200341d9086a200341a8056a290300370000200341e1086a200341b0056a290300370000200341e9086a200341b8056a290300370000200341033602c808200320032903a0053700d108200341c8086a10c802200328028c0521020b02402002450d00200241186c450d00200328028805102c0b024020032802980541ffffffff0371450d00200328029405102c0b200341043a00f8060c380b0240200328029c07450d002007102c0b200341f8066a410110a8040c350b200341f8066a410910a8040240200328028c052202450d00200241186c450d00200328028805102c0b20032802980541ffffffff0371450d34200328029405102c0c340b200141046a280200210e200341e8076a41206a2208200241206a280200360200200341e8076a41186a2209200241186a290200370300200341e8076a41106a220a200241106a290200370300200341e8076a41086a220b200241086a290200370300200320022902003703e80720022802242102200341d8066a41186a22064200370300200341d8066a41106a22014200370300200341d8066a41086a22074200370300200342003703d80620034198086a41e6dcc700410710c501200720034198086a41086a29000037030020032003290098083703d806200341a8066a41a08ec100411110c5012006200341a8066a41086a290000370300200120032900a806370300200341306a200341d8066a1089040240024002402003280230417d710d00200341c8086a41206a2008280200360200200341c8086a41186a2009290300370300200341c8086a41106a200a290300370300200341c8086a41086a200b290300370300200320032903e8073703c808200320023602ec08200341e8046a200341c8086a10c602200341b8076a41086a200341f1046a290000370300200341b8076a41106a200341e8046a41116a290000370300200341b8076a41186a20034181056a290000370300200320032900e9043703b80720032d00e8044101470d01410221010c020b200341c8086a411d10a80420034192046a20032d00cb083a0000200320032f00c9083b01900420032d00c808210120032902cc08210420022002280200417f6a220636020020060d012002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22062006280200417f6a220636020020060d012002102c0c010b20034198046a41186a200341b8076a41186a29030037030020034198046a41106a200341b8076a41106a29030037030020034198046a41086a200341b8076a41086a290300370300200320032903b8073703980420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341b8076a20034198046a10d50220032802c007220241206a2206417f4c0d2d0240024020060d00410121070c010b200610322207450d2f0b200341003602a0072003200636029c07200320073602980720034198076a4100411010c80120032802980720032802a00722066a2207200329009808370000200741086a20034198086a41086a2900003700002003200641106a22063602a00720034198076a2006411010c80120032802980720032802a00722066a220720032900d806370000200741086a200341d8066a41086a2900003700002003200641106a22073602a00720032802b807210620034198076a2007200210c801200328029807220720032802a00722086a2006200210c9081a2003200820026a22023602a007024020032802bc07450d002006102c0b200341c8086a2007200210d803200341b8076a41086a20034184096a290200370300200341b8076a41106a2003418c096a290200370300200341b8076a41186a220620034194096a290200370300200341b8076a41206a22082003419c096a2802003602002003200341fc086a2902003703b80702400240024020032802e8082209450d00200341c8086a41186a2903002104200341c8086a41086a290300210f200341f8086a280200210a200341f4086a2802002115200341f0086a280200210220032903d808210520032903c808211020032802ec08210b200341a8066a41206a2008280200360200200341a8066a41186a2006290300370300200341a8066a41106a2208200341b8076a41106a2216290300370300200341a8066a41086a2206200341b8076a41086a2217290300370300200320032903b8073703a8060240200328029c07450d002007102c0b200341c0046a41086a22072006290300370300200341c0046a41106a22182008290300370300200341c0046a41186a2208200341a8066a41186a2219290300370300200341c0046a41206a221a200341a8066a41206a280200360200200341e8046a41186a2214200437030020034198056a200a36020020034190056a20023602002003418c056a200b360200200320032903a8063703c004200320053703f804200320103703e804200320153602940520032009360288052003200f3703f004200341bc056a201a280200360200200341b4056a2008290300370200200341ac056a2018290300370200200341a4056a20072903003702002003419c056a220820032903c004370200200341b8076a41186a200341b8056a2903003703002016200341b0056a2903003703002017200341a8056a290300370300200320032903a0053703b807200341d8066a41186a4200370300200341d8066a41106a4200370300200341d8066a41086a22074200370300200342003703d80620034198086a41e6dcc700410710c501200720034198086a41086a29000037030020032003290098083703d806200341a8066a41ccbac200410a10c501200141086a2006290000370000200120032900a806370000200341286a200341d8066a412010c60120032802284101460d0120102105200f210c0c020b0240200328029c07450d002007102c0b200341c8086a410110a80420034192046a20032d00cb083a0000200320032f00c9083b01900420032d00c808210120032902cc0821040c020b200328022c2107200341c8086a41086a22162008280200360200200341a8066a41086a2217200341a0056a220a41086a2218290300370300200341a8066a41106a221a200a41106a221b2903003703002019200a41186a29030037030020032003290294053703c8082003200a2903003703a80620034194056a21152014290300211120032903f80421120240024020020d0020102105200f210c200921010c010b2009200241186c6a210820102105200f210c20092102200921010340200241086a290300210d20022903002104024002402007200241106a2802002206490d004200200c200d7d2005200454ad7d220d200520047d2204200556200d200c56200d200c511b22061b210c4200200420061b21050c010b20012004370300200120063602102001200d370308200141186a21010b200241186a22022008470d000b0b201520032903c808370200200a20032903a806370300200341e8046a41186a2011370300201541086a201628020036020020182017290300370300201b201a290300370300200a41186a200341a8066a41186a290300370300200320123703f804200320053703e8042003200b36028c052003200c3703f00420032009360288052003200120096b41186d2202360290050b024002400240024020020d0020032903f8044281c8afa0255441002014290300501b0d010b200342f3e885db96cddbb3203703c004200341c0046a200341a0056a2005200c10ab0420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341c8086a20034198046a10d50220032802d008220241206a2201417f4c0d300240024020010d00410121060c010b200110322206450d320b200341003602b006200320013602ac06200320063602a806200341a8066a4100411010c80120032802a80620032802b00622016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602b006200341a8066a2001411010c80120032802a80620032802b00622016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602b00620032802c8082101200341a8066a2006200210c80120032802a806220620032802b00622076a2001200210c9081a2003200720026a22023602b006024020032802cc08450d002001102c0b20062002200341e8046a10ac04024020032802ac06450d002006102c0b200ead4298ec037e42f8b7b1ed017c21054201210c0c010b200341c8086a200341b8076a200e10ae0420034198076a41026a220220032d00cb083a0000200320032f00c9083b01980720032d00c80822014104470d01200342f3e885db96cddbb3203703f806200341f8066a200341b8076a10af044200210c0b0240201020032903e804220d58200f200341e8046a41086a290300220458200f2004511b0d00200341f8086a2010200d7d370300200341c8086a41086a41083a0000200341d9086a200341b8076a41086a290300370000200341e1086a200341c8076a290300370000200341e9086a200341d0076a29030037000020034180096a200f20047d2010200d54ad7d370300200341033602c808200320032903b8073700d108200341c8086a10c8020b0240200328028c052202450d00200241186c450d00200328028805102c0b024020032802980541ffffffff0371450d00200328029405102c0b200320032800e8033602f8032003200341eb036a2800003600fb03200041186a41003a0000200041106a20053703002000200c370308200020032802f8033600192000411c6a20032800fb03360000200042003703000c3c0b20032902cc08210420034190046a41026a20022d00003a0000200320032f0198073b0190040240200328028c052202450d00200241186c450d00200328028805102c0b20032802980541ffffffff0371450d00200328029405102c0b20034188046a41026a220220034190046a41026a2d00003a0000200320032800e8033602f803200320032f0190043b0188042003200341eb036a2800003600fb03200041186a41003a000020004200370308200020032802f8033600192000411c6a20032800fb03360000200041206a20013a000020002004370024200020032f0188043b0021200041236a20022d00003a0000200042013703000c3a0b200141046a280200210e200341e8076a41206a2208200241206a280200360200200341e8076a41186a2209200241186a290200370300200341e8076a41106a220a200241106a290200370300200341e8076a41086a220b200241086a290200370300200320022902003703e80720022802242102200341d8066a41186a22014200370300200341d8066a41106a22064200370300200341d8066a41086a22074200370300200342003703d80620034198086a41e6dcc700410710c501200720034198086a41086a29000037030020032003290098083703d806200341a8066a41a08ec100411110c5012001200341a8066a41086a2207290000370300200620032900a806370300200341386a200341d8066a10890402400240024002402003280238417d710d00200341c8086a41206a2008280200360200200341c8086a41186a2009290300370300200341c8086a41106a200a290300370300200341c8086a41086a200b290300370300200320032903e8073703c808200320023602ec08200341e8046a200341c8086a10c6022007200341f1046a290000370300200341a8066a41106a200341e8046a41116a290000370300200341a8066a41186a20034181056a290000370300200320032900e9043703a80620032d00e8044101470d01200341023a00f8060c030b200341f8066a411d10a80420022002280200417f6a220136020020010d012002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d012002102c0c010b20034198046a41186a200341a8066a41186a29030037030020034198046a41106a200341a8066a41106a29030037030020034198046a41086a200341a8066a41086a290300370300200320032903a8063703980420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341b8076a20034198046a10d50220032802c007220241206a2201417f4c0d2d0240024020010d00410121060c010b200110322206450d2f0b200341003602a0072003200136029c07200320063602980720034198076a4100411010c80120032802980720032802a00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602a00720034198076a2001411010c80120032802980720032802a00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602a00720032802b807210120034198076a2006200210c801200328029807220620032802a00722076a2001200210c9081a2003200720026a22023602a007024020032802bc07450d002001102c0b200341c8086a2006200210d803200341b8076a41086a20034184096a290200370300200341b8076a41106a2003418c096a290200370300200341b8076a41186a220220034194096a290200370300200341b8076a41206a220a2003419c096a2802003602002003200341fc086a2902003703b807024020032802e8082207450d00200341c8086a41186a2903002104200341c8086a41086a2903002105200341f8086a2802002108200341f4086a2802002109200341f0086a280200210b20032903d808210c20032903c808210d20032802ec082101200341a8066a41206a200a280200360200200341a8066a41186a2002290300370300200341a8066a41106a2202200341b8076a41106a290300370300200341a8066a41086a220a200341b8076a41086a290300370300200320032903b8073703a8060240200328029c07450d002006102c0b200341c0046a41086a2206200a290300370300200341c0046a41106a220a2002290300370300200341c0046a41186a2202200341a8066a41186a290300370300200341c0046a41206a2214200341a8066a41206a280200360200200341e8046a41186a200437030020034198056a200836020020034190056a200b3602002003418c056a2001360200200320032903a8063703c0042003200c3703f8042003200d3703e80420032009360294052003200736028805200320053703f004200341bc056a2014280200360200200341b4056a2002290300370200200341ac056a200a290300370200200341a4056a20062903003702002003419c056a20032903c00437020020034198086a41e6dcc700410710c501200341d8066a41b18ec100410a10c501200341c8086a200341a0056a220b10e40220032802d008220241206a2206417f4c0d2e0240024020060d004101210a0c010b20061032220a450d300b200341003602c007200320063602bc072003200a3602b807200341b8076a4100411010c80120032802b80720032802c00722066a220a200329009808370000200a41086a20034198086a41086a2900003700002003200641106a22063602c007200341b8076a2006411010c80120032802b80720032802c00722066a220a20032900d806370000200a41086a200341d8066a41086a2900003700002003200641106a220a3602c00720032802c8082106200341b8076a200a200210c80120032802b807220a20032802c00722146a2006200210c9081a2003201420026a22023602c007024020032802cc08450d002006102c0b200a200210b401024020032802bc07450d00200a102c0b20034198086a41e6dcc700410710c501200341d8066a418893c700410a10c501200341c8086a200b10e40220032802d008220241206a2206417f4c0d2e0240024020060d004101210a0c010b20061032220a450d300b200341003602c007200320063602bc072003200a3602b807200341b8076a4100411010c80120032802b80720032802c00722066a220a200329009808370000200a41086a20034198086a41086a2900003700002003200641106a22063602c007200341b8076a2006411010c80120032802b80720032802c00722066a220a20032900d806370000200a41086a200341d8066a41086a2900003700002003200641106a220a3602c00720032802c8082106200341b8076a200a200210c80120032802b807220a20032802c007220b6a2006200210c9081a2003200b20026a22023602c007024020032802cc08450d002006102c0b200341003a00cd080240024002400240200e41c000490d00200e41808001490d01200e418080808004490d0241052106200341053a00cd08200341033a00c8082003200e3600c9080c030b41012106200341013a00cd082003200e4102743a00c8080c020b41022106200341023a00cd082003200e4102744101723b01c8080c010b41042106200341043a00cd082003200e4102744102723602c8080b200a2002200341c8086a200610a702024020032d00cd08450d00200341003a00cd080b024020032802bc07450d00200a102c0b02402001450d00200141186c450d002007102c0b0240200841ffffffff0371450d002009102c0b200341043a00f8060c340b0240200328029c07450d002006102c0b200341f8066a410110a8040b20032d00f8064104460d3220032902fc0621040b20032802f806210220002004370024200041206a2002360000200041186a41003a000020004200370308200042013703000c390b200341e8076a41206a2209200241206a280200360200200341e8076a41186a220a200241186a290200370300200341e8076a41106a220b200241106a290200370300200341e8076a41086a220e200241086a290200370300200320022902003703e807200141046a2802002107200141086a28020021082001410c6a280200211820022802242102200341d8066a41186a22014200370300200341d8066a41106a22174200370300200341d8066a41086a22064200370300200342003703d80620034198086a41e6dcc700410710c501200620034198086a41086a29000037030020032003290098083703d806200341a8066a41a08ec100411110c5012001200341a8066a41086a2206290000370300201720032900a806370300200341c8006a200341d8066a10890402402003280248417d710d00200341c8086a41206a2009280200360200200341c8086a41186a200a290300370300200341c8086a41106a200b290300370300200341c8086a41086a200e290300370300200320032903e8073703c808200320023602ec08200341e8046a200341c8086a10c6022006200341f1046a290000370300200341a8066a41106a200341e8046a41116a290000370300200341a8066a41186a20034181056a290000370300200320032900e9043703a806024020032d00e8044101470d00200341023a00f806024020080d000c310b2007450d2f200841ffffff3f71450d2f2007102c0c2f0b20034198076a41186a200341a8066a41186a29030037030020034198076a41106a200341a8066a41106a29030037030020034198076a41086a200341a8066a41086a290300370300200320032903a8063703980720034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341b8076a20034198076a10d50220032802c007220241206a2201417f4c0d2b0240024020010d00410121060c010b200110322206450d2d0b200341003602a0042003200136029c04200320063602980420034198046a4100411010c80120032802980420032802a00422016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602a00420034198046a2001411010c80120032802980420032802a00422016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602a00420032802b807210120034198046a2006200210c801200328029804220620032802a00422096a2001200210c9081a2003200920026a22023602a004024020032802bc07450d002001102c0b200341c8086a2006200210d803200341b8076a41086a20034184096a290200370300200341b8076a41106a2003418c096a290200370300200341b8076a41186a220220034194096a290200370300200341b8076a41206a220a2003419c096a2802003602002003200341fc086a2902003703b8070240024020032802e8082201450d00200341c8086a41186a2903002104200341c8086a41086a2903002105200341f8086a280200210b200341f4086a280200210e200341f0086a280200211420032903d808210c20032903c808210d20032802ec082109200341a8066a41206a200a280200360200200341a8066a41186a2002290300370300200341a8066a41106a2202200341b8076a41106a290300370300200341a8066a41086a220a200341b8076a41086a290300370300200320032903b8073703a8060240200328029c04450d002006102c0b200341c0046a41086a2215200a290300370300200341c0046a41106a220a2002290300370300200341c0046a41186a2202200341a8066a41186a2206290300370300200341c0046a41206a2216200341a8066a41206a280200360200200341e8046a41186a200437030020034198056a200b36020020034190056a20143602002003418c056a2009360200200320032903a8063703c0042003200c3703f8042003200d3703e8042003200e360294052003200136028805200320053703f004200341bc056a2016280200360200200341b4056a2002290300370200200341ac056a200a290300370200200341a4056a20152903003702002003419c056a20032903c00437020020180d01200341f8066a410510a80402402009450d00200941186c450d002001102c0b200b41ffffffff0371450d2f200e102c0c2f0b0240200328029c04450d002006102c0b200341f8066a410110a8040c2e0b200741186a2900002105200741106a290000210c20072900002104200341c8086a41086a2201200741086a290000220d370300200341a8066a41086a2209200d370300200341a8066a41106a220a200c37030020062005370300200320043703c808200320043703a80620022006290300370300200341c0046a41106a2206200a290300370300200341c0046a41086a220a2009290300370300200320032903a8063703c00420034198046a41186a2209200229030037030020034198046a41106a2202200629030037030020034198046a41086a2206200a290300370300200320032903c00437039804200341c8086a41186a2009290300370300200341c8086a41106a220b20022903003703002001200629030037030020032003290398043703c80841201032220a450d2c200a20032903c808370000200a41186a200341c8086a41186a2209290300370000200a41106a200b290300370000200a41086a200129030037000020034281808080103702dc062003200a3602d806024020184101470d00410121020c2b0b200341b8076a41086a2214200741286a290000370300200341b8076a41106a2215200741306a290000370300200341b8076a41186a2216200741386a290000370300200320072900203703b807201841057421184102210241c000210141012106034020092016290300370300200341c8086a41106a220b2015290300370300200341c8086a41086a220e2014290300370300200320032903b8073703c80802402002417f6a2006470d00200341d8066a2006410110d60120032802d806210a0b200a20016a41606a220620032903c808370000200641186a2009290300370000200641106a200b290300370000200641086a200e290300370000200320023602e00620024110460d2b20182001460d2b2014200720016a220641086a2900003703002015200641106a2900003703002016200641186a290000370300200320062900003703b807200141206a2101200241016a210220032802dc0621060c000b0b200341f8066a411d10a80402402008450d002007450d00200841ffffff3f71450d002007102c0b20022002280200417f6a220136020020010d2d2002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d2d2002102c0c2d0b200341e8076a41206a2208200241206a280200360200200341e8076a41186a2209200241186a290200370300200341e8076a41106a220a200241106a290200370300200341e8076a41086a220b200241086a290200370300200320022902003703e80720022802242102200341d8066a41186a22014200370300200341d8066a41106a22064200370300200341d8066a41086a22074200370300200342003703d80620034198086a41e6dcc700410710c501200720034198086a41086a29000037030020032003290098083703d806200341a8066a41a08ec100411110c5012001200341a8066a41086a2207290000370300200620032900a806370300200341d0006a200341d8066a10890402400240024002402003280250417d710d00200341c8086a41206a2008280200360200200341c8086a41186a2009290300370300200341c8086a41106a200a290300370300200341c8086a41086a200b290300370300200320032903e8073703c808200320023602ec08200341e8046a200341c8086a10c6022007200341f1046a290000370300200341a8066a41106a200341e8046a41116a290000370300200341a8066a41186a20034181056a290000370300200320032900e9043703a80620032d00e8044101470d01200341023a00f8060c030b200341f8066a411d10a80420022002280200417f6a220136020020010d012002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d012002102c0c010b20034198046a41186a200341a8066a41186a29030037030020034198046a41106a200341a8066a41106a29030037030020034198046a41086a200341a8066a41086a290300370300200320032903a8063703980420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341b8076a20034198046a10d50220032802c007220241206a2201417f4c0d2b0240024020010d00410121060c010b200110322206450d2d0b200341003602a0072003200136029c07200320063602980720034198076a4100411010c80120032802980720032802a00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602a00720034198076a2001411010c80120032802980720032802a00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602a00720032802b807210120034198076a2006200210c801200328029807220620032802a00722076a2001200210c9081a2003200720026a22023602a007024020032802bc07450d002001102c0b200341c8086a2006200210d803200341b8076a41086a20034184096a290200370300200341b8076a41106a2003418c096a290200370300200341b8076a41186a220220034194096a290200370300200341b8076a41206a220a2003419c096a2802003602002003200341fc086a2902003703b807024020032802e8082207450d00200341c8086a41186a2903002104200341c8086a41086a2903002105200341f8086a2802002108200341f4086a2802002109200341f0086a280200210b20032903d808210c20032903c808210d20032802ec082101200341a8066a41206a200a280200360200200341a8066a41186a2002290300370300200341a8066a41106a2202200341b8076a41106a290300370300200341a8066a41086a220a200341b8076a41086a290300370300200320032903b8073703a8060240200328029c07450d002006102c0b200341c0046a41086a2206200a290300370300200341c0046a41106a220a2002290300370300200341c0046a41186a2202200341a8066a41186a290300370300200341c0046a41206a220e200341a8066a41206a280200360200200341e8046a41186a200437030020034198056a200836020020034190056a200b3602002003418c056a2001360200200320032903a8063703c0042003200c3703f8042003200d3703e80420032009360294052003200736028805200320053703f004200341bc056a200e280200360200200341b4056a2002290300370200200341ac056a200a290300370200200341a4056a20062903003702002003419c056a20032903c00437020020034198086a41e6dcc700410710c501200341d8066a418893c700410a10c501200341c8086a200341a0056a220b10e40220032802d008220241206a2206417f4c0d2c0240024020060d004101210a0c010b20061032220a450d2e0b200341003602c007200320063602bc072003200a3602b807200341b8076a4100411010c80120032802b80720032802c00722066a220a200329009808370000200a41086a20034198086a41086a2900003700002003200641106a22063602c007200341b8076a2006411010c80120032802b80720032802c00722066a220a20032900d806370000200a41086a200341d8066a41086a2900003700002003200641106a220a3602c00720032802c8082106200341b8076a200a200210c80120032802b807220a20032802c007220e6a2006200210c9081a2003200e20026a22023602c007024020032802cc08450d002006102c0b200a200210b401024020032802bc07450d00200a102c0b20034198086a41e6dcc700410710c501200341d8066a41b18ec100410a10c501200341c8086a200b10e40220032802d008220241206a2206417f4c0d2c0240024020060d004101210a0c010b20061032220a450d2e0b200341003602c007200320063602bc072003200a3602b807200341b8076a4100411010c80120032802b80720032802c00722066a220a200329009808370000200a41086a20034198086a41086a2900003700002003200641106a22063602c007200341b8076a2006411010c80120032802b80720032802c00722066a220a20032900d806370000200a41086a200341d8066a41086a2900003700002003200641106a220a3602c00720032802c8082106200341b8076a200a200210c80120032802b807220a20032802c007220b6a2006200210c9081a2003200b20026a22023602c007024020032802cc08450d002006102c0b200a200210b401024020032802bc07450d00200a102c0b02402001450d00200141186c450d002007102c0b0240200841ffffffff0371450d002009102c0b200341043a00f8060c2a0b0240200328029c07450d002006102c0b200341f8066a410110a8040b20032d00f8064104460d2820032902fc0621040b20032802f806210220002004370024200041206a2002360000200041186a41003a000020004200370308200042013703000c370b200341e8076a41206a200141216a2d00003a0000200341e8076a41186a200141196a290000370300200341e8076a41106a200141116a290000370300200341e8076a41086a200141096a290000370300200320012900013703e807200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c808200341e8046a200341c8086a10c602200341d8066a41086a2202200341e8046a41096a290000370300200341d8066a41106a2201200341e8046a41116a290000370300200341d8066a41186a2206200341e8046a41196a290000370300200320032900e9043703d80620032d00e8044101460d0e20034198046a41186a200629030037030020034198046a41106a200129030037030020034198046a41086a2002290300370300200320032903d8063703980420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341b8076a20034198046a10d50220032802c007220241206a2201417f4c0d280240024020010d00410121060c010b200110322206450d2a0b200341003602a0072003200136029c07200320063602980720034198076a4100411010c80120032802980720032802a00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602a00720034198076a2001411010c80120032802980720032802a00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602a00720032802b807210120034198076a2006200210c801200328029807220620032802a00722076a2001200210c9081a2003200720026a22023602a007024020032802bc07450d002001102c0b200341c8086a2006200210d803200341b8076a41086a20034184096a290200370300200341b8076a41106a2003418c096a290200370300200341b8076a41186a220220034194096a290200370300200341b8076a41206a220a2003419c096a2802003602002003200341fc086a2902003703b807024020032802e8082207450d00200341c8086a41186a2903002104200341c8086a41086a2903002105200341f8086a2802002108200341f4086a2802002109200341f0086a280200210b20032903d808210c20032903c808210d20032802ec082101200341a8066a41206a200a280200360200200341a8066a41186a2002290300370300200341a8066a41106a2202200341b8076a41106a290300370300200341a8066a41086a220a200341b8076a41086a290300370300200320032903b8073703a8060240200328029c07450d002006102c0b200341c0046a41086a2206200a290300370300200341c0046a41106a220a2002290300370300200341c0046a41186a2202200341a8066a41186a290300370300200341c0046a41206a220e200341a8066a41206a280200360200200341e8046a41186a200437030020034198056a200836020020034190056a200b3602002003418c056a2001360200200320032903a8063703c0042003200c3703f8042003200d3703e80420032009360294052003200736028805200320053703f004200341bc056a200e280200360200200341b4056a2002290300370200200341ac056a200a290300370200200341a4056a20062903003702002003419c056a20032903c004370200200341c8086a41206a200341e8076a41206a2d00003a0000200341c8086a41186a200341e8076a41186a290300370300200341c8086a41106a200341e8076a41106a290300370300200341c8086a41086a200341e8076a41086a290300370300200320032903e8073703c80820034198086a41e6dcc700410710c501200341d8066a41e0b9c200410510c501200341b8076a200341a0056a10e40220032802c007220241206a2206417f4c0d290240024020060d004101210a0c010b20061032220a450d2b0b200341003602b006200320063602ac062003200a3602a806200341a8066a4100411010c80120032802a80620032802b00622066a220a200329009808370000200a41086a20034198086a41086a2900003700002003200641106a22063602b006200341a8066a2006411010c80120032802a80620032802b00622066a220a20032900d806370000200a41086a200341d8066a41086a2900003700002003200641106a220a3602b00620032802b8072106200341a8066a200a200210c80120032802a806220a20032802b006220b6a2006200210c9081a2003200b20026a22023602b006024020032802bc07450d002006102c0b200a2002200341c8086a10aa04024020032802ac06450d00200a102c0b02402001450d00200141186c450d002007102c0b0240200841ffffffff0371450d002009102c0b200341043a00f8060c260b0240200328029c07450d002006102c0b200341f8066a410110a80420032d00f8064104460d2520032902fc0621040c240b20034198046a41186a200141196a29000037030020034198046a41106a200141116a29000037030020034198046a41086a200141096a2900003703002003200129000137039804200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c808200341e8046a200341c8086a10c602200341a8066a41086a2202200341e8046a41096a290000370300200341a8066a41106a2201200341e8046a41116a290000370300200341a8066a41186a2206200341e8046a41196a290000370300200320032900e9043703a80620032d00e8044101460d0c200341c0046a41186a2006290300370300200341c0046a41106a2001290300370300200341c0046a41086a2002290300370300200320032903a8063703c00420034198086a41e6dcc700410710c501200341d8066a419099c100410610c501200341e8046a200341c0046a10e40220032802f004220241206a2201417f4c0d270240024020010d00410121060c010b200110322206450d290b200341003602f007200320013602ec07200320063602e807200341e8076a4100411010c80120032802e80720032802f00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602f007200341e8076a2001411010c80120032802e80720032802f00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22013602f00720032802e8042106200341e8076a2001200210c80120032802e807220120032802f00722076a2006200210c9081a2003200720026a22023602f007024020032802ec04450d002006102c0b200341c8086a2001200210c901200341e8046a41086a200341d2086a290100370300200341e8046a41106a200341da086a290100370300200341e8046a41176a2202200341e1086a290000370000200320032901ca083703e80402400240024020032d00c8084101470d0020032d00c9082106200341f8066a41176a2002290000370000200341f8066a41106a2202200341e8046a41106a290300370300200341f8066a41086a2207200341e8046a41086a290300370300200320032903e8043703f806024020032802ec07450d002001102c0b200341b8076a41176a2201200341f8066a41176a290000370000200341b8076a41106a22082002290300370300200341b1066a2007290300370000200341b9066a2008290300370000200341a8066a41186a2001290000370000200320063a00a806200320032903f8063700a906200341e8076a41086a20034198046a41086a290300370300200341e8076a41106a20034198046a41106a290300370300200341e8076a41186a20034198046a41186a29030037030020032003290398043703e80720034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341c8086a200341e8076a10d50220032802d008220241206a2201417f4c0d2a20010d01410121060c020b024020032802ec07450d002001102c0b200341e8036a410210a8040c220b200110322206450d290b200341003602f004200320013602ec04200320063602e804200341e8046a4100411010c80120032802e80420032802f00422016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602f004200341e8046a2001411010c80120032802e80420032802f00422016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602f00420032802c8082101200341e8046a2006200210c80120032802e804220620032802f00422076a2001200210c9081a2003200720026a22023602f004024020032802cc08450d002001102c0b2006200210ce022102024020032802ec04450d002006102c0b02402002450d00200341e8036a410410a8040c210b200341e8076a200341a8066a412010cc08450d1f2003200341e8076a3602b80720034198086a41e6dcc700410710c501200341d8066a419099c100410610c501200341c8086a200341c0046a10e40220032802d008220241206a2201417f4c0d270240024020010d00410121060c010b200110322206450d290b200341003602f004200320013602ec04200320063602e804200341e8046a4100411010c80120032802e80420032802f00422016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602f004200341e8046a2001411010c80120032802e80420032802f00422016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602f00420032802c8082101200341e8046a2006200210c80120032802e804220620032802f00422076a2001200210c9081a2003200720026a22023602f004024020032802cc08450d002001102c0b20062002200341b8076a10cc01024020032802ec04450d002006102c0b20034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341c8086a200341a8066a10d50220032802d008220241206a2201417f4c0d270240024020010d00410121060c010b200110322206450d290b200341003602a0072003200136029c07200320063602980720034198076a4100411010c80120032802980720032802a00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602a00720034198076a2001411010c80120032802980720032802a00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22013602a00720032802c808210620034198076a2001200210c801200328029807220120032802a00722076a2006200210c9081a2003200720026a22023602a007024020032802cc08450d002006102c0b200341c8086a2001200210d803024020032802e8082206450d002001200210b4010b200341b8076a41086a220220034184096a290200370300200341b8076a41106a22072003418c096a290200370300200341b8076a41186a220820034194096a290200370300200341b8076a41206a22092003419c096a2802003602002003200341fc086a2902003703b80702402006450d00200341c8086a41186a2903002104200341c8086a41086a2903002105200341f8086a280200210a200341f4086a280200210b200341f0086a280200210e20032903d808210c20032903c808210d20032802ec082114200341e8046a41206a2009280200360200200341e8046a41186a2008290300370300200341e8046a41106a2007290300370300200341e8046a41086a2002290300370300200320032903b8073703e8040240200328029c07450d002001102c0b200341c8086a41186a2004370300200341f8086a200a360200200341f0086a200e360200200341ec086a2014360200200341fc086a20032903e80437020020034184096a200341f0046a2903003702002003418c096a200341e8046a41106a29030037020020034194096a200341e8046a41186a2903003702002003419c096a200341e8046a41206a2802003602002003200c3703d808200320053703d0082003200d3703c8082003200b3602f408200320063602e80820034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341b8076a200341e8076a10d50220032802c007220241206a2201417f4c0d280240024020010d00410121060c010b200110322206450d2a0b200341c8086a41206a2107200341c8086a41106a2108200341003602a0072003200136029c07200320063602980720034198076a4100411010c80120032802980720032802a00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602a00720034198076a2001411010c80120032802980720032802a00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602a00720032802b807210120034198076a2006200210c801200328029807220620032802a00722096a2001200210c9081a2003200920026a22093602a007024020032802bc07450d002001102c0b200341003602c007200342013703b807200341b8076a41004120102f20032802b80720032802c00722016a2202200329038009370000200241086a20034188096a290300370000200241106a20034190096a290300370000200241186a20034198096a2903003700002003200141206a3602c0072003200341c8086a3602d806200341d8066a200341b8076a10e903200320083602d806200341d8066a200341b8076a10e903200341b8076a200710b00420032802f40820032802fc08200341b8076a10d5032006200920032802b807220220032802c00710a702024020032802bc07450d002002102c0b0240200328029c07450d002006102c0b024020032802ec082202450d00200241186c450d0020032802e808102c0b20032802f80841ffffffff0371450d2020032802f408102c0c200b200328029c07450d1f2001102c0c1f0b200141046a2802002101200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c8080240200341c8086a10da02450d00200341b8076a41026a200341e8076a41026a2d000022023a0000200320032f00e80722013b01b807200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c350b200341d8066a41186a22024200370300200341d8066a41106a22064200370300200341d8066a41086a22074200370300200342003703d80620034198086a41e6dcc700410710c501200720034198086a41086a29000037030020032003290098083703d806200341a8066a41f4b7c200410e10c5012002200341a8066a41086a290000370300200620032900a806370300200320013602c808200341d8066a4120200341c8086a410410a702200041186a41003a000020004200370308200020032800e8043600192000411c6a200341eb046a280000360000200042003703000c340b200141046a2802002107200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c8080240200341c8086a10da02450d00200341b8076a41026a200341e8076a41026a2d000022023a0000200320032f00e80722013b01b807200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c340b200341d8066a41186a22024200370300200341d8066a41106a22014200370300200341d8066a41086a22064200370300200342003703d80620034198086a41e6dcc700410710c501200620034198086a41086a220829000037030020032003290098083703d806200341a8066a41f4b7c200410e10c5012002200341a8066a41086a2209290000370300200120032900a806370300200341d8006a200341d8066a412010c601200328025c210a2003280258210b200242003703002001420037030020064200370300200342003703d80620034198086a41e6dcc700410710c5012006200829000037030020032003290098083703d806200341a8066a41f4b7c200410e10c50120022009290000370300200120032900a8063703002003200a4100200b1b20076a3602c808200341d8066a4120200341c8086a410410a702200041186a41003a000020004200370308200020032800e8043600192000411c6a200341eb046a280000360000200042003703000c330b20012d00012101200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c8080240200341c8086a10da020d00200341d8066a41186a22024200370300200341d8066a41106a22064200370300200341d8066a41086a22074200370300200342003703d80620034198086a41e6dcc700410710c501200720034198086a41086a220829000037030020032003290098083703d806200341a8066a41f4b7c200410e10c5012002200341a8066a41086a2209290000370300200620032900a806370300200341e0006a200341d8066a412010c6012003280264210a2003280260210b200242003703002006420037030020074200370300200342003703d80620034198086a41e6dcc700410710c5012007200829000037030020032003290098083703d806200341a8066a41f4b7c200410e10c50120022009290000370300200620032900a8063703002003200a4100200b1b220241e4006e20016c200241e4007020016c220141e4006e41ff0120014180c801491b200141e4007041324b6a41ff01716a20026a3602c808200341d8066a4120200341c8086a410410a702200041186a41003a000020004200370308200020032800e8043600192000411c6a200341eb046a280000360000200042003703000c330b200341b8076a41026a200341e8076a41026a2d000022023a0000200320032f00e80722013b01b807200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c320b200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c8080240200341c8086a10da02450d00200341b8076a41026a200341e8076a41026a2d000022023a0000200320032f00e80722013b01b807200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c320b200341d8066a41186a22024200370300200341d8066a41106a22014200370300200341d8066a41086a22064200370300200342003703d80620034198086a41e6dcc700410710c501200620034198086a41086a29000037030020032003290098083703d806200341a8066a41d8bfc200410810c5012002200341a8066a41086a290000370300200120032900a806370300200341d8066a4102108e04200041186a41003a000020004200370308200020032800e8043600192000411c6a200341eb046a280000360000200042003703000c310b200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c8080240200341c8086a10da02450d00200341b8076a41026a200341e8076a41026a2d000022023a0000200320032f00e80722013b01b807200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c310b200341d8066a41186a22024200370300200341d8066a41106a22014200370300200341d8066a41086a22064200370300200342003703d80620034198086a41e6dcc700410710c501200620034198086a41086a29000037030020032003290098083703d806200341a8066a41d8bfc200410810c5012002200341a8066a41086a290000370300200120032900a806370300200341d8066a4101108e04200041186a41003a000020004200370308200020032800e8043600192000411c6a200341eb046a280000360000200042003703000c300b2001410c6a2802002107200141086a2802002106200141046a2802002101200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c8080240200341c8086a10da020d00200320073602d008200320013602c808200320063602cc08200341d8066a41186a22024200370300200341d8066a41106a22074200370300200341d8066a41086a22084200370300200342003703d80620034198086a41e6dcc700410710c501200820034198086a41086a29000037030020032003290098083703d806200341a8066a41ccb8c200410d10c5012002200341a8066a41086a290000370300200720032900a806370300200341d8066a200341c8086a10b1040240200641ffffff3f71450d002001102c0b200041186a41003a000020004200370308200020032800e8043600192000411c6a200341eb046a280000360000200042003703000c300b02402006450d002001450d00200641ffffff3f71450d002001102c0b200341b8076a41026a200341e8076a41026a2d000022023a0000200320032f00e80722013b01b807200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c2f0b200141246a2802002106200341e8046a41186a200141196a290000370300200341e8046a41106a200141116a290000370300200341e8046a41086a200141096a290000370300200320012900013703e804200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c808200341c8086a10da020d04200341c8086a200341e8046a200610ae0420034198076a41026a220120032d00cb083a0000200320032f00c9083b019807024020032d00c80822024104460d0020032902cc082104200341a8066a41026a20012d00003a0000200320032f0198073b01a8060c180b200342f3e885db96cddbb3203703e807200341e8076a200341e8046a10af04200041186a41003a000020004200370308200020032800b8073600192000411c6a200341bb076a280000360000200042003703000c2e0b200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c8080240200341c8086a10da02450d00200341b8076a41026a200341e8076a41026a2d000022023a0000200320032f00e80722013b01b807200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c2e0b200341d8066a41186a22024200370300200341d8066a41106a22014200370300200341d8066a41086a22064200370300200342003703d80620034198086a41e6dcc700410710c501200620034198086a41086a29000037030020032003290098083703d806200341a8066a41d8bfc200410810c5012002200341a8066a41086a290000370300200120032900a806370300200341d8066a4103108e04200041186a41003a000020004200370308200020032800e8043600192000411c6a200341e8046a41036a280000360000200042003703000c2d0b200141046a280200211c2002411a6a2901002104200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210e200241126a2f01002114200241116a2d00002115200241106a2d000021162002410e6a2f0100211a2002410d6a2d000021192002410c6a2d0000211b2002410a6a2f0100211d200241096a2d0000211e200241086a2d0000211f200241066a2f01002120200241056a2d00002121200241046a2d00002122200241026a2f01002123200141106a28020021242001410c6a2802002118200141086a28020021172002280224210120022d0001210720022d000022060d0120012001280200417f6a2202360200200320043703e807024020020d002001280208200128020c2802001102000240200128020c280204450d002001280208102c0b200141046a22022002280200417f6a220236020020020d002001102c0b200320043703d007200320083a00cf07200320093a00ce072003200a3b01cc072003200b3a00cb072003200e3a00ca07200320143b01c807200320153a00c707200320163a00c6072003201a3b01c407200320193a00c3072003201b3a00c2072003201d3b01c0072003201e3a00bf072003201f3a00be07200320203b01bc07200320213a00bb07200320223a00ba07200320233b01b8070240200741ff0171450d00200341f2046a200341c0076a290300370100200341fa046a200341c8076a29030037010020034182056a200341d0076a290300370100200320073a00e904200341003a00e804200320032903b8073701ea04200341c8086a200341e8046a10c70220032d00c80821060c150b41022106200341023a00c8080c140b200141246a280200210e200341e8076a41206a2208200241206a280200360200200341e8076a41186a2209200241186a290200370300200341e8076a41106a220a200241106a290200370300200341e8076a41086a220b200241086a290200370300200320022902003703e8072002280224210220034198076a41186a200141196a29000037030020034198076a41106a200141116a29000037030020034198076a41086a200141096a2900003703002003200129000137039807200341b8076a41186a22064200370300200341b8076a41106a22014200370300200341b8076a41086a22074200370300200342003703b80720034198086a41e6dcc700410710c501200720034198086a41086a29000037030020032003290098083703b807200341a8066a41a08ec100411110c5012006200341a8066a41086a290000370300200120032900a806370300200341c8036a200341b8076a1089040240024020032802c803417d710d00200341c8086a41206a2008280200360200200341c8086a41186a2009290300370300200341c8086a41106a200a290300370300200341c8086a41086a200b290300370300200320032903e8073703c808200320023602ec08200341e8046a200341c8086a10c60220032d00e8044101470d01200341023a00e8030c130b200341e8036a411d10a80420022002280200417f6a220136020020010d112002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d112002102c0c110b20034198046a41186a20034198076a41186a29030037030020034198046a41106a20034198076a41106a29030037030020034198046a41086a20034198076a41086a290300370300200320032903980737039804200341b8076a41186a4200370300200341b8076a41106a4200370300200341b8076a41086a22024200370300200342003703b80720034198086a41e6dcc700410710c501200220034198086a41086a29000037030020032003290098083703b807200341a8066a41ccbac200410a10c501200141086a200341a8066a41086a290000370000200120032900a806370000200341c0036a200341b8076a412010c60120032802c003450d0a024020032802c4032202200e490d00200341d0076a4200370300200341c8076a4200370300200341b8076a41086a22064200370300200342003703b80720034198086a41e6dcc700410710c501200620034198086a41086a29000037030020032003290098083703b807200341a8066a41a0b7c200410c10c501200141086a200341a8066a41086a290000370000200120032900a806370000200341b8036a200341b8076a412010c6010240200e4100200220032802bc0341d40020032802b8031b6b2201200120024b1b2208490d0020034198086a41e6dcc700410710c501200341d8066a41acbec200411310c5012003200e3602a806200341b8076a200341a8066a410410c701200341c8086a410c6a200341a8066a41046a360200200320063602cc082003200341a8066a3602d0082003200341b8076a3602c808200341e8046a200341c8086a107e20032802f004220241206a2201417f4c0d1f0240024020010d00410121060c010b200110322206450d210b200341003602d008200320013602cc08200320063602c808200341c8086a4100411010c80120032802c80820032802d00822016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602d008200341c8086a2001411010c80120032802c80820032802d00822016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602d00820032802e8042101200341c8086a2006200210c80120032802c808220620032802d00822076a2001200210c9081a2003200720026a22023602d008024020032802ec04450d002001102c0b200341a0036a2006200210d301200341a0036a41106a290300210420032903a803210520032802a0032102024020032802cc08450d002006102c0b02402002450d0020034198086a41e6dcc700410710c501200341d8066a419099c100410610c501200341c8086a20034198046a10e40220032802d008220241206a2201417f4c0d200240024020010d00410121060c010b200110322206450d220b41002107200341003602b006200320013602ac06200320063602a806200341a8066a4100411010c80120032802a80620032802b00622016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602b006200341a8066a2001411010c80120032802a80620032802b00622016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602b00620032802c8082101200341a8066a2006200210c80120032802a806220620032802b00622096a2001200210c9081a2003200920026a22023602b006024020032802cc08450d002001102c0b200341c8086a2006200210c901200341b8076a41086a200341c8086a41096a290000370300200341b8076a41106a200341c8086a41116a290000370300200341d0076a2201200341e1086a290000370300200320032900c9083703b807024020032d00c8084101470d00200341f0046a200341b8076a41096a290000370300200341f8046a200341b8076a41116a290000370300200341ff046a2001290000370000200320032900b9073703e80420032d00b8072102410121070b024020032802ac06450d002006102c0b2007450d0e200341f8066a41176a2201200341e8046a41176a290000370000200341f8066a41106a2206200341e8046a41106a290300370300200341c9046a200341f0046a290300370000200341d1046a2006290300370000200341d8046a2001290000370000200320023a00c004200320032903e8043700c10420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341b8076a200341c0046a10d50220032802c007220241206a2201417f4c0d200240024020010d00410121060c010b200110322206450d220b2003410036028007200320013602fc06200320063602f806200341f8066a4100411010c80120032802f80620032802800722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a220136028007200341f8066a2001411010c80120032802f80620032802800722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602800720032802b8072101200341f8066a2006200210c80120032802f806220620032802800722076a2001200210c9081a2003200720026a220236028007024020032802bc07450d002001102c0b200341c8086a2006200210d803200341b8076a41086a20034184096a290200370300200341b8076a41106a2003418c096a290200370300200341b8076a41186a220220034194096a290200370300200341b8076a41206a22072003419c096a2802003602002003200341fc086a2902003703b80720032802e8082209450d0f200341c8086a41186a290300210c200341c8086a41086a290300210d200341f8086a280200210a200341f4086a2802002101200341f0086a280200210b20032903d808210f20032903c808211020032802ec082114200341a8066a41206a2007280200360200200341a8066a41186a2002290300370300200341a8066a41106a2202200341b8076a41106a290300370300200341a8066a41086a2207200341b8076a41086a290300370300200320032903b8073703a806024020032802fc06450d002006102c0b200341e8046a41186a200c37030020034198056a200a36020020034190056a200b3602002003418c056a20143602002003419c056a220620032903a806370200200341a4056a2007290300370200200341ac056a2002290300370200200341b4056a200341a8066a41186a290300370200200341bc056a200341c8066a2802003602002003200f3703f804200320103703e804200320013602940520032009360288052003200d3703f00420062802002207450d102007417f6a210a410021064100210202400240034002400240024002400240024020072002460d002008200128020022094b0d0102402006450d00200220066b220b20074f0d03200120064102746b220b2802002114200b2009360200200120143602000c040b41002106200a2002460d040c050b2007200741f48ac500103f000b200641016a21060c010b200b200741e48ac500103f000b200a2002470d0120060d030b200328029c0521070c030b200241016a2102200141046a21010c000b0b200720066b2102200328029c0522072002490d002003200236029c05200221070b4100210220032802940521090240024020070e021301000b4100210220072101034020022001410176220620026a2208200e200920084102746a280200491b2102200120066b220141014b0d000b0b0240200e200920024102746a2802002201460d0020072002200e20014b6a22024f0d12200220071044000b200341e8036a410f10a8040c120b200341e8036a410c10a8040c120b200341e8036a410c10a8040c110b200341e8036a410c10a8040c100b200241226a2f01002102200341c8086a41156a200b3a0000200341c8086a41146a200e3a0000200341c8086a41126a20143b0100200341c8086a41116a20153a0000200341c8086a41106a20163a0000200341c8086a410e6a201a3b0100200341c8086a410d6a20193a0000200341c8086a410c6a201b3a0000200341c8086a410a6a201d3b0100200341c8086a41096a201e3a0000200341c8086a41086a201f3a0000200320043702ec07200320083a00eb07200320093a00ea072003200a3b01e807200320203b01ce08200320213a00cd08200320223a00cc08200320233b01ca08200320073a00c908200320063a00c808200341e6086a200341e8076a41086a280200360100200341c8086a41166a20032903e807370100200341c8086a41226a20023b0100200320013602ec080c120b410221020c120b200341023a00e8030c140b200341023a00f8060c150b200341023a00f8060c240b200141d8016a2f01002108200141d4016a2802002109200141d0016a280200210a2001410c6a280200210b200141086a2802002106200141046a2802002107200341e8046a200141106a41c00110c9081a200341a8066a41286a220e20014188026a290300370300200341a8066a41206a221420014180026a290300370300200341a8066a41186a2215200141f8016a290300370300200341a8066a41106a2216200141f0016a290300370300200341a8066a41086a2217200141e8016a2903003703002003200141e0016a2903003703a806200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c808024002400240200341c8086a10cc020d002003200b3602c804200320063602c404200320073602c004200341c8086a200341e8046a41c00110c9081a200341b8076a41286a200e290300370300200341b8076a41206a2014290300370300200341b8076a41186a2015290300370300200341b8076a41106a2016290300370300200341b8076a41086a2017290300370300200320032903a8063703b807200341e8076a200341c0046a200341c8086a4102200341b8076a200a2009200810b20420032903e8074201510d022003200328008108360298072003200341e8076a411c6a28000036009b0720032003280298073602b8072003200328009b073600bb07200341e8076a41106a290300210420032903f0072105200041186a200341e8076a41186a2d00003a0000200041106a200437030020002005370308200020032802b8073600192000411c6a20032800bb07360000420021040c010b200341e8046a10e90102402006450d002007450d00200641ffffffff0771450d002007102c0b20032003280298073602b8072003200328009b073600bb0720032003290098043703c80820032003419f046a2800003600cf08200041186a41003a000020004200370308200020032802b8073600192000411c6a20032800bb07360000200041206a41023a0000200020032903c808370021200041286a20032800cf08360000420121040b200020043703000c260b200341c8086a41206a20034190086a290300370300200341c8086a41186a200341e8076a41206a290300370300200341c8086a41106a200341e8076a41186a290300370300200341d0086a200341e8076a41106a290300370300200320032903f0073703c80841b99dc300418002200341c8086a41bc9fc30041cc9fc3001040000b200141d8016a2f01002108200141d4016a2802002109200141d0016a280200210a2001410c6a280200210b200141086a2802002106200141046a2802002107200341e8046a200141106a41c00110c9081a200341e8076a41286a220e20014188026a290300370300200341e8076a41206a221420014180026a290300370300200341e8076a41186a2215200141f8016a290300370300200341e8076a41106a2216200141f0016a290300370300200341e8076a41086a2217200141e8016a2903003703002003200141e0016a2903003703e807200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c808200341b8076a200341c8086a10c60202400240024020032d00b8074101470d00200341a8066a41206a41023a0000200341a8066a41186a41003a0000200342003703b006200342013703a806200341e8046a10e90102402006450d002007450d00200641ffffffff0771450d002007102c0b200341b0066a21020c010b2003200b3602a0042003200636029c042003200736029804200341c8086a200341e8046a41c00110c9081a200341b8076a41286a200e290300370300200341b8076a41206a2014290300370300200341b8076a41186a2015290300370300200341b8076a41106a2016290300370300200341b8076a41086a2017290300370300200320032903e8073703b807200341a8066a20034198046a200341c8086a4101200341b8076a200a2009200810b204200341a8066a41086a210220032903a8064201520d010b200341c0046a41206a200241206a2903002204370300200341c0046a41186a200241186a2903002205370300200341c0046a41106a200241106a290300220c370300200341c0046a41086a200241086a290300220d37030020032002290300220f3703c004200041286a2004370300200041206a2005370300200041186a200c370300200041106a200d3703002000200f370308200042013703000c250b200341c0046a41106a200241106a2903002204370300200341c0046a41086a200241086a290300220537030020032002290300220c3703c004200041186a2004370300200041106a20053703002000200c370308200042003703000c240b200141246a28020021092002280224210220034180056a200141196a290000370300200341f8046a200141116a290000370300200341f0046a200141096a290000370300200320012900013703e80420034198086a41c1dcc700410610c501200341d8066a41acc8c700410710c501200341c8086a200341e8046a10d50220032802d008220141206a2206417f4c0d150240024020060d00410121070c010b200610322207450d170b200341003602f007200320063602ec07200320073602e807200341e8076a4100411010c80120032802e80720032802f00722066a2207200329009808370000200741086a20034198086a41086a2900003700002003200641106a22063602f007200341e8076a2006411010c80120032802e80720032802f00722066a220720032900d806370000200741086a200341d8066a41086a2900003700002003200641106a22073602f00720032802c8082106200341e8076a2007200110c80120032802e807220720032802f00722086a2006200110c9081a2003200820016a22013602f007024020032802cc08450d002006102c0b200341c8086a2007200110d602200341c8086a41106a2903002105200341e8086a290300210c200341e0086a290300210d20032903d008210f20032903c8082104024020032802ec07450d002007102c0b0240024002400240024020044201520d00200f200d842005200c84844200520d010b200341c8086a200341e8046a200910ae042003419a076a220120032d00cb083a0000200320032f00c9083b01980720032d00c80822064104470d01200342f3e885db96cddbb3203703a806200341a8066a200341e8046a10af0420022002280200417f6a2201360200200341043a00b80720010d032002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d032002102c0c030b200341b8076a410b10a8040c010b20032902cc082104200320063a00b807200320032f0198073b00b907200320043702bc07200320012d00003a00bb070b20022002280200417f6a2201360200024020010d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b20032d00b8074104460d0020032802b8072102200020032902bc07370024200041206a2002360000200041186a41003a000020004200370308200042013703000c240b20004200370308200020032800c004360019200041186a41003a00002000411c6a200341c3046a280000360000200042003703000c230b200141046a2802002107200341c8086a41206a200241206a290200370300200341c8086a41186a200241186a290200370300200341c8086a41106a200241106a290200370300200341c8086a41086a200241086a290200370300200320022902003703c8080240200341c8086a10da020d00200341d8066a41186a22024200370300200341d8066a41106a22064200370300200341d8066a41086a22014200370300200342003703d80620034198086a41e6dcc700410710c501200120034198086a41086a29000037030020032003290098083703d806200341a8066a41ccbac200410a10c5012002200341a8066a41086a290000370300200620032900a806370300200341e0036a200341d8066a412010c601024020032802e0034101470d0020032802e4032101200341f0066a22094200370300200341e8066a220a4200370300200341d8066a41086a22084200370300200342003703d80620034198086a41e6dcc700410710c501200820034198086a41086a220b29000037030020032003290098083703d806200341a8066a41a0b7c200410c10c501200641086a220e200341a8066a41086a2214290000370000200620032900a806370000200341d8036a200341d8066a412010c60102404100200120032802dc0341d40020032802d8031b6b2202200220014b1b22024100200120076b2215201520014b1b22014f0d00034020021094042001200241016a2202470d000b0b20094200370300200a420037030020084200370300200342003703d80620034198086a41e6dcc700410710c5012008200b29000037030020032003290098083703d806200341a8066a41a0b7c200410c10c501200e2014290000370000200620032900a806370000200320073602c808200341d8066a4120200341c8086a410410a7020b20004200370308200020032800e804360019200041186a41003a00002000411c6a200341eb046a280000360000200042003703000c230b200341b8076a41026a200341e8076a41026a2d000022023a0000200320032f00e80722013b01b807200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c220b200141106a2903002104200141086a290300210d20034198046a41206a2208200241206a28020036020020034198046a41186a2209200241186a29020037030020034198046a41106a220a200241106a29020037030020034198046a41086a220b200241086a290200370300200320022902003703980420022802242102200341d8066a41186a22014200370300200341d8066a41106a22064200370300200341d8066a41086a22074200370300200342003703d80620034198086a41e6dcc700410710c501200720034198086a41086a29000037030020032003290098083703d806200341a8066a41a08ec100411110c5012001200341a8066a41086a2207290000370300200620032900a806370300200341d0036a200341d8066a10890402400240024020032802d003417d710d00200341c8086a41206a2008280200360200200341c8086a41186a2009290300370300200341c8086a41106a200a290300370300200341c8086a41086a200b29030037030020032003290398043703c808200320023602ec08200341e8046a200341c8086a10c6022007200341f1046a290000370300200341a8066a41106a200341e8046a41116a290000370300200341a8066a41186a20034181056a290000370300200320032900e9043703a80620032d00e8044101470d01410221010c020b200341c8086a411d10a804200320032900c9083703e8032003200341c8086a41086a2800003600ef0320032d00c808210120022002280200417f6a220636020020060d012002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22062006280200417f6a220636020020060d012002102c0c010b20034198076a41186a200341a8066a41186a29030037030020034198076a41106a200341a8066a41106a29030037030020034198076a41086a200341a8066a41086a290300370300200320032903a8063703980720034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341e8046a20034198076a10d50220032802f004220241206a2201417f4c0d140240024020010d00410121060c010b200110322206450d160b2003410036028007200320013602fc06200320063602f806200341f8066a4100411010c80120032802f80620032802800722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a220136028007200341f8066a2001411010c80120032802f80620032802800722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602800720032802e8042101200341f8066a2006200210c80120032802f806220620032802800722076a2001200210c9081a2003200720026a220236028007024020032802ec04450d002001102c0b200341c8086a2006200210d803200341b8076a41086a20034184096a290200370300200341b8076a41106a2003418c096a290200370300200341b8076a41186a220220034194096a290200370300200341b8076a41206a22082003419c096a2802003602002003200341fc086a2902003703b807024020032802e8082207450d00200341c8086a41186a2903002111200341c8086a41086a2903002125200341f8086a280200210a200341f4086a280200210b200341f0086a280200210120032903d808210f20032903c808212620032802ec082109200341a8066a41206a2008280200360200200341a8066a41186a2002290300370300200341a8066a41106a2202200341b8076a41106a290300370300200341a8066a41086a2208200341b8076a41086a290300370300200320032903b8073703a806024020032802fc06450d002006102c0b200341c0046a41106a20022903002205370300200341e8076a41086a2008290300370300200341e8076a41106a2005370300200341e8076a41186a2202200341a8066a41186a290300370300200341e8076a41206a2206200341a8066a41206a280200360200200320032903a8063703e807024002402001450d00200341e8046a41206a2006280200360200200341e8046a41186a2002290300370300200341e8046a41106a200341e8076a41106a290300370300200341e8046a41086a200341e8076a41086a290300370300200320032903e8073703e804200141186c20076a41686a2102420021124200211302400340024020010d00200f2110410021010c020b02402002290300221020127c2205200d58200241086a290300222720137c2005201054ad7c220c200458200c20045122061b0d0020022010200d20127d22057d37030020022027200420137d200d201254ad7d22047d2010200554ad7d370308201120047c200f20057c2210200f54ad7c21110c020b2001417f6a2101201120277c200f20107c2210200f54ad7c2111200241686a21022010210f20052112200c21132005200d54200c20045420061b0d000b0b200341f8086a200a360200200341f0086a2001360200200341ec086a2009360200200341fc086a20032903e804370200200320103703d808200341c8086a41186a201137030020034184096a200341e8046a41086a22022903003702002003418c096a200341f8046a29030037020020034194096a200341e8046a41186a2903003702002003419c096a200341e8046a41206a280200360200200320263703c8082003200b3602f408200320073602e808200320253703d00820104280c8afa0255441002011501b450d01200341e8046a410810a804200320032900e9043703e803200320022800003600ef0320032d00e8042101024020032802ec082202450d00200241186c450d0020032802e808102c0b20032802f80841ffffffff0371450d0320032802f408102c0c030b200341c8086a410a10a804200320032900c9083703e8032003200341d0086a2800003600ef0320032d00c808210102402009450d00200941186c450d002007102c0b200a450d02200b450d02200a41ffffffff0371450d02200b102c0c020b200342f3e885db96cddbb3203703a806200341a8066a20034180096a2026202510ab0420034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341e8046a20034198076a10d50220032802f004220241206a2201417f4c0d150240024020010d00410121060c010b200110322206450d170b200341003602c007200320013602bc07200320063602b807200341b8076a4100411010c80120032802b80720032802c00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602c007200341b8076a2001411010c80120032802b80720032802c00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602c00720032802e8042101200341b8076a2006200210c80120032802b807220620032802c00722076a2001200210c9081a2003200720026a22023602c007024020032802ec04450d002001102c0b20062002200341c8086a10ac04024020032802bc07450d002006102c0b20033502f00842d086037e2104024020032802ec082202450d00200241186c450d0020032802e808102c0b20044280f3e893017c2104024020032802f80841ffffffff0371450d0020032802f408102c0b200320032800900436028804200320034193046a28000036008b04200041186a41003a0000200041106a20043703002000420137030820002003280288043600192000411c6a200328008b04360000200042003703000c230b024020032802fc06450d002006102c0b200341c8086a410110a804200320032900c9083703e8032003200341d0086a2800003600ef0320032d00c80821010b200320032800900436028804200320032903e8033703f803200320032800ef033600ff03200320034193046a28000036008b04200041186a41003a00002000420037030820002003280288043600192000411c6a200328008b04360000200041206a20013a0000200020032903f803370021200041286a20032800ff03360000200042013703000c210b200341e8036a410c10a8040c050b200341e8036a410210a8040c040b024020032802fc06450d002006102c0b200341e8036a410110a8040c030b4100210220032802940521090b02402007200328029805470d0020034194056a2007410110950220032802940521090b200920024102746a220141046a2001200720026b41027410ca081a2001200e3602002003200741016a36029c05200341b8076a200e200341a0056a2209109904200341c8086a20032802b807220220032802c00710a4040240024020032802e80822170d0042002110410021164108211741002115420021114200210d4200210f0c010b200341d0086a290300210f200341e0086a2903002111200341f0086a280200211520032903c808210d20032903d808211020032802ec0821160b024020032802bc07450d002002102c0b20034198086a41e6dcc700410710c501200341d8066a418a99c100410610c501200341c8086a200341c0046a10d50220032802d008220241206a2201417f4c0d0e0240024020010d00410121060c010b200110322206450d100b200341003602c007200320013602bc07200320063602b807200341b8076a4100411010c80120032802b80720032802c00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602c007200341b8076a2001411010c80120032802b80720032802c00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602c00720032802c8082101200341b8076a2006200210c80120032802b807220620032802c00722076a2001200210c9081a2003200720026a22023602c007024020032802cc08450d002001102c0b20062002200341e8046a10ac04024020032802bc07450d002006102c0b20034198086a41e6dcc700410710c501200341a8066a419b92c100411010c5012003200e36029004200341d8066a20034190046a410410c701200341d4086a20034190046a41046a3602002003200341e0066a3602cc08200320034190046a3602d0082003200341d8066a3602c808200341b8076a200341c8086a107e20032802c007220241206a2201417f4c0d0e0240024020010d00410121060c010b200110322206450d100b200341003602e006200320013602dc06200320063602d806200341d8066a4100411010c80120032802d80620032802e00622016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602e006200341d8066a2001411010c80120032802d80620032802e00622016a220620032900a806370000200641086a200341a8066a41086a2900003700002003200141106a22063602e00620032802b8072101200341d8066a2006200210c80120032802d806220620032802e00622076a2001200210c9081a2003200720026a22023602e006024020032802bc07450d002001102c0b200341c8086a2006200210cc03200341b8076a41086a200341c8086a410c6a290200370300200320032902cc083703b8070240024020032802c8084101460d0041002114200341f8066a410c6a4100360200200342003703f8060c010b200341f8066a41086a200341b8076a41086a290300370300200320032903b807220c3703f806200ca721140b024020032802dc06450d002006102c0b200341f8066a41047221180240024020032802fc06220a450d0020034180076a280200210b0340200a41046a2106200a41346a2101200a2f013221084100210202400240034020082002460d0120092001412010cc082207450d02200141206a2101200641046a2106200241016a21022007417f4a0d000b2002417f6a21080b200b450d02200b417f6a210b200a20084102746a4194036a280200210a0c010b0b200628020022010d010b200341043a00e803201810cf032016450d01201641306c450d012017102c0c010b0240024020144101201441014b1b2202418094ebdc036e2002418094ebdc03704100476a22064101200641014b1b220620024b0d0020034188036a20052004428094ebdc03420010c708200341f8026a20052004428094ebdc03420010c808200341e8026a20032903f802200341f8026a41086a2903002002200120022001491b20066ead428094ebdc037e200220066ead8042ffffffff0f832204420010ce08200341c8086a200e20034198046a109b0420034198036a20032802c808220120032802d008109a04200341e8026a41086a29030020032903e802220520042003290388037e2204428094ebdc0380a72004428094ebdc03824280cab5ee01566aad7c2204200554ad7c2105200328029c0341002003280298031b2102024020032802cc08450d002001102c0b200341c0026a20042005428094ebdc03420010c708200341b0026a20042005428094ebdc03420010c808200341a0026a20032903b002200341b0026a41086a2903002002ad220c420010ce0820034190026a200420032903a002221220032903c002200c7e220c428094ebdc0380a7417f200c428080808080c0b2cd3b541b200c428094ebdc03824280cab5ee01566aad7c220c7d22132005200341a0026a41086a290300200c201254ad7c22277d2004200c54ad7d2204428094ebdc03420010c70820034180026a20132004428094ebdc03420010c80820102011200d200f10b3042102200341f0016a200329038002221020034180026a41086a29030022112002ad2204420010ce08200341d0026a200920032903f0012205200329039002221220047e2204428094ebdc0380a7417f2004428080808080c0b2cd3b541b2004428094ebdc03824280cab5ee01566aad7c2204200c7c220c200341f0016a41086a2903002004200554ad7c20277c200c200454ad7c10b404200341d0026a41106a290300210420032903d8022105024020032903d002220ca74101470d0020034180096a2004370300200341f8086a2005370300200341c8086a41086a41013a0000200341d9086a200341a8056a290300370000200341e1086a200341b0056a290300370000200341e9086a200341b8056a290300370000200341033602c808200320032903a0053700d108200341c8086a10c802200341d0076a22024200370300200341b8076a41106a22014200370300200341b8076a41086a22064200370300200342003703b80720034198086a41d4dcc700410810c501200620034198086a41086a220829000037030020032003290098083703b807200341d8066a41bba8c700410d10c5012002200341d8066a41086a2209290000370300200120032900d806370300200341c0016a200341b8076a412010d301200341c0016a41106a290300210c20032903c801211320032802c0012107200242003703002001420037030020064200370300200342003703b80720034198086a41d4dcc700410810c5012006200829000037030020032003290098083703b807200341d8066a41bba8c700410d10c50120022009290000370300200120032900d8063703002003427f200c420020071b220c20047c2013420020071b220420057c22052004542202ad7c220420022004200c542004200c511b22021b3703d0082003427f200520021b3703c808200341b8076a4120200341c8086a411010a7020c020b200c4201520d01200341d0076a22024200370300200341b8076a41106a22014200370300200341b8076a41086a22064200370300200342003703b80720034198086a41d4dcc700410810c501200620034198086a41086a220829000037030020032003290098083703b807200341d8066a41bba8c700410d10c5012002200341d8066a41086a2209290000370300200120032900d806370300200341d8016a200341b8076a412010d301200341d8016a41106a290300210c20032903e001211320032802d8012107200242003703002001420037030020064200370300200342003703b80720034198086a41d4dcc700410810c5012006200829000037030020032003290098083703b807200341d8066a41bba8c700410d10c50120022009290000370300200120032900d8063703002003427f200c420020071b220c20047c2013420020071b220420057c22052004542202ad7c220420022004200c542004200c511b22021b3703d0082003427f200520021b3703c808200341b8076a4120200341c8086a411010a7020c010b41f0bcc300411941f8acc800103c000b02402015450d002017201541306c6a210a200341d1086a2107200341b8076a41106a210120034180096a211520172102034020034198016a201020112002290300200241086a290300200d200f10b304ad2204420010ce08200341a8016a200241106a22062003290398012205201220047e2204428094ebdc0380a7417f2004428080808080c0b2cd3b541b2004428094ebdc03824280cab5ee01566aad7c220420034198016a41086a2903002004200554ad7c10b404200341a8016a41106a290300210420032903b00121050240024020032903a801220ca74101470d00200341d8066a41186a200241286a2209290000370300200341d8066a41106a200241206a220b290000370300200341d8066a41086a2208200241186a2202290000370300200320062900003703d8062006290000210c20022900002113200b2900002127200341a8066a41186a22022009290000370300200341a8066a41106a22092027370300200341a8066a41086a220b20133703002003200c3703a806200320053703f80820152004370300200341013a00d008200341033602c808200720032903a806370000200741086a200b290300370000200741106a2009290300370000200741186a2002290300370000200341c8086a10c802200341b8076a41186a220b420037030020014200370300200341b8076a41086a22024200370300200342003703b80720034198086a41d4dcc700410810c501200220034198086a41086a220e29000037030020032003290098083703b807200341d8066a41bba8c700410d10c501200141086a22142008290000370000200120032900d806370000200341e8006a200341b8076a412010d301200341e8006a41106a290300210c2003290370211320032802682109200b42003703002001420037030020024200370300200342003703b80720034198086a41d4dcc700410810c5012002200e29000037030020032003290098083703b807200341d8066a41bba8c700410d10c50120142008290000370000200120032900d8063700002003427f200c420020091b220c20047c2013420020091b220420057c22052004542202ad7c220420022004200c542004200c511b22021b3703d0082003427f200520021b3703c808200341b8076a4120200341c8086a411010a7020c010b200c4201520d00200341b8076a41186a2209420037030020014200370300200341b8076a41086a22024200370300200342003703b80720034198086a41d4dcc700410810c501200220034198086a41086a220b29000037030020032003290098083703b807200341d8066a41bba8c700410d10c501200141086a220e200341d8066a41086a2214290000370000200120032900d80637000020034180016a200341b8076a412010d30120034180016a41106a290300210c20032903880121132003280280012108200942003703002001420037030020024200370300200342003703b80720034198086a41d4dcc700410810c5012002200b29000037030020032003290098083703b807200341d8066a41bba8c700410d10c501200e2014290000370000200120032900d8063700002003427f200c420020081b220c20047c2013420020081b220420057c22052004542202ad7c220420022004200c542004200c511b22021b3703d0082003427f200520021b3703c808200341b8076a4120200341c8086a411010a7020b200641206a2202200a470d000b0b200341043a00e803201810cf0302402016450d00201641306c450d002017102c0b0240200328028c052202450d00200241186c450d00200328028805102c0b20032802980541ffffffff0371450d01200328029405102c0c010b0240200328028c052202450d00200241186c450d00200328028805102c0b20032802980541ffffffff0371450d00200328029405102c0b20032d00e8034104460d0120032902ec0321040b20032802e803210220002004370024200041206a2002360000200041186a41003a000020004200370308200042013703000c190b20004200370308200020032800f803360019200041186a41003a00002000411c6a200341fb036a280000360000200042003703000c180b024002400240200641ff01714102460d0020032802ec0822022002280200417f6a2201360200024020010d002002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22012001280200417f6a220136020020010d002002102c0b200341023a00a8060c010b024002402024450d00202441016a21012017210203402001417f6a22014102490d0220022802002106200241046a2207210220062007280200490d000b200341a8066a410e10a8040c020b200341a8066a410510a8040c010b20034198086a41e6dcc700410710c501200341d8066a41f0c0c200411010c5012003201c3602b807200341e8076a200341b8076a410410c701200341d4086a200341b8076a41046a3602002003200341f0076a3602cc082003200341b8076a3602d0082003200341e8076a3602c808200341e8046a200341c8086a107e20032802f004220241206a2201417f4c0d0b0240024020010d00410121060c010b200110322206450d0d0b200341003602d008200320013602cc08200320063602c808200341c8086a4100411010c80120032802c80820032802d00822016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602d008200341c8086a2001411010c80120032802c80820032802d00822016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602d00820032802e8042101200341c8086a2006200210c80120032802c808220620032802d00822076a2001200210c9081a2003200720026a22023602d008024020032802ec04450d002001102c0b200341e8046a2006200210910420032902ec04420020032802e80422021b2104024020032802cc08450d002006102c0b2002410820021b211602400240024002402024410274220a20176a417c6a2802002004422088a722024f0d0041002101417f210620172107034020012007280200220b6a22022004422088a7220e4f0d042016200241d8006c6a220228022c211420022802202115200241306a2802002108200241246a28020021092002200241d8006a2006200e6a200b6b41d8006c10ca081a02402009450d002015450d00200941306c450d002015102c0b02402008450d002014450d00200841ffffff3f71450d002014102c0b200741046a210720044280808080707c2104200641016a21062001417f6a2101200a417c6a220a0d000b02402018450d002017450d00201841ffffffff0371450d002017102c0b20034198086a41e6dcc700410710c501200341d8066a41f0c0c200411010c5012003201c3602b807200341e8076a200341b8076a410410c701200341d4086a200341b8076a41046a3602002003200341f0076a3602cc082003200341b8076a3602d0082003200341e8076a3602c808200341e8046a200341c8086a107e20032802f004220241206a2201417f4c0d0f20010d01410121060c020b200341a8066a410710a80402402002450d00200241d8006c2101201641306a210203400240200241746a2802002206450d00200641306c450d00200241706a280200102c0b0240200228020041ffffff3f71450d002002417c6a280200102c0b200241d8006a2102200141a87f6a22010d000b0b2004a72202450d03200241d8006c450d032016102c0c030b200110322206450d0e0b200341003602f007200320013602ec07200320063602e807200341e8076a4100411010c80120032802e80720032802f00722016a2206200329009808370000200641086a20034198086a41086a2900003700002003200141106a22013602f007200341e8076a2001411010c80120032802e80720032802f00722016a220620032900d806370000200641086a200341d8066a41086a2900003700002003200141106a22063602f00720032802e8042101200341e8076a2006200210c80120032802e807220620032802f00722076a2001200210c9081a2003200720026a22023602f007024020032802ec04450d002001102c0b200341c8086a20162004422088a7220110e3032006200220032802c808220720032802d00810a702024020032802cc08450d002007102c0b024020032802ec07450d002006102c0b02402001450d00201641306a21022004422088a741d8006c210103400240200241746a2802002206450d00200641306c450d00200241706a280200102c0b0240200228020041ffffff3f71450d002002417c6a280200102c0b200241d8006a2102200141a87f6a22010d000b0b02402004a72202450d00200241d8006c450d002016102c0b200341043a00a8060c020b2002200e1047000b02402018450d002017450d00201841ffffffff0371450d002017102c0b20032d00a8064104460d0020032802a8062102200020032902ac06370024200041206a2002360000200041186a41003a000020004200370308200042013703000c180b20004200370308200020032800c004360019200041186a41003a00002000411c6a200341c3046a280000360000200042003703000c170b200341c0046a41026a200341a8066a41026a2d000022013a0000200320032f01a80622063b01c004200041206a20023a0000200041186a41003a000020004200370308200020063b0021200041236a20013a000020002004370024200042013703000c160b200341043a00e8030c020b20032d00e8034104460d0120032902ec0321040b20032802e803210220002004370024200041206a2002360000200041186a41003a000020004200370308200042013703000c130b20004200370308200020032800f803360019200041186a41003a00002000411c6a200341fb036a280000360000200042003703000c120b20032802f806210220002004370024200041206a2002360000200041186a41003a000020004200370308200042013703000c110b20004200370308200020032800e803360019200041186a41003a00002000411c6a200341eb036a280000360000200042003703000c100b20004200370308200020032800e803360019200041186a41003a00002000411c6a200341eb036a280000360000200042003703000c0f0b0240200841ffffff3f71450d002007102c0b0240200a0d00200341013a00f8060240200328028c052202450d00200241186c450d00200328028805102c0b20032802980541ffffffff0371450d04200328029405102c0c040b20032802dc062108200341f0066a4200370300200341e8066a4200370300200341d8066a41086a22014200370300200342003703d80620034198086a41e6dcc700410710c501200120034198086a41086a29000037030020032003290098083703d806200341a8066a41ccbac200410a10c501201741086a200341a8066a41086a290000370000201720032900a806370000200341c0006a200341d8066a412010c6012003280244210b2003280240210e20034198086a41e6dcc700410710c501200341d8066a418893c700410a10c501200341c8086a200341a0056a220910e40220032802d008220141206a2206417f4c0d000240024020060d00410121070c010b200610322207450d020b200341003602c007200320063602bc07200320073602b807200341b8076a4100411010c80120032802b80720032802c00722066a2207200329009808370000200741086a20034198086a41086a2900003700002003200641106a22063602c007200341b8076a2006411010c80120032802b80720032802c00722066a220720032900d806370000200741086a200341d8066a41086a2900003700002003200641106a22073602c00720032802c8082106200341b8076a2007200110c80120032802b807220720032802c00722146a2006200110c9081a2003201420016a22013602c007024020032802cc08450d002006102c0b2007200110b401024020032802bc07450d002007102c0b20034198086a41e6dcc700410710c501200341d8066a41b18ec100410a10c501200341c8086a200910e40220032802d008220141206a2206417f4c0d000240024020060d00410121070c010b200610322207450d020b200341003602c007200320063602bc07200320073602b807200341b8076a4100411010c80120032802b80720032802c00722066a2207200329009808370000200741086a20034198086a41086a2900003700002003200641106a22063602c007200341b8076a2006411010c80120032802b80720032802c00722066a220720032900d806370000200741086a200341d8066a41086a2900003700002003200641106a22073602c00720032802c8082106200341b8076a2007200110c80120032802b807220920032802c00722076a2006200110c9081a2003200720016a22143602c007024020032802cc08450d002006102c0b200b4100200e1b210b200341003602d008200342013703c808200341c8086a2002108f01200a20024105746a210720032802d0082101200a21020340200341c8086a20014120102f20032802c80820032802d00822066a22012002290000370000200141086a200241086a290000370000200141106a200241106a290000370000200141186a200241186a2900003700002003200641206a22013602d0082007200241206a2202470d000b200341c8086a20014104102f20032802c80820032802d00822026a200b3600002003200241046a22023602d008200341c8086a20024101102f20032802c808220220032802d00822016a41003a00002003200141016a22013602d008200920142002200110a702024020032802cc08450d002002102c0b024020032802bc07450d002009102c0b02402008450d00200841ffffff3f71450d00200a102c0b0240200328028c052202450d00200241186c450d00200328028805102c0b024020032802980541ffffffff0371450d00200328029405102c0b200341043a00f8060c050b103b000b1039000b2008450d002007450d00200841ffffff3f71450d002007102c0b20032d00f8064104460d0120032902fc0621040b20032802f806210220002004370024200041206a2002360000200041186a41003a000020004200370308200042013703000c090b20004200370308200020032800e803360019200041186a41003a00002000411c6a200341eb036a280000360000200042003703000c080b20004200370308200020032800e803360019200041186a41003a00002000411c6a200341eb036a280000360000200042003703000c070b20032d00f8064104460d0120032902fc0621040b20032802f806210220002004370024200041206a2002360000200041186a41003a000020004200370308200042013703000c050b20004200370308200020032800e803360019200041186a41003a00002000411c6a200341eb036a280000360000200042003703000c040b20004200370308200020032800f803360019200041186a41003a00002000411c6a200341fb036a280000360000200042003703000c030b20032d00f8064104460d0120032902fc0621040b20032802f806210220002004370024200041206a2002360000200041186a41003a000020004200370308200042013703000c010b20004200370308200020032800e803360019200041186a41003a00002000411c6a200341eb036a280000360000200042003703000b200341e00a6a24000b960701097f230041d0016b22022400200241086a41e6dcc700410710c50120024198016a418a99c100410610c501200241c0016a200110d5020240024020022802c801220141206a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b20024100360290012002200336028c01200220043602880120024188016a4100411010c80120022802880120022802900122036a22042002290008370000200441086a200241086a41086a2900003700002002200341106a22033602900120024188016a2003411010c80120022802880120022802900122036a2204200229009801370000200441086a20024198016a41086a22052900003700002002200341106a22043602900120022802c001210320024188016a2004200110c801200228028801220420022802900122066a2003200110c9081a2002200620016a220136029001024020022802c401450d002003102c0b200241306a2004200110d8032005200241ec006a29020037030020024198016a41106a200241f4006a29020037030020024198016a41186a2203200241fc006a29020037030020024198016a41206a220520024184016a2802003602002002200241e4006a290200370398010240024020022802502207450d00200241e0006a2802002106200241dc006a280200210820022802542101200241086a41206a2005280200360200200241086a41186a2003290300370300200241086a41106a220320024198016a41106a2205290300370300200241086a41086a220920024198016a41086a220a29030037030020022002290398013703080240200228028c01450d002004102c0b200241306a41106a2003290300370300200241306a41086a2009290300370300200241306a41186a200241086a41186a290300370300200241306a41206a200241086a41206a280200360200200a2002413c6a2902003703002005200241c4006a29020037030020024198016a41186a200241cc006a29020037030020022002290308370330200220022902343703980102402001450d00200141186c450d002007102c0b02402006450d002008450d00200641ffffffff0371450d002008102c0b2000200229039801370001200041196a200241b0016a290300370000200041116a200241a8016a290300370000200041096a200241a0016a290300370000410121010c010b0240200228028c01450d002004102c0b410021010b200020013a0000200241d0016a24000f0b103b000b1039000be10101047f230041306b220224000240412010322203450d002002422037020c20022003360208200241086a41004120102f20022802082203200228021022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2201360210200241186a2003200110c7012002412c6a200320016a360200200220033602282002200241186a41086a3602242002200241186a3602202000200241206a107e0240200228020c450d002003102c0b200241306a24000f0b1039000bce0201027f230041c0036b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00200041003a00000c010b200328021421042003200341186a2802003602ac03200320013602a803200341e0016a200341a8036a10d804410121020240024020032d00e0014101470d004100210220034100360228200342013703202003410f3602b4032003200341086a3602b0032003200341206a3602bc03200341f4016a4101360200200342013702e401200341b4bcc3003602e0012003200341b0036a3602f001200341bc036a41dcb7c000200341e0016a103e1a200335022842208620033502208410002003280224450d012003280220102c0c010b200341206a200341e0016a41017241c00110c9081a200041016a200341206a41c00110c9081a0b200020023a00002004450d002001102c0b200341c0036a24000b9a0401057f230041e0006b22022400200241086a41ffdcc700410710c501200241186a41b0b5c300410810c50102400240200141086a280200220341046a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b200241003602402002200436023c20022005360238200241386a41004104102f2002280238200228024022046a20012800003600002002200441046a36024020012802042003200241386a10ca04200241c8006a200228023822012002280240220410c701200241dc006a200120046a360200200220013602582002200241d0006a3602542002200241c8006a360250200241286a200241d0006a107e0240200228023c450d002001102c0b2002280230220441206a2201417f4c0d000240024020010d00410121030c010b200110322203450d020b2000200136020420002003360200200041086a2201410036020020004100411010c8012000280200200128020022036a220520022900083700002001200341106a2203360200200541086a200241086a41086a29000037000020002003411010c8012000280200200128020022036a220520022900183700002001200341106a2206360200200541086a200241186a41086a2900003700002002280228210320002006200410c8012000280200200128020022006a2003200410c9081a2001200020046a3602000240200228022c450d002003102c0b200241e0006a24000f0b103b000b1039000bfb0302057f017e230041f0016b22012400200141a8016a41c1dcc700410610c501200141d8006a41acc8c700410710c501200141106a200010d502024002402001280218220041206a2202417f4c0d000240024020020d00410121030c010b200210322203450d020b20014100360208200120023602042001200336020020014100411010c8012001280200200128020822026a220320012900a801370000200341086a200141a8016a41086a2900003700002001200241106a220236020820012002411010c8012001280200200128020822026a22032001290058370000200341086a200141d8006a41086a22042900003700002001200241106a22023602082001280210210320012002200010c80120012802002202200128020822056a2003200010c9081a2001200520006a220036020802402001280214450d002003102c0b200141d8006a2002200010d60220012903582106200141a8016a200441c40010c9081a0240024020064201510d0041002103200141106a410041c40010cb081a0c010b20012802a4012103200141106a200141a8016a41c40010c9081a0b200141e0006a200141106a41c40010c9082104200141a4016a417f200341016a220520052003491b3602002001420137035820022000200410d80202402001280204450d002002102c0b200141f0016a24000f0b103b000b1039000bfb0302057f017e230041f0016b22012400200141a8016a41c1dcc700410610c501200141d8006a41acc8c700410710c501200141106a200010d502024002402001280218220041206a2202417f4c0d000240024020020d00410121030c010b200210322203450d020b20014100360208200120023602042001200336020020014100411010c8012001280200200128020822026a220320012900a801370000200341086a200141a8016a41086a2900003700002001200241106a220236020820012002411010c8012001280200200128020822026a22032001290058370000200341086a200141d8006a41086a22042900003700002001200241106a22023602082001280210210320012002200010c80120012802002202200128020822056a2003200010c9081a2001200520006a220036020802402001280214450d002003102c0b200141d8006a2002200010d60220012903582106200141a8016a200441c40010c9081a0240024020064201510d0041002103200141106a410041c40010cb081a0c010b20012802a4012103200141106a200141a8016a41c40010c9081a0b200141e0006a200141106a41c40010c9082104200141a4016a41002003417f6a2205200520034b1b3602002001420137035820022000200410d80202402001280204450d002002102c0b200141f0016a24000f0b103b000b1039000bc35908027f017e027f017e017f027e1f7f047e230041a0086b22042400200241106a22052903002106200328021021072003280200210820022903002109200441b4036a200241e8016a290000370200200441bc036a200241f0016a290000370200200441c4036a200241f8016a290000370200200441e7e485f3063602a8032004200241e0016a2900003702ac0320044198056a41106a200328021036020020044198056a41086a200341086a290200370300200420032902003703980520044188066a200441a8036a20044198056a10ce060240024002400240024002400240024020042802c806220a450d00200441e0006a413e6a20044188066a41386a290300370100200441e0006a41366a20044188066a41306a290300370100200441e0006a412e6a20044188066a41286a290300370100200441e0006a41266a20044188066a41206a290300370100200441e0006a411e6a20044188066a41186a290300370100200441e0006a41166a20044188066a41106a290300370100200441e0006a410e6a20044188066a41086a2903003701002004200429038806370166200441d0066a290300210b20042802cc062103200441f8036a200441e0006a41c60010c9081a200441206a41086a200441f8036a410e6a290100370300200441206a41106a200441f8036a41166a290100370300200441206a41186a200441f8036a411e6a290100370300200441206a41206a200441f8036a41266a290100370300200441206a41286a200441f8036a412e6a290100370300200441206a41306a200441f8036a41366a290100370300200441206a41386a200441f8036a413e6a290100370300200420042901fe033703202002290308210c200441e0006a200541f00110c9081a02400240200c4201520d0020044188066a200441e0006a41f00110c9081a024020044188066a410c6a200441f8066a412010cc080d0020042802900620042802f406460d080b200441f4066a21022004419c046a220d20044188066a41086a220541206a28020036020020044194046a220e200541186a2902003702002004418c046a220f200541106a290200370200200441f8036a410c6a200541086a290200370200200441013602f803200420052902003702fc03200429038806210c200441003602b003200442013703a803200c200441f8036a2009200441a8036a109907200441b4066a20042802a80320042802b003200441d8076a220510a6052110024020042802ac03450d0020042802a803102c0b200d200241206a280200360200200e200241186a290200370200200f200241106a29020037020020044184046a200241086a290200370200200441013602f803200420022902003702fc03200429038806210c200441003602b003200442013703a803200c200441f8036a2009200441a8036a10990720044198076a20042802a80320042802b003200510a6052102024020042802ac03450d0020042802a803102c0b20102002710d010c070b20044188066a200441e0006a41f00110c9081a024020044188066a410c6a200441f8066a412010cc080d0020042802900620042802f406460d070b200441f4066a21022004419c046a220d20044188066a41086a220541206a28020036020020044194046a220e200541186a2902003702002004418c046a220f200541106a290200370200200441f8036a410c6a200541086a290200370200200441003602f803200420052902003702fc03200429038806210c200441003602b003200442013703a803200c200441f8036a2009200441a8036a109907200441b4066a20042802a80320042802b003200441d8076a220510a6052110024020042802ac03450d0020042802a803102c0b200d200241206a280200360200200e200241186a290200370200200f200241106a29020037020020044184046a200241086a290200370200200441003602f803200420022902003702fc03200429038806210c200441003602b003200442013703a803200c200441f8036a2009200441a8036a10990720044198076a20042802a80320042802b003200510a6052102024020042802ac03450d0020042802a803102c0b2010200271450d060b2009500d0120044188066a2009427f7c10d907200441186a200428028806220d20042802900610c601200428021c2105200428021821020240200428028c06450d00200d102c0b20024101460d02200441e0006a410610a30520044197066a200441e0006a41086a28020022023600002004200429036037008f06200041186a41003a0000200042003703082000200429008806370019200041216a20044188066a41086a290000370000200041286a2002360000200042013703000c060b200441e0006a410510a30520044197066a200441e0006a41086a28020022023600002004200429036037008f06200041186a41003a0000200042003703082000200429008806370019200041216a20044188066a41086a290000370000200041286a2002360000200042013703000c030b20044188066a420010d907200441086a200428028806220520042802900610c601200428020c210d200428020821020240200428028c06450d002005102c0b4101210e0c010b20044188066a200910d907200441106a200428028806220e20042802900610c6012004280214210d200428021021020240200428028c06450d00200e102c0b4100210e0b024020024101460d00200441e0006a410610a30520044197066a200441e0006a41086a28020022023600002004200429036037008f06200041186a41003a0000200042003703082000200429008806370019200041216a20044188066a41086a290000370000200041286a2002360000200042013703000c030b0240024002400240024002402008200d4b0d0002404102200820054d200e1b22024102460d0020024101710d010b200441003602d802200442013703d0022001411f6a2d000021052001411e6a2d0000210d2001411d6a2d0000210e2001411c6a2d0000210f2001411b6a2d000021102001411a6a2d00002111200141196a2d00002112200141186a2d00002113200141176a2d00002114200141166a2d00002115200141156a2d00002116200141146a2d00002117200141136a2d00002118200141126a2d00002119200141116a2d0000211a2001410f6a2d0000211b2001410e6a2d0000211c2001410d6a2d0000211d2001410c6a2d0000211e2001410b6a2d0000211f2001410a6a2d00002120200141096a2d00002121200141076a2d00002122200141066a2d00002123200141056a2d00002124200141036a2d00002125200141206a2d0000212620012d0010212720012d0008212820012d0004212920012d0002212a20012d0001212b200441d0026a410020012d0000220241014610d60120042802d802210102402002450d0020042802d00220014105746a210203402002411f6a20263a00002002202b41ff0171202a4108747241ffff0371202541ff017120294108747241107472ad202441ff017120234108747241ffff0371202241ff017120284108747241107472ad422086843700002002202141ff017120204108747241ffff0371201f41ff0171201e4108747241107472ad201d41ff0171201c4108747241ffff0371201b41ff017120274108747241107472ad422086843700082002411e6a20053a0000200241106a201a41ff017120194108747241ffff0371201841ff017120174108747241107472ad201641ff017120154108747241ffff0371201441ff017120134108747241107472ad422086843700002002411c6a200e41ff0171200d410874723b0000200241186a201241ff017120114108747241ffff0371201041ff0171200f4108747241107472360000200241206a2102200141016a2101410041ff01710d000b0b200420013602d802200441e0026a41086a22052001360200200420042903d0023703e002200441e0006a41186a200441206a41086a290300370300200441e0006a41206a200441206a41106a290300370300200441e0006a41286a200441206a41186a290300370300200441e0006a41306a2201200441206a41206a290300370300200441e0006a41386a220e200441206a41286a290300370300200441a0016a220f200441206a41306a290300370300200441e0006a41c8006a2210200441206a41386a290300370300200441b8016a200b370300200441b4016a2003360200200441e0006a41d0006a2211200a360200200420063703682004200937036020042004290320370370200420073602c401200420083602c00141d0001032220d450d0320044188066a41086a2212200441e0006a41106a220241086a29030037030020044188066a41106a2213200241106a29030037030020044188066a41186a2214200241186a29030037030020042002290300370388062001290300210c200e290300210b200f290300212c2010290300212d200441f8036a201110a502200d41386a202d370300200d202c370330200d41286a200b370300200d200c370320200d41186a2014290300370300200d41106a2013290300370300200d41086a2012290300370300200d200429038806370300200d20042903f803370340200d41c8006a200441f8036a41086a280200360200200441f0026a41086a2005280200360200200420042903e0023703f0022004410036028005200442013703f804200441f8046a41004108102f20042802f80420042802800522026a20093700002004200241086a220236028005200441f8046a20024108102f20042802f80420042802800522026a20063700002004200241086a36028005200441a8036a41eddcc700410810c501200441f8036a41d4d0c000411210c50120044188066a41edd5c00010a102200428029006220241206a2201417f4c0d040240024020010d00410121050c010b200110322205450d040b200441003602a0052004200136029c05200420053602980520044198056a4100411010c80120042802980520042802a00522016a220520042900a803370000200541086a200441a8036a41086a2900003700002004200141106a22013602a00520044198056a2001411010c80120042802980520042802a00522016a220520042900f803370000200541086a200441f8036a41086a2900003700002004200141106a22053602a005200428028806210120044198056a2005200210c801200428029805220520042802a005220e6a2001200210c9081a2004200e20026a22023602a0050240200428028c06450d002001102c0b20044188066a2005200210f604200429028c06420020042802880622021b210c2002410120021b21100240200428029c05450d002005102c0b2004200c4220883e02fc05200420103602f8052004200441f8056a10870220042802000d012004280204221320042802fc0541306e2202200220134b1bad42307e220b422088a70d04200ba72202417f4c0d040240024020020d00410821110c010b200210322211450d040b200441003602e005200420113602d8052004200241306e22023602dc05410021120240024002402013450d0041002114034020042802fc0522014108490d0320042802f805220e290000210b2004200e41086a3602f8052004200141786a22023602fc0520024108490d03201441016a21142004200141706a220f3602fc052004200e41106a3602f805200e290008212c41002102200441003a00a8062001416f6a21010340200f2002460d0320044188066a20026a200e20026a220541106a2d00003a00002004200541116a3602f8052004200241016a22053a00a806200420013602fc052001417f6a21012005210220054120470d000b200441f8036a41186a220220044188066a41186a290300370300200441f8036a41106a220120044188066a41106a290300370300200441f8036a41086a220e20044188066a41086a29030037030020042004290388063703f803200541ff01714120490d0320044180036a41086a200e290300222d37030020044180036a41106a2001290300222e37030020044180036a41186a2002290300222f370300200441c8046a41186a2201202f370300200441c8046a41106a2205202e370300200441c8046a41086a220e202d370300200420042903f803222d370398052004202d370380032004202d3703c8040240201220042802dc05470d00200441d8056a2012109d0520042802e005211220042802d80521110b2011201241306c6a2202202c3703082002200b370300200220042903c804370310200241186a200e290300370300200241206a2005290300370300200241286a20012903003703002004201241016a22123602e00520142013470d000b20042802dc05210220042802d80521110b2002410020111b210e2012410020111b21052011410820111b21010c040b200241ff0171450d00200441003a00a8060b20042802dc052202450d01200241306c450d0120042802d805102c0c010b200441e0006a410610a30520044197066a200441e0006a41086a28020022023600002004200429036037008f06200041186a41003a0000200042003703082000200429008806370019200041216a20044188066a41086a290000370000200041286a2002360000200042013703000c070b41082101410021054100210e0b20044188066a41edd5c000200441f8046a10a002200441f8036a200428028806220f20042802900610fc0420042902fc03420020042802f80322021b210b2002410120021b211a0240200428028c06450d00200f102c0b20044180036a41206a20053602002004419c036a200e36020020044180036a41106a200b37030020044180036a41086a200441f8046a41086a280200360200200420042903f8043703800320042001360298032004201a36028c03200b422088210b0240200ca7450d002010102c0b200ba7211920044188066a41086a200d41086a29030037030020044188066a41106a200d41106a29030037030020044188066a41186a200d41186a29030037030020044188066a41206a200d41206a29030037030020044188066a41286a2202200d41286a29030037030020044188066a41306a2201200d41306a29030037030020044188066a41386a2205200d41386a290300370300200441f8036a41086a200d41cc006a2802003602002004200d290300370388062004200d2902443703f80302400240200d280240220e0d004100210e0c010b20044198056a41386a220f200529030037030020044198056a41306a2205200129030037030020044198056a41286a2201200229030037030020044198056a41206a220220044188066a41206a29030037030020044198056a41186a221020044188066a41186a29030037030020044198056a41106a221120044188066a41106a29030037030020044198056a41086a221220044188066a41086a290300370300200441f8046a41086a2213200441f8036a41086a280200360200200420042903880637039805200420042903f8033703f804200441a8036a41386a200f290300370300200441a8036a41306a2005290300370300200441a8036a41286a2001290300370300200441a8036a41186a2010290300370300200441a8036a41106a2011290300370300200441a8036a41086a2012290300370300200441e8036a200e360200200420022903003703c80320042004290398053703a803200441ec036a220220042903f804370200200241086a20132802003602002004410036029006200442013703880620044188066a41004108102f20042802880620042802900622026a20093700002004200241086a22023602900620044188066a20024108102f200428028806220120042802900622026a20063700002004419c066a41002900f5d5403702002004200241086a36029006200441002900edd540370294062004200441a8036a3602a406200441c8046a20044188066a10bf060240200428028c06450d002001102c0b20044188066a200441c8046a10a202200428028806220120042802900610ce0221020240200428028c06450d002001102c0b02400240024020020d00200441f8036a200441a8036a41d00010c9081a200441d8056a200441f0026a10a60220044188066a200441f8036a41d00010c9081a20044188066a41d0006a220241086a200441d8056a41086a280200360200200220042903d805370200200441f8036a200441c8046a10a20220042802f803220220042802800420044188066a109205024020042802fc03450d002002102c0b024020042802cc062202450d00200241306c450d0020042802c806102c0b024020042802dc0641ffffff3f71450d0020042802d806102c0b200441f8036a41186a2201200441c8046a41186a290300370300200441f8036a41106a2205200441c8046a41106a290300370300200441f8036a41086a220e200441c8046a41086a290300370300200420042903c8043703f8034100210220042802980321100240024020042802a00322120e020003010b20044188066a41186a200129030037030020044188066a41106a200529030037030020044188066a41086a200e290300370300200420042903f80337038806410021020c030b410021022012210103400240417f20102001410176220e20026a220f41306c6a2211290300220c200952200c2009541b22050d00417f2011290308220c200652200c2006541b21050b2002200f20054101461b21022001200e6b220141014d0d020c000b0b4100210e20042802ec032202450d02200241306c450d0220042802e803102c0c020b024002400240417f2010200241306c6a2205290300220c200952200c2009541b22010d0041ff0121012005290308220c2006540d01200c20065221010b2001450d010b2002200141ff017141ff01466a21020b20044188066a41186a200441f8036a41186a29030037030020044188066a41106a200441f8036a41106a29030037030020044188066a41086a200441f8036a41086a290300370300200420042903f80337038806201220024f0d00200220121044000b02402012200428029c03470d0020044180036a41186a2012109d05200428029403211920042802980321100b2010200241306c6a220141306a2001201220026b41306c10ca081a20012006370308200120093703002001200429038806370310200141186a20044188066a41086a2205290300370300200141206a20044188066a41106a220f290300370300200141286a20044188066a41186a22012903003703004101210e2004201241016a3602a0032001200441f8036a41186a290300370300200f200441f8036a41106a2903003703002005200441f8036a41086a290300370300200420042903f8033703880602402019200428029003470d002004418c036a2019410110d60120042802940321190b200428028c03221a20194105746a2202200429038806370000200241186a2001290300370000200241106a200f290300370000200241086a20052903003700002004201941016a2219360294030b200d41d0006a220220026b220141d0006d210502402001450d00200541d0006c2101200241c0006a210203400240200241046a2802002205450d00200541306c450d002002280200102c0b200241d0006a2102200141b07f6a22010d000b0b200d102c0240200e0d0020044180036a10e707410021100c030b0240024002402019450d002019410574210d200441cc066a2102201a21010340200441f8056a200110a20220044188066a20042802f805220e20042802800610e804200441f8036a41086a220f20044188066a41086a290300370300200441f8036a41106a221020044188066a41106a290300370300200441f8036a41186a221120044188066a41186a290300370300200441f8036a41206a221220044188066a41206a290300370300200441f8036a41286a221320044188066a41286a290300370300200441f8036a41306a221420044188066a41306a290300370300200441f8036a41386a221520044188066a41386a290300370300200441c8046a41086a2216200241086a290200370300200441c8046a41106a2217200241106a290200370300200441c8046a41186a2218200241186a28020036020020042004290388063703f803200420022902003703c804024020042802c8062205450d00200441a8036a41386a2015290300370300200441a8036a41306a2014290300370300200441a8036a41286a2013290300370300200441a8036a41206a2012290300370300200441a8036a41186a2011290300370300200441a8036a41106a2010290300370300200441a8036a41086a200f290300370300200441d8056a41086a2016290300370300200441d8056a41106a2017290300370300200441d8056a41186a2018280200360200200420042903f8033703a803200420042903c8043703d8050b024020042802fc05450d00200e102c0b20050d02200141206a2101200d41606a220d0d000b0b410821104200210b0c010b20044198056a41386a2202200441a8036a41386a29030037030020044198056a41306a220e200441a8036a41306a29030037030020044198056a41286a220f200441a8036a41286a29030037030020044198056a41206a2210200441a8036a41206a29030037030020044198056a41186a2211200441a8036a41186a29030037030020044198056a41106a2212200441a8036a41106a29030037030020044198056a41086a2213200441a8036a41086a290300370300200441f8046a41086a2214200441d8056a41086a290300370300200441f8046a41106a2215200441d8056a41106a290300370300200441f8046a41186a2216200441d8056a41186a280200360200200420042903a80337039805200420042903d8053703f80441e00010322220450d01202020042903980537030020202005360240202020042903f804370244202041386a2002290300370300202041306a200e290300370300202041286a200f290300370300202041206a2010290300370300202041186a2011290300370300202041106a2012290300370300202041086a2013290300370300202041cc006a2014290300370200202041d4006a2015290300370200202041dc006a201628020036020020044281808080103702ec04200420203602e8040240200d4120460d00200141206a2111201a20194105746a221f41606a212220044188066a41c4006a2102410121210340201121010340200441f8056a200110a20220044188066a20042802f805221020042802800610e804200441f8036a41086a220d20044188066a41086a2218290300370300200441f8036a41106a220e20044188066a41106a2219290300370300200441f8036a41186a220f20044188066a41186a221a290300370300200441f8036a41206a221120044188066a41206a221b290300370300200441f8036a41286a221220044188066a41286a221c290300370300200441f8036a41306a221320044188066a41306a221d290300370300200441f8036a41386a221420044188066a41386a221e290300370300200441c8046a41086a2215200241086a290200370300200441c8046a41106a2216200241106a290200370300200441c8046a41186a2217200241186a28020036020020042004290388063703f803200420022902003703c804024020042802c8062205450d00200441a8036a41386a2014290300370300200441a8036a41306a2013290300370300200441a8036a41286a2012290300370300200441a8036a41206a2011290300370300200441a8036a41186a200f290300370300200441a8036a41106a200e290300370300200441a8036a41086a200d290300370300200441d8056a41086a2015290300370300200441d8056a41106a2016290300370300200441d8056a41186a2017280200360200200420042903f8033703a803200420042903c8043703d8050b024020042802fc05450d002010102c0b024020050d00201f200141206a2201470d010c030b0b20044198056a41386a2210200441a8036a41386a29030037030020044198056a41306a2211200441a8036a41306a29030037030020044198056a41286a2212200441a8036a41286a29030037030020044198056a41206a2213200441a8036a41206a29030037030020044198056a41186a2214200441a8036a41186a29030037030020044198056a41106a2215200441a8036a41106a29030037030020044198056a41086a2216200441a8036a41086a290300370300200441f8046a41086a2217200441d8056a41086a290300370300200441f8046a41106a2223200441d8056a41106a290300370300200441f8046a41186a2224200441d8056a41186a280200360200200420042903a80337039805200420042903d8053703f8042018201629030037030020192015290300370300201a2014290300370300201b2013290300370300201c2012290300370300201d2011290300370300201e2010290300370300200420042903980537038806200d2017290300370300200e2023290300370300200f2024280200360200200420042903f8043703f8030240202120042802ec04470d00200441e8046a2021410110940220042802e80421200b200141206a21112020202141e0006c6a2210200429038806370300201041106a2019290300370300201041086a2018290300370300201d290300210c201e290300210b201c290300212c201b290300212d201a290300212e201041c0006a2005360200201041186a202e370300201041206a202d370300201041286a202c370300201041c4006a20042903f803370200201041386a200b370300201041306a200c370300201041cc006a200d290300370200201041d4006a200e290300370200201041dc006a200f2802003602002004202141016a22213602f00420222001470d000b0b20042802e804211020042902ec04210b0b20044188066a41206a20044180036a41206a280200220136020020044188066a41186a20044180036a41186a290300220c37030020044188066a41106a20044180036a41106a29030037030020044188066a41086a20044180036a41086a290300370300200420042903800337038806200141306c4104722202417f4c0d01200210322205450d00200441003602e005200420023602dc05200420053602d805200441d8056a2001108f0102402001450d00200ca72202200141306c6a210f20042802e005210103402002290300210c200441d8056a20014108102f20042802d80520042802e00522016a200c3700002004200141086a22013602e005200241086a290300210c200441d8056a20014108102f20042802d80520042802e00522016a200c3700002004200141086a220d3602e005412010322201450d02200442203702fc03200420013602f803200441f8036a41004120102f20042802f8032205200428028004220e6a2201200241106a290000370000200141086a200241186a290000370000200141106a200241206a290000370000200141186a200241286a2900003700002004200e41206a220136028004200441d8056a200d2001102f20042802d80520042802e005220d6a2005200110c9081a2004200d20016a22013602e005024020042802fc03450d002005102c0b200241306a2202200f470d000b0b200441a8036a41eddcc700410810c501200441f8036a41d4d0c000411210c50120044198056a41edd5c00010a10220042802a005220241206a2201417f4c0d010240024020010d00410121050c010b200110322205450d010b200441003602d004200420013602cc04200420053602c804200441c8046a4100411010c80120042802c80420042802d00422016a220520042900a803370000200541086a200441a8036a41086a2900003700002004200141106a22013602d004200441c8046a2001411010c80120042802c80420042802d00422016a220520042900f803370000200541086a200441f8036a41086a2900003700002004200141106a22053602d0042004280298052101200441c8046a2005200210c80120042802c804220520042802d004220d6a2001200210c9081a2004200d20026a22023602d0040240200428029c05450d002001102c0b20052002200441d8056a108a03024020042802cc04450d002005102c0b024020042802dc05450d0020042802d805102c0b200441f8036a41edd5c00020044188066a10a00220042802f803220220042802800420044194066a108d05024020042802fc03450d002002102c0b20044188066a10e7070c020b1039000b103b000b024020042802f40241ffffff3f71450d0020042802f002102c0b024020100d0002402003450d00200341306c450d00200a102c0b200441e0006a410710a30520044197066a200441e0006a41086a28020022023600002004200429036037008f06200041186a41003a0000200042003703082000200429008806370019200041216a20044188066a41086a290000370000200041286a2002360000200042013703000c040b024020074101200741014b1b2202418094ebdc036e2002418094ebdc03704100476a22014101200141014b1b220120024b0d00200441003602b003200442043703a803200441a8036a4100200b422088a722071095022002200741036c220520022005491b20016ead428094ebdc037e200220016ead8042ffffffff0f83220c200c7e220c42808090bbbad6adf00d200c42808090bbbad6adf00d541b428094ebdc0380210c20042802b003210d0240024020070d0020042802a803210e0c010b200ca7210520042802a803220e200d4102746a210220072101034020022005360200200241046a21022001417f6a22010d000b200d20076a210d0b2004200d3602b00320102007200e200d200810a30221022004410036028004200442013703f803200441f8036a41004108102f20042802f80320042802800422016a20093700002004200141086a220136028004200441f8036a20014108102f20042802f80320042802800422016a2006370000200441f8036a41146a41002900f5d5403702002004200141086a36028004200441002900edd5403702840420044194066a20042903800437020020044188066a41146a20044188046a290300370200200441a4066a20044190046a280200360200200441a8066a20023a00002004410436028806200420042903f80337028c0620044188066a10c802024020042802ac0341ffffffff0371450d00200e102c0b02402007450d00200741e0006c2101201041d4006a210203400240200241706a2802002205450d00200541306c450d002002416c6a280200102c0b0240200228020041ffffff3f71450d002002417c6a280200102c0b200241e0006a2102200141a07f6a22010d000b0b0240200ba72202450d00200241e0006c450d002010102c0b02402003450d00200341306c450d00200a102c0b2000420037030820004200370300200041186a41013a00000c010b41f0bcc300411941f8acc800103c000b200441a0086a24000f0b200441e0006a410610a30520044197066a200441e0006a41086a28020022023600002004200429036037008f06200041186a41003a0000200042003703082000200429008806370019200041216a20044188066a41086a290000370000200041286a2002360000200042013703000b2003450d00200341306c450d00200a102c0b200441a0086a24000b9a0101027f230041106b220424000240410810322205450d002004420837020420042005360200200441004104102f2004280200200428020822056a20023600002004200541046a2202360208200420024104102f20042802002202200428020822056a20033600002004200541046a2203360208200020012002200310a70202402004280204450d002002102c0b200441106a24000f0b1039000bb50401057f230041e0006b22032400200341086a418dddc700410810c501200341186a41c0fbc300411210c50120032001360238200341c4006a200341386a410410c701200341dc006a2201200341386a41046a3602002003200341c4006a41086a22043602542003200341386a3602582003200341c4006a360250200341286a200341d0006a107e2003200236024c200341c4006a200341cc006a410410c7012001200341cc006a41046a360200200320043602542003200341cc006a3602582003200341c4006a360250200341386a200341d0006a107e0240024020032802302201200328024022046a41206a2202417f4c0d000240024020020d00410121050c010b200210322205450d020b2000200236020420002005360200200041086a2202410036020020004100411010c8012000280200200228020022056a220620032900083700002002200541106a2205360200200641086a200341086a41086a29000037000020002005411010c8012000280200200228020022056a220620032900183700002002200541106a2207360200200641086a200341186a41086a2900003700002003280228210520002007200110c8012000280200200228020022066a2005200110c9081a2002200620016a22063602002003280238210120002006200410c8012000280200200228020022006a2001200410c9081a2002200020046a3602000240200328023c450d002001102c0b0240200328022c450d002005102c0b200341e0006a24000f0b103b000b1039000ba808020b7f037e230041a0026b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a418dddc700410810c501200141b8016a41a7edc300410410c5012002200141b8016a41086a290000370300200320012900b8013703002001412036022c2001200141086a360228200141306a200141086a412010b30102400240200128023022040d00410021050c010b200128023421062001200141306a41086a280200360244200120043602402001200141c0006a1087020240024020012802000d0002400240024002402001280204220720012802444105762202200220074b1b22024105742203417f4c0d000240024020020d00410121050c010b200310322205450d020b41002108200141003602502001200236024c200120053602480240024002402007450d0041002109034041002103200141003a00d8012001280244417f6a2102200941016a210903402002417f460d03200141b8016a20036a2001280240220a2d00003a00002001200a41016a3602402001200341016a220a3a00d801200120023602442002417f6a2102200a2103200a4120470d000b20014180026a41186a2202200141b8016a41186a29030037030020014180026a41106a2203200141b8016a41106a29030037030020014180026a41086a220b200141b8016a41086a290300370300200120012903b80137038002200a41ff01714120490d03200141f8006a41086a200b290300220c370300200141f8006a41106a2003290300220d370300200141f8006a41186a2002290300220e370300200141d8006a41186a2203200e370300200141d8006a41106a220a200d370300200141d8006a41086a220b200c3703002001200129038002220c370398012001200c3703782001200c37035802402008200128024c470d00200141c8006a2008410110d60120012802482105200128025021080b200520084105746a22022001290358370000200241186a2003290300370000200241106a200a290300370000200241086a200b2903003700002001200841016a220836025020092007470d000b0b200129024c210c2005450d060c070b200341ff0171450d00200141003a00d8010b200128024c41ffffff3f710d020c030b103b000b1039000b2005102c0b0b41002105200141003602880220014201370380022001410f3602e4012001200141286a3602e001200120014180026a36029801200141cc016a4101360200200142013702bc01200141b4bcc3003602b8012001200141e0016a3602c80120014198016a41dcb7c000200141b8016a103e1a200135028802422086200135028002841000200128028402450d00200128028002102c0b2006450d002004102c0b0240024020050d0020004100360208200042013702000c010b2000200c370204200020053602000b200141a0026a24000bfb99040a047f017e027f027e0f7f037e057f017e057f027e230041f0016b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e25000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324000b200341d4006a410136020020034201370244200341eccdc80036024020034104360224200341ec9cc8003602202003200341206a360250200341c0006a41e88bc4001046000b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d2342002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a280200211a200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682101200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d00410121084100211441002113410021124200210b4200211c4200210a4200211d4100211141002110410021154100210f4100210e410021164100210d4100210c410021094100211741002118410021194200211b4100211a410021214100212242002123410021204100211f4100211e410021014100210641002127410121264101212541012124410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a280200211a200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682101200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2005360200200320073703582003201c3703482003201b3703e8012003201a3602e401200320193602e001200320183602dc01200320173602d801200320163602d401200320153602d001200320143602cc01200320133602c801200320123602c401200320113602c001200320103602bc012003200f3602b8012003200e3602b4012003200d3602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c200320043602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c440b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d2342002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a280200211a200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211e200328026c21012003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d00410121084100211441002113410021124200210b4200211c4200210a4200211d4100211141002110410021154100210f4100210e410021164100210d4100210c410021094100211741002118410021194200211b4100211a410021214100212242002123410021204100211f4100211e410021014100210641002127410121264101212541012124410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a280200211a200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211e200328026c21012003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2005360200200320073703582003201c3703482003201b3703e8012003201a3602e401200320193602e001200320183602dc01200320173602d801200320163602d401200320153602d001200320143602cc01200320133602c801200320123602c401200320113602c001200320103602bc012003200f3602b8012003200e3602b4012003200d3602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003200436026c2003201e3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c430b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d2342002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a280200211a200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211e200328026c211f200328027021012003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d00410121084100211441002113410021124200210b4200211c4200210a4200211d4100211141002110410021154100210f4100210e410021164100210d4100210c410021094100211741002118410021194200211b4100211a410021214100212242002123410021204100211e4100211f410021014100210641002127410121264101212541012124410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a280200211a200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211e200328026c211f200328027021012003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2005360200200320073703582003201c3703482003201b3703e8012003201a3602e401200320193602e001200320183602dc01200320173602d801200320163602d401200320153602d001200320143602cc01200320133602c801200320123602c401200320113602c001200320103602bc012003200f3602b8012003200e3602b4012003200d3602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c2003202136027820032020360274200320043602702003201f36026c2003201e3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c420b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d2342002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a280200211a200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211e200328026c211f200328027021202003280274210120032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d00410121084100211441002113410021124200210b4200211c4200210a4200211d4100211141002110410021154100210f4100210e410021164100210d4100210c410021094100211741002118410021194200211b4100211a4100212141002122420021234100211e4100211f41002120410021014100210641002127410121264101212541012124410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a280200211a200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211e200328026c211f200328027021202003280274210120032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2005360200200320073703582003201c3703482003201b3703e8012003201a3602e401200320193602e001200320183602dc01200320173602d801200320163602d401200320153602d001200320143602cc01200320133602c801200320123602c401200320113602c001200320103602bc012003200f3602b8012003200e3602b4012003200d3602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c2003202136027820032004360274200320203602702003201f36026c2003201e3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c410b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d2342002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a280200211a200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211e200328026c211f200328027021202003280274212120032802782122200328027c210120032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d00410121084100211441002113410021124200210b4200211c4200210a4200211d4100211141002110410021154100210f4100210e410021164100210d4100210c410021094100211741002118410021194200211b4100211a4100211e4100211f41002120410021214200212341002122410021014100210641002127410121264101212541012124410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a280200211a200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211e200328026c211f200328027021202003280274212120032802782122200328027c210120032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2005360200200320073703582003201c3703482003201b3703e8012003201a3602e401200320193602e001200320183602dc01200320173602d801200320163602d401200320153602d001200320143602cc01200320133602c801200320123602c401200320113602c001200320103602bc012003200f3602b8012003200e3602b4012003200d3602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003200436027c2003202236027820032021360274200320203602702003201f36026c2003201e3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c400b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d2342002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782101200328027c212120032903800121232003280288012122200328028c01212420032802900121252003280294012126200328029c0121270c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122024102470d00410121064100211341002112410021114200210b4200211c4200210a4200211d410021104100210f410021144100210e4100210d410021154100210c41002109410021084100211641002117410021184200211b410021194100211a4100211e4100211f410021204100210141002121420021234100210541002126410121254101212441012122410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782101200328027c212120032903800121232003280288012122200328028c012124200328029001212520032802940121260b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2027360200200320073703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320053602a0012003200236029801200320263602940120032025360290012003202436028c01200320223602880120032023370380012003202136027c20032004360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c3f0b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d2342002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102470d00200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d004101210641002108410021094100210c4200210a4200210b4200211b4200211c4100210d4100210e4100210f4100211041002111410021124100211341002114410021154100211641002117410021184200211d410021194100211a4100211e4100211f41002120410021214100212241002101420021234100212441002125410121264101212741012128410021020c020b20032903800122074280808080708321232007a72101200341c0006a41106a290300211b200341e0006a290300210a200341a0016a2802002124200341a4016a2802002106200341a8016a2802002115200341ac016a2802002114200341b0016a2802002113200341b4016a2802002111200341b8016a2802002110200341bc016a280200210e200341c0016a280200210d200341c4016a280200210c200341c8016a2802002109200341cc016a2802002108200341d0016a280200210f200341d4016a2802002112200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211d2003290348210b200329035821072003290340211c2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c21222003280288012128200328028c012127200328029001212620032802940121250c010b2006290300211b2005290300210a200341a0016a2802002124200341a4016a2802002106200341a8016a2802002115200341ac016a2802002114200341b0016a2802002113200341b4016a2802002111200341b8016a2802002110200341bc016a280200210e200341c0016a280200210d200341c4016a280200210c200341c8016a2802002109200341cc016a2802002108200341d0016a280200210f200341d4016a2802002112200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211d2003290348210b200329035821072003290340211c2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c21222003280288012128200328028c01212720032802900121262003280294012125200328029c01210520032903800122294280808080708321232029a721010b024020012004460d00200341c0006a41206a200a370300200341c0006a41106a201b3703002003419c016a2005360200200320073703582003200b3703482003201d3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320123602d4012003200f3602d001200320083602cc01200320093602c8012003200c3602c4012003200d3602c0012003200e3602bc01200320103602b801200320113602b401200320133602b001200320143602ac01200320153602a801200320063602a401200320243602a0012003200236029801200320253602940120032026360290012003202736028c0120032028360288012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201c37034020032023428080808070832004ad8437038001200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c3e0b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d2342002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102470d00200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d004101210641002108410021094100210c4200210a4200210b4200211b4200211c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211e4100211f41002120410021214200211d4100210141002122410021244101212541012126410121274200212341002128410021020c020b200329038001221d422088a72101200341c0006a41106a290300211b200341e0006a290300210a200341a0016a2802002122200341a4016a2802002106200341a8016a2802002115200341ac016a2802002114200341b0016a2802002113200341b4016a2802002111200341b8016a2802002110200341bc016a280200210e200341c0016a280200210d200341c4016a280200210c200341c8016a2802002109200341cc016a2802002108200341d0016a280200210f200341d4016a2802002112200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002128200341e8016a29030021232003290348210b200329035821072003290340211c20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c21212003280288012127200328028c012126200328029001212520032802940121240c010b2006290300211b2005290300210a200341a0016a2802002122200341a4016a2802002106200341a8016a2802002115200341ac016a2802002114200341b0016a2802002113200341b4016a2802002111200341b8016a2802002110200341bc016a280200210e200341c0016a280200210d200341c4016a280200210c200341c8016a2802002109200341cc016a2802002108200341d0016a280200210f200341d4016a2802002112200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002128200341e8016a29030021232003290348210b200329035821072003290340211c20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c21212003280288012127200328028c01212620032802900121252003280294012124200328029c012105200329038001221d422088a721010b024020012004460d00200341c0006a41206a200a370300200341c0006a41106a201b3703002003419c016a2005360200200320073703582003200b370348200320233703e801200320283602e401200320183602e001200320173602dc01200320163602d801200320123602d4012003200f3602d001200320083602cc01200320093602c8012003200c3602c4012003200d3602c0012003200e3602bc01200320103602b801200320113602b401200320133602b001200320143602ac01200320153602a801200320063602a401200320223602a0012003200236029801200320243602940120032025360290012003202636028c0120032027360288012003202136027c200320203602782003201f3602742003201e3602702003201a36026c200320193602682003201c37034020032004ad422086201d42ffffffff0f838437038001200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c3d0b20012802042101200341c0006a41206a200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a200241106a290200370300200341c0006a41086a200241086a290200370300200320022902003703404102210202400240200341c0006a10da020d0020010d01410321020b200041dc94c4003600242000410f3b002120004200370308200041286a410f360000200041206a20023a0000200041186a41003a0000200042013703000c3d0b42002107200341386a22024200370300200341206a41106a22044200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41b995c400410d10c5012002200629000037030020042003290040370300200341c0006a200341206a10f5020240024020032802980122084102460d00200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002104200341a4016a2802002105200341a8016a2802002106200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012102200328028c01212420032802900121252003280294012126200328029c0121270c010b20024200370300200442003703002005420037030020034200370320200341c0006a41ac95c400410d10c5012005200629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020042003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122084102470d00410121054100211341002112410021114200210b4200211c4200210a4200211d410021104100210f410021144100210e4100210d410021154100210c41002109410021064100211641002117410021184100211a4100211e4100211f4100212041002121410021224200212341002104410021264101212541012124410121024200211b41002119410021080c010b200341d0006a290300210a200341e0006a290300210b200341a0016a2802002104200341a4016a2802002105200341a8016a2802002106200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012102200328028c012124200328029001212520032802940121260b024020022001460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2027360200200320073703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320063602a801200320053602a401200320043602a0012003200836029801200320263602940120032025360290012003202436028c01200320013602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c3c0b20012802042101200341c0006a41206a200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a200241106a290200370300200341c0006a41086a200241086a290200370300200320022902003703404102210202400240200341c0006a10da020d0020010d01410321020b200041dc94c4003600242000410f3b002120004200370308200041286a410f360000200041206a20023a0000200041186a41003a0000200042013703000c3c0b42002107200341386a22024200370300200341206a41106a22044200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41b995c400410d10c5012002200629000037030020042003290040370300200341c0006a200341206a10f5020240024020032802980122084102460d00200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002104200341a4016a2802002105200341a8016a2802002106200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01210220032802900121252003280294012126200328029c0121270c010b20024200370300200442003703002005420037030020034200370320200341c0006a41ac95c400410d10c5012005200629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020042003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122084102470d00410121054100211341002112410021114200210b4200211c4200210a4200211d410021104100210f410021144100210e4100210d410021154100210c41002109410021064100211641002117410021184100211a4100211e4100211f4100212041002121410021224200212341002104410021264101212541012102410121244200211b41002119410021080c010b200341d0006a290300210a200341e0006a290300210b200341a0016a2802002104200341a4016a2802002105200341a8016a2802002106200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012102200328029001212520032802940121260b024020022001460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2027360200200320073703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320063602a801200320053602a401200320043602a0012003200836029801200320263602940120032025360290012003200136028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c3b0b20012802042101200341c0006a41206a200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a200241106a290200370300200341c0006a41086a200241086a290200370300200320022902003703404102210202400240200341c0006a10da020d0020010d01410321020b200041dc94c4003600242000410f3b002120004200370308200041286a410f360000200041206a20023a0000200041186a41003a0000200042013703000c3b0b42002107200341386a22024200370300200341206a41106a22044200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41b995c400410d10c5012002200629000037030020042003290040370300200341c0006a200341206a10f5020240024020032802980122084102460d00200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002104200341a4016a2802002105200341a8016a2802002106200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121022003280294012126200328029c0121270c010b20024200370300200442003703002005420037030020034200370320200341c0006a41ac95c400410d10c5012005200629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020042003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122084102470d00410121054100211341002112410021114200210b4200211c4200210a4200211d410021104100210f410021144100210e4100210d410021154100210c410021094100210641002116410021174100211a4100211e4100211f410021204100212141002122420021234100210441002126410121024101212541012124410021184200211b41002119410021080c010b200341d0006a290300210a200341e0006a290300210b200341a0016a2802002104200341a4016a2802002105200341a8016a2802002106200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001210220032802940121260b024020022001460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2027360200200320073703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320063602a801200320053602a401200320043602a0012003200836029801200320263602940120032001360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c3a0b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d2042002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012101200328029c0121270c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122024102470d00410121064100211341002112410021114200210b4200211c4200210a4200211d410021104100210f410021144100210e4100210d410021154100210c410021094100210841002116410021174100211a4100211e4100211f410021204100212141002122420021234100210541002101410121264101212541012124410021184200211b41002119410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121010b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2027360200200320073703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320053602a0012003200236029801200320043602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c390b200141086a280200210420012802042101200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a200241086a29020037030020032002290200370340200341c0006a10da020d2042002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341106a41ac95c400410d10c5012009200341106a41086a220c29000037030020032003290010370320200341106a41b995c400410d10c5012002200c29000037030020082003290010370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121280c010b200341386a22024200370300200341206a41106a22054200370300200341206a41086a2206420037030020034200370320200341c0006a41ac95c400410d10c5012006200341c0006a41086a220829000037030020032003290040370320200341c0006a41c695c400410c10c5012002200829000037030020052003290040370300200341c0006a200341206a10f502200328029c012128024020032802980122024102470d00410121064100211341002112410021114200210b4200211c4200210a4200211d410021104100210f410021144100210e4100210d410021154100210c410021094100210841002116410021174100211a4100211e4100211f410021204100212141002122420021234100210541002127410121264101212541012124410021184200211b41002119410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b0240024020012002470d002001450d0120042028460d010b200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2004360200200320073703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320053602a0012003200136029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c380b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d2042002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002101200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d00410121064100211341002112410021114200210b4200211c4200210a4200211d410021104100210f410021144100210e4100210d4100210c410021154100210941002108410021164100211a4100211e4100211f41002120410021214100212242002123410021014100212741012126410121254101212441002117410021184200211b41002119410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002101200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2005360200200320073703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320043602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c370b20012802042101200341c0006a41206a200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a200241106a290200370300200341c0006a41086a200241086a290200370300200320022902003703404102210202400240200341c0006a10da020d0020010d01410321020b200041dc94c4003600242000410f3b002120004200370308200041286a410f360000200041206a20023a0000200041186a41003a0000200042013703000c370b42002107200341386a22024200370300200341206a41106a22044200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41b995c400410d10c5012002200629000037030020042003290040370300200341c0006a200341206a10f5020240024020032802980122084102460d00200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002104200341a4016a2802002102200341a8016a2802002105200341ac016a2802002106200341b0016a2802002109200341b4016a280200210c200341b8016a280200210d200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c01212420032802900121252003280294012126200328029c0121270c010b20024200370300200442003703002005420037030020034200370320200341c0006a41ac95c400410d10c5012005200629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020042003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122084102470d00410121024100211241002111410021104200210b4200211c4200210a4200211d4100210f4100210e410021134100210d4100210c4100210941002114410021064100210541002115410021194100211a4100211e4100211f410021204100212142002123410021044100212641012125410121244101212241002116410021174200211b41002118410021080c010b200341d0006a290300210a200341e0006a290300210b200341a0016a2802002104200341a4016a2802002102200341a8016a2802002105200341ac016a2802002106200341b0016a2802002109200341b4016a280200210c200341b8016a280200210d200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c012124200328029001212520032802940121260b024020022001460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2027360200200320073703582003201c3703482003201b3703e801200320183602e401200320173602e001200320163602dc01200320153602d801200320143602d401200320133602d001200320123602cc01200320113602c801200320103602c4012003200f3602c0012003200e3602bc012003200d3602b8012003200c3602b401200320093602b001200320063602ac01200320053602a801200320013602a401200320043602a0012003200836029801200320263602940120032025360290012003202436028c01200320223602880120032023370380012003202136027c200320203602782003201f3602742003201e3602702003201a36026c200320193602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c360b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002101200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d00410121084100211341002112410021114200210b4200211c4200210a4200211d410021104100210f410021144100210e4100210d4100210c41002115410021094100211a4100211e4100211f410021204100212141002122420021234100210141002106410021274101212641012125410121244100211641002117410021184200211b41002119410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002101200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2005360200200320073703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320043602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c350b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002101200341b0016a2802002109200341b4016a280200210c200341b8016a280200210d200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c01212420032802900121252003280294012126200328029c0121270c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122024102470d00410121064100211241002111410021104200210b4200211c4200210a4200211d4100210f4100210e410021134100210d4100210c4100211441002109410021194100211a4100211e4100211f410021204100212142002123410021084100210141002105410021264101212541012124410121224100211541002116410021174200211b41002118410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002101200341b0016a2802002109200341b4016a280200210c200341b8016a280200210d200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c012124200328029001212520032802940121260b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2027360200200320073703582003201c3703482003201b3703e801200320183602e401200320173602e001200320163602dc01200320153602d801200320143602d401200320133602d001200320123602cc01200320113602c801200320103602c4012003200f3602c0012003200e3602bc012003200d3602b8012003200c3602b401200320093602b001200320043602ac01200320083602a801200320063602a401200320053602a0012003200236029801200320263602940120032025360290012003202436028c01200320223602880120032023370380012003202136027c200320203602782003201f3602742003201e3602702003201a36026c200320193602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c340b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a2802002101200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d00410121084100211341002112410021114200210b4200211c4200210a4200211d41002110410021144100210f4100210e4100210d4100211a4100211e4100211f41002120410021214100212242002123410021094100210c410021014100210641002127410121264101212541012124410021154100211641002117410021184200211b41002119410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a2802002101200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2005360200200320073703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b401200320043602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c330b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a2802002101200341b8016a280200210d200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c01212420032802900121252003280294012126200328029c0121270c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122024102470d00410121064100211241002111410021104200210b4200211c4200210a4200211d4100210f4100210e410021134100210d410021194100211a4100211e4100211f41002120410021214200212341002108410021094100210c410021014100210541002126410121254101212441012122410021144100211541002116410021174200211b41002118410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a2802002101200341b8016a280200210d200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c012124200328029001212520032802940121260b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2027360200200320073703582003201c3703482003201b3703e801200320183602e401200320173602e001200320163602dc01200320153602d801200320143602d401200320133602d001200320123602cc01200320113602c801200320103602c4012003200f3602c0012003200e3602bc012003200d3602b801200320043602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320053602a0012003200236029801200320263602940120032025360290012003202436028c01200320223602880120032023370380012003202136027c200320203602782003201f3602742003201e3602702003201a36026c200320193602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c320b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a2802002101200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c01212420032802900121252003280294012126200328029c0121270c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122024102470d00410121064100211241002111410021104200210b4200211c4200210a4200211d4100210f410021134100210e410021194100211a4100211e4100211f41002120410021214200212341002108410021094100210c4100210d410021014100210541002126410121254101212441012122410021144100211541002116410021174200211b41002118410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a2802002101200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c012124200328029001212520032802940121260b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2027360200200320073703582003201c3703482003201b3703e801200320183602e401200320173602e001200320163602dc01200320153602d801200320143602d401200320133602d001200320123602cc01200320113602c801200320103602c4012003200f3602c0012003200e3602bc01200320043602b8012003200d3602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320053602a0012003200236029801200320263602940120032025360290012003202436028c01200320223602880120032023370380012003202136027c200320203602782003201f3602742003201e3602702003201a36026c200320193602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c310b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002101200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d00410121084100211341002112410021114200210b4200211c4200210a4200211d410021104100211a4100211e4100211f41002120410021214100212242002123410021094100210c4100210d4100210e4100210f41002101410021064100212741012126410121254101212441002114410021154100211641002117410021184200211b41002119410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002101200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2005360200200320073703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c001200320043602bc012003200f3602b8012003200e3602b4012003200d3602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c300b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002101200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d00410121084100211341002112410021114200210b4200211d4200211c4200210a4100211a4100211e4100211f41002120410021214100212242002123410021094100210c4100210d4100210e4100210f4100211041002101410021064100212741012126410121254101212441002114410021154100211641002117410021184200211b41002119410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002101200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c200329035821072003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2005360200200320073703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320043602c001200320103602bc012003200f3602b8012003200e3602b4012003200d3602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c2f0b200141086a2903002107200341c0006a41206a2204200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2205200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f4200210a200341206a41186a22024200370300200341206a41106a22064200370300200341206a41086a2208420037030020034200370320200341c0006a41ac95c400410d10c5012008200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020062003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002005290300210b2004290300211b200341a0016a2802002101200341a4016a2802002104200341a8016a2802002105200341ac016a2802002106200341b0016a2802002108200341b4016a2802002109200341b8016a280200210c200341bc016a280200210d200341c0016a280200210e200341c4016a280200210f200341c8016a2802002110200341cc016a2802002111200341d0016a2802002112200341d4016a2802002113200341d8016a2802002114200341dc016a2802002115200341e0016a2802002116200341e4016a2802002117200341e8016a290300211c2003290348211d200329035821232003290340210a20032802682118200328026c21192003280270211a2003280274211e2003280278211f200328027c212020032903800121292003280288012121200328028c01212220032802900121242003280294012125200328029c0121260c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341c0006a41ac95c400410d10c5012004200341c0006a41086a220529000037030020032003290040370320200341c0006a41c695c400410c10c5012002200529000037030020012003290040370300200341c0006a200341206a10f502200328029c012126024020032802980122024102470d004101210441002111410021104100210f41002118410021194100211a4100211e4100211f4100212042002129410021054100210641002108410021094100210c4100210d4100210e4100210141002125410121244101212241012121420021234200211b4200211d4200210b41002112410021134100211441002115410021164200211c41002117410021020c010b200341c0006a41106a290300210b200341e0006a290300211b200341a0016a2802002101200341a4016a2802002104200341a8016a2802002105200341ac016a2802002106200341b0016a2802002108200341b4016a2802002109200341b8016a280200210c200341bc016a280200210d200341c0016a280200210e200341c4016a280200210f200341c8016a2802002110200341cc016a2802002111200341d0016a2802002112200341d4016a2802002113200341d8016a2802002114200341dc016a2802002115200341e0016a2802002116200341e4016a2802002117200341e8016a290300211c2003290348211d200329035821232003290340210a20032802682118200328026c21192003280270211a2003280274211e2003280278211f200328027c212020032903800121292003280288012121200328028c012122200328029001212420032802940121250b0240200a2007510d00200341c0006a41206a201b370300200341c0006a41106a200b3703002003419c016a2026360200200320233703582003201d3703482003201c3703e801200320173602e401200320163602e001200320153602dc01200320143602d801200320133602d401200320123602d001200320113602cc01200320103602c8012003200f3602c4012003200e3602c0012003200d3602bc012003200c3602b801200320093602b401200320083602b001200320063602ac01200320053602a801200320043602a401200320013602a0012003200236029801200320253602940120032024360290012003202236028c01200320213602880120032029370380012003202036027c2003201f3602782003201e3602742003201a3602702003201936026c2003201836026820032007370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c2e0b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002101200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c01212420032802900121252003280294012126200328029c0121270c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122024102470d004101210641002112410021114200210b4200211c4200210a4200211d410021194100211a4100211e4100211f41002120410021214200212341002108410021094100210c4100210d4100210e4100210f4100211041002101410021054100212641012125410121244101212241002113410021144100211541002116410021174200211b41002118410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002101200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c200329035821072003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c012124200328029001212520032802940121260b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a2027360200200320073703582003201c3703482003201b3703e801200320183602e401200320173602e001200320163602dc01200320153602d801200320143602d401200320133602d001200320123602cc01200320113602c801200320043602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320053602a0012003200236029801200320263602940120032025360290012003202436028c01200320223602880120032023370380012003202136027c200320203602782003201f3602742003201e3602702003201a36026c200320193602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c2d0b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002101200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c2003290358211d200329034021072003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d0041012108410021134100211a4100211e4100211f41002120410021214100212242002123410021094100210c4100210d4100210e4100210f4100211041002111410021124100210141002106410021274101212641012125410121244200211d4200210b4200211c4200210a41002114410021154100211641002117410021184200211b41002119410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002101200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c2003290358211d200329034021072003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a20053602002003201d3703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320043602c801200320123602c401200320113602c001200320103602bc012003200f3602b8012003200e3602b4012003200d3602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a36026820032007370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c2c0b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002101200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c2003290358211d200329034021232003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121072003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d0041012108410021134100210141002106410021274101212641012125410121244100211241002111410021104100210f4100210e4100210d4100210c410021094100212241002121410021204100211f4100211e4100211a420021234200211d4200210b4200211c4200210a41002114410021154100211641002117410021184200211b41002119410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002101200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c2003290358211d200329034021232003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121072003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a20053602002003201d3703582003201c3703482003201b3703e801200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320043602cc01200320133602c801200320123602c401200320113602c001200320103602bc012003200f3602b8012003200e3602b4012003200d3602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032007370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a36026820032023370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c2b0b200141106a2903002107200141086a290300210a200341c0006a41206a2204200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2205200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f4200210b200341206a41186a22024200370300200341206a41106a22064200370300200341206a41086a2208420037030020034200370320200341c0006a41ac95c400410d10c5012008200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020062003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002005290300211b2004290300211d200341a0016a2802002101200341a4016a2802002104200341a8016a2802002105200341ac016a2802002106200341b0016a2802002108200341b4016a2802002109200341b8016a280200210c200341bc016a280200210d200341c0016a280200210e200341c4016a280200210f200341c8016a2802002110200341cc016a2802002111200341d0016a2802002112200341d4016a2802002113200341d8016a2802002114200341dc016a2802002115200341e0016a2802002116200341e4016a2802002117200341e8016a29030021232003290348211c200329035821292003290340212a20032802682118200328026c21192003280270211a2003280274211e2003280278211f200328027c2120200329038001210b2003280288012121200328028c01212220032802900121242003280294012125200328029c0121260c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341c0006a41ac95c400410d10c5012004200341c0006a41086a220529000037030020032003290040370320200341c0006a41c695c400410c10c5012002200529000037030020012003290040370300200341c0006a200341206a10f502200328029c012126024020032802980122024102470d0041002125410121214101212241012124410021014101210441002111410021104100210f4100210e4100210d4100210c41002109410021084100210641002105410021204100211f4100211e4100211a4100211941002118420021294200211d4200211c4200211b4200212a41002112410021134100211441002115410021164200212341002117410021020c010b200341c0006a41106a290300211b200341e0006a290300211d200341a0016a2802002101200341a4016a2802002104200341a8016a2802002105200341ac016a2802002106200341b0016a2802002108200341b4016a2802002109200341b8016a280200210c200341bc016a280200210d200341c0016a280200210e200341c4016a280200210f200341c8016a2802002110200341cc016a2802002111200341d0016a2802002112200341d4016a2802002113200341d8016a2802002114200341dc016a2802002115200341e0016a2802002116200341e4016a2802002117200341e8016a29030021232003290348211c200329035821292003290340212a20032802682118200328026c21192003280270211a2003280274211e2003280278211f200328027c2120200329038001210b2003280288012121200328028c012122200328029001212420032802940121250b0240201c200a85201b20078584500d00200341c0006a41206a201d370300200341c0006a41106a20073703002003419c016a2026360200200320293703582003200a370348200320233703e801200320173602e401200320163602e001200320153602dc01200320143602d801200320133602d401200320123602d001200320113602cc01200320103602c8012003200f3602c4012003200e3602c0012003200d3602bc012003200c3602b801200320093602b401200320083602b001200320063602ac01200320053602a801200320043602a401200320013602a0012003200236029801200320253602940120032024360290012003202236028c0120032021360288012003200b370380012003202036027c2003201f3602782003201e3602742003201a3602702003201936026c200320183602682003202a370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c2a0b200141106a2903002107200141086a290300210a200341c0006a41206a2204200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2205200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f4200210b200341206a41186a22024200370300200341206a41106a22064200370300200341206a41086a2208420037030020034200370320200341c0006a41ac95c400410d10c5012008200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020062003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002005290300211d2004290300211b200341a0016a2802002104200341a4016a2802002105200341a8016a2802002106200341ac016a2802002108200341b0016a2802002109200341b4016a280200210c200341b8016a280200210d200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a2903002123200329034821292003290358211c2003290340212a20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c2121200329038001210b2003280288012122200328028c01212420032802900121252003280294012126200328029c0121010c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341c0006a41ac95c400410d10c5012004200341c0006a41086a220529000037030020032003290040370320200341c0006a41c695c400410c10c5012002200529000037030020012003290040370300200341c0006a200341206a10f502200328029c012101024020032802980122024102470d004100212641012122410121244101212541002104410121054100211241002111410021104100210f4100210e4100210d4100210c41002109410021084100210641002121410021204100211f4100211e4100211a410021194200211c4200211b420021294200211d4200212a41002113410021144100211541002116410021174200212341002118410021020c010b200341c0006a41106a290300211d200341e0006a290300211b200341a0016a2802002104200341a4016a2802002105200341a8016a2802002106200341ac016a2802002108200341b0016a2802002109200341b4016a280200210c200341b8016a280200210d200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a2903002123200329034821292003290358211c2003290340212a20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c2121200329038001210b2003280288012122200328028c012124200328029001212520032802940121260b0240201c200a85201b20078584500d00200341c0006a41206a2007370300200341c0006a41106a201d3703002003419c016a20013602002003200a37035820032029370348200320233703e801200320183602e401200320173602e001200320163602dc01200320153602d801200320143602d401200320133602d001200320123602cc01200320113602c801200320103602c4012003200f3602c0012003200e3602bc012003200d3602b8012003200c3602b401200320093602b001200320083602ac01200320063602a801200320053602a401200320043602a0012003200236029801200320263602940120032025360290012003202436028c0120032022360288012003200b370380012003202136027c200320203602782003201f3602742003201e3602702003201a36026c200320193602682003202a370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c290b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002101200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c2003290358211d2003290340212320032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121072003280288012122200328028c01212420032802900121252003280294012126200328029c0121270c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122024102470d0041002126410121224101212441012125410021054101210641002101410021134100211241002111410021104100210f4100210e4100210d4100210c410021094100210841002121410021204100211f4100211e4100211a410021194200211d4200210b4200211c4200210a42002123410021144100211541002116410021174200211b41002118410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002101200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c2003290358211d2003290340212320032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121072003280288012122200328028c012124200328029001212520032802940121260b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a20273602002003201d3703582003201c3703482003201b3703e801200320183602e401200320173602e001200320163602dc01200320153602d801200320143602d401200320043602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320053602a0012003200236029801200320263602940120032025360290012003202436028c01200320223602880120032007370380012003202136027c200320203602782003201f3602742003201e3602702003201a36026c2003201936026820032023370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c280b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002101200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c2003290358211d2003290340212320032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121072003280288012122200328028c01212420032802900121252003280294012126200328029c0121270c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122024102470d004100212641012122410121244101212541002105410121064100210141002114410021134100211241002111410021104100210f4100210e4100210d4100210c410021094100210841002121410021204100211f4100211e4100211a410021194200211d4200210b4200211c4200210a420021234100211541002116410021174200211b41002118410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002101200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c2003290358211d2003290340212320032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121072003280288012122200328028c012124200328029001212520032802940121260b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a20273602002003201d3703582003201c3703482003201b3703e801200320183602e401200320173602e001200320163602dc01200320153602d801200320043602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320053602a0012003200236029801200320263602940120032025360290012003202436028c01200320223602880120032007370380012003202136027c200320203602782003201f3602742003201e3602702003201a36026c2003201936026820032023370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c270b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002101200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c2003290358211d2003290340212320032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121072003280288012122200328028c01212420032802900121252003280294012126200328029c0121270c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122024102470d00410021264101212241012124410121254100210541012106410021014100211541002114410021134100211241002111410021104100210f4100210e4100210d4100210c410021094100210841002121410021204100211f4100211e4100211a410021194200211d4200210b4200211c4200210a4200212341002116410021174200211b41002118410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002101200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a290300211b2003290348211c2003290358211d2003290340212320032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121072003280288012122200328028c012124200328029001212520032802940121260b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a20273602002003201d3703582003201c3703482003201b3703e801200320183602e401200320173602e001200320163602dc01200320043602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320053602a0012003200236029801200320263602940120032025360290012003202436028c01200320223602880120032007370380012003202136027c200320203602782003201f3602742003201e3602702003201a36026c2003201936026820032023370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c260b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002101200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c2003290358211d200329034021232003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121072003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d004100212741012124410121254101212641002106410121084100210141002117410021164100211541002114410021134100211241002111410021104100210f4100210e4100210d4100210c410021094100212241002121410021204100211f4100211e4100211a4200211d4200210b4200211c4200210a42002123410021184200211b41002119410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002101200341e0016a2802002118200341e4016a2802002119200341e8016a290300211b2003290348211c2003290358211d200329034021232003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121072003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a20053602002003201d3703582003201c3703482003201b3703e801200320193602e401200320183602e001200320043602dc01200320173602d801200320163602d401200320153602d001200320143602cc01200320133602c801200320123602c401200320113602c001200320103602bc012003200f3602b8012003200e3602b4012003200d3602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032007370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a36026820032023370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c250b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002101200341e4016a2802002118200341e8016a290300211b2003290348211c2003290358211d2003290340212320032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121072003280288012122200328028c01212420032802900121252003280294012126200328029c0121270c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122024102470d004100212641012122410121244101212541002105410121064100210141002117410021164100211541002114410021134100211241002111410021104100210f4100210e4100210d4100210c410021094100210841002121410021204100211f4100211e4100211a410021194200211d4200210b4200211c4200210a420021234200211b41002118410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002101200341e4016a2802002118200341e8016a290300211b2003290348211c2003290358211d2003290340212320032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121072003280288012122200328028c012124200328029001212520032802940121260b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a20273602002003201d3703582003201c3703482003201b3703e801200320183602e401200320043602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320053602a0012003200236029801200320263602940120032025360290012003202436028c01200320223602880120032007370380012003202136027c200320203602782003201f3602742003201e3602702003201a36026c2003201936026820032023370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c240b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a2802002101200341e8016a29030021072003290348211b2003290358211c2003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121050c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012105024020032802980122024102470d0041002127410121244101212541012126410021064101210841002101410021194100211841002117410021164100211541002114410021134100211241002111410021104100210f4100210e4100210d4100210c41002109420021234100212241002121410021204100211f4100211e4100211a4200211c4200210b4200211b4200210a4200211d410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002106200341a4016a2802002108200341a8016a2802002109200341ac016a280200210c200341b0016a280200210d200341b4016a280200210e200341b8016a280200210f200341bc016a2802002110200341c0016a2802002111200341c4016a2802002112200341c8016a2802002113200341cc016a2802002114200341d0016a2802002115200341d4016a2802002116200341d8016a2802002117200341dc016a2802002118200341e0016a2802002119200341e4016a2802002101200341e8016a29030021072003290348211b2003290358211c2003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020012004460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a20053602002003201c3703582003201b370348200320073703e801200320043602e401200320193602e001200320183602dc01200320173602d801200320163602d401200320153602d001200320143602cc01200320133602c801200320123602c401200320113602c001200320103602bc012003200f3602b8012003200e3602b4012003200d3602b0012003200c3602ac01200320093602a801200320083602a401200320063602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d370340200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c230b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a29030021072003290348211b2003290358211c2003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c01212520032802900121262003280294012127200328029c0121010c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012101024020032802980122024102470d00410021274101212441012125410121264100210541012106410021194100211841002117410021164100211541002114410021134100211241002111410021104100210f4100210e4100210d4100210c4100210941002108420021234100212241002121410021204100211f4100211e4100211a4200211c4200210b4200211b4200210a4200211d410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002105200341a4016a2802002106200341a8016a2802002108200341ac016a2802002109200341b0016a280200210c200341b4016a280200210d200341b8016a280200210e200341bc016a280200210f200341c0016a2802002110200341c4016a2802002111200341c8016a2802002112200341cc016a2802002113200341d0016a2802002114200341d4016a2802002115200341d8016a2802002116200341dc016a2802002117200341e0016a2802002118200341e4016a2802002119200341e8016a29030021072003290348211b2003290358211c2003290340211d2003280268211a200328026c211e2003280270211f2003280274212020032802782121200328027c212220032903800121232003280288012124200328028c012125200328029001212620032802940121270b024020042007a7460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a20013602002003201c3703582003201b370348200320193602e401200320183602e001200320173602dc01200320163602d801200320153602d401200320143602d001200320133602cc01200320123602c801200320113602c401200320103602c0012003200f3602bc012003200e3602b8012003200d3602b4012003200c3602b001200320093602ac01200320083602a801200320063602a401200320053602a0012003200236029801200320273602940120032026360290012003202536028c01200320243602880120032023370380012003202236027c20032021360278200320203602742003201f3602702003201e36026c2003201a3602682003201d37034020032007428080808070832004ad843703e801200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b2000420037030820002003280003360019200041186a41003a00002000411c6a200341066a280000360000200042003703000c220b20012802042104200341c0006a41206a2205200241206a290200370300200341c0006a41186a200241186a290200370300200341c0006a41106a2206200241106a290200370300200341c0006a41086a2201200241086a29020037030020032002290200370340200341c0006a10da020d1f42002107200341206a41186a22024200370300200341206a41106a22084200370300200341206a41086a2209420037030020034200370320200341c0006a41ac95c400410d10c5012009200129000037030020032003290040370320200341c0006a41b995c400410d10c5012002200129000037030020082003290040370300200341c0006a200341206a10f5020240024020032802980122024102460d002006290300210a2005290300210b200341a0016a2802002101200341a4016a2802002105200341a8016a2802002106200341ac016a2802002108200341b0016a2802002109200341b4016a280200210c200341b8016a280200210d200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a29030021072003290348211b2003290358211c2003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c01212420032802900121252003280294012126200328029c0121270c010b200341386a22024200370300200341206a41106a22014200370300200341206a41086a2205420037030020034200370320200341c0006a41ac95c400410d10c5012005200341c0006a41086a220629000037030020032003290040370320200341c0006a41c695c400410c10c5012002200629000037030020012003290040370300200341c0006a200341206a10f502200328029c012127024020032802980122024102470d004100212641012122410121244101212541002101410121054100211841002117410021164100211541002114410021134100211241002111410021104100210f4100210e4100210d4100210c4100210941002108410021064200212341002121410021204100211f4100211e4100211a410021194200211c4200210b4200211b4200210a4200211d410021020c010b200341c0006a41106a290300210a200341e0006a290300210b200341a0016a2802002101200341a4016a2802002105200341a8016a2802002106200341ac016a2802002108200341b0016a2802002109200341b4016a280200210c200341b8016a280200210d200341bc016a280200210e200341c0016a280200210f200341c4016a2802002110200341c8016a2802002111200341cc016a2802002112200341d0016a2802002113200341d4016a2802002114200341d8016a2802002115200341dc016a2802002116200341e0016a2802002117200341e4016a2802002118200341e8016a29030021072003290348211b2003290358211c2003290340211d20032802682119200328026c211a2003280270211e2003280274211f20032802782120200328027c212120032903800121232003280288012122200328028c012124200328029001212520032802940121260b024020042007422088a7460d00200341c0006a41206a200b370300200341c0006a41106a200a3703002003419c016a20273602002003201c3703582003201b370348200320183602e401200320173602e001200320163602dc01200320153602d801200320143602d401200320133602d001200320123602cc01200320113602c801200320103602c4012003200f3602c0012003200e3602bc012003200d3602b8012003200c3602b401200320093602b001200320083602ac01200320063602a801200320053602a401200320013602a0012003200236029801200320263602940120032025360290012003202436028c01200320223602880120032023370380012003202136027c200320203602782003201f3602742003201e3602702003201a36026c200320193602682003201d3703402003200742ffffffff0f832004ad422086843703e801200341386a22024200370300200341206a41106a22014200370300200341206a41086a2204420037030020034200370320200341106a41ac95c400410d10c5012004200341106a41086a220529000037030020032003290010370320200341106a41b995c400410d10c50120022005290000370300200120032900103703002003410036021820034201370310200341c0006a200341106a10d506200341206a41202003280210200328021810a7022003280214450d002003280210102c0b420021072000420037030820002003280040360019200041186a41003a00002000411c6a200341c3006a2800003600000c200b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c200b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c1f0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c1e0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c1d0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c1c0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c1b0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c1a0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c190b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c180b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c170b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c160b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c150b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c140b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c130b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c120b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c110b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c100b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0f0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0e0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0d0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0c0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0b0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0a0b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c090b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c080b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c070b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c060b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c050b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c040b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c030b2003410a6a41026a2003410d6a41026a2d000022023a0000200320032f000d22013b010a200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c020b200341c0006a41026a200341036a41026a2d000022023a0000200320032f000322013b0140200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000420121070b200020073703000b200341f0016a24000ba3a70108077f017e087f017e0d7f017e147f0a7e230022042105200441c00b6b4160712204240020044180096a41206a200141206a29020037030020044180096a41186a2206200141186a29020037030020044180096a41106a2207200141106a29020037030020044180096a41086a2208200141086a2902003703002004200129020037038009024002400240024002400240024020044180096a10cc020d00200642003703002007420037030020084200370300200442003703800920044180056a419ee3c300411510c501200820044180056a41086a220129000037030020042004290080053703800920044180056a418ce4c300410810c5012006200129000037030020072004290080053703000240024020044180096a412010ce020d0020044180056a41086a2201200241086a280200360200200420022902003703800520044180096a20044180056a109e0620044180096a41086a280200210920044180096a410c6a280200210a20042802840921072004280280094101470d0120002007360200200041086a200a360200200041046a2009360200200310c202200524000f0b20004183223b0100200041086a4119360200200041046a41e0e0c300360200200041026a41003a00000c020b4200210b20044180056a41186a2206420037030020044180056a41106a220c4200370300200142003703002004420037038005200441e8006a41c1dcc700410610c5012001200441e8006a41086a22022900003703002004200429006837038005200441c8046a4196a4c600410610c5012006200441c8046a41086a2208290000370300200c20042900c804370300200441c0006a20044180056a412010c6012004280244210d2004280240210e20064200370300200c4200370300200142003703002004420037038005200441e8006a41ac95c400410d10c501200120022900003703002004200429006837038005200441c8046a41c695c400410c10c50120062008290000370300200c20042900c80437030020044180096a20044180056a10f50220042802d809210f200441e0026a41086a20044180096a41106a290300370300200441e0026a41106a220820044180096a41186a290300370300200441e0026a41186a221020044180096a41206a290300370300200441e0026a41206a221120044180096a41286a290300370300200441e0026a41286a221220044180096a41306a290300370300200441e0026a41306a2213200441b8096a29030037030020042004290388093703e0022004290380092114200441e4096a2802002115200441e0096a280200211620042802dc09211720042802d409211820042802d009210120042802cc09210620042802c809210220042802c409211920042802c009211a20044180056a200441e8096a41c80010c9081a02400240200f4102470d00200441f8006a41306a4200370300200441f8006a41286a4200370300200441f8006a41206a4200370300200441f8006a41186a4200370300200441f8006a41106a420037030020044180016a42003703002004420037037820044198076a410041c80010cb081a41012115410021194100211a41002116410021184101210141012106410121024100210f0c010b200441f8006a41306a2013290300370300200441f8006a41286a2012290300370300200441f8006a41206a2011290300370300200441f8006a41186a2010290300370300200441f8006a41106a2008290300370300200441f8006a41086a200441e0026a41086a290300370300200420042903e00237037820044198076a20044180056a41c80010c9081a2014210b0b20044198096a2210420037030020044190096a221b420037030020044180096a41086a220842003703002004420037038009200441d8006a41bee8c700410d10c5012008200441d8006a41086a22112900003703002004200429005837038009200441e8006a41c4efc700411110c5012010200441e8006a41086a2212290000370300201b2004290068370300200441386a20044180096a412010c60102402002450d00200428023c21132004280238211c20104200370300201b4200370300200842003703002004420037038009200441d8006a41bee8c700410d10c501200820112900003703002004200429005837038009200441e8006a4188eec700411110c501201b41086a2012290000370000201b20042900683700004100211120044180056a20044180096a10eb04200429028405420020042802800522081b21142008410420081b21120240024002404100200d4100200e1b220820134100201c1b6b2210201020084b1b200270221020062001200620014b1b4f0d0020044180056a41086a220d200441f8006a41086a29030037030020044180056a41106a220e200441f8006a41106a29030037030020044180056a41186a2213200441f8006a41186a29030037030020044180056a41206a221c200441f8006a41206a29030037030020044180056a41286a221d200441f8006a41286a29030037030020044180056a41306a221e200441f8006a41306a290300370300200420042903783703800520044180096a20044198076a41c80010c9081a41c801103222110d010c0a0b2014a72201450d012001412c6c450d012012102c0c010b2011200b370300201120042903800537030820112015360264201120163602602011201736025c2011200f36025820112018360254201120013602502011200636024c20112002360248201120193602442011201a360240201141106a200d290300370300201141186a200e290300370300201141206a2013290300370300201141286a201c290300370300201141306a201d290300370300201141386a201e290300370300201141e8006a20044180096a41c80010c9081a201120083602c001201120103602bc01201120143702b401201120123602b0010b024020110d004100210620044100360250200442043703484104211f41002120410021210c050b200441003602900720044204370388072004410036025020044204370348200441d8006a41968dc700410d10c501200441e8006a41a38dc700411310c501412010322201450d072004422037028405200420013602800520044180056a4100411010c80120042802800520042802880522016a22062004290058370000200641086a200441d8006a41086a2900003700002004200141106a22013602880520044180056a2001411010c801200428028005220220042802880522016a22062004290068370000200641086a200441e8006a41086a2900003700002004200141106a2206360288052006417f4c0d050240024020060d00410121080c010b200610322208450d080b4100210120044100360288092004200636028409200420083602800920044180096a4100200610c80120042802800920042802880922086a2002200610c9081a20044194096a20044180056a41086a2202280200360200200441003a009c09200441163602980920044198076a41186a220f200429039809370300200420042903800537028c0920044198076a41106a20044180096a41106a290300220b3703002004200820066a3602880920044198076a41086a2004290388092214370300200420042903800922223703980720044180056a41106a200b3703002002201437030020044180056a41186a200f290300370300200420223703800520044180096a20044180056a10b901024020042802ec0a2202450d00410421154104211641002106034020042802800b210f20042802f80a210820042802f40a2110200428028009210d02402011200428028409220e20042802880b10a006450d0002402006200428028c07470d0020044188076a200610d204200428029007210620042802880721160b201620064102746a200d3602002004200641016a22063602900702402001200428024c470d00200441c8006a2001410110950220042802502101200428024821150b201520014102746a200e3602002004200141016a22013602500b02402010450d002002450d002002102c0b0240200f450d002008450d002008102c0b20044180096a20044180056a10b90120042802ec0a22020d000b0b0240200428028405450d00200428028005102c0b024020044190056a280200450d00200428028c05102c0b2004280288072123200428028c0721242004280290072201450d03202320014102746a21252004418c0b6a212620044180096a41086a2127200441ec046a212820044198076a4104722129200441c8046a412c6a212a20044180096a412c6a211a200441e0026a41046a211220044198076a41086a211320044180056a41e4016a211c20232108034020082802002102200441e8006a41968dc700410d10c501200441c8046a41a38dc700411310c501200420023602e00220044198076a200441e0026a410410c7012004201236028c0920042013360284092004200441e0026a36028809200420044198076a3602800920044180056a20044180096a107e200428028805220141206a2206417f4c0d060240024020060d004101210f0c010b20061032220f450d090b200441003602a0072004200636029c072004200f3602980720044198076a4100411010c80120042802980720042802a00722066a220f2004290068370000200f41086a200441e8006a41086a220f2900003700002004200641106a22063602a00720044198076a2006411010c80120042802980720042802a00722066a221020042900c804370000201041086a200441c8046a41086a22172900003700002004200641106a22063602a007200428028005211020044198076a2006200110c801200428029807220620042802a007221d6a2010200110c9081a2004201d20016a22013602a0070240200428028405450d002010102c0b20044180096a2006200110f3040240024020042802e80a22100d004101211d0c010b2006200110b40120042802f00a212b20042802f40a212c20042802fc0a212d200441f8006a20044180096a41e80110c9081a4100211d0b0240200428029c07450d002006102c0b200441e8006a41968dc700410d10c501200441c8046a41bc92c700411e10c501200420023602e00220044198076a200441e0026a410410c7012004201236028c0920042013360284092004200441e0026a36028809200420044198076a3602800920044180056a20044180096a107e200428028805220141206a2206417f4c0d060240024020060d00410121020c010b200610322202450d090b200441003602a0072004200636029c07200420023602980720044198076a4100411010c80120042802980720042802a00722066a22022004290068370000200241086a200f2900003700002004200641106a22063602a00720044198076a2006411010c80120042802980720042802a00722066a220220042900c804370000200241086a20172900003700002004200641106a22063602a007200428028005210220044198076a2006200110c801200428029807220620042802a00722176a2002200110c9081a2004201720016a22013602a0070240200428028405450d002002102c0b20044180096a2006200110ee0402402004280280092202450d002006200110b4010b20042802a809210120042802a409211720042802a009212e200428029c09212f200428029809213020042802940921312004280290092132200428028c0921332004280288092134200428028409211f20044180056a41086a2220201a41086a2802003602002004201a290200370380050240024020020d00410021020c010b200441d8006a41086a202028020036020020042004290380053703582001213520172121202e2136202f211e20302118203121152032210e2033211920342116201f210d0b0240200428029c07450d002006102c0b200841046a2108200441e0026a200441f8006a41e80110c9081a200f200441d8006a41086a2802003602002004200429035837036802400240201d200245720d0020044198076a200441e0026a41e80110c9081a202a2004290368370200202a41086a200f280200360200200420353602f004200420213602ec04200420363602e8042004201e3602e404200420183602e004200420153602dc042004200e3602d804200420193602d404200420163602d0042004200d3602cc04200420023602c80420044180056a202941e40110c9081a20044180096a200441c8046a109901201c41186a20044180096a41186a290300370000201c41106a20044180096a41106a290300370000201c41086a2027290300370000201c200429038009370000200442888080802037038009202720044180056a41840210c9081a202641086a202841086a2802003602002026202829020037020020044180096a10c80202402016450d002016410c6c21062002210103400240200141046a280200450d002001280200102c0b2001410c6a2101200641746a22060d000b0b0240200d450d00200d410c6c450d002002102c0b02402015450d0020154104742106201941046a210103400240200141046a280200450d002001280200102c0b200141106a2101200641706a22060d000b0b0240200e450d00200e41ffffffff0071450d002019102c0b02402018450d00201e450d002018102c0b0240202b450d002010450d002010102c0b202d450d01202c450d01202c102c0c010b024002402010450d000240202b450d002010102c0b202d450d00202c450d00202c102c20020d010c020b2002450d010b02402016450d002016410c6c21062002210103400240200141046a280200450d002001280200102c0b2001410c6a2101200641746a22060d000b0b0240200d450d00200d410c6c450d002002102c0b02402015450d0020154104742106201941046a210103400240200141046a280200450d002001280200102c0b200141106a2101200641706a22060d000b0b0240200e450d002019450d00200e41ffffffff0071450d002019102c0b02402018450d00201e450d002018102c0b2035450d002021450d002021102c0b20082025470d000c040b0b41c0fac700413941a0fcc700103c000b200041023a00000b200310c202024020022802082201450d0020022802002204200141d0006c6a21060340200441046a410036020020042802002101200441013602000240200441086a280200450d002001102c0b200441d0006a22042006470d000b0b20022802042204450d03200441d0006c450d032002280200102c200524000f0b0240202441ffffffff0371450d002023102c0b201110a1062011102c4101212120042802502106200428024c21202004280248211f0b20044180096a41186a2213420037030020044180096a41106a221c420037030020044180096a41086a221a42003703002004420037038009200441d8006a41bee8c700410d10c501201a200441d8006a41086a221d2900003703002004200429005837038009200441e8006a4188eec700411110c501201b41086a221e200441e8006a41086a2217290000370000201b200429006837000020044180056a20044180096a10eb042004280280052101200429028405210b20044180056a41186a420037030020044180056a41106a420037030020044180056a41086a220242003703002004420037038005200441e8006a41ac95c400410d10c501200220172900003703002004200429006837038005200441c8046a41c695c400410c10c501200c41086a200441c8046a41086a290000370000200c20042900c80437000020044180096a20044180056a10f50220042802d8092102200441e0026a41086a222e201c290300370300200441e0026a41106a222f2013290300370300200441e0026a41186a20044180096a41206a290300370300200441e0026a41206a20044180096a41286a290300370300200441e0026a41286a20044180096a41306a290300370300200441e0026a41306a200441b8096a29030037030020042004290388093703e00220042802c009210820044180056a200441e8096a41c80010c9081a200b420020011b2237422088a7210d4100200820024102461b2134200941ffffffff0371212c201f20064102746a21182007200a4102746a21162001410420011b211920044180096a410472213020044180056a410872211220072106201f21010340024002402007450d00024020062016460d00410121102001210820062102200641046a220f21060c020b202c450d002007102c0b024020012018460d00410021072006210f4100211020012102200141046a220821010c010b0240202041ffffffff0371450d00201f102c0b20044180056a41186a420037030020044180056a41106a420037030020044180056a41086a220142003703002004420037038005200441e8006a41f1ddc700410510c5012001200441e8006a41086a22062900003703002004200429006837038005200441c8046a41c4fec000410a10c501200c41086a200441c8046a41086a290000370000200c20042900c80437000020044180096a20044180056a412010b9032004280280092102200429028409210b20044180096a41186a420037030020044180096a41106a420037030020044180096a41086a220142003703002004420037038009200441d8006a41bee8c700410d10c5012001200441d8006a41086a2900003703002004200429005837038009200441e8006a41fcefc700410910c501201b41086a2006290000370000201b200429006837000020044180056a20044180096a10f9040240024020042802800522070d0041002118200441003602800120044204370378410421074100211a4104210e0c010b2004200429028405221437027c200420073602782014422088a7211a2014a721182007210e0b20044180096a41186a2208420037030020044180096a41106a220f420037030020044180096a41086a220142003703002004420037038009200441d8006a41bee8c700410d10c5012001200441d8006a41086a22102900003703002004200429005837038009200441e8006a41b4edc700410f10c501201b41086a2215200441e8006a41086a2206290000370000201b200429006837000020044180056a20044180096a10f5044104211c410021174100211d4100212c02402004280280052216450d0020044180056a41086a280200211d2004418c056a280200212c20042802840521172016211c0b20044180056a41186a420037030020044180056a41106a420037030020044180056a41086a221642003703002004420037038005200441e8006a41c1dcc700410610c501201620062900003703002004200429006837038005200441c8046a4196a4c600410610c501200c41086a200441c8046a41086a290000370000200c20042900c804370000200441306a20044180056a412010c601200428023421162004280230211220084200370300200f4200370300200142003703002004420037038009200441d8006a41bee8c700410d10c501200120102900003703002004200429005837038009200441e8006a41dcecc700410f10c50120152006290000370000201b200429006837000020044180056a20044180096a10e9042004280280052201410420011b210f0240200429028405420020011b2214422088a72208450d002008410c6c2106200f210103400240200141046a28020041ffffffff0371450d002001280200102c0b2001410c6a2101200641746a22060d000b0b02402014a72201450d002001410c6c450d00200f102c0b200b420020021b21382002410420021b212e024002402008450d002016410020121b2132200441003602e802200442043703e002201c41286a212f202e417c6a21312019200d412c6c6a210f200e201a41346c6a21152038422088a7211e200441a0056a2134410021134104213041002110410021164100211220192101024003402012417f6a2106203120124102746a21020340200f2001460d02200241046a2102200641016a2106200128020021072001412c6a220d210120074102470d000b200641016a2112201021072016210102400340024002402001450d0020072110200121160c010b4100200e200e20154622011b21082007200e2015476a2110410121162015200e41346a20011b210e2007211a0b024020080d0020042802800121330c020b4100210120102107200828020022182006490d000b200d2101201a213320182006460d010b024002400240024002402006201e490d00201d450d03201d410274417c6a41027641016a2107410021014100210202400340201e202f20016a2802006a2006460d012001412c6a21012007200241016a2202470d000c050b0b201c20016a2218280200210220044180096a41186a22132018411c6a29020037030020044180096a41106a2230201841146a29020037030020044180096a41086a221f2018410c6a2902003703002004201841046a29020037038009201841246a280200210720182018412c6a201d412c6c20016b41546a10ca081a20044198076a41186a2013290300220b37030020044198076a41106a2030290300221437030020044198076a41086a201f29030022223703002004200429038009223937039807201f2022370300203020143703002013200b3703002004203937038009200441286a2006203210e10520042802280d0141f9fac70041de0041d8fbc700105c000b20022802002102200441206a2006203210e1052004280220450d032004280224211820044180056a411f6a20044180096a411f6a28000036000020044180056a41186a20044180096a41186a29000037030020044180056a41106a20044180096a41106a29000037030020044180056a41086a20044180096a41086a2900003703002004200429008009370380054100211f0c010b200428022c211820044180056a41186a201329030037030020044180056a41106a203029030037030020044180056a41086a201f290300370300200441e8006a41026a200441c8046a41026a2d000022013a0000200420042903800937038005200420042f00c80422133b0168203441026a20013a0000203420133b0000201d417f6a211d4101211f20042802e80221130b20044180096a411f6a222020044180056a411f6a28000036000020044180096a41186a222d20044180056a41186a29030037030020044180096a41106a222b20044180056a41106a29030037030020044180096a41086a223520044180056a41086a2903003703002004200429038005370380090240201320042802e402470d00200441e0026a10a20620042802e80221130b20042802e0022230201341386c6a22012006360204200120333602002001410c6a201f3a0000200141086a20023602002001410d6a200429038009370000200141156a20352903003700002001411d6a202b290300370000200141256a202d2903003700002001412c6a2020280000360000200141346a2018360200200141306a20073602002004201341016a22133602e8020b200d21010c010b0b41f9fac70041de0041e8fbc700105c000b20042802e402211e0240024002402013450d002030201341386c6a21134100211541002116203021010340200141046a290200210b2001410c6a2d0000210e2001280200211820044180056a41276a200141346a220628000036000020044180056a41206a2001412d6a220229000037030020044180056a41186a200141256a221029000037030020044180056a41106a2001411d6a220d29000037030020044180056a41086a200141156a221a29000037030020042001410d6a22122900003703800520044180096a41276a2207200628000036000020044180096a41206a2208200229000037030020044180096a41186a220f201029000037030020044180096a41106a2210200d29000037030020044180096a41086a220d201a2900003703002004201229000037038009200e4102460d0220044198076a41276a2206200728000036000020044198076a41206a2202200829030037030020044198076a41186a200f290300221437030020044198076a41106a2010290300222237030020044198076a41086a200d29030022393703002004200429038009223a370398072007200628000036000020082002290300370300200f201437030020102022370300200d20393703002004203a370380092004280280012202201620186a2206490d0302402002200428027c470d00200441f8006a20021083040b201641016a21162004280278200641346c6a220641346a20062015200220186b6a41346c10ca081a2006200e3a00082006200b370200200641096a200429038009370000200641116a200d290300370000200641196a2010290300370000200641216a200f290300370000200641296a2008290300370000200641306a20072800003600002004200241016a360280012015417f6a2115200141386a22012013470d000b0b20044180096a41276a20044180056a41276a28000036000020044180096a41206a20044180056a41206a29030037030020044180096a41186a20044180056a41186a29030037030020044180096a41106a20044180056a41106a29030037030020044180096a41086a20044180056a41086a2903003703002004200429038005370380090b0240201e450d00201e41386c450d002030102c0b20044180096a41086a200441f8006a41086a280200360200200420042903783703800920044180096a10a3062004202c36028c092004201d3602880920042017360284092004201c3602800920044180096a10a4062004203737028409200420193602800920044180096a10a506203842ffffffff0383500d02202e102c0c020b200620021044000b02402017450d002017412c6c450d00201c102c0b02402018450d00201841346c450d002007102c0b0240203842ffffffff0383500d00202e102c0b2037a72201450d002001412c6c450d002019102c0b20044198076a41086a200341086a280200360200200420032902003703980720044198056a420037030020044190056a420037030020044180056a41086a220142003703002004420037038005200441e8006a41bee8c700410d10c5012001200441e8006a41086a2900003703002004200429006837038005200441c8046a41fcefc700410910c501200c41086a200441c8046a41086a290000370000200c20042900c80437000020044180096a20044180056a10f9040240024020042802800922010d00200441003602880520044204370380050c010b20042004290284093702840520042001360280050b20044180096a20044198076a20044180056a10a60620044180096a41086a280200212e2004418c096a2802002101200428028409212c024002400240024002400240024002402004280280094101460d002001450d0620044180056a41186a2216420037030020044180056a41106a2218420037030020044180056a41086a220e42003703002004420037038005200441e8006a41bee8c700410d10c501200e200441e8006a41086a22192900003703002004200429006837038005200441c8046a4188eec700411110c501200c41086a221a200441c8046a41086a2212290000370000200c20042900c80437000020044180096a20044180056a10eb042004280280092106200429028409210b2016420037030020184200370300200e42003703002004420037038005200441e8006a41bee8c700410d10c501200e20192900003703002004200429006837038005200441c8046a41fcefc700410910c501201a2012290000370000200c20042900c804370000200b420020061b211420044180096a20044180056a10f9042006410420061b21132004280280092206410420061b2115200429028409420020061b2222422088a72207450d05202c20014102746a210d2007417f6a21172015412c6a211c2014422088a72132410021084202210b202c210f410021060340201c200641346c6a210220062101034020072001460d040240200ba722064102470d0002400240200f200d470d0041002106200d210f0c010b200f280200211041012106200f41046a210f0b2010ad4220862006ad84210b0b02400240024020064101470d00200241546a2210280200200b422088a72206470d000240200ba74102470d00200d200f41046a200f200d461b210f0b4101211d02402002415c6a2d00004101470d00200241586a28020021302002280200213120044180096a41186a2002415d6a220641186a29000037030020044180096a41106a200641106a29000037030020044180096a41086a200641086a2900003703002004200629000037038009201028020021064100211d0b200620324f0d0820132006412c6c6a220620303602042006201d360200200641086a200429038009370200200641106a20044180096a41086a290300370200200641186a20044180096a41106a290300370200200641206a20044180096a41186a290300370200200641286a2031360200200841016a21084202210b0c010b2008450d01200120086b220620074f0d0520022008414c6c6a220641746a29020021392006416c6a290200213a200641646a29020021382006415c6a2902002137200641546a2210290200213b200e200641046a221d28020036020020042006417c6a29020037038005200241546a220641286a290200213c200641206a290200213d200641186a290200213e200641106a290200213f200641086a2902002140200241046a221e280200212f20102006290200370200201d202f360200201041086a2040370200201041106a203f370200201041186a203e370200201041206a203d370200201041286a203c3702002006203b3702002002415c6a2037370200200241646a20383702002002416c6a203a370200200241746a2039370200201e200e2802003602002002417c6a2004290380053702000b200141016a210620172001460d070c020b200241346a2102410021082007200141016a2201470d000c070b0b0b2000202c360200200041086a2001360200200041046a202e3602002021201145720d0a0c060b2006200741e48ac500103f000b2007200741f48ac500103f000b2006203241848bc500103f000b2008417f6a20074f0d00202242ffffffff0f832122200720086b21070b2016420037030020184200370300200e42003703002004420037038005200441e8006a41bee8c700410d10c501200e20192900003703002004200429006837038005200441c8046a41fcefc700410910c501201a2012290000370000200c20042900c80437000020044180096a2015200710a70620044180056a4120200428028009220120042802880910a7020240200428028409450d002001102c0b02402022a72201450d00200141346c450d002015102c0b2004201437028409200420133602800920044180096a10a5060b20044180056a41186a420037030020044180056a41106a420037030020044180056a41086a220142003703002004420037038005200441e8006a41ac95c400410d10c5012001200441e8006a41086a22072900003703002004200429006837038005200441c8046a41c695c400410c10c501200c41086a200441c8046a41086a290000370000200c20042900c80437000020044180096a20044180056a10f50220042802d809210f200441e0026a41086a20044180096a41106a2217290300370300200441e0026a41106a20044180096a41186a2201290300370300200441e0026a41186a20044180096a41206a290300370300200441e0026a41206a20044180096a41286a290300370300200441e0026a41286a20044180096a41306a290300370300200441e0026a41306a200441b8096a29030037030020042004290388093703e002200429038009211420044180056a200441e8096a41c80010c9081a200142003703002017420037030020044180096a41086a220642003703002004420037038009200441d8006a4184dec700410310c5012006200441d8006a41086a22082900003703002004200429005837038009200441e8006a41fc95c600410d10c501200120072900003703002017200429006837030020044180056a20044180096a412010b9032004280280052102200429028405210b2001420037030020174200370300200642003703002004420037038009200441d8006a4184dec700410310c501200620082900003703002004200429005837038009200441e8006a41c496c600411a10c5012001200729000037030020172004290068370300200441186a20044180096a412010c601200b420020021b210b2002410420021b21190240024020042802180d00200b422088a72134410021330c010b200428021c2108410021334100210102400240200b422088a722340e020201000b4100210120342106034020012006410176220220016a22072008201920074102746a280200491b2101200620026b220641014b0d000b0b200141002008201920014102746a280200461b21330b02400240203320344f0d00200f41024620145072211c200441e0026a41046a210a20044198076a41086a213220044180056a41086a211d200441a8056a2109410021084100211f20342116203321150340201c0d01201920154102746a2213280200210e024020080d0041bc0210322208450d094100210d20084100360200200841046a20044180096a41b60210c9081a200841003b01ba020b20082102200d211802400340200241186a210720022f01ba02211041002101200241046a221a21060240034020102001460d012006280200210f200641046a2106200741186a2107200141016a21010240417f200f200e47200f200e4b1b41016a0e03000401000b0b2001417f6a21100b02402018450d002018417f6a2118200220104102746a41bc026a28020021020c010b0b200441e8006a4184dec700410310c501200441c8046a418894c600411310c5012004200e3602e00220044198076a200441e0026a410410c7012004200a36028c0920042032360284092004200441e0026a36028809200420044198076a3602800920044180056a20044180096a107e200428028805220141206a2206417f4c0d070240024020060d00410121070c010b200610322207450d0a0b200441003602a0072004200636029c07200420073602980720044198076a4100411010c80120042802980720042802a00722066a22072004290068370000200741086a200441e8006a41086a220f2900003700002004200641106a22063602a00720044198076a2006411010c80120042802980720042802a00722066a220720042900c804370000200741086a200441c8046a41086a22182900003700002004200641106a22073602a007200428028005210620044198076a2007200110c801200428029807220720042802a007221e6a2006200110c9081a2004201e20016a22013602a0070240200428028405450d002006102c0b20044180096a2007200110830502400240200428028809221e0d0041e0001032221e450d0b420021144108212f420021220c010b2004290380092214428080808070832122200428028c09212f0b0240200428029c07450d002007102c0b200441e8006a4184dec700410310c501200441c8046a41f494c600411610c5012004200e3602e00220044198076a200441e0026a410410c7012004200a36028c0920042032360284092004200441e0026a36028809200420044198076a3602800920044180056a20044180096a107e200428028805220141206a2206417f4c0d070240024020060d00410121070c010b200610322207450d0a0b20044100360288092004200636028409200420073602800920044180096a4100411010c80120042802800920042802880922066a22072004290068370000200741086a200f2900003700002004200641106a22063602880920044180096a2006411010c80120042802800920042802880922066a220720042900c804370000200741086a20182900003700002004200641106a220736028809200428028005210620044180096a2007200110c8012004280280092207200428028809220f6a2006200110c9081a2004200f20016a2201360288090240200428028405450d002006102c0b20044180056a2007200110a00420042802800541014621012004280284052106200428028805210f0240200428028409450d002007102c0b2006410020011b2130200f410020011b21312022201442ffffffff0f838421140240024002400240024020022f01ba022201410b490d00410021204104210102400240201041054f0d00201021180c010b4105210141052118024002402010417b6a0e020201000b201041796a211841012120410621010c010b41002118410121200b41bc0210322206450d0e4100212d20064100360200200641046a20044180096a41b60210c9082110200641003b01ba02201a20014102746a220f280200212b20044180056a41106a221a2002200141186c6a220741c0006a290200370300201d200741386a2902003703002004200741306a290200370380052010200f41046a20022f01ba022001417f736a220f41027410c9081a200641306a200741c8006a200f41186c10c9081a200220013b01ba022006200f3b01ba022006200220201b220120184102746a220741086a200741046a220720012f01ba0220186b41027410ca081a2007200e3602002001201841186c6a220f41c8006a200f41306a220720012f01ba0220186b41186c10ca081a200f41c0006a2030360200200f41386a201e36020020072014370200200f413c6a202f360200200f41c4006a2031360200200120012f01ba0241016a3b01ba02200441e0026a41106a2235201a290300370300200441e0026a41086a2203201d29030037030020042004290380053703e002024020022802002201450d004100212d034020062136202b210c20022f01b802211820044198076a41106a2225203529030037030020322003290300370300200420042903e00237039807024002400240200122022f01ba022206410b490d004100212041042110024020184105490d0020182110024002402018417b6a0e020201000b201841796a211841012120410621100c010b4100211841012120410521100b41ec0210322206450d13202d41016a212d4100210120064100360200200641046a20044180096a41b60210c9082126200641003b01ba0220062004290280053702bc02200641c4026a201d290200370200200641cc026a201a290200370200200641d4026a20044180056a41186a290200370200200641dc026a20044180056a41206a290200370200200641e4026a2009290200370200200241046a222f2010410274220f6a280200212b20044180096a41106a2230200241306a222a201041186c6a221e41106a29020037030020044180096a41086a2231201e41086a2902003703002004201e290200370380092026202f200f41046a22276a20022f01ba0222282010417f736a220f41027410c9082126200641306a201e41186a200f41186c10c9082129200220103b01ba022006200f3b01ba02201a2030290300370300201d2031290300370300200420042903800937038005200641bc026a200220276a41bc026a202820106b41027410c908211e02400340200620014102746a41bc026a280200221020013b01b8022010200636020020012001200f4922106a2201200f4b0d0120100d000b0b2030201a29030022143703002031201d29030022223703002004200429038005223937038009201a2014370300201d202237030020042039370380052020450d012018410274220f201e6a41086a201e201841016a220141027422106a221e20062f01ba0220186b41027410ca081a201e2036360200202620106a2026200f6a220f20062f01ba0220186b41027410ca081a200f200c3602002029201841186c6a220f41186a200f20062f01ba0220186b41186c10ca081a200f41106a2025290300370200200f41086a2032290300370200200f200429039807370200200620062f01ba0241016a220f3b01ba022001200f41ffff0371220f4b0d020340200620014102746a41bc026a280200221020013b01b8022010200636020020012001200f496a2210200f4b0d032001200f4f2118201021012018450d000c030b0b2018410274220f200241bc026a22106a41086a2010201841016a2201410274221a6a2210200620186b410274220610ca081a20102036360200200241046a2210201a6a2010200f6a220f200610ca081a200f200c3602002002201841186c6a220641c8006a200641306a220f20022f01ba0220186b41186c10ca081a200641c0006a2025290300370200200641386a2032290300370200200f200429039807370200200220022f01ba0241016a22063b01ba022018200641ffff037122064f0d080340200220014102746a41bc026a280200220f20013b01b802200f2002360200200120012006496a220f20064b0d09200120064f2110200f21012010450d000c090b0b2018410274220f200241bc026a22106a41086a2010201841016a2201410274221e6a221020022f01ba0220186b41027410ca081a20102036360200202f201e6a202f200f6a220f20022f01ba0220186b41027410ca081a200f200c360200202a201841186c6a220f41186a200f20022f01ba0220186b41186c10ca081a200f41106a2025290300370200200f41086a2032290300370200200f200429039807370200200220022f01ba0241016a220f3b01ba022001200f41ffff0371220f4b0d000340200220014102746a41bc026a280200221020013b01b8022010200236020020012001200f4922106a2201200f4b0d0120100d000b0b2035201a2903003703002003201d29030037030020042004290380053703e002200228020022010d000b0b200441f8006a41106a20352903002214370300200441f8006a41086a20032903002222370300200420042903e002223937037820044198076a41106a220220143703002032202237030020042039370398072008450d0141ec0210322201450d0e20014100360200200141046a20044180096a41b60210c9082110200141003b01ba0220012004290280053702bc02200141c4026a201d290200370200200141cc026a201a290200370200200141d4026a20044180056a41186a290200370200200141dc026a20044180056a41206a290200370200200141e4026a2009290200370200200120083602bc02200841003b01b8022008200136020020044180096a41106a2218200229030037030020044180096a41086a221a2032290300370300200420042903980737038009200d202d470d0220012f01ba022202410a4b0d03200d41016a210d2001200241016a22083b01ba022001200241186c6a220f41306a200429038009370200200f41386a201a290300370200200f41c0006a2018290300370200201020024102746a202b360200200120084102746a41bc026a2006360200200620083b01b80220062001360200200121080c040b201a20104102746a220641046a2006200120106b41027410ca081a2006200e3602002002201041186c6a220141c8006a200141306a220720022f01ba0220106b41186c10ca081a200141c0006a2030360200200141386a201e360200200720143702002001413c6a202f360200200141c4006a2031360200200220022f01ba0241016a3b01ba020c030b41ecd0c800412b41bcd2c800103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b201f41016a211f0b02400240024002400240024002402007280200220620072802042202460d0020072007410c6a280200417f6a200641016a71220f36020020072802082006410c6c6a22062802042112200628020022010d01200f21060b410021074100210120062002460d020c010b2006280208210620072007280210417f6a3602102007200728021420066b360214200420063602e402200420013602e00220044180056a200441e0026a10be040240024020042d008005410a460d002004200e3602a407200441013a00a007200442013703980720044180096a20044180056a41f00110c9081a20044198076a20044180096a10a8061a0c010b41002802d8d248450d0041002802d4d248210641002802d0d248210741002802dcd2482110200441ce003602c009200442c4808080103703b809200441dc8fc6003602b409200442203702ac09200441b7a1c6003602a809200442003703a009200441c4b5c80036029c092004420137039009200441aca1c60036028c092004410336028809200441b4a1c600360284092004410136028009200741f8a3c000201041024622101b20044180096a200641e0a3c00020101b28021011030020042d0080052206410a460d00024002400240024002400240024020060e0700010203040506070b200428028405200428028c0510c30202402004280288052206450d0020064198026c450d00200428028405102c0b20042802900520042802980510c4022004280294052206450d0620064188026c450d06200428029005102c0c060b200428028405200428028c0510c30202402004280288052206450d0020064198026c450d00200428028405102c0b20042802900520042802980510c4022004280294052206450d0520064188026c450d05200428029005102c0c050b200428028405200428028c0510c30202402004280288052206450d0020064198026c450d00200428028405102c0b20042802900520042802980510c4022004280294052206450d0420064188026c450d04200428029005102c0c040b200428028405200428028c0510c3022004280288052206450d0320064198026c450d03200428028405102c0c030b200428028805450d02200428028405102c0c020b201d10a20120042802840510c502200428028405102c0c010b201d10a20120042802840510c502200428028405102c0b024020120d004100211241012107200f2002470d010c020b2001102c41012107200f2002460d010b024020160d00410021160c020b201541016a20167021150c010b024020160d00410021160c010b201620154d0d012013201341046a20162015417f736a41027410ca081a201541002016417f6a221620154b1b21150b20070d012001450d012012450d012001102c0c010b201520161047000b201620154d0d020c000b0b410021084100211f20342116203321150b200ba7210102400240201620154b0d0020044198096a420037030020044190096a420037030020044180096a41086a220642003703002004420037038009200441d8006a4184dec700410310c5012006200441d8006a41086a2900003703002004200429005837038009200441e8006a41c496c600411a10c501201741086a200441e8006a41086a2900003700002017200429006837000020044180096a412010b4010c010b201920154102746a280200210620044198096a420037030020044190096a420037030020044180096a41086a220242003703002004420037038009200441d8006a4184dec700410310c5012002200441d8006a41086a2900003703002004200429005837038009200441e8006a41c496c600411a10c501201b41086a200441e8006a41086a290000370000201b2004290068370000200420063602800520044180096a412020044180056a410410a7020b20042016360288052004201936028005200420013602840520044198096a420037030020044190096a420037030020044180096a41086a220642003703002004420037038009200441d8006a4184dec700410310c5012006200441d8006a41086a2900003703002004200429005837038009200441e8006a41fc95c600410d10c501201741086a200441e8006a41086a2900003700002017200429006837000020044180096a20044180056a108a050240200141ffffffff0371450d002019102c0b0240024020080d0041002101410021084100211f0c010b20082101034020082f01ba022106200d450d01200d417f6a210d200820064102746a41bc026a280200210820012802bc0221010c000b0b200441ac076a200636020020044198076a41106a20083602002004201f3602b007200442003703a0072004200136029c07200441003602980720044180096a20044198076a10a9060240200428028c09450d0020044188076a41046a210d200441d8006a41086a210e200441bc0b6a41046a211c20044188076a41086a211b20044180096a41047221100340200441f8006a41086a201041086a290200221437030020042010290200220b37037820042802980921152004280294092116200428028009210f200441e0026a41086a220120143703002004200b3703e00202400240200ba720042802e402460d0020044180056a41086a2001290300370300200420042903e00237038005200441e8006a4184dec700410310c501200441c8046a418894c600411310c5012004200f3602bc0b20044188076a200441bc0b6a410410c7012004201c36028c092004201b360284092004200441bc0b6a36028809200420044188076a36028009200441d8006a20044180096a107e2004280260220141206a2206417f4c0d070240024020060d00410121020c010b200610322202450d0a0b20044100360290072004200636028c07200420023602880720044188076a4100411010c80120042802880720042802900722066a22022004290068370000200241086a200441e8006a41086a22192900003700002004200641106a22063602900720044188076a2006411010c80120042802880720042802900722066a220220042900c804370000200241086a200441c8046a41086a221a2900003700002004200641106a2202360290072004280258210620044188076a2002200110c801200428028807221820042802900722026a2006200110c9081a2004200220016a2212360290070240200428025c450d002006102c0b200428028c05417f6a2207200428028405220220042802800522016b712208410c6c41046a2206417f4c0d070240024020060d00410121130c010b200610322213450d0a0b20044100360288092004200636028409200420133602800920044180096a2008108f01024020022001460d002004280288052108034020082001410c6c6a2206280200200628020820044180096a10bb01200141016a20077122012002470d000b0b20182012200428028009220120042802880910a7020240200428028409450d002001102c0b0240200428028c07450d002018102c0b20044180056a10aa06200441e8006a4184dec700410310c501200441c8046a41f494c600411610c5012004200f36028807200441d8006a20044188076a410410c7012004200d36028c092004200e36028409200420044188076a360288092004200441d8006a3602800920044180056a20044180096a107e200428028805220141206a2206417f4c0d070240024020060d00410121020c010b200610322202450d0a0b20044100360288092004200636028409200420023602800920044180096a4100411010c80120042802800920042802880922066a22022004290068370000200241086a20192900003700002004200641106a22063602880920044180096a2006411010c80120042802800920042802880922066a220220042900c804370000200241086a201a2900003700002004200641106a220236028809200428028005210620044180096a2002200110c801200428028009220220042802880922076a2006200110c9081a2004200720016a2201360288090240200428028405450d002006102c0b200220012016201510ea02200428028409450d012002102c0c010b200441e8006a4184dec700410310c501200441c8046a418894c600411310c5012004200f36028807200441d8006a20044188076a410410c7012004200d36028c092004200e36028409200420044188076a360288092004200441d8006a3602800920044180056a20044180096a107e200428028805220141206a2206417f4c0d060240024020060d00410121020c010b200610322202450d090b20044100360288092004200636028409200420023602800920044180096a4100411010c80120042802800920042802880922066a22022004290068370000200241086a200441e8006a41086a22072900003700002004200641106a22063602880920044180096a2006411010c80120042802800920042802880922066a220220042900c804370000200241086a200441c8046a41086a22082900003700002004200641106a220236028809200428028005210620044180096a2002200110c801200428028009220220042802880922156a2006200110c9081a2004201520016a2201360288090240200428028405450d002006102c0b2002200110b4010240200428028409450d002002102c0b200441e8006a4184dec700410310c501200441c8046a41f494c600411610c5012004200f36028807200441d8006a20044188076a410410c7012004200d36028c092004200e36028409200420044188076a360288092004200441d8006a3602800920044180056a20044180096a107e200428028805220141206a2206417f4c0d060240024020060d00410121020c010b200610322202450d090b20044100360288092004200636028409200420023602800920044180096a4100411010c80120042802800920042802880922066a22022004290068370000200241086a20072900003700002004200641106a22063602880920044180096a2006411010c80120042802800920042802880922066a220220042900c804370000200241086a20082900003700002004200641106a220236028809200428028005210620044180096a2002200110c801200428028009220220042802880922076a2006200110c9081a2004200720016a2201360288090240200428028405450d002006102c0b2002200110b4010240200428028409450d002002102c0b200441e0026a10aa060b20044180096a20044198076a10a906200428028c090d000b0b20044180056a20044198076a10a9060240200428028c05450d0020044180096a4104722101034020044180096a41186a20044180056a41186a28020036020020044180096a41106a20044180056a41106a29030037030020044180096a41086a20044180056a41086a290300370300200420042903800537038009200110aa0620044180056a20044198076a10a906200428028c050d000b0b0240200428029c072206450d00200628020021012006102c2001450d000340200128020021062001102c2006210120060d000b0b20044198096a2201420037030020044190096a2206420037030020044180096a41086a22024200370300200442003703800920044180056a419ee3c300411510c501200220044180056a41086a220729000037030020042004290080053703800920044180056a418ce4c300410810c50120012007290000370300200620042900800537030020044180096a412041c4b5c800410010a702200041043a00000240202e450d00202c450d00202e41ffffffff0371450d00202c102c0b2021201145720d040b201110a1062011102c200524000f0b20022802002202200d4f0d00200441023602800920192002412c6c6a2201290200210b20042903980921142004290390092122200429038809213920012004290380093702002001290208213a200120393702082001290210213920012022370210200141186a220629020021222006201437020020042039370390052004203a370388052004200b37038005200420223703980502400240200ba7417f6a0e020101000b200141206a2802002106200141246a2802002102200141286a2802002101200b422088a7210e202f201241106a290200370300202e201241086a290200370300200420122902003703e002024020100d0020044198076a41106a2210202f29030037030020044198076a41086a2215202e290300370300200420042903e0023703980720134200370300201c4200370300201a42003703002004420037038009200441d8006a41bee8c700410d10c501201a201d2900003703002004200429005837038009200441e8006a41b4edc700410f10c501201e2017290000370000201b2004290068370000200441f8006a20044180096a10f50402400240200428027822310d00200441043602c8044100213141002132410021330c010b200420313602c804200428027c2131200428028001213220042802840121330b200420333602d404200420323602d004200420313602cc042030200429039807370200203041086a2015290300370200203041106a20102903003702002004200e36028009200420013602a409200420023602a0092004200636029c09200441c8046a20044180096a2034109d01200441f8006a41086a20042903d004370300200420042903c804220b37037820134200370300201c4200370300201a42003703002004420037038009200441d8006a41bee8c700410d10c501201a201d2900003703002004200429005837038009200441e8006a41b4edc700410f10c501201e2017290000370000201b20042900683700000240200ba722010d0020044180096a412010b4010c020b20044180096a200441f8006a108e05200428027c2206450d012006412c6c450d012001102c0c010b20134200370300201c4200370300201a42003703002004420037038009200441d8006a41bee8c700410d10c501201a201d2900003703002004200429005837038009200441e8006a41f4eec700411410c501201e2017290000370000201b200429006837000020044198076a20044180096a412010b9032004280298072201410420011b21150240024002400240200429029c07420020011b220b422088a722310e020300010b41002101200e2015280200470d020c010b4100210120312106034020012006410176220220016a2210200e201520104102746a280200491b2101200620026b220641014b0d000b200e201520014102746a280200470d0120012031490d00200120311047000b201520014102746a2206200641046a2001417f7320316a41027410ca081a200b4280808080707c210b0b20042015360298072004200b37029c0720134200370300201c4200370300201a42003703002004420037038009200441d8006a41bee8c700410d10c501201a201d2900003703002004200429005837038009200441e8006a41f4eec700411410c501201e2017290000370000201b200429006837000020044180096a412020044198076a10d104200ba72201450d00200141ffffffff0371450d002015102c0b200f2106200821010c000b0b103b000b200524000f0b1039000bf10101037f200128022421020240024002402001280200220341ff0171450d00200141046a280200210120022002280200417f6a22043602004100210320040d022002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22042004280200417f6a22043602002004450d010c020b20022002280200417f6a2204360200200341807e7121014101210320040d012002280208200228020c2802001102000240200228020c280204450d002002280208102c0b200241046a22042004280200417f6a220436020020040d010b2002102c0b20002001360204200020033602000b9b2205027f017e037f017e097f230041f0026b220424004101210502400240024020002001460d0041022105200110fb02450d0042002106200441a0026a2205420037030020044188026a41106a2207420037030020044188026a41086a220842003703002004420037038802200441a8026a41ac95c400410d10c5012008200441a8026a41086a290000370300200420042900a80237038802200441c8026a41c695c400410c10c5012005200441c8026a41086a290000370300200720042900c802370300200441186a20044188026a10f5020240024020042802704102470d00410021094200210a410021074100210b410021084100210c4100210d0c010b200441186a41106a290300210a20044198016a2802002109200441a8016a2802002107200441ac016a280200210b200441b8016a2802002108200441bc016a280200210c200441c0016a280200210d200429032021060b024020020d00410321050c010b4104210520072002490d00024020030d00410521050c010b4106210520082003490d00200441a8026a4187dec700410410c501200441c8026a41bcadc500411710c5012004410036029002200442013703880220044188026a41004104102f20042802880220042802900222056a20003600002004200541046a22053602900220044188026a20054104102f200428028802220520042802900222076a20013600002004200741046a220736029002200441b8026a2005200710c701200441246a200520076a360200200420053602202004200441c0026a36021c2004200441b8026a360218200441d8026a200441186a107e0240200428028c02450d002005102c0b20042802e002220541206a2207417f4c0d010240024020070d00410121080c010b200710322208450d030b200441003602c002200420073602bc02200420083602b802200441b8026a4100411010c80120042802b80220042802c00222076a220820042900a802370000200841086a200441a8026a41086a2900003700002004200741106a22073602c002200441b8026a2007411010c80120042802b80220042802c00222076a220820042900c802370000200841086a200441c8026a41086a2900003700002004200741106a22083602c00220042802d8022107200441b8026a2008200510c80120042802b802220820042802c002220e6a2007200510c9081a2004200e20056a22053602c002024020042802dc02450d002007102c0b200441186a2008200510fe0420042d00382107024020042802bc02450d002008102c0b41072105200741ff01714102470d00200441a8026a4187dec700410410c501200441c8026a41acb1c500410c10c5012004410036029002200442013703880220044188026a41004104102f20042802880220042802900222056a20003600002004200541046a22053602900220044188026a20054104102f200428028802220520042802900222076a20013600002004200741046a220736029002200441b8026a2005200710c701200441186a410c6a200520076a360200200420053602202004200441c0026a36021c2004200441b8026a360218200441d8026a200441186a107e0240200428028c02450d002005102c0b20042802e002220541206a2207417f4c0d010240024020070d00410121080c010b200710322208450d030b20044100360290022004200736028c02200420083602880220044188026a4100411010c80120042802880220042802900222076a220820042900a802370000200841086a200441a8026a41086a2900003700002004200741106a22073602900220044188026a2007411010c80120042802880220042802900222076a220820042900c802370000200841086a200441c8026a41086a2900003700002004200741106a22083602900220042802d802210720044188026a2008200510c8012004280288022208200428029002220e6a2007200510c9081a2004200e20056a220536029002024020042802dc02450d002007102c0b200441186a2008200510f30220042d004c21070240200428028c02450d002008102c0b41082105200741ff01714102470d00200441a8026a4187dec700410410c501200441c8026a41fcb2c500411710c501200420003602b802200441d8026a200441b8026a410410c701200441246a200441b8026a41046a3602002004200441e0026a36021c2004200441b8026a3602202004200441d8026a36021820044188026a200441186a107e200428029002220541206a2207417f4c0d010240024020070d00410121080c010b200710322208450d030b200441003602202004200736021c20042008360218200441186a4100411010c8012004280218200428022022076a220820042900a802370000200841086a200441a8026a41086a2900003700002004200741106a2207360220200441186a2007411010c8012004280218200428022022076a220820042900c802370000200841086a200441c8026a41086a2900003700002004200741106a22083602202004280288022107200441186a2008200510c801200428021822082004280220220e6a2007200510c9081a2004200e20056a22053602200240200428028c02450d002007102c0b200441cc026a41003a0000200441003602c802200441106a20082005200441c8026a4105410010b704024002402004280210450d00200420042802142205410520054105491b36028c022004200441c8026a36028802200441086a20044188026a108702200428020c210f20042802084521100c010b410021100b0240200428021c450d002008102c0b200441a8026a4187dec700410410c501200441c8026a41ecaec500411b10c501200420003602b802200441d8026a200441b8026a410410c701200441246a200441b8026a41046a3602002004200441e0026a36021c2004200441b8026a3602202004200441d8026a36021820044188026a200441186a107e200428029002220541206a2207417f4c0d010240024020070d00410121080c010b200710322208450d030b200441003602202004200736021c20042008360218200441186a4100411010c8012004280218200428022022076a220820042900a802370000200841086a200441a8026a41086a2900003700002004200741106a2207360220200441186a2007411010c8012004280218200428022022076a220820042900c802370000200841086a200441c8026a41086a2900003700002004200741106a22083602202004280288022107200441186a2008200510c801200428021822082004280220220e6a2007200510c9081a2004200e20056a22053602200240200428028c02450d002007102c0b20042008200510c60120042802002111200428020421120240200428021c450d002008102c0b200441c8026a41f1ddc700410510c50120044188026a41e8fec000410b10c501200420003602b802200441d8026a200441b8026a410410c701200441246a200441b8026a41046a3602002004200441e0026a36021c2004200441b8026a3602202004200441d8026a360218200441a8026a200441186a107e20042802b002220541206a2207417f4c0d010240024020070d004101210e0c010b20071032220e450d030b41002108200441003602e002200420073602dc022004200e3602d802200441d8026a4100411010c80120042802d80220042802e00222076a220e20042900c802370000200e41086a200441c8026a41086a2900003700002004200741106a22073602e002200441d8026a2007411010c80120042802d80220042802e00222076a220e200429008802370000200e41086a20044188026a41086a2900003700002004200741106a220e3602e00220042802a8022107200441d8026a200e200510c80120042802d802220e20042802e00222136a2007200510c9081a2004201320056a22053602e002024020042802ac02450d002007102c0b200441186a200e200510b301024020042802182205450d0041012108200428021c450d002005102c0b200f410020101b210f2012410020111b2107024020042802dc02450d00200e102c0b410921052007200f6a200d200c20081b4f0d00200441a8026a4187dec700410410c501200441c8026a41ecaec500411b10c501200420003602b802200441d8026a200441b8026a410410c701200441246a200441b8026a41046a3602002004200441e0026a36021c2004200441b8026a3602202004200441d8026a36021820044188026a200441186a107e200428029002220541206a2208417f4c0d014101210c02402008450d0020081032220c450d030b200741016a210d200441003602202004200836021c2004200c360218200441186a4100411010c8012004280218200428022022076a220820042900a802370000200841086a200441a8026a41086a2900003700002004200741106a2207360220200441186a2007411010c8012004280218200428022022076a220820042900c802370000200841086a200441c8026a41086a2900003700002004200741106a22083602202004280288022107200441186a2008200510c801200428021822082004280220220c6a2007200510c9081a2004200c20056a22053602200240200428028c02450d002007102c0b2004200d360288022008200520044188026a410410a7020240200428021c450d002008102c0b2004200a3703202004200637031820044100360228200441003a00382004200b360234200420023602302004200336022c200441a8026a4187dec700410410c501200441c8026a41bcadc500411710c501200441003602e002200442013703d802200441d8026a41004104102f20042802d80220042802e00222056a20003600002004200541046a22053602e002200441d8026a20054104102f20042802d802220520042802e00222076a20013600002004200741046a22073602e002200441e8026a2005200710c70120044194026a200520076a36020020042005360290022004200441f0026a36028c022004200441e8026a36028802200441b8026a20044188026a107e024020042802dc02450d002005102c0b20042802c002220541206a2207417f4c0d010240024020070d00410121080c010b200710322208450d030b20044100360290022004200736028c02200420083602880220044188026a4100411010c80120042802880220042802900222076a220820042900a802370000200841086a200441a8026a41086a2900003700002004200741106a22073602900220044188026a2007411010c80120042802880220042802900222076a220820042900c802370000200841086a200441c8026a41086a2900003700002004200741106a22083602900220042802b802210720044188026a2008200510c8012004280288022208200428029002220c6a2007200510c9081a2004200c20056a220536029002024020042802bc02450d002007102c0b20082005200441186a1088050240200428028c02450d002008102c0b200441306a2208420037030041102105200441186a41106a220c4200370300200441186a41086a2207420037030020044200370318200441186a4187dec700410410c50120044188026a41acaec500411b10c501200820044188026a41086a220d290000370300200c200429008802370300200441003602d002200442013703c802200441c8026a41004104102f20042802c80220042802d00222086a20003600002004200841046a22083602d002200441c8026a20084104102f20042802c80220042802d00222086a20013600002004200841046a22083602d002200d2008360200200420042903c80237038802200441186a412020044188026a10f402200441246a200236020020072003360200200441003602900220044201370388022004200036021c200441073a0018200441186a20044188026a10f602200441186a10f7022007200428029002360200200420042903880237031820092001200441186a10c4011a0b200441f0026a240020050f0b103b000b1039000bbb0301047f230041c0006b22022400419094c5002103411f2104410e21050240024002400240024002400240024002400240024002400240024002400240200141ff01710e10000102030405060708090a0b0c0d0e0f000b2002411c6a41013602002002420137020c200241eccdc80036020820024104360224200241c0fcc7003602202002200241206a360218200241086a41c09ac5001046000b41f08fc500210341152104410021050c0d0b419090c5002103410121050c0c0b41b890c5002103411b2104410221050c0b0b41dc90c500210341232104410321050c0a0b418891c5002103411e2104410421050c090b41b091c500210341262104410521050c080b41e091c5002103411c2104410621050c070b418492c5002103410721050c060b41ac92c5002103411c2104410821050c050b41d092c5002103411c2104410921050c040b41f492c500210341212104410a21050c030b41a093c5002103411e2104410b21050c020b41c893c5002103411c2104410c21050c010b41ec93c5002103411b2104410d21050b200041832e3b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bc41f03057f017e077f23004190046b22022400200241c0036a4187dec700410410c501200241d0036a41bcadc500411710c501200241003602f803200242013703f003200241f0036a41004104102f20022802f00320022802f80322036a20013600002002200341046a22033602f803200241f0036a20034104102f20022802f003220320022802f80322046a20003600002002200441046a22043602f803200241b0036a2003200410c701200241cc016a200320046a360200200220033602c8012002200241b8036a3602c4012002200241b0036a3602c001200241e0036a200241c0016a107e024020022802f403450d002003102c0b024002400240024020022802e803220341206a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b200241003602b803200220043602b403200220053602b003200241b0036a4100411010c80120022802b00320022802b80322046a220520022900c003370000200541086a200241c0036a41086a2900003700002002200441106a22043602b803200241b0036a2004411010c80120022802b00320022802b80322046a220520022900d003370000200541086a200241d0036a41086a2900003700002002200441106a22053602b80320022802e0032104200241b0036a2005200310c80120022802b003220520022802b80322066a2004200310c9081a2002200620036a22033602b803024020022802e403450d002004102c0b200241c0016a2005200310fe04200241f0036a41086a200241c0016a41086a290300370300200241f0036a41106a200241c0016a41106a290300370300200241f0036a41186a2204200241c0016a41186a290300370300200220022903c0013703f003200220022800e1013602d0032002200241e4016a2800003600d303024020022d00e00122034102460d00200241a0016a41186a2004290300370300200241a0016a41106a200241f0036a41106a290300370300200241a0016a41086a200241f0036a41086a290300370300200220022903f0033703a001200220022802d00336029801200220022800d30336009b010b024020022802b403450d002005102c0b20034102460d02200241f0006a410e6a200241a0016a41086a2205290300370100200241f0006a41166a200241a0016a41106a290300370100200241f0006a411e6a200241a0016a41186a2903002207370100200241c8006a411e6a22042007370100200220022903a001370176200241c8006a41086a200241f0006a41086a290100370300200241c8006a41106a200241f0006a41106a290100370300200241c8006a41186a200241f0006a41186a29010037030020022002280298013602202002200228009b0136002320022002290170370348200241286a41186a2004290100370300200241286a41106a200241c8006a41166a290100370300200241286a41086a200241c8006a410e6a2901003703002002200229014e370328410b210420030d03200241f0036a41186a22034200370300200241f0036a41106a22044200370300200241f0036a41086a22064200370300200242003703f003200241c0036a41ac95c400410d10c5012006200241c0036a41086a290000370300200220022900c0033703f003200241d0036a41c695c400410c10c5012003200241d0036a41086a290000370300200420022900d003370300200241c0016a200241f0036a10f502200241c0026a2802002108200241d8026a2802002109200241dc026a280200210a200228029802210b200241c8006a41f1ddc700410510c501200241f0006a41e8fec000410b10c501200220003602d003200241a0016a200241d0036a410410c701200241c0016a410c6a200241d0036a41046a360200200220053602c4012002200241d0036a3602c8012002200241a0016a3602c001200241f0036a200241c0016a107e20022802f803220341206a2204417f4c0d000240024020040d00410121060c010b200410322206450d020b41002105200241003602a801200220043602a401200220063602a001200241a0016a4100411010c80120022802a00120022802a80122046a22062002290048370000200641086a200241c8006a41086a2900003700002002200441106a22043602a801200241a0016a2004411010c80120022802a00120022802a80122046a22062002290070370000200641086a200241f0006a41086a2900003700002002200441106a22063602a80120022802f0032104200241a0016a2006200310c80120022802a001220620022802a801220c6a2004200310c9081a2002200c20036a22033602a801024020022802f403450d002004102c0b200241c0016a2006200310b301024020022802c0012203450d004101210520022802c401450d002003102c0b024020022802a401450d002006102c0b200241c0036a4187dec700410410c501200241d0036a41ecb1c500411810c501200220003602f003200241c8006a200241f0036a410410c701200241cc016a200241f0036a41046a3602002002200241d0006a3602c4012002200241f0036a3602c8012002200241c8006a3602c001200241f0006a200241c0016a107e2002280278220341206a2204417f4c0d000240024020040d00410121060c010b200410322206450d020b200241003602c801200220043602c401200220063602c001200241c0016a4100411010c80120022802c00120022802c80122046a220620022900c003370000200641086a200241c0036a41086a2900003700002002200441106a22043602c801200241c0016a2004411010c80120022802c00120022802c80122046a220620022900d003370000200641086a200241d0036a41086a2900003700002002200441106a22063602c80120022802702104200241c0016a2006200310c80120022802c001220620022802c801220c6a2004200310c9081a2002200c20036a22033602c80102402002280274450d002004102c0b200241cc006a41003a000020024100360248200241186a20062003200241c8006a4105410010b704024002402002280218450d002002200228021c2203410520034105491b3602742002200241c8006a360270200241106a200241f0006a1087022002280214210c200228021045210d0c010b4100210d0b024020022802c401450d002006102c0b200241c0036a4187dec700410410c501200241d0036a41b0afc500411f10c501200220003602f003200241c8006a200241f0036a410410c701200241cc016a200241f0036a41046a3602002002200241d0006a3602c4012002200241f0036a3602c8012002200241c8006a3602c001200241f0006a200241c0016a107e2002280278220341206a2204417f4c0d000240024020040d00410121060c010b200410322206450d020b4100200a200b410246220b1b210a41002009200b1b2109200241003602c801200220043602c401200220063602c001200241c0016a4100411010c80120022802c00120022802c80122046a220620022900c003370000200641086a200241c0036a41086a2900003700002002200441106a22043602c801200241c0016a2004411010c80120022802c00120022802c80122046a220620022900d003370000200641086a200241d0036a41086a2900003700002002200441106a22063602c80120022802702104200241c0016a2006200310c80120022802c001220620022802c801220e6a2004200310c9081a2002200e20036a22033602c80102402002280274450d002004102c0b200a200920051b2105200c4100200d1b2109200241086a2006200310c601200228020c410020022802081b2103024020022802c401450d002006102c0b410c2104200320096a20054f0d03200241e4016a2002280023360000200241c0016a41186a200241286a41186a290300370300200241c0016a41106a200241286a41106a290300370300200241c0016a41086a200241286a41086a290300370300200220022903283703c001200241013a00e001200220022802203600e101200241c0036a4187dec700410410c501200241d0036a41bcadc500411710c5012002410036025020024201370348200241c8006a41004104102f2002280248200228025022046a20013600002002200441046a2204360250200241c8006a20044104102f20022802482204200228025022056a20003600002002200541046a2205360250200241a0016a2004200510c701200241fc006a200420056a360200200220043602782002200241a0016a41086a3602742002200241a0016a360270200241f0036a200241f0006a107e0240200228024c450d002004102c0b20022802f803220441206a2205417f4c0d000240024020050d00410121060c010b200510322206450d020b200241003602782002200536027420022006360270200241f0006a4100411010c8012002280270200228027822056a220620022900c003370000200641086a200241c0036a41086a2900003700002002200541106a2205360278200241f0006a2005411010c8012002280270200228027822056a220620022900d003370000200641086a200241d0036a41086a2900003700002002200541106a220636027820022802f0032105200241f0006a2006200410c80120022802702206200228027822096a2005200410c9081a2002200920046a2204360278024020022802f403450d002005102c0b20062004200241c0016a10880502402002280274450d002006102c0b200241c0036a4187dec700410410c501200241d0036a41b0afc500411f10c501200220003602f003200241c8006a200241f0036a410410c701200241cc016a200241f0036a41046a3602002002200241d0006a3602c4012002200241f0036a3602c8012002200241c8006a3602c001200241f0006a200241c0016a107e2002280278220441206a2205417f4c0d004101210602402005450d00200510322206450d020b200341016a2109200241003602c801200220053602c401200220063602c001200241c0016a4100411010c80120022802c00120022802c80122036a220520022900c003370000200541086a200241c0036a41086a2900003700002002200341106a22033602c801200241c0016a2003411010c80120022802c00120022802c80122036a220520022900d003370000200541086a200241d0036a41086a2900003700002002200341106a22053602c80120022802702103200241c0016a2005200410c80120022802c001220520022802c80122066a2003200410c9081a2002200620046a22043602c80102402002280274450d002003102c0b41002008200b1b21032002200936027020052004200241f0006a410410a702024020022802c401450d002005102c0b2002410036027820024201370370200220003602c401200241083a00c001200241c0016a200241f0006a10f602200241c0016a10f702200241c0016a41086a2002280278360200200220022903703703c00120032001200241c0016a10c4011a411021040c030b103b000b1039000b410a21040b20024190046a240020040bb00e05037f047e067f017e017f23004190026b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00200041023a00340c010b2003280214210402400240200341106a41086a28020022054110490d0020054170714110460d002005417c7122024120460d0020024124460d0020024128460d002002412c460d0020024130460d0020054134460d00200141086a290000210620012900002107200141186a2900002108200129001021092001280020210a2001280024210b2001280028210c200128002c210d2001280030210e41002102024002400240024020012d00340e020100040b200341003a004020054135460d02200341013a0040200320012d00353a002020054136460d01200341023a0040200320012d00363a002120054137460d01200341033a0040200320012d00373a002220054138460d01200341043a0040200320012d00383a002320054139460d01200341053a0040200320012d00393a00242005413a460d01200341063a0040200320012d003a3a00252005413b460d01200341073a0040200320012d003b3a00262005413c460d01200341083a0040200320012d003c3a00272005413d460d01200341093a0040200320012d003d3a00282005413e460d012003410a3a0040200320012d003e3a00292005413f460d012003410b3a0040200320012d003f3a002a200541c000460d012003410c3a0040200320012d00403a002b200541c100460d012003410d3a0040200320012d00413a002c200541c200460d012003410e3a0040200320012d00423a002d200541c300460d012003410f3a0040200320012d00433a002e200541c400460d01200341103a0040200320012d00443a002f200541c500460d01200341113a0040200320012d00453a0030200541c600460d01200341123a0040200320012d00463a0031200541c700460d01200341133a0040200320012d00473a0032200541c800460d01200341143a0040200320012d00483a0033200541c900460d01200341153a0040200320012d00493a0034200541ca00460d01200341163a0040200320012d004a3a0035200541cb00460d01200341173a0040200320012d004b3a0036200541cc00460d01200341183a0040200320012d004c3a0037200541cd00460d01200341193a0040200320012d004d3a0038200541ce00460d012003411a3a0040200320012d004e3a0039200541cf00460d012003411b3a0040200320012d004f3a003a200541d000460d012003411c3a0040200320012d00503a003b200541d100460d012003411d3a0040200320012d00513a003c200541d200460d012003411e3a0040200320012d00523a003d200541d300460d012003411f3a0040200320012d00533a003e200541d400460d01200341b0016a41106a2202200341206a41106a290300370300200341b0016a41086a2205200341206a41086a290300370300200320012d00543a003f200341b0016a41186a220f200341206a41186a290300370300200341203a00402003200329032022103703d001200320103703b00120034190016a41186a2211200f29030037030020034190016a41106a220f200229030037030020034190016a41086a22022005290300370300200320032903b00137039001200341f0006a41186a2011290300370300200341f0006a41106a200f290300370300200341f0006a41086a20022903003703002003200329039001370370410121020b200341c8006a41186a2205200341f0006a41186a290300370300200341c8006a41106a220f200341f0006a41106a290300370300200341c8006a41086a2211200341f0006a41086a290300370300200341ea006a200341ef006a2d00003a000020032003290370370348200320032f006d3b0168200041186a20083703002000200937031020002006370308200020073703002000200e3602302000200d36022c2000200c3602282000200b3602242000200a360220200341206a411f6a220a200341c8006a411f6a280000360000200341206a41186a220b2005290300370300200341206a41106a2205200f290300370300200341206a41086a220c201129030037030020032003290348370320200041d4006a200a280000360000200041cd006a200b290300370000200041c5006a20052903003700002000413d6a200c290300370000200020032903203700350c030b200341003a00400b20034190016a41086a200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a2903003703000b20034100360228200342013703202003410f3602d4012003200341086a3602d0012003200341206a3602b001200341dc006a41013602002003420137024c200341b4bcc3003602482003200341d0016a360258200341b0016a41dcb7c000200341c8006a103e1a2003350228422086200335022084100002402003280224450d002003280220102c0b410221020b200020023a00342004450d002001102c0b20034190026a24000b31002001ad4220862000ad84200235020842208620022802002200ad84101d0240200241046a280200450d002000102c0b0bb409061b7f017e037f047e057f017e230041d0006b220224002002412036020420022001360200200241086a2001412010b30102400240200228020822010d00200041023602580c010b200228020c2103024002400240200241106a28020022044104490d002004417c7122054104460d0020054108460d002005410c460d0020054110460d0020054114460d0020054118460d002005411c460d0020054120460d0020054124460d0020054128460d002005412c460d0020044130460d00200128000021062001280004210720012800082108200128000c21092001280010210a2001280014210b2001280018210c200128001c210d2001280020210e2001280024210f20012800282110200128002c21112004414f6a2112200141316a2113410021050240024020012d00300e020100020b20124104490d012004414b6a2112200141356a211320012800312114410121050b20124104490d002012417c7122044104460d0020044108460d002004410c460d0020044110460d0020044114460d0020044118460d002004411c460d0020044120460d002012415c6a4108490d002004412c460d0020044130460d0020044134460d00201241486a4110490d00201241b87f6a4110490d00200441d800460d00200441dc00460d00200441e000460d00200441e400460d00200441e800460d00201328000021122013280004211520132800082116201328000c211720132800102118201328001421192013280018211a201328001c211b2013280020211c2013290024211d201328002c211e2013280030211f20132800342120201341c0006a290000212120132900382122201341d0006a29000021232013290048212420132800582125201328005c2126201328006021272013280064212820132800682129200441947f6a220441084b0d01410120047441910271450d010b20024100360220200242013703182002410f36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c200241b4bcc3003602382002200241286a360248200241346a41dcb7c000200241386a103e1a200235022042208620023502188410000240200228021c450d002002280218102c0b410221050c010b201329006c212a20132800742104200041106a202137030020002022370308200041206a202337030020002024370318200020063602282000200736022c20002008360230200020093602342000200a3602382000200b36023c2000200c3602402000200d3602442000200e3602482000200f36024c20002010360250200020113602542000201436025c200041e0006a2012360200200041e4006a2015360200200041e8006a2016360200200041ec006a2017360200200041f0006a2018360200200041f4006a2019360200200041f8006a201a360200200041fc006a201b36020020004180016a201c36020020004184016a201e36020020004188016a201f3602002000418c016a202036020020004190016a202536020020004194016a202636020020004198016a20273602002000419c016a2028360200200041a0016a2029360200200041ac016a2004360200200041a4016a202a3702002000201d3703000b200020053602582003450d002001102c0b200241d0006a24000bc21601037f034002400240024002400240024002400240024002400240024020002d00000e0a000102030405060708090a0b2001200141086a22022802004101102f200128020020022802006a41003a00002002200228020041016a3602002001200041046a10a401200041106a280200200041186a280200200110a3010f0b2001200141086a22022802004101102f200128020020022802006a41013a00002002200228020041016a3602002001200041046a10a401200041106a280200200041186a280200200110a3010f0b2001200141086a22022802004101102f200128020020022802006a41023a00002002200228020041016a3602002001200041046a10a401200041106a280200200041186a280200200110a3010f0b2001200141086a22022802004101102f200128020020022802006a41033a00002002200228020041016a3602002001200041106a10a6012001200041046a10a4010f0b2001200141086a22022802004101102f200128020020022802006a41043a00002002200228020041016a2203360200024002400240024020002d00010e03000102030b200120034101102f200128020020022802006a41003a00002002200228020041016a3602000c020b200120034101102f200128020020022802006a41013a00002002200228020041016a3602000c010b200120034101102f200128020020022802006a41023a00002002200228020041016a3602000b20002802042000410c6a280200200110bb010f0b2001200141086a22022802004101102f200128020020022802006a41053a00002002200228020041016a3602002001200041086a10a501200041046a2802002100200120022802004101102f200128020020022802006a41003a00000c050b2001200141086a22022802004101102f200128020020022802006a41063a00002002200228020041016a3602002001200041086a10a501200041046a2802002100200120022802004101102f200128020020022802006a41003a00000c040b2001200141086a22022802004101102f200128020020022802006a41073a00002002200228020041016a22043602000240024002400240200041046a280200220341c000490d00200341808001490d012003418080808004490d02200120044101102f2001280200200141086a22022802006a41033a00002002200228020041016a220336020020002802042104200120034104102f200128020020022802006a20043600002002200228020041046a22033602000c030b200120044101102f200128020020022802006a20034102743a00002002200228020041016a22033602000c020b200120044102102f2001280200200141086a22022802006a20034102744101723b00002002200228020041026a22033602000c010b200120044104102f2001280200200141086a22022802006a20034102744102723600002002200228020041046a22033602000b02400240024002402000280208220241c000490d00200241808001490d012002418080808004490d02200120034101102f2001280200200141086a22022802006a41033a00002002200228020041016a220336020020002802082104200120034104102f200128020020022802006a20043600002002200228020041046a22033602000c030b200120034101102f2001280200200141086a22042802006a20024102743a00002004200428020041016a22033602000c020b200120034102102f2001280200200141086a22042802006a20024102744101723b00002004200428020041026a22033602000c010b200120034104102f2001280200200141086a22042802006a20024102744102723600002004200428020041046a22033602000b024002400240200028020c220241c000490d00200241808001490d012002418080808004490d02200120034101102f2001280200200141086a22022802006a41033a00002002200228020041016a2203360200200028020c2100200120034104102f200128020020022802006a20003600002002200228020041046a3602000f0b200120034101102f2001280200200141086a22012802006a20024102743a00002001200128020041016a3602000f0b200120034102102f2001280200200141086a22012802006a20024102744101723b00002001200128020041026a3602000f0b200120034104102f2001280200200141086a22012802006a20024102744102723600002001200128020041046a3602000f0b2001200141086a22022802004101102f200128020020022802006a41083a00002002200228020041016a2204360200024002400240200041046a280200220341c000490d00200341808001490d012003418080808004490d02200120044101102f2001280200200141086a22022802006a41033a00002002200228020041016a220336020020002802042100200120034104102f200128020020022802006a20003600002002200228020041046a3602000f0b200120044101102f200128020020022802006a20034102743a00002002200228020041016a3602000f0b200120044102102f2001280200200141086a22012802006a20034102744101723b00002001200128020041026a3602000f0b200120044104102f2001280200200141086a22012802006a20034102744102723600002001200128020041046a3602000f0b2001200141086a22022802004101102f200128020020022802006a41093a00002002200228020041016a22043602000240024002400240200041046a280200220341c000490d00200341808001490d012003418080808004490d02200120044101102f2001280200200141086a22022802006a41033a00002002200228020041016a220336020020002802042104200120034104102f200128020020022802006a20043600002002200228020041046a22033602000c030b200120044101102f200128020020022802006a20034102743a00002002200228020041016a22033602000c020b200120044102102f2001280200200141086a22022802006a20034102744101723b00002002200228020041026a22033602000c010b200120044104102f2001280200200141086a22022802006a20034102744102723600002002200228020041046a22033602000b02400240024002402000280208220241c000490d00200241808001490d012002418080808004490d02200120034101102f2001280200200141086a22022802006a41033a00002002200228020041016a220336020020002802082104200120034104102f200128020020022802006a20043600002002200228020041046a22033602000c030b200120034101102f2001280200200141086a22042802006a20024102743a00002004200428020041016a22033602000c020b200120034102102f2001280200200141086a22042802006a20024102744101723b00002004200428020041026a22033602000c010b200120034104102f2001280200200141086a22042802006a20024102744102723600002004200428020041046a22033602000b024002400240200028020c220241c000490d00200241808001490d012002418080808004490d02200120034101102f2001280200200141086a22022802006a41033a00002002200228020041016a2203360200200028020c2100200120034104102f200128020020022802006a20003600002002200228020041046a3602000f0b200120034101102f2001280200200141086a22012802006a20024102743a00002001200128020041016a3602000f0b200120034102102f2001280200200141086a22012802006a20024102744101723b00002001200128020041026a3602000f0b200120034104102f2001280200200141086a22012802006a20024102744102723600002001200128020041046a3602000b0f0b200141086a2202200228020041016a3602000c000b0b960401027f0240024002400240024002400240024020002d00000e0700010203040506070b200041046a2802002000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041106a280200200041186a28020010c402200041146a2802002201450d0620002802102200450d0620014188026c450d062000102c0f0b200041046a2802002000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041106a280200200041186a28020010c402200041146a2802002201450d0520002802102200450d0520014188026c450d052000102c0f0b200041046a2802002000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041106a280200200041186a28020010c402200041146a2802002201450d0420002802102200450d0420014188026c450d042000102c0f0b200041046a2802002000410c6a28020010c302200041086a2802002201450d0320002802042200450d0320014198026c450d032000102c0f0b200041086a2802002201450d02200041046a2802002200450d022001450d022000102c0f0b200041086a10a201200041046a220028020010c5022000280200102c0f0b200041086a10a201200041046a220028020010c5022000280200102c0b0bc645020c7f087e230041f0016b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a0e050001020304000b200128020421042001411c6a2802002105200141186a2802002106200141146a2802002107200141106a28020021082001410c6a2802002109200141086a280200210a200341a0016a41206a200241206a290200370300200341a0016a41186a200241186a290200370300200341a0016a41106a200241106a290200370300200341a0016a41086a220b200241086a290200370300200320022902003703a001200341d8006a200341a0016a10c60220034180016a41086a220c200341d8006a41096a29000037030020034180016a41106a2202200341e9006a29000037030020034180016a41186a2201200341f1006a290000370300200320032900593703800102400240024020032d00584101460d00200341386a41186a2001290300370300200341386a41106a2002290300370300200341386a41086a200c2903003703002003200329038001370338200142003703002002420037030020034200370388012003420037038001200341a0016a4196dec700410910c5012003200b29000037038801200320032900a00137038001200341a0016a418487c500411e10c5012001200b290000370300200220032900a00137030020034180016a412010dc0241ff017122024102460d012002410171450d0120054108490d080240200741b6f7c400460d0020072900004280c2cdeb16520d090b200341c8016a4196dec700410910c50120034180016a41f1ddc700410510c501200320043602e801200341d8016a200341e8016a410410c701200341ac016a200341e8016a41046a3602002003200341e0016a3602a4012003200341e8016a3602a8012003200341d8016a3602a001200341d8006a200341a0016a107e2003280260220241206a2201417f4a0d020c150b200341023a00280c110b200341286a410610a4050c100b0240024020010d004101210b0c010b20011032220b450d050b200341003602a801200320013602a4012003200b3602a001200341a0016a4100411010c80120032802a00120032802a80122016a220b20032900c801370000200b41086a200341c8016a41086a2900003700002003200141106a22013602a801200341a0016a2001411010c80120032802a00120032802a80122016a220b200329008001370000200b41086a20034180016a41086a2900003700002003200141106a220b3602a80120032802582101200341a0016a200b200210c80120032802a001220b20032802a801220c6a2001200210c9081a2003200c20026a22023602a8010240200328025c450d002001102c0b200b200210ce022102024020032802a401450d00200b102c0b20020d06200341b8016a22024200370300200341b0016a22014200370300200341a0016a41086a220d4200370300200342003703a001200341c8016a41f1ddc700410510c501200d200341c8016a41086a290000370300200320032900c8013703a00120034180016a41d893c600410d10c501200220034180016a41086a2900003703002001200329008001370300200341d8006a200341a0016a412010b90320032802582201410420011b210e41002102024002400240024002400240200329025c420020011b220f422088a722010e020201000b41002102034020022001410176220b20026a220c2004200e200c4102746a280200491b21022001200b6b220141014b0d000b0b2004200e20024102746a280200460d010b200341a0016a200341386a4280a0e5b9c29101420010d202200320032900a1013703582003200d28000036005f20032d00a00122024104460d02200341306a200328005f360000200320023a0028200320032903583700290c010b200341286a410110a4050b200fa72202450d10200241ffffffff0371450d10200e102c0c100b200341a0016a41186a200341386a41186a290300370300200341a0016a41106a200341386a41106a290300370300200341a0016a41086a200341386a41086a290300370300200320032903383703a001200341c8016a4196dec700410910c50120034180016a41bef7c400410710c501200320043602e401200341e8016a200341e4016a410410c701200341e4006a200341e4016a41046a3602002003200341e8016a41086a36025c2003200341e4016a3602602003200341e8016a360258200341d8016a200341d8006a107e20032802e001220241206a2201417f4c0d120240024020010d004101210b0c010b20011032220b450d050b200341003602602003200136025c2003200b360258200341d8006a4100411010c8012003280258200328026022016a220b20032900c801370000200b41086a200341c8016a41086a2900003700002003200141106a2201360260200341d8006a2001411010c8012003280258200328026022016a220b200329008001370000200b41086a20034180016a41086a2900003700002003200141106a220b36026020032802d8012101200341d8006a200b200210c8012003280258220b2003280260220c6a2001200210c9081a2003200c20026a2202360260024020032802dc01450d002001102c0b200b2002200341a0016a10c9020240200328025c450d00200b102c0b200341c8016a4196dec700410910c50120034180016a41f1ddc700410510c501200320043602e801200341d8016a200341e8016a410410c701200341ac016a200341e8016a41046a3602002003200341e0016a3602a4012003200341e8016a3602a8012003200341d8016a3602a001200341d8006a200341a0016a107e2003280260220241206a2201417f4c0d120240024020010d004101210b0c010b20011032220b450d050b200341003602a801200320013602a4012003200b3602a001200341a0016a4100411010c80120032802a00120032802a80122016a220b20032900c801370000200b41086a200341c8016a41086a2900003700002003200141106a22013602a801200341a0016a2001411010c80120032802a00120032802a80122016a220b200329008001370000200b41086a20034180016a41086a2900003700002003200141106a220b3602a80120032802582101200341a0016a200b200210c80120032802a001220b20032802a801220c6a2001200210c9081a2003200c20026a22023602a8010240200328025c450d002001102c0b200341003a00d801200b2002200341d8016a410110a702024020032802a401450d00200b102c0b200341b4016a2005360200200341b0016a2006360200200341003a00b801200320073602ac01200320083602a801200320093602a4012003200a3602a0012004200341a0016a10f902200341043a0028200fa72202450d10200241ffffffff0371450d10200e102c0c100b200341a0016a41206a200241206a290200370300200341a0016a41186a200241186a290200370300200341a0016a41106a200241106a290200370300200341a0016a41086a2201200241086a290200370300200320022902003703a001200341086a200341a0016a10ef0220032802080d06200328020c210a20034180016a41186a2202420037030020034180016a41106a2207420037030020034200370388012003420037038001200341a0016a4196dec700410910c5012003200129000037038801200320032900a00137038001200341a0016a418487c500411e10c50120022001290000370300200720032900a00137030020034180016a412010dc0241ff017122024102460d072002410171450d07200341c8016a4196dec700410910c50120034180016a41f1ddc700410510c5012003200a3602e801200341386a200341e8016a410410c701200341ac016a200341e8016a41046a3602002003200341c0006a3602a4012003200341e8016a3602a8012003200341386a3602a001200341d8006a200341a0016a107e2003280260220241206a2201417f4c0d110240024020010d00410121070c010b200110322207450d040b200341003602a801200320013602a401200320073602a001200341a0016a4100411010c80120032802a00120032802a80122016a220720032900c801370000200741086a200341c8016a41086a2900003700002003200141106a22013602a801200341a0016a2001411010c80120032802a00120032802a80122016a2207200329008001370000200741086a20034180016a41086a2900003700002003200141106a22013602a80120032802582107200341a0016a2001200210c80120032802a001220120032802a80122066a2007200210c9081a2003200620026a22063602a8010240200328025c450d002007102c0b02402001200610dc0241ff017122024102460d002001200610b4010b024020032802a401450d002001102c0b41022002410171200241024622021b210120020d08024020014101710d00200341c8016a4196dec700410910c50120034180016a41bef7c400410710c5012003200a3602e801200341386a200341e8016a410410c701200341ac016a200341e8016a41046a3602002003200341c0006a3602a4012003200341e8016a3602a8012003200341386a3602a001200341d8006a200341a0016a107e2003280260220241206a2201417f4c0d120240024020010d00410121070c010b200110322207450d050b200341003602402003200136023c20032007360238200341386a4100411010c8012003280238200328024022016a220720032900c801370000200741086a200341c8016a41086a2900003700002003200141106a2201360240200341386a2001411010c8012003280238200328024022016a2207200329008001370000200741086a20034180016a41086a2900003700002003200141106a220136024020032802582107200341386a2001200210c80120032802382201200328024022066a2007200210c9081a2003200620026a22023602400240200328025c450d002007102c0b200341a0016a2001200210c901024002400240024020032d00a00122070d0020034198016a200341b9016a29000037030020034190016a200341b1016a290000370300200320032900a101370380012003200341a9016a290000370388010c010b2001200210b40120034180016a41186a2202200341b9016a29000037030020034180016a41106a2206200341b1016a2900003703002003200341a9016a29000037038801200320032900a1013703800120074101460d010b200341f0006a4200370300200341e8006a4200370300200341e0006a4200370300200342003703580c010b200341e0006a200329038801370300200341d8006a41186a2002290300370300200341d8006a41106a200629030037030020032003290380013703580b0240200328023c450d002001102c0b200341d8006a4280a0e5b9c29101420010d902200a10fa02200341043a00d8010c0e0b200341d8016a410310a4050c0b0b200341a0016a41206a200241206a290200370300200341a0016a41186a200241186a290200370300200341a0016a41106a200241106a290200370300200341a0016a41086a2201200241086a290200370300200320022902003703a0010240200341a0016a10da02450d00200341c8016a41026a200341386a41026a2d000022023a0000200320032f003822013b01c801200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c100b20034180016a41186a2202420037030020034180016a41106a2207420037030020034200370388012003420037038001200341a0016a4196dec700410910c5012003200129000037038801200320032900a00137038001200341a0016a418487c500411e10c50120022001290000370300200720032900a001370300200341013a00d80120034180016a4120200341d8016a410110a702200041186a41003a000020004200370308200020032800583600192000411c6a200341db006a280000360000200042003703000c0f0b200341a0016a41206a200241206a290200370300200341a0016a41186a200241186a290200370300200341a0016a41106a200241106a290200370300200341a0016a41086a2201200241086a290200370300200320022902003703a0010240200341a0016a10da02450d00200341c8016a41026a200341386a41026a2d000022023a0000200320032f003822013b01c801200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a0000200042013703000c0f0b20034180016a41186a2202420037030020034180016a41106a2207420037030020034200370388012003420037038001200341a0016a4196dec700410910c5012003200129000037038801200320032900a00137038001200341a0016a418487c500411e10c50120022001290000370300200720032900a001370300200341003a00d80120034180016a4120200341d8016a410110a702200041186a41003a000020004200370308200020032800583600192000411c6a200341db006a280000360000200042003703000c0e0b20012802042101200341a0016a41206a200241206a290200370300200341a0016a41186a200241186a290200370300200341a0016a41106a200241106a290200370300200341a0016a41086a200241086a290200370300200320022902003703a001200341186a200341a0016a10ef0220032802180d06200328021c210a200341c8016a4196dec700410910c50120034180016a41bc87c500410b10c501200320013602d801200341386a200341d8016a410410c701200341ac016a200341d8016a41046a3602002003200341386a41086a3602a4012003200341d8016a3602a8012003200341386a3602a001200341d8006a200341a0016a107e2003280260220241206a2207417f4c0d0e0240024020070d00410121060c010b200710322206450d010b200341003602a801200320073602a401200320063602a001200341a0016a4100411010c80120032802a00120032802a80122076a220620032900c801370000200641086a200341c8016a41086a2900003700002003200741106a22073602a801200341a0016a2007411010c80120032802a00120032802a80122076a2206200329008001370000200641086a20034180016a41086a2900003700002003200741106a22063602a80120032802582107200341a0016a2006200210c80120032802a001220620032802a80122096a2007200210c9081a2003200920026a22023602a8010240200328025c450d002007102c0b200341106a2006200210c6012003280214210720032802102102024020032802a401450d002006102c0b02400240024020024101470d002007200a460d010b200341c8016a4196dec700410910c50120034180016a41bc87c500410b10c5012003200a3602d801200341386a200341d8016a410410c701200341ac016a200341d8016a41046a3602002003200341c0006a3602a4012003200341d8016a3602a8012003200341386a3602a001200341d8006a200341a0016a107e2003280260220241206a2207417f4c0d100240024020070d004101210a0c010b20071032220a450d030b200341003602a801200320073602a4012003200a3602a001200341a0016a4100411010c80120032802a00120032802a80122076a220a20032900c801370000200a41086a200341c8016a41086a2900003700002003200741106a22073602a801200341a0016a2007411010c80120032802a00120032802a80122076a220a200329008001370000200a41086a20034180016a41086a2900003700002003200741106a220a3602a80120032802582107200341a0016a200a200210c80120032802a001220a20032802a80122066a2007200210c9081a2003200620026a22023602a8010240200328025c450d002007102c0b20032001360258200a2002200341d8006a410410a70220032802a401450d01200a102c0c010b200341c8016a4196dec700410910c50120034180016a41bc87c500410b10c501200320013602d801200341386a200341d8016a410410c701200341ac016a200341d8016a41046a3602002003200341c0006a3602a4012003200341d8016a3602a8012003200341386a3602a001200341d8006a200341a0016a107e2003280260220241206a2207417f4c0d0f0240024020070d00410121060c010b200710322206450d020b200341003602a801200320073602a401200320063602a001200341a0016a4100411010c80120032802a00120032802a80122076a220620032900c801370000200641086a200341c8016a41086a2900003700002003200741106a22073602a801200341a0016a2007411010c80120032802a00120032802a80122076a2206200329008001370000200641086a20034180016a41086a2900003700002003200741106a22063602a80120032802582107200341a0016a2006200210c80120032802a001220620032802a80122096a2007200210c9081a2003200920026a22023602a8010240200328025c450d002007102c0b2006200210b401024020032802a401450d002006102c0b200341c8016a4196dec700410910c50120034180016a41f1ddc700410510c5012003200a3602d801200341386a200341d8016a410410c701200341ac016a200341d8016a41046a3602002003200341c0006a3602a4012003200341d8016a3602a8012003200341386a3602a001200341d8006a200341a0016a107e2003280260220241206a2207417f4c0d0f0240024020070d00410121060c010b200710322206450d020b200341003602402003200736023c20032006360238200341386a4100411010c8012003280238200328024022076a220620032900c801370000200641086a200341c8016a41086a2900003700002003200741106a2207360240200341386a2007411010c8012003280238200328024022076a2206200329008001370000200641086a20034180016a41086a2900003700002003200741106a220636024020032802582107200341386a2006200210c80120032802382206200328024022096a2007200210c9081a2003200920026a22093602400240200328025c450d002007102c0b2006200910dc02210b200341c8016a4196dec700410910c50120034180016a41f1ddc700410510c50120032001360228200341d8016a200341286a410410c701200341ac016a200341286a41046a3602002003200341d8016a41086a3602a4012003200341286a3602a8012003200341d8016a3602a001200341d8006a200341a0016a107e2003280260220241206a2207417f4c0d0f0240024020070d00410121040c010b200710322204450d020b200b41ff0171210c200341003602a801200320073602a401200320043602a001200341a0016a4100411010c80120032802a00120032802a80122076a220b20032900c801370000200b41086a200341c8016a41086a2900003700002003200741106a22073602a801200341a0016a2007411010c80120032802a00120032802a80122076a220b200329008001370000200b41086a20034180016a41086a2900003700002003200741106a22073602a8012003280258210b200341a0016a2007200210c80120032802a001220720032802a80122046a200b200210c9081a2003200420026a22023602a8010240200328025c450d00200b102c0b2007200210dc02210b02400240200c4102470d002007200210b4010c010b2003200c3a00d80120072002200341d8016a410110a7020b200b41ff01712102024020032802a401450d002007102c0b0240024020024102470d002006200910b4010c010b200320023a00d80120062009200341d8016a410110a7020b0240200328023c450d002006102c0b200341c8016a4196dec700410910c50120034180016a41bef7c400410710c5012003200a3602d801200341386a200341d8016a410410c701200341ac016a200341d8016a41046a3602002003200341c0006a3602a4012003200341d8016a3602a8012003200341386a3602a001200341d8006a200341a0016a107e2003280260220241206a2207417f4c0d0f0240024020070d004101210a0c010b20071032220a450d020b200341003602e001200320073602dc012003200a3602d801200341d8016a4100411010c80120032802d80120032802e00122076a220a20032900c801370000200a41086a200341c8016a41086a2900003700002003200741106a22073602e001200341d8016a2007411010c80120032802d80120032802e00122076a220a200329008001370000200a41086a20034180016a41086a2900003700002003200741106a22073602e0012003280258210a200341d8016a2007200210c80120032802d801220720032802e00122066a200a200210c9081a2003200620026a22063602e0010240200328025c450d00200a102c0b200341a0016a2007200610c901200341a0016a41096a290000210f200341b1016a2900002110200341b9016a290000211120032900a101211220032d00a001210b200341c8016a4196dec700410910c50120034180016a41bef7c400410710c50120032001360228200341386a200341286a410410c701200341ac016a200341286a41046a3602002003200341386a41086a3602a4012003200341286a3602a8012003200341386a3602a001200341d8006a200341a0016a107e2003280260220241206a220a417f4c0d0f410121090240200a450d00200a10322209450d020b20114200200b41014622011b21112010420020011b2110200f420020011b210f2012420020011b2112200341003602402003200a36023c20032009360238200341386a4100411010c8012003280238200328024022016a220a20032900c801370000200a41086a200341c8016a41086a2900003700002003200141106a2201360240200341386a2001411010c8012003280238200328024022016a220a200329008001370000200a41086a20034180016a41086a2900003700002003200141106a22013602402003280258210a200341386a2001200210c80120032802382201200328024022096a200a200210c9081a2003200920026a22023602400240200328025c450d00200a102c0b200341a0016a2001200210c901200341a9016a220a2900002113200341b1016a22092900002114200341b9016a220b290000211520032900a101211620032d00a001210c200b201137000020092010370000200a200f370000200320123700a101200341013a00a0012003200341a0016a410172220436025820012002200341d8006a10cc0120154200200c41014622021b210f2014420020021b21102013420020021b21112016420020021b21120240200328023c450d002001102c0b200a201137000020092010370000200b200f370000200320123700a101200341013a00a0012003200436025820072006200341d8006a10cc0120032802dc01450d002007102c0b4200210f20004200370308200020032800a001360019200041186a41003a00002000411c6a200341a3016a2800003600000c070b1039000b200341286a410710a4050c090b200341286a410110a4050c080b200341023a00d8010c050b200341d8016a410610a4050c030b200341d8016a200110a4050c020b200341a0016a41026a200341e8016a41026a2d000022023a0000200320032f00e80122013b01a001200041206a41023a0000200041186a41003a000020004200370308200020013b0021200041236a20023a00004201210f0b2000200f3703000c050b20032d00d8014104460d0120032902dc01210f0b20032802d80121022000200f370024200041206a2002360000200041186a41003a000020004200370308200042013703000c030b2000420037030820002003280028360019200041186a41003a00002000411c6a2003412b6a280000360000200042003703000c020b02402006450d002007450d002007102c0b02402009450d00200a450d00200a102c0b20032d00284104460d00200328022821022000200329022c370024200041206a2002360000200041186a41003a000020004200370308200042013703000c010b2000420037030820002003280021360019200041186a41003a00002000411c6a200341246a280000360000200042003703000b200341f0016a24000f0b103b000bf80a030d7f017e017f230041e0006b22022400200141146a2802002103200141106a280200210420012d00182105200128020c2106200128020821072001280204210820012802002109200241186a22014200370300200241106a220a4200370300200241086a220b420037030020024200370300200241c0006a41f1ddc700410510c501200b200241c0006a41086a220c29000037030020022002290040370300200241c0006a41f481c100410d10c5012001200c290000370300200a2002290040370300200241306a2002412010b90302400240024002400240024002402002280230220d0d004100210120024100360258200242043703504100210b4100210e0c010b20022002290234220f3702542002200d36025041002101024002400240200f422088a7220e0e020201000b41002101200e210b03402001200b410176220c20016a2210200d20104102746a28020020004b1b2101200b200c6b220b41014b0d000b0b4101210b200d20014102746a280200220c2000460d03200e2001200c2000496a2201490d040b200e200fa7220b470d010b200241d0006a200b10d2042002280250210d0b200d20014102746a220b41046a200b200e20016b41027410ca081a200b20003602002002200e41016a3602584100210b0b200241306a41086a200241d0006a41086a28020036020020022002290350220f37033002400240200fa722010d00200241186a4200370300200241106a4200370300200241086a2201420037030020024200370300200241c0006a41f1ddc700410510c5012001200241c0006a41086a220c29000037030020022002290040370300200241c0006a41f481c100410d10c501200a41086a200c290000370000200a20022900403700002002412010b4010c010b200241186a4200370300200241106a4200370300200241086a220c420037030020024200370300200241c0006a41f1ddc700410510c501200c200241c0006a41086a221029000037030020022002290040370300200241c0006a41f481c100410d10c501200a41086a2010290000370000200a200229004037000020024120200241306a10d104200228023441ffffffff0371450d002001102c0b024002400240200b0d00200241306a41f1ddc700410510c501200241c0006a41a482c100411410c5012002200036025c200241206a200241dc006a410410c7012002410c6a200241dc006a41046a3602002002200241286a3602042002200241dc006a3602082002200241206a360200200241d0006a2002107e2002280258220141206a220b417f4c0d0402400240200b0d004101210c0c010b200b1032220c450d060b200241003602282002200b3602242002200c360220200241206a4100411010c80120022802202002280228220b6a220c2002290030370000200c41086a200241306a41086a2900003700002002200b41106a220b360228200241206a200b411010c80120022802202002280228220b6a220c2002290040370000200c41086a200241c0006a41086a2900003700002002200b41106a220c3602282002280250210b200241206a200c200110c8012002280220220c200228022822106a200b200110c9081a2002201020016a221036022802402002280254450d00200b102c0b200241003602082002420137030020092007200210bb0120062003200210bb01200220022802084101102f200228020022012002280208220b6a20053a00002002200b41016a220b360208200c20102001200b10a70202402002280204450d002001102c0b02402002280224450d00200c102c0b02402008450d002009450d002009102c0b2004450d0220060d010c020b02402008450d002009450d002009102c0b2004450d012006450d010b2006102c0b200241e0006a24000f0b2001200e1044000b103b000b1039000bf61e03087f017e047f230041f0006b22012400200141206a22024200370300200141186a22034200370300200141086a41086a2204420037030020014200370308200141286a41f1ddc700410510c5012004200141286a41086a220529000037030020012001290028370308200141386a41f481c100410d10c5012002200141386a41086a220629000037030020032001290038370300200141386a200141086a412010b90320012802382207410420071b210802400240024002400240024002400240024002400240200129023c420020071b2209422088a7220a0e020401000b41002107200a210b03402007200b410176220c20076a220d2008200d4102746a28020020004b1b2107200b200c6b220b41014b0d000c020b0b4100210720082802002000470d020c010b200820074102746a2802002000470d012007200a490d002007200a1047000b200820074102746a220b200b41046a2007417f73200a6a41027410ca081a200141286a41f1ddc700410510c501200141386a41a482c100411410c5012001200036024c200141d0006a200141cc006a410410c701200141146a200141cc006a41046a3602002001200141d8006a36020c2001200141cc006a3602102001200141d0006a360208200141e0006a200141086a107e2001280268220741206a220b417f4c0d0102400240200b0d004101210c0c010b200b1032220c450d030b200141003602102001200b36020c2001200c360208200141086a4100411010c80120012802082001280210220b6a220c2001290028370000200c41086a200141286a41086a2900003700002001200b41106a220b360210200141086a200b411010c80120012802082001280210220b6a220c2001290038370000200c41086a200141386a41086a2900003700002001200b41106a220c3602102001280260210b200141086a200c200710c8012001280208220c2001280210220d6a200b200710c9081a2001200d20076a220736021002402001280264450d00200b102c0b200c200710b4010240200128020c450d00200c102c0b20094280808080707c21090b200120083602602001200937026420024200370300200342003703002004420037030020014200370308200141286a41f1ddc700410510c5012004200529000037030020012001290028370308200141386a41f481c100410d10c501200341086a200629000037000020032001290038370000200141086a4120200141e0006a10d1040240200942ffffffff0383500d002008102c0b200141206a4200370300200141186a4200370300200141086a41086a2207420037030020014200370308200141286a41f1ddc700410510c5012007200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141e0006a200141086a412010b9030240024002400240200128026022080d004100210720014100360258200142043703504100210b410021040c010b20012001290264220937025420012008360250410021070240024002402009422088a722040e020201000b410021072004210b03402007200b410176220c20076a220d2008200d4102746a28020020004b1b2107200b200c6b220b41014b0d000b0b200820074102746a280200220b2000460d0320042007200b2000496a2207490d060b20042009a7220b470d010b200141d0006a200b10d204200128025021080b200820074102746a220b41046a200b200420076b41027410ca081a200b20003602002001200441016a3602580b200141e0006a41086a200141d0006a41086a280200360200200120012903502209370360024002402009a722070d00200141206a4200370300200141186a4200370300200141086a41086a2207420037030020014200370308200141286a41f1ddc700410510c5012007200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141086a412010b4010c010b200141206a4200370300200141186a4200370300200141086a41086a220b420037030020014200370308200141286a41f1ddc700410510c501200b200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141086a4120200141e0006a10d104200128026441ffffffff0371450d002007102c0b200141206a4200370300200141186a4200370300200141086a41086a2207420037030020014200370308200141286a4181dec700410310c5012007200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141e0006a200141086a412010b9030240024002400240200128026022080d004100210720014100360258200142043703504100210b410021040c010b20012001290264220937025420012008360250410021070240024002402009422088a722040e020201000b410021072004210b03402007200b410176220c20076a220d2008200d4102746a28020020004b1b2107200b200c6b220b41014b0d000b0b200820074102746a280200220b2000460d0320042007200b2000496a2207490d070b20042009a7220b470d010b200141d0006a200b10d204200128025021080b200820074102746a220b41046a200b200420076b41027410ca081a200b20003602002001200441016a3602580b200141e0006a41086a200141d0006a41086a280200360200200120012903502209370360024002402009a722070d00200141206a4200370300200141186a4200370300200141086a41086a2207420037030020014200370308200141286a4181dec700410310c5012007200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141086a412010b4010c010b200141206a4200370300200141186a4200370300200141086a41086a220b420037030020014200370308200141286a4181dec700410310c501200b200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141086a4120200141e0006a10d104200128026441ffffffff0371450d002007102c0b200141206a4200370300200141186a4200370300200141086a41086a2207420037030020014200370308200141286a4184dec700410310c5012007200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141e0006a200141086a412010b9030240024002400240200128026022080d004100210720014100360258200142043703504100210b410021040c010b20012001290264220937025420012008360250410021070240024002402009422088a722040e020201000b410021072004210b03402007200b410176220c20076a220d2008200d4102746a28020020004b1b2107200b200c6b220b41014b0d000b0b200820074102746a280200220b2000460d0320042007200b2000496a2207490d080b20042009a7220b470d010b200141d0006a200b10d204200128025021080b200820074102746a220b41046a200b200420076b41027410ca081a200b20003602002001200441016a3602580b200141e0006a41086a200141d0006a41086a280200360200200120012903502209370360024002402009a722070d00200141206a4200370300200141186a4200370300200141086a41086a2207420037030020014200370308200141286a4184dec700410310c5012007200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141086a412010b4010c010b200141206a4200370300200141186a4200370300200141086a41086a220b420037030020014200370308200141286a4184dec700410310c501200b200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141086a4120200141e0006a10d104200128026441ffffffff0371450d002007102c0b200141206a4200370300200141186a4200370300200141086a41086a2207420037030020014200370308200141286a4187dec700410410c5012007200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141e0006a200141086a412010b9030240024002400240200128026022080d004100210720014100360258200142043703504100210b410021040c010b20012001290264220937025420012008360250410021070240024002402009422088a722040e020201000b410021072004210b03402007200b410176220c20076a220d2008200d4102746a28020020004b1b2107200b200c6b220b41014b0d000b0b200820074102746a280200220b2000460d0320042007200b2000496a2207490d090b20042009a7220b470d010b200141d0006a200b10d204200128025021080b200820074102746a220b41046a200b200420076b41027410ca081a200b20003602002001200441016a3602580b200141e0006a41086a200141d0006a41086a280200360200200120012903502209370360024002402009a722000d00200141206a4200370300200141186a4200370300200141086a41086a2200420037030020014200370308200141286a4187dec700410410c5012000200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141086a412010b4010c010b200141206a4200370300200141186a4200370300200141086a41086a2207420037030020014200370308200141286a4187dec700410410c5012007200141286a41086a29000037030020012001290028370308200141386a41d893c600410d10c501200341086a200141386a41086a29000037000020032001290038370000200141086a4120200141e0006a10d104200128026441ffffffff0371450d002000102c0b200141f0006a24000f0b103b000b1039000b200720041044000b200720041044000b200720041044000b200720041044000bde0503047f017e027f230041e0006b22012400200141186a22024200370300200141106a22034200370300200141086a420037030020014200370300200141f1ddc700410510c501200141c0006a41c4fec000410a10c5012002200141c0006a41086a29000037030020032001290040370300200141c0006a2001412010b90320012802402203410420031b2104410021020240024002400240024002402001290244420020031b2205422088a722030e020201000b41002102034020022003410176220620026a2207200420074102746a28020020004b1b2102200320066b220341014b0d000b0b41012103200420024102746a2802002000460d010b200141306a41f1ddc700410510c501200141c0006a41e8fec000410b10c5012001200036025c200141206a200141dc006a410410c7012001410c6a200141dc006a41046a3602002001200141206a41086a3602042001200141dc006a3602082001200141206a360200200141d0006a2001107e2001280258220241206a2206417f4c0d010240024020060d00410121070c010b200610322207450d030b41002103200141003602282001200636022420012007360220200141206a4100411010c8012001280220200128022822066a22072001290030370000200741086a200141306a41086a2900003700002001200641106a2206360228200141206a2006411010c8012001280220200128022822066a22072001290040370000200741086a200141c0006a41086a2900003700002001200641106a220736022820012802502106200141206a2007200210c80120012802202207200128022822006a2006200210c9081a2001200020026a220236022802402001280254450d002006102c0b20012007200210b301024020012802002202450d00410121032001280204450d002002102c0b2001280224450d002007102c0b02402005a72202450d00200241ffffffff0371450d002004102c0b200141e0006a240020030f0b103b000b1039000b960401027f0240024002400240024002400240024020002d00000e0700010203040506070b200041046a2802002000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041106a280200200041186a28020010c402200041146a2802002201450d0620002802102200450d0620014188026c450d062000102c0f0b200041046a2802002000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041106a280200200041186a28020010c402200041146a2802002201450d0520002802102200450d0520014188026c450d052000102c0f0b200041046a2802002000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041106a280200200041186a28020010c402200041146a2802002201450d0420002802102200450d0420014188026c450d042000102c0f0b200041046a2802002000410c6a28020010c302200041086a2802002201450d0320002802042200450d0320014198026c450d032000102c0f0b200041086a2802002201450d02200041046a2802002200450d022001450d022000102c0f0b200041086a10a201200041046a220028020010c5022000280200102c0f0b200041086a10a201200041046a220028020010c5022000280200102c0b0bb10502067f047e230041106b2203240002400240200241c4006c41046a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b2000200436020420002005360200200041086a2204410036020020002002108f0102402002450d00200241c4006c210203400240024020012d00004101460d00200020042802004101102f2000280200200428020022056a41003a00002004200541016a2205360200200141046a2802002106200020054104102f2000280200200428020022056a20063600002004200541046a3602000c010b200020042802004101102f2000280200200428020022056a41013a00002004200541016a360200412010322205450d042003422037020420032005360200200341004120102f20032802002206200328020822076a2205200141016a290000370000200541086a200141096a290000370000200541106a200141116a290000370000200541186a200141196a2900003700002003200741206a2205360208200020042802002005102f200028020020042802006a2006200510c9081a2004200428020020056a36020020032802042205200820051b210802402005450d002008450d002006102c0b0240200141216a2d00004101460d00200020042802004101102f2000280200200428020022056a41003a00002004200541016a3602000c010b200020042802004101102f2000280200200428020022056a41013a00002004200541016a2205360200200020054120102f2001413a6a2900002109200141326a290000210a2001412a6a290000210b200141226a290000210c20042004280200220541206a360200200520002802006a2205200c370000200541086a200b370000200541106a200a370000200541186a20093700000b200141c4006a2101200241bc7f6a22020d000b0b200341106a24000f0b103b000b1039000b9539040c7f027e027f077e230041c0026b2201240020014100360210200142043703080240024002402000410c6a28020041246c2202450d002000280204210341042104410021050340024020032d00004101470d00200341106a2802002206417f4c0d04200341016a2800002107200341086a28020021080240024020060d00410121090c010b200610322209450d040b20014100360280012001200636027c20012009360278200141f8006a4100200610c80120012802782209200128028001220a6a2008200610c9081a20012007360260200128027c2108200141f8006a41086a220b200141306a41086a290200370300200120073602182001200128006336001b20012001290230370378200a20066a210702402005200128020c470d00200141086a2005410110f20120012802102105200128020821040b2004200541246c6a220641013a00002001280218210a200128001b210c200620073602102006200836020c20062009360208200641046a200c3600002006200a360001200620012903783702142006411c6a200b2903003702002001200541016a22053602100b200341246a21032002415c6a22020d000b0b200141306a41186a22064200370300200141306a41106a22034200370300200141306a41086a2205420037030020014200370330200141d0006a41c1dcc700410610c5012005200141d0006a41086a29000037030020012001290050370330200141e0006a41c0d0c600411210c5012006200141e0006a41086a220529000037030020032001290060370300200141203602b4022001200141306a3602b002200141e0006a200141306a412010b30102400240200128026022060d00410221050c010b2001280264210a20012005280200360254200120063602502001200141d0006a1087022001280204210802400240024020012802000d00200141f8006a200141d0006a108a02200128027822020d010b20014100360220200142013703182001410f3602742001200141b0026a3602702001200141186a3602bc022001418c016a41013602002001420137027c200141b4bcc3003602782001200141f0006a36028801200141bc026a41dcb7c000200141f8006a103e1a200135022042208620013502188410000240200128021c450d002001280218102c0b410221050c010b20014180016a2802002109200128027c2107410121050b200a450d002006102c0b200141b0016a41002902ecde47370300200141a8016a41002902e4de47370300200141f8006a41286a41002902dcde47370300200141f8006a41206a41002902d4de47370300200141f8006a41186a41002902ccde47370300200141f8006a41106a41002902c4de47370300200141f8006a41086a41002902bcde47370300200141002902b4de473703780240024020054102460d004101210602402008410a490d0041002106024020094106470d000240200128027c22062002470d00410121060c010b20062002410610cc084521060b200641017321060b02402007450d002002450d002002102c0b20060d00200141f8006a10ff024200210d0c010b200141246a200141f8006a41086a2903003702002001410a3602182001200129037837021c200141c8006a4200370300200141c0006a4200370300200141306a41086a2206420037030020014200370330200141d0006a41c1dcc700410610c5012006200141d0006a41086a29000037030020012001290050370330200141e0006a41c0d0c600411210c501200341086a200141e0006a41086a290000370000200320012900603700002001410036026820014201370360200141283a0070200141e0006a41004101102f2001280260200128026822066a20012d00703a00002001200641016a360268200141e0006a200141186a410472108003200141306a412020012802602206200128026810a70202402001280264450d002006102c0b0240200128021c450d00200141246a280200450d00200141206a280200102c0b4200210e20014190016a2206420037030020014188016a22094200370300200141f8006a41086a2205420037030020014200370378200141186a41c1dcc700410610c5012005200141186a41086a29000037030020012001290018370378200141306a4180d1c600411510c5012006200141306a41086a2900003703002009200129003037030002400240200141f8006a412010dc0241ff017122064102460d0020064101710d010b200141186a41c1dcc700410610c501200141306a41acc8c700410710c501412010322206450d022001422037025420012006360250200141d0006a4100411010c8012001280250200128025822066a22052001290018370000200541086a200141186a41086a2900003700002001200641106a2206360258200141d0006a2006411010c80120012802502205200128025822066a22022001290030370000200241086a200141306a41086a2900003700002001200641106a22063602582006417f4c0d030240024020060d00410121020c010b200610322202450d030b200141003602682001200636026420012002360260200141e0006a4100200610c80120012802602202200128026822076a2005200610c9081a2001200720066a2206360268200141f8006a2002200610b20102402001280278450d0020012802782106200141b0016a2104200141a0016a210f20014190016a211003400240024020012802582202200129027c220e422088a722054b0d00200128025022072006460d0120072006200210cc08450d010b200ea7450d022006450d022006102c0c020b2006450d0102402001280264450d002001280260102c0b2001200e37026420012006360260200120053602b402200120063602b002200141186a2006200510b3010240024002400240024020012802182206450d00200128021c2107024002400240200128022022084104490d002006280000210a200141003a007020084104460d002008417b6a4110490d002008416b6a4110490d002008415b6a4110490d002008414b6a410f4b0d010b20014100360238200142013703302001410f3602742001200141b0026a3602702001200141306a3602bc022001410136028c012001420137027c200141b4bcc3003602782001200141f0006a36028801200141bc026a41dcb7c000200141f8006a103e1a2001350238422086200135023084100002402001280234450d002001280230102c0b410021080c010b20062d0004210c2006410d6a29000021112006290005210d2006413d6a29000021122006412d6a29000021132006411d6a290000211420062900352115200629002521162006290015211741012108200a210b0b02402007450d002006102c0b2008450d00200520026b2206410f4b0d0141002802d8d248450d0220014126360234200141e59ec00036023041002802d4d248210641002802d0d248210541002802dcd248210220014180013602b801200142df808080103703b0012001419e9fc0003602ac01200142133702a4012001418b9fc0003602a00120014201370398012001420137038801200141b4b5c8003602840120014113360280012001418b9fc00036027c2001410136027820014104360274200641e0a3c000200241024622021b28021021062001200141f0006a360294012001200141306a360270200541f8a3c00020021b200141f8006a20061103000c020b41002802d8d248450d032001412b360234200141f8eac60036023041002802d4d248210641002802d0d248210541002802dcd2482102200141af013602b801200142f0808080103703b001200141eeebc6003602ac01200142263702a401200141c8ebc6003602a00120014201370398012001420137038801200141b4b5c800360284012001412636028001200141c8ebc60036027c2001410136027820014104360274200641e0a3c000200241024622021b28021021062001200141f0006a360294012001200141306a360270200541f8a3c00020021b200141f8006a20061103000c030b200641706a41204f0d010b41002802d8d248450d0120014125360234200141a3ebc60036023041002802d4d248210641002802d0d248210541002802dcd2482102200141b8013602b801200142f0808080103703b001200141eeebc6003602ac01200142263702a401200141c8ebc6003602a00120014201370398012001420137038801200141b4b5c800360284012001412636028001200141c8ebc60036027c2001410136027820014104360274200641e0a3c000200241024622021b28021021062001200141f0006a360294012001200141306a360270200541f8a3c00020021b200141f8006a20061103000c010b20042012370300200f201337030020102014370300200120153703a801200120163703980120012017370388012001200d3703782001200b3602b80120012011370380012001200c41ff01713602bc0120012802602001280268200141f8006a1081030b200141f8006a2001280260200128026810b201200128027822060d000b0b02402001280264450d002001280260102c0b02402001280254450d002001280250102c0b20014190016a420037030020014188016a4200370300200141f8006a41086a2206420037030020014200370378200141186a41c1dcc700410610c5012006200141186a41086a29000037030020012001290018370378200141306a4180d1c600411510c501200941086a200141306a41086a29000037000020092001290030370000200141013a0070200141f8006a4120200141f0006a410110a702200141f8006a109b01200129038001210e0b200141d0006a41c1dcc700410610c501200141e0006a41c8edc600411410c50120032001290060370000200341086a2206200141e0006a41086a2205290000370000200141f8006a41086a2202200141d0006a41086a2207290000370300200141f8006a41106a2208200141306a41106a2209290300370300200141f8006a41186a220a200141306a41186a220b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a41afdec700410410c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a419fdec700411010c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a41004108411b108203200141d0006a4196dec700410910c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a41004108411b108203200141d0006a418bdec700410b10c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410041084100108203200141d0006a4187dec700410410c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410041084100108203200141d0006a4184dec700410310c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410041084100108203200141d0006a4181dec700410310c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410041084100108203200141d0006a41f6ddc700410b10c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410041084100108203200141d0006a41f1ddc700410510c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410041084100108203200141d0006a41e8ddc700410910c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410041084100108203200141d0006a41d7ddc700411110c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410041084100108203200141d0006a41ceddc700410910c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410041084100108203200141d0006a41b7ddc700411710c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410041084100108203200141d0006a41a7ddc700411010c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410041084100108203200141d0006a4195ddc700411210c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a418dddc700410810c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a4186ddc700410710c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a41ffdcc700410710c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a41f5dcc700410a10c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a41eddcc700410810c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a41e6dcc700410710c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a41dcdcc700410a10c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a41dce2c700411210c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a41d4dcc700410810c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a41de96c800410710c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a41cbdcc700410910c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203200141d0006a41c7dcc700410410c501200141e0006a41c8edc600411410c50120032001290060370000200620052900003700002002200729000037030020082009290300370300200a200b29030037030020012001290050370378200141f8006a410241004100108203427f200e4280b892b70a7c220d200d200e541b210d0b2000280200200041106a200041d0006a200141086a410110830320002802001084032111200141f8006a109b01200129037821174200210e200141306a41186a4200370300200141306a41106a4200370300200141306a41086a2206420037030020014200370330200141d0006a41c1dcc700410610c5012006200141d0006a41086a29000037030020012001290050370330200141e0006a41c4ccc600410b10c501200341086a200141e0006a41086a29000037000020032001290060370000200141f8006a200141306a108503200141f8006a41186a2903002116200129037821142006200141f8006a41106a29030037030020012001290380013703300240024020144201510d00200141186a41086a4200370300200142003703180c010b200141186a41086a2006290300370300200120012903303703182016210e0b200141f8006a41106a200141186a41086a290300370300200141f8006a41186a427f200e427f427f200d20117c22112011200d541b220d20177c22112011200d541b7c220d200d200e541b370300200120012903183703800120014201370378200141306a41186a22054200370300200141306a41106a22024200370300200141306a41086a2206420037030020014200370330200141d0006a41c1dcc700410610c5012006200141d0006a41086a220729000037030020012001290050370330200141e0006a41c4ccc600410b10c501200341086a2208200141e0006a41086a220929000037000020032001290060370000200141306a200141f8006a41086a10860320054200370300200242003703002006420037030020014200370330200141d0006a41c1dcc700410610c5012006200729000037030020012001290050370330200141e0006a41b0d1c600410e10c5012008200929000037000020032001290060370000200141306a41004100108703200141086a102b200141c0026a24000f0b1039000b103b000b8e0101027f02402000280200450d00200041086a2802002201450d0020002802042202450d002001450d002002102c0b02402000280210450d00200041186a2802002201450d00200041146a2802002202450d002001450d002002102c0b0240200028022c450d00200041346a2802002201450d00200041306a2802002200450d002001410c6c450d002000102c0b0b900401047f230041106b2202240020012802042103024002400240024020012802004101470d002001410c6a280200220141046a2204417f4c0d0202400240024002400240024020040d002002410036020820022004360204200241013602000c010b200410322205450d08200241003602082002200436020420022005360200200141c000490d01200141808001490d022001418080808004490d030b200241004101102f2002280200200228020822046a41033a00002002200441016a2204360208200220044104102f2002280200200228020822046a2001360000200441046a21040c030b200241004101102f2002280200200228020822046a20014102743a0000200441016a21040c020b200241004102102f2002280200200228020822046a20014102744101723b0000200441026a21040c010b200241004104102f2002280200200228020822046a2001410274410272360000200441046a21040b20022004360208200220042001102f20022802002204200228020822056a2003200110c9081a2002200520016a22013602080c010b20022003200141086a28020010980120022802002104200228020821010b2000200041086a22032802002001102f200028020020032802006a2004200110c9081a2003200328020020016a360200024020044100200228020422001b2201450d002000450d002001102c0b200241106a24000f0b103b000b1039000ba30101037f230041106b22032400200341003602082003420137030020022802402104200341004104102f2003280200200328020822056a20043600002003200541046a220436020820022802442105200320044104102f2003280200200328020822046a20053600002003200441046a360208200320021087052000200120032802002202200328020810a70202402003280204450d002002102c0b200341106a24000bb00101027f230041106b220424002004410036020820044201370300200441004102102f2004280200200428020822056a20013b00002004200541026a2201360208200420014101102f2004280200200428020822016a20023a00002004200141016a2202360208200420024101102f20042802002202200428020822016a20033a00002004200141016a2203360208200041202002200310a70202402004280204450d002002102c0b200441106a24000bef0d01077f230041e0006b22052400200541186a22064200370300200541106a22074200370300200541086a2208420037030020054200370300200541386a41c1dcc700410610c5012008200541386a41086a220929000037030020052005290038370300200541386a41b0d1c600410e10c5012006200929000037030020072005290038370300200541022005108703200541003602004186a4c60041102005410410a70220064200370300200742003703002008420037030020054200370300200541386a41c1dcc700410610c5012008200929000037030020052005290038370300200541386a4196a4c600410610c50120062009290000370300200720052900383703002005200036023820054120200541386a410410a70220064200370300200742003703002008420037030020054200370300200541386a41c1dcc700410610c5012008200929000037030020052005290038370300200541386a419ca4c600410610c5012006200929000037030020072005290038370300024002402003280208220841246c41046a2209417f4c0d00200328020021060240024020090d00410121030c010b200910322203450d020b200541003602302005200936022c20052003360228200541286a2008108f010240024020080d002005280228210a200528023021030c010b200841246c210b200528023021030340200541386a200610840220052802382109200541286a200320052802402208102f2005280228220a200528023022036a2009200810c9081a2005200320086a22033602300240200528023c450d002009102c0b200641246a2106200b415c6a220b0d000b0b20054120200a200310a7020240200528022c450d00200a102c0b20052001360228200541186a4200370300200541106a4200370300200541086a2206420037030020054200370300200541386a41c1dcc700410610c5012006200541386a41086a220829000037030020052005290038370300200541386a41a2a4c600410a10c501200741086a20082900003700002007200529003837000020054120200541286a10cc0120052001360224200541286a41c1dcc700410610c501200541386a41fda3c600410910c50120052000417f6a360254200541d8006a200541d4006a410410c7012005410c6a200541d4006a41046a3602002005200541d8006a41086a3602042005200541d4006a3602082005200541d8006a360200200541c8006a2005107e2005280250220641206a2208417f4c0d000240024020080d00410121090c010b200810322209450d020b20054100360208200520083602042005200936020020054100411010c8012005280200200528020822086a22092005290028370000200941086a200541286a41086a2900003700002005200841106a220836020820052008411010c8012005280200200528020822086a22092005290038370000200941086a200541386a41086a2900003700002005200841106a22093602082005280248210820052009200610c80120052802002209200528020822036a2008200610c9081a2005200320066a22063602080240200528024c450d002008102c0b20092006200541246a10cc0102402005280204450d002009102c0b20052002360228200541186a22094200370300200541106a22034200370300200541086a2206420037030020054200370300200541386a41c1dcc700410610c5012006200541386a41086a220829000037030020052005290038370300200541386a41aca4c600410e10c501200741086a220b20082900003700002007200529003837000020054120200541286a10cc0120094200370300200342003703002006420037030020054200370300200541386a41c1dcc700410610c5012006200829000037030020052005290038370300200541386a41c4ccc600410b10c501200b2008290000370000200720052900383700002005412010b40102402004450d0020094200370300200342003703002006420037030020054200370300200541386a41c1dcc700410610c5012006200829000037030020052005290038370300200541386a41baa4c600410610c501200b2008290000370000200720052900383700002005412010b40120094200370300200342003703002006420037030020054200370300200541386a41c1dcc700410610c5012006200829000037030020052005290038370300200541386a4190cfc600410a10c501200b2008290000370000200720052900383700002005412010b40120094200370300200342003703002006420037030020054200370300200541386a41c1dcc700410610c5012006200829000037030020052005290038370300200541386a41c0a4c600410b10c501200b20082900003700002007200529003837000020054120109d040b200541e0006a24000f0b103b000b1039000bd5e201060a7f027e087f017e2f7f057e230041f0096b22012400200141306a10e007024002400240024002400240024002400240200128023822020d00200141003602380c010b200241057441606a41057641016a21034100210420012802302205210602400340200628020020004b0d01200641206a21062003200441016a2204470d000b200321040b0240024020022004490d0041002107200141003602382005200441057422086a21090240024020040d00200521060c010b4100210341002107024003402007210a200c210b200e210d2010210f0240200520036a220641046a28020022070d00200f2110200d210e200b210c200a21070c020b2006411c6a2802002111200641186a2802002112200641146a2802002110200641106a280200210e200641086a290200210c0240200a450d000240200ba72213450d00201341ffffff3f71450d00200a102c0b200f450d00200d450d00200f41ffffff3f71450d00200d102c0b2008200341206a2203470d000b0b200641206a21060b20062009460d0103400240200641046a280200220d0d00200641206a21060c030b200641146a2802002103200641106a280200210a0240200641086a280200220f450d00200f41ffffff3f71450d00200d102c0b200641206a210602402003450d00200a450d00200341ffffff3f71450d00200a102c0b20092006470d000c020b0b2004200241d089c500104f000b200220046b2108024020062009460d002006280204220a450d00200941606a21090340200641146a2802002103200641106a280200210f0240200641086a280200220d450d00200a450d00200d41ffffff3f71450d00200a102c0b02402003450d00200f450d00200341ffffff3f71450d00200f102c0b20092006460d01200641246a2103200641206a21062003280200220a0d000b0b02402008450d0002402004450d002005200520044105746a200841057410ca081a0b200120083602380b2007450d004200210b20014180066a41186a2206420037030020014180066a41106a220d420037030020014180066a41086a220442003703002001420037038006200141e0056a41ac95c400410d10c5012004200141e0056a41086a290000370300200120012900e00537038006200141f0056a41c695c400410c10c5012006200141f0056a41086a220a290000370300200d20012900f005370300200141c0026a20014180066a10f5022001280298032103200141b8066a41086a2205200141c0026a41086a290300370300200141b8066a41106a2209200141c0026a41106a290300370300200141b8066a41186a2208200141c0026a41186a290300370300200141b8066a41206a2214200141c0026a41206a290300370300200a200141fc026a280200360200200120012903c0023703b806200120012902f4023703f00520012903e802211520012802f002210f2004200141c0036a290300370300200d200141c8036a2903003703002006200141d0036a29030037030020014180066a41206a2216200141d8036a29030037030020014180066a41286a2217200141e0036a29030037030020014180066a41306a2218200141e8036a2903003703002001200141b8036a29030037038006200128029c0321130240024020034102470d0041002102200141f8006a41086a410036020020014188016a41086a420037030020014188016a41106a420037030020014188016a41186a420037030020014188016a41206a4200370300200141c0006a41086a4200370300200141c0006a41106a4200370300200141c0006a41186a4200370300200141c0006a41206a4200370300200141c0006a41286a4200370300200141c0006a41306a420037030020014200370378200142003703880120014200370340410121194100211a4100211b4100211c4100211d4100211e4100210f4100211f41002120410121214101212241012123410021030c010b200141b4036a2802002102200141b0036a280200211a200141ac036a280200211b200141a8036a280200211c200141a4036a2802002119200141a0036a280200211f20012802940321202001280290032121200128028c0321222001280288032123200128028403211d200128028003211e20014188016a41206a201429030037030020014188016a41186a200829030037030020014188016a41106a200929030037030020014188016a41086a2005290300370300200141f8006a41086a200a280200360200200141c0006a41086a2004290300370300200141c0006a41106a200d290300370300200141c0006a41186a2006290300370300200141c0006a41206a2016290300370300200141c0006a41286a2017290300370300200141c0006a41306a2018290300370300200120012903b80637038801200120012903f00537037820012001290380063703402015210b0b200141d0016a41186a4200370300200141d0016a41106a4200370300200141d0016a41086a4200370300200142003703d001410510322206450d01200142053702bc06200120063602b806200141b8066a4100410510c80120012802b80620012802c00622066a220441002800e4ee46360000200441046a41002d00e8ee463a00002001200641056a22063602c006200141b8066a2006412010c801200141e0066a41186a22064200370300200141e0066a41106a22144200370300200141e0066a41086a22044200370300200142003703e006200141e0056a41c7dcc700410410c5012004200141e0056a41086a290000370300200120012900e0053703e006200141f0056a418cd7c500410a10c5012006200141f0056a41086a290000370300201420012900f005370300200141c0026a200141e0066a10860520012d00c002210620014180066a41186a200141d9026a29000037030020014180066a41106a200141d1026a29000037030020014180066a41086a200141c9026a290000370300200120012900c102370380060240024020064101460d00200141b8076a4200370300200141b0076a4200370300200141a8076a4200370300200142003703a0070c010b200141a0076a41186a20014180066a41186a290300370300200141a0076a41106a20014180066a41106a290300370300200141a0076a41086a20014180066a41086a29030037030020012001290380063703a0070b200141b8066a20012802c006412010c80120012802b806220420012802c006220a6a220620012903a007370000200641086a200141a0076a41086a290300370000200641106a200141a0076a41106a290300370000200641186a200141a0076a41186a2903003700002001200a41206a22063602c00620014180066a20042006109a01200141c0026a41186a220620014180066a41186a290300370300200141c0026a41106a220a20014180066a41106a290300370300200141c0026a41086a220520014180066a41086a29030037030020012001290380063703c002024020012802bc06450d002004102c0b200141b0016a41086a2005290300370300200141b0016a41106a200a290300370300200141b0016a41186a2006290300370300200120012903c0023703b001200141e0066a41186a4200370300200141e0066a41106a4200370300200141e0066a41086a22064200370300200142003703e006200141e0056a41ac95c400410d10c5012006200141e0056a41086a290000370300200120012900e0053703e006200141f0056a41b995c400410d10c501201441086a200141f0056a41086a290000370000201420012900f005370000200141c0026a200141e0066a10f5020240200128029803220841024622040d00200141e0066a412010b4010b200141b8066a41086a2216200141c0026a41086a2217290300370300200141b8066a41106a2218200141c0026a41106a2224290300370300200141b8066a41186a2225200141c0026a41186a2226290300370300200141b8066a41206a2227200141c0026a41206a2228290300370300200141f0056a41086a220a200141fc026a2229280200360200200120012903c0023703b806200120012902f4023703f00520012903e802211520012802f002212a20014180066a41086a2206200141c0036a222b29030037030020014180066a41106a2205200141c8036a222c29030037030020014180066a41186a2209200141d0036a222d29030037030020014180066a41206a222e200141d8036a222f29030037030020014180066a41286a2230200141e0036a223129030037030020014180066a41306a2232200141e8036a22332903003703002001200141b8036a29030037038006024020040d00200141b4036a2802002104200141b0036a2802002134200141ac036a2802002135200141a8036a2802002136200141a4036a2802002137200141a0036a2802002138200128029c032139200128029403213a200128029003213b200128028c03213c200128028803213d200128028403213e200128028003213f200141d0016a41206a22402027290300370300200141d0016a41186a22272025290300370300200141d0016a41106a22252018290300370300200141d0016a41086a2218201629030037030020014198026a41086a2216200a280200360200200141a0076a41086a22412006290300370300200141a0076a41106a22422005290300370300200141a0076a41186a22432009290300370300200141a0076a41206a2244202e290300370300200141a0076a41286a222e2030290300370300200141a0076a41306a22302032290300370300200120012903b8063703d001200120012903f0053703980220012001290380063703a00720282040290300370300202620272903003703002024202529030037030020172018290300370300202920162802003602002001419c036a2039360200200120012903d0013703c0022001202a3602f002200120153703e80220012001290398023702f402200120043602b403200120343602b003200120353602ac03200120363602a803200120373602a403200120383602a00320012008360298032001203a360294032001203b360290032001203c36028c032001203d360288032001203e360284032001203f36028003203320302903003703002031202e290300370300202f2044290300370300202d2043290300370300202c2042290300370300202b2041290300370300200120012903a0073703b8032009420037030020054200370300200642003703002001420037038006200141e0056a41ac95c400410d10c5012006200141e0056a41086a290000370300200120012900e00537038006200141f0056a41c695c400410c10c501200d41086a200a290000370000200d20012900f005370000200141003602c006200142013703b806200141c0026a200141b8066a10d50620014180066a412020012802b80620012802c00610a70220012802bc06450d0020012802b806102c0b4200211520014180066a41186a220a420037030020014180066a41106a2205420037030020014180066a41086a220642003703002001420037038006200141e0056a41ac95c400410d10c5012006200141e0056a41086a290000370300200120012900e00537038006200141f0056a41c695c400410c10c501200d41086a200141f0056a41086a2209290000370000200d20012900f005370000200141c0026a20014180066a10f5022001280298032104200141b8066a41086a222e200141c0026a41086a290300370300200141b8066a41106a222f200141c0026a41106a290300370300200141b8066a41186a2230200141c0026a41186a290300370300200141b8066a41206a2231200141c0026a41206a2903003703002009200141fc026a280200360200200120012903c0023703b806200120012902f4023703f00520012903e802214520012802f00221082006200141c0036a2903003703002005200141c8036a290300370300200a200141d0036a29030037030020014180066a41206a2232200141d8036a29030037030020014180066a41286a2233200141e0036a29030037030020014180066a41306a2234200141e8036a2903003703002001200141b8036a29030037038006200128029c0321160240024020044102470d004100211720014188026a41086a410036020020014198026a41086a420037030020014198026a41106a420037030020014198026a41186a420037030020014198026a41206a4200370300200141d0016a41086a4200370300200141d0016a41106a4200370300200141d0016a41186a4200370300200141d0016a41206a4200370300200141d0016a41286a4200370300200141d0016a41306a420037030020014200370388022001420037039802200142003703d00141012118410021244100212541002126410021274100212841002108410021294100212a4101212b4101212c4101212d410021040c010b200141b4036a2802002117200141b0036a2802002124200141ac036a2802002125200141a8036a2802002126200141a4036a2802002118200141a0036a2802002129200128029403212a200128029003212b200128028c03212c200128028803212d2001280284032127200128028003212820014198026a41206a203129030037030020014198026a41186a203029030037030020014198026a41106a202f29030037030020014198026a41086a202e29030037030020014188026a41086a2009280200360200200141d0016a41086a2006290300370300200141d0016a41106a2005290300370300200141d0016a41186a200a290300370300200141d0016a41206a2032290300370300200141d0016a41286a2033290300370300200141d0016a41306a2034290300370300200120012903b80637039802200120012903f0053703880220012001290380063703d001204521150b200141c0026a41206a20014188016a41206a290300370300200141c0026a41186a20014188016a41186a290300370300200141c0026a41106a20014188016a41106a290300370300200141c0026a41086a20014188016a41086a290300370300200141fc026a200141f8006a41086a2802003602002001419c036a201336020020012001290388013703c0022001200f3602f0022001200b3703e802200120012903783702f402200120023602b4032001201a3602b0032001201b3602ac032001201c3602a803200120193602a4032001201f3602a0032001200336029803200120203602940320012021360290032001202236028c0320012023360288032001201d360284032001201e36028003200141a4056a200c370200200141b0056a2010360200200141b4056a2012360200200141e8036a200141c0006a41306a290300370300200141e0036a200141c0006a41286a290300370300200141d8036a200141c0006a41206a290300370300200141d0036a200141c0006a41186a290300370300200141c8036a200141c0006a41106a290300370300200141c0036a200141c0006a41086a290300370300200120073602a0052001200e3602ac05200120012903403703b803200141a0046a200836020020014198046a2015370300200141e4046a2017360200200141e0046a2024360200200141dc046a2025360200200141d8046a2026360200200141d4046a2018360200200141d0046a2029360200200141cc046a2016360200200141c8046a2004360200200141c4046a202a360200200141c0046a202b360200200141bc046a202c360200200141b8046a202d360200200141b4046a2027360200200141b0046a202836020020014190046a20014198026a41206a29030037030020014188046a20014198026a41186a29030037030020014180046a20014198026a41106a290300370300200141f8036a20014198026a41086a290300370300200141a4046a200129038802370200200141ac046a20014188026a41086a28020036020020012001290398023703f00320014198056a200141d0016a41306a29030037030020014190056a200141d0016a41286a29030037030020014188056a200141d0016a41206a29030037030020014180056a200141d0016a41186a290300370300200141f8046a200141d0016a41106a290300370300200141f0046a200141d0016a41086a290300370300200141e8046a20012903d001370300200141d4056a200141b0016a41186a290300370200200141cc056a200141b0016a41106a290300370200200141c4056a200141b0016a41086a290300370200200120012903b0013702bc05200120113602b80520014180066a41186a420037030020014180066a41106a420037030020014180066a41086a220642003703002001420037038006200141e0056a41c1dcc700410610c5012006200141e0056a41086a290000370300200120012900e00537038006200141f0056a4196a4c600410610c501200d41086a200141f0056a41086a290000370000200d20012900f005370000200141286a20014180066a412010c601200128022c21072001280228210a200141a0076a41186a22064200370300200141a0076a41106a221b4200370300200141a0076a41086a22044200370300200142003703a007200141b8066a41f1ddc700410510c5012004200141b8066a41086a2203290000370300200120012900b8063703a007200141b8066a41c4fec000410a10c50120062003290000370300201b20012900b80637030020014180066a200141a0076a412010b9030240024020012802800622060d00200141003602d809200142043703d0090c010b20012001290284063702d409200120063602d0090b42002115200141b8076a4200370300200141b0076a4200370300200141a0076a41086a22064200370300200142003703a007200141b8066a41f1ddc700410510c5012006200141b8066a41086a2204290000370300200120012900b8063703a007200141b8066a41d893c600410d10c501201b41086a2004290000370000201b20012900b80637000020014180066a200141a0076a412010b9030240024020012802800622020d00410421020c010b200141a0076a412010b40120012902840621150b02402015422088a72206450d0020074100200a1b2108200220064102746a2113200141e0066a41046a210e200141b8066a41086a210f20012802d809211220012802d00921102002210503402005280200210a0240024002400240024020120e020301000b4100210620122104034020062004410176220320066a2207200a201020074102746a280200491b2106200420036b220441014b0d000b200a201020064102746a280200470d02201220064b0d01200620121047000b41002106200a2010280200470d010b201020064102746a2204200441046a20122006417f736a41027410ca081a20012012417f6a22123602d8090c010b200141e0056a41f1ddc700410510c501200141f0056a41e8fec000410b10c5012001200a3602e006200141b8066a200141e0066a410410c7012001200e3602ac072001200f3602a4072001200141e0066a3602a8072001200141b8066a3602a00720014180066a200141a0076a107e200128028806220641206a2204417f4c0d050240024020040d00410121030c010b200410322203450d050b200141003602a807200120043602a407200120033602a007200141a0076a4100411010c80120012802a00720012802a80722046a220320012900e005370000200341086a200141e0056a41086a2900003700002001200441106a22043602a807200141a0076a2004411010c80120012802a00720012802a80722046a220320012900f005370000200341086a200141f0056a41086a2900003700002001200441106a22033602a8072001280280062104200141a0076a2003200610c80120012802a007220320012802a80722076a2004200610c9081a2001200720066a22063602a8070240200128028406450d002004102c0b2003200610b40120012802a407450d002003102c0b200141e0056a41f1ddc700410510c501200141f0056a418cffc000410510c5012001200a3602e006200141b8066a200141e0066a410410c7012001200e3602ac072001200f3602a4072001200141e0066a3602a8072001200141b8066a3602a00720014180066a200141a0076a107e200128028806220641206a2204417f4c0d040240024020040d00410121030c010b200410322203450d040b200141003602a807200120043602a407200120033602a007200141a0076a4100411010c80120012802a00720012802a80722036a220420012900e005370000200441086a200141e0056a41086a22042900003700002001200341106a22033602a807200141a0076a2003411010c80120012802a00720012802a80722076a220320012900f005370000200341086a200141f0056a41086a22032900003700002001200741106a22093602a8072001280280062107200141a0076a2009200610c80120012802a007220920012802a80722116a2007200610c9081a2001201120066a22063602a8070240200128028406450d002007102c0b2009200610b401024020012802a407450d002009102c0b200141e0056a41f1ddc700410510c501200141f0056a4191f6c000411210c5012001200a3602e006200141b8066a200141e0066a410410c7012001200e3602ac072001200f3602a4072001200141e0066a3602a8072001200141b8066a3602a00720014180066a200141a0076a107e200128028806220641206a2207417f4c0d040240024020070d00410121090c010b200710322209450d040b200141003602a807200120073602a407200120093602a007200141a0076a4100411010c80120012802a00720012802a80722076a220920012900e005370000200941086a20042900003700002001200741106a22073602a807200141a0076a2007411010c80120012802a00720012802a80722076a220920012900f005370000200941086a20032900003700002001200741106a22093602a8072001280280062107200141a0076a2009200610c80120012802a007220920012802a80722116a2007200610c9081a2001201120066a22063602a8070240200128028406450d002007102c0b2009200610b401024020012802a407450d002009102c0b200141e0056a41f1ddc700410510c501200141f0056a41d081c100410a10c5012001200a3602e006200141b8066a200141e0066a410410c7012001200e3602ac072001200f3602a4072001200141e0066a3602a8072001200141b8066a3602a00720014180066a200141a0076a107e200128028806220641206a2207417f4c0d040240024020070d00410121090c010b200710322209450d040b200141003602a807200120073602a407200120093602a007200141a0076a4100411010c80120012802a00720012802a80722076a220920012900e005370000200941086a20042900003700002001200741106a22073602a807200141a0076a2007411010c80120012802a00720012802a80722076a220920012900f005370000200941086a20032900003700002001200741106a22093602a8072001280280062107200141a0076a2009200610c80120012802a007220920012802a80722116a2007200610c9081a2001201120066a22063602a8070240200128028406450d002007102c0b2009200610b401024020012802a407450d002009102c0b200141e0056a41f1ddc700410510c501200141f0056a41acffc000410b10c5012001200a3602e006200141b8066a200141e0066a410410c7012001200e3602ac072001200f3602a4072001200141e0066a3602a8072001200141b8066a3602a00720014180066a200141a0076a107e200128028806220641206a2207417f4c0d040240024020070d00410121090c010b200710322209450d040b200141003602c006200120073602bc06200120093602b806200141b8066a4100411010c80120012802b80620012802c00622076a220920012900e005370000200941086a20042900003700002001200741106a22043602c006200141b8066a2004411010c80120012802b80620012802c00622046a220720012900f005370000200741086a20032900003700002001200441106a22043602c0062001280280062103200141b8066a2004200610c80120012802b806220420012802c00622076a2003200610c9081a2001200720066a22073602c0060240200128028406450d002003102c0b200141a0076a2004200710b803024020012802a0072206450d002004200710b4010b20012902a407210b024020012802bc06450d002004102c0b200541046a2105200b200c20061b210c02402006450d002001200c3702a407200120063602a007200a20082008200141a0076a10ba031a0b20052013470d000b0b02402015a72206450d00200641ffffffff0371450d002002102c0b4200210c200141b8076a4200370300200141b0076a4200370300200141a0076a41086a22064200370300200142003703a007200141b8066a41f1ddc700410510c5012006200141b8066a41086a2204290000370300200120012900b8063703a007200141b8066a41f481c100410d10c501201b41086a2004290000370000201b20012900b80637000020014180066a200141a0076a412010b90302400240200128028006221d0d004104211d0c010b200141a0076a412010b401200129028406210c0b02400240200c422088a72206450d00201d20064102746a211320014190076a41046a2112200141e0096a41086a2111200141e0096a41046a211c200141b8066a41086a210f200141b9076a211a200141ec066a2102201d210e0340200e2802002103200141e0056a41f1ddc700410510c501200141f0056a41a482c100411410c5012001200336029007200141e0096a20014190076a410410c701200120123602ac07200120113602a407200120014190076a3602a8072001200141e0096a3602a00720014180066a200141a0076a107e200128028806220641206a2204417f4c0d050240024020040d00410121070c010b200410322207450d050b200141003602e809200120043602e409200120073602e009200141e0096a4100411010c80120012802e00920012802e80922046a220720012900e005370000200741086a200141e0056a41086a22052900003700002001200441106a22043602e809200141e0096a2004411010c80120012802e00920012802e80922046a220720012900f005370000200741086a200141f0056a41086a22092900003700002001200441106a22043602e8092001280280062107200141e0096a2004200610c80120012802e009220420012802e809220a6a2007200610c9081a2001200a20066a22063602e8090240200128028406450d002007102c0b20012006360284072001200436028007200141f0056a2004200610b3010240024020012802f00522070d00410221070c010b20012802f4052110200120012802f8053602e405200120073602e005200141a0076a200141e0056a10c9030240024020012d00b807220a4102470d00200141003602880620014201370380062001410f36029407200120014180076a36029007200120014180066a36029c07200141013602b407200142013702a407200141b4bcc3003602a007200120014190076a3602b0072001419c076a41dcb7c000200141a0076a103e1a200135028806422086200135028006841000200128028406450d01200128028006102c0c010b20014180066a41106a200141a0076a41106a29030037030020014180066a41086a200141a0076a41086a2903003703002001418c076a41026a201a41026a2d000022083a000020014190076a41026a20083a0000200120012903a007370380062001201a2f000022083b018c07200120083b0190070b02402010450d002007102c0b41022107200a4102460d002004200610b401200a21070b200141a0076a41086a220a20014180066a41086a290300370300200141a0076a41106a221020014180066a41106a2903003703002001418c076a41026a20014190076a41026a2d00003a000020012001290380063703a007200120012f0190073b018c070240200741024622060d00200141b8066a41106a2010290300370300200f200a290300370300200120012903a0073703b8060b024020012802e409450d002004102c0b024020060d00200141e0066a41106a200141b8066a41106a290300370300200141e0066a41086a2219200f290300370300200120012903b8063703e0060240024020070d00200141e0056a41f1ddc700410510c501200141f0056a41e8fec000410b10c501200120033602e009200141b8066a200141e0096a410410c7012001201c3602ac072001200f3602a4072001200141e0096a3602a8072001200141b8066a3602a00720014180066a200141a0076a107e200128028806220641206a2204417f4c0d080240024020040d00410121070c010b200410322207450d080b200141003602a807200120043602a407200120073602a007200141a0076a4100411010c80120012802a00720012802a80722046a220720012900e005370000200741086a20052900003700002001200441106a22043602a807200141a0076a2004411010c80120012802a00720012802a80722046a220720012900f005370000200741086a20092900003700002001200441106a22073602a8072001280280062104200141a0076a2007200610c80120012802a007220720012802a807220a6a2004200610c9081a2001200a20066a22063602a8070240200128028406450d002004102c0b2007200641c4b5c800410010a70220012802a407450d012007102c0c010b4100210620012802d009211002400240024020012802d80922080e020201000b4100210620082104034020062004410176220720066a220a20032010200a4102746a280200491b2106200420076b220441014b0d000b0b2003201020064102746a2802002204460d0120082006200320044b6a2206490d050b0240200820012802d409470d00200141d0096a200810d20420012802d00921100b201020064102746a220441046a2004200820066b41027410ca081a200420033602002001200841016a3602d8090b200f2019280200360200200120012903e0063703b806200141e0056a41f1ddc700410510c501200141f0056a418cffc000410510c5012001200336029007200141e0096a20014190076a410410c701200120123602ac07200120113602a407200120014190076a3602a8072001200141e0096a3602a00720014180066a200141a0076a107e200128028806220641206a2204417f4c0d060240024020040d00410121070c010b200410322207450d060b200141003602a807200120043602a407200120073602a007200141a0076a4100411010c80120012802a00720012802a80722046a220720012900e005370000200741086a20052900003700002001200441106a22043602a807200141a0076a2004411010c80120012802a00720012802a80722046a220720012900f005370000200741086a20092900003700002001200441106a22073602a8072001280280062104200141a0076a2007200610c80120012802a007220720012802a807220a6a2004200610c9081a2001200a20066a22063602a8070240200128028406450d002004102c0b20072006200141b8066a108a03024020012802a407450d002007102c0b024020012802bc06450d0020012802b806102c0b200f200241086a280200360200200120022902003703b806200141e0056a41f1ddc700410510c501200141f0056a41acffc000410b10c5012001200336029007200141e0096a20014190076a410410c701200120123602ac07200120113602a407200120014190076a3602a8072001200141e0096a3602a00720014180066a200141a0076a107e200128028806220641206a2204417f4c0d060240024020040d00410121030c010b200410322203450d060b200141003602a807200120043602a407200120033602a007200141a0076a4100411010c80120012802a00720012802a80722046a220320012900e005370000200341086a20052900003700002001200441106a22043602a807200141a0076a2004411010c80120012802a00720012802a80722046a220320012900f005370000200341086a20092900003700002001200441106a22033602a8072001280280062104200141a0076a2003200610c80120012802a007220320012802a80722076a2004200610c9081a2001200720066a22063602a8070240200128028406450d002004102c0b20032006200141b8066a108a03024020012802a407450d002003102c0b20012802bc06450d0020012802b806102c0b200e41046a220e2013470d000b0b0240200ca72206450d00200641ffffffff0371450d00201d102c0b0240024020012802d0092206450d00200120012902d409220c3702a407200120063602a007200141f8066a4200370300200141f0066a4200370300200141e0066a41086a22044200370300200142003703e006200141b8066a41f1ddc700410510c5012004200141b8066a41086a2203290000370300200120012900b8063703e006200141b8066a41c4fec000410a10c501201441086a2003290000370000201420012900b806370000200141e0066a200141a0076a108a05200c42ffffffff0383500d012006102c0c010b200141b8076a4200370300200141b0076a4200370300200141a0076a41086a22064200370300200142003703a007200141b8066a41f1ddc700410510c5012006200141b8066a41086a2204290000370300200120012900b8063703a007200141b8066a41c4fec000410a10c501201b41086a2004290000370000201b20012900b806370000200141a0076a412010b4010b200141c0026a10ff07200141e0056a41968dc700410d10c501200141f0056a41bc92c700411e10c501412010322206450d022001422037028406200120063602800620014180066a4100411010c80120012802800620012802880622066a220420012900e005370000200441086a200141e0056a41086a2900003700002001200641106a22063602880620014180066a2006411010c801200128028006220320012802880622066a220420012900f005370000200441086a200141f0056a41086a2900003700002001200641106a2206360288062006417f4c0d034101210402402006450d00200610322204450d030b200141003602a807200120063602a407200120043602a007200141a0076a4100200610c80120012802a00720012802a80722046a2003200610c9081a200141b4076a20014180066a41086a2203280200360200200141013a00bc07200141173602b807200141b8066a41186a220720012903b80737030020012001290380063702ac07200141b8066a41106a200141a0076a41106a290300220c3703002001200420066a3602a807200141b8066a41086a20012903a807220b370300200120012903a00722153703b80620014180066a41106a200c3703002003200b37030020014180066a41186a20072903003703002001201537038006200141a0076a20014180066a10b701024020012802a4072207450d00034020012802cc07210920012802c807210520012802c007211220012802bc07211020012802b807210320012802b407210e20012802b007210a20012802a807210f024020012802ac072206450d002006410c6c21042007210603400240200641046a280200450d002006280200102c0b2006410c6a2106200441746a22040d000b0b0240200f450d002007450d00200f410c6c450d002007102c0b02402003450d0020034104742104200a41046a210603400240200641046a280200450d002006280200102c0b200641106a2106200441706a22040d000b0b0240200e450d00200a450d00200e41ffffffff0071450d00200a102c0b02402010450d002012450d002010102c0b02402009450d002005450d002005102c0b200141a0076a20014180066a10b70120012802a40722070d000b0b0240200128028406450d00200128028006102c0b024020014190066a280200450d00200128028c06102c0b200141e0056a41968dc700410d10c501200141f0056a41a38dc700411310c501412010322206450d022001422037028406200120063602800620014180066a4100411010c80120012802800620012802880622066a220420012900e005370000200441086a200141e0056a41086a2900003700002001200641106a22063602880620014180066a2006411010c801200128028006220320012802880622066a220420012900f005370000200441086a200141f0056a41086a2900003700002001200641106a2206360288062006417f4c0d034101210402402006450d00200610322204450d030b200141003602a807200120063602a407200120043602a007200141a0076a4100200610c80120012802a00720012802a80722046a2003200610c9081a200141b4076a20014180066a41086a2203280200360200200141013a00bc07200141163602b807200141b8066a41186a220720012903b80737030020012001290380063702ac07200141b8066a41106a200141a0076a41106a290300220c3703002001200420066a3602a807200141b8066a41086a20012903a807220b370300200120012903a00722153703b80620014180066a41106a200c3703002003200b37030020014180066a41186a20072903003703002001201537038006200141a0076a20014180066a10b90103400240200128028c0922060d000240200128028406450d00200128028006102c0b024020014190066a280200450d00200128028c06102c0b200141e0056a41968dc700410d10c501200141f0056a418091c700411510c501412010322206450d04200142203702bc06200120063602b806200141b8066a4100411010c80120012802b80620012802c00622066a220420012900e005370000200441086a200141e0056a41086a2900003700002001200641106a22063602c006200141b8066a2006411010c80120012802b806220320012802c00622066a220420012900f005370000200441086a200141f0056a41086a2900003700002001200641106a22063602c0062006417f4c0d054101210402402006450d00200610322204450d050b200141003602a807200120063602a407200120043602a007200141a0076a4100200610c80120012802a00720012802a80722046a2003200610c9081a200141b4076a200141b8066a41086a280200360200200141013a00bc07200141183602b80720014180066a41186a220320012903b807370300200120012903b8063702ac0720014180066a41106a200141a0076a41106a2207290300220c3703002001200420066a3602a80720014180066a41086a20012903a807220b370300200120012903a0072215370380062007200c370300200141a0076a41086a200b370300200141a0076a41186a2003290300370300200120153703a007200141b8066a200141a0076a10b101024002400340024020012802bc0622060d00024020012802a407450d0020012802a007102c0b200141a0056a21100240200141b0076a280200450d0020012802ac07102c0b200141b8066a201010b90720012802b806220e450d0220012902bc06210c200141f8066a4200370300200141f0066a4200370300200141e0066a41086a22064200370300200142003703e006200141e0056a41968dc700410d10c5012006200141e0056a41086a290000370300200120012900e0053703e006200141f0056a418893c700410a10c501201441086a200141f0056a41086a290000370000201420012900f005370000200c422088a722064105744104722204417f4c0d09200410322203450d08200141003602a807200120043602a407200120033602a007200141a0076a2006108f010240024020060d0020012802a007210a20012802a80721040c010b2006410574210320012802a8072104200e21060340200141a0076a20044120102f20012802a007220a20012802a80722076a22042006290000370000200441086a200641086a290000370000200441106a200641106a290000370000200441186a200641186a2900003700002001200741206a22043602a807200641206a2106200341606a22030d000b0b200141e0066a4120200a200410a702024020012802a407450d00200a102c0b200ca72206450d03200641ffffff3f71450d03200e102c0c030b024020012802c406450d002006450d002006102c0b200141b8066a200141a0076a10b1010c000b0b20014198066a420037030020014190066a420037030020014180066a41086a220642003703002001420037038006200141e0056a41968dc700410d10c5012006200141e0056a41086a290000370300200120012900e00537038006200141f0056a418893c700410a10c501200d41086a200141f0056a41086a290000370000200d20012900f00537000020014180066a412010b4010b20012802b8052104200141e0066a41186a4200370300200141e0066a41106a4200370300200141e0066a41086a22064200370300200142003703e006200141e0056a41968dc700410d10c5012006200141e0056a41086a2203290000370300200120012900e0053703e006200141f0056a41bc93c700411310c501201441086a200141f0056a41086a2206290000370000201420012900f005370000200120043602a007200141e0066a4120200141a0076a410410a70220014180066a41186a2207420037030020014180066a41106a220a420037030020014180066a41086a220442003703002001420037038006200141e0056a41ac95c400410d10c50120042003290000370300200120012900e00537038006200141f0056a41c695c400410c10c501200d41086a220e2006290000370000200d20012900f005370000200141a0076a20014180066a10f50220012802f807210f200141b8066a41086a200141a0076a41086a290300370300200141b8066a41106a200141a0076a41106a290300370300200141b8066a41186a200141a0076a41186a290300370300200141b8066a41206a200141a0076a41206a2903003703002006200141dc076a280200360200200120012903a0073703b806200120012902d4073703f00520014180086a280200211c20014184086a280200210520014194086a280200210920014190086a28020021122001418c086a280200211120014188086a280200210820012802e0072113200141b0066a200141c8086a290300370300200141a8066a200141c0086a29030037030020014180066a41206a200141b8086a2903003703002007200141b0086a29030037030020074200370300200a4200370300200442003703002001420037038006200141e0056a41f1ddc700410510c50120042003290000370300200120012900e00537038006200141f0056a41c4fec000410a10c501200e2006290000370000200d20012900f005370000200141a0076a20014180066a412010b9030240024020012802a00722060d004100211a0c010b20012902a407220c422088a7211a200ca72204450d00200441ffffffff0371450d002006102c0b200f4102462104200141d0096a201010b907200141e0096a108906200141a0076a41186a220f4200370300200141a0076a41106a22024200370300200141a0076a41086a22074200370300200142003703a00720014180066a4189bec300410f10c501200720014180066a41086a220629000037030020012001290080063703a00720014180066a41a0c0c300411410c501201b41086a22192006290000370000201b200129008006370000200141203602e4052001200141a0076a3602e005200141e0066a200141a0076a412010b3010240024020012802e006220a0d00410021030c010b20012802e40621102001200141e0066a41086a2802003602f4052001200a3602f00520014180066a200141f0056a1080050240024020012802800622030d0041002103200141003602c006200142013703b8062001410f360294072001200141e0056a360290072001200141b8066a3602800720014194066a41013602002001420137028406200141b4bcc30036028006200120014190076a3602900620014180076a41dcb7c00020014180066a103e1a20013502c00642208620013502b806841000024020012802bc06450d0020012802b806102c0b0c010b200129028406210b0b2010450d00200a102c0b4100201320041b21134100200820041b21084100201120041b21114100201220041b210e4100200920041b21094101200520041b210520014180066a41186a420037030020014180066a41106a4200370300200642003703002001420037038006200141e0056a41bee8c700410d10c5012006200141e0056a41086a290000370300200120012900e00537038006200141f0056a41dcecc700410f10c501200d41086a200141f0056a41086a290000370000200d20012900f005370000200141a0076a20014180066a10e90420012802a007210a20012902a407210c20012802b8052110200f42003703002002420037030020074200370300200142003703a00720014180066a4189bec300410f10c5012007200629000037030020012001290080063703a00720014180066a41f0c0c300411510c50120192006290000370000201b200129008006370000200141206a200141a0076a412010c601200b420020031b210b200c4200200a1b210c2003410120031b2107200a4104200a1b210a02400240024002402001280224410020012802201b2203450d00200321060c010b41002106200141a0076a4100109e0520012802a007450d01200141a0076a10f8050b02402006410020104100201c20041b6b2204200420104b1b22042003200420034b1b22034f0d000340200141a0076a200610a10520012802a007220420012802a80710b401200641016a2106024020012802a407450d002004102c0b20032006470d000b0b200141f8066a4200370300200141f0066a4200370300200141e0066a41086a22064200370300200142003703e006200141b8066a4189bec300410f10c5012006200141b8066a41086a2204290000370300200120012900b8063703e006200141b8066a41f0c0c300411510c501201441086a2004290000370000201420012900b806370000200120033602a007200141e0066a4120200141a0076a410410a7020c010b200141f8066a4200370300200141f0066a4200370300200141e0066a41086a22064200370300200142003703e006200141a0076a4189bec300410f10c5012006200141a0076a41086a2204290000370300200120012900a0073703e006200141a0076a41f0c0c300411510c501201441086a2004290000370000201420012900a007370000200120103602a007200141e0066a4120200141a0076a410410a7020b200141c8076a200c370300200141bc076a200b370200200141a0076a41086a2204200141d0096a41086a280200360200200141b4076a220f200141e0096a41086a280200360200200120012903d0093703a007200120012903e0093702ac072001200e3602e407200120053602e007200120083602dc07200120093602d807200120113602d4072001200a3602c407200120073602b80720012013201a6a3602d007200141b8066a201010a10520012802c006211020012802b806210a2001410036028806200142013703800620012802a007210620014180066a20042802002204108f0102402004450d00200441057421032001280288062104034020014180066a20044120102f20012802800620012802880622076a22042006290000370000200441086a200641086a290000370000200441106a200641106a290000370000200441186a200641186a2900003700002001200741206a220436028806200641206a2106200341606a22030d000b0b20012802ac07210620014180066a200f2802002204108f0102402004450d00200441057421032001280288062104034020014180066a20044120102f20012802800620012802880622076a22042006290000370000200441086a200641086a290000370000200441106a200641106a290000370000200441186a200641186a2900003700002001200741206a220436028806200641206a2106200341606a22030d000b0b20012802b807210620014180066a200141a0076a41206a2802002204108f0102402004450d00200441057421032001280288062104034020014180066a20044120102f20012802800620012802880622076a22042006290000370000200441086a200641086a290000370000200441106a200641106a290000370000200441186a200641186a2900003700002001200741206a220436028806200641206a2106200341606a22030d000b0b20012802c407210620014180066a200141cc076a2802002204108f0102402004450d0020062004410c6c6a210403402006280200200641086a28020020014180066a10d5032006410c6a22062004470d000b0b20012802d007210620014180066a2001280288064104102f2001280280062001280288066a2006360000200120012802880641046a22063602880620012802d407210420014180066a20064104102f2001280280062001280288066a2004360000200120012802880641046a22063602880620012802d807210420014180066a20064104102f2001280280062001280288066a2004360000200120012802880641046a22063602880620012802dc07210420014180066a20064104102f2001280280062001280288066a2004360000200120012802880641046a22063602880620012802e007210420014180066a20064104102f2001280280062001280288066a2004360000200120012802880641046a22063602880620014180066a20064104102f2001280280062001280288066a200e360000200120012802880641046a220636028806200a2010200128028006200610a7020240200128028406450d00200128028006102c0b024020012802bc06450d00200a102c0b200141a0076a10f8054200210c20014198066a420037030020014190066a420037030020014180066a41086a220642003703002001420037038006200141b8066a4181dec700410310c5012006200141b8066a41086a2204290000370300200120012900b80637038006200141b8066a41d893c600410d10c501200d41086a2004290000370000200d20012900b806370000200141a0076a20014180066a412010b9030240024020012802a00722110d00410421110c010b20014180066a412010b40120012902a407210c0b0240200c422088a72206450d0020064102742110200141b8066a41046a210e200141e0096a41086a210f20112103034020032802002107200141e0056a4181dec700410310c501200141f0056a41a4bfc000411510c501200120073602b806200141e0096a200141b8066a410410c7012001200e3602ac072001200f3602a4072001200141b8066a3602a8072001200141e0096a3602a00720014180066a200141a0076a107e200128028806220641206a2204417f4c0d070240024020040d004101210a0c010b20041032220a450d070b200141003602a807200120043602a4072001200a3602a007200141a0076a4100411010c80120012802a00720012802a80722046a220a20012900e005370000200a41086a200141e0056a41086a22052900003700002001200441106a22043602a807200141a0076a2004411010c80120012802a00720012802a80722046a220a20012900f005370000200a41086a200141f0056a41086a22092900003700002001200441106a220a3602a8072001280280062104200141a0076a200a200610c80120012802a007220a20012802a80722126a2004200610c9081a2001201220066a22063602a8070240200128028406450d002004102c0b200a200610b401024020012802a407450d00200a102c0b200141e0056a4181dec700410310c501200141f0056a4198c2c000411910c501200120073602b806200141e0096a200141b8066a410410c7012001200e3602ac072001200f3602a4072001200141b8066a3602a8072001200141e0096a3602a00720014180066a200141a0076a107e200128028806220641206a2204417f4c0d070240024020040d00410121070c010b200410322207450d070b200141003602a807200120043602a407200120073602a007200141a0076a4100411010c80120012802a00720012802a80722046a220720012900e005370000200741086a20052900003700002001200441106a22043602a807200141a0076a2004411010c80120012802a00720012802a80722046a220720012900f005370000200741086a20092900003700002001200441106a22073602a8072001280280062104200141a0076a2007200610c80120012802a007220720012802a807220a6a2004200610c9081a2001200a20066a22063602a8070240200128028406450d002004102c0b2007200610b401024020012802a407450d002007102c0b200341046a21032010417c6a22100d000b0b0240200ca72206450d00200641ffffffff0371450d002011102c0b4200210b20014198066a420037030020014190066a420037030020014180066a41086a220642003703002001420037038006200141b8066a4184dec700410310c5012006200141b8066a41086a2204290000370300200120012900b80637038006200141b8066a41d893c600410d10c501200d41086a2004290000370000200d20012900b806370000200141a0076a20014180066a412010b9030240024020012802a007221a0d004104211a0c010b20014180066a412010b40120012902a407210b0b0240200b422088a72206450d00201a20064102746a2119200141b8066a41046a2108200141e0096a41086a211320014198066a2105201a210903402009280200210a200141e0056a4184dec700410310c501200141f0056a41f494c600411610c5012001200a3602b806200141e0096a200141b8066a410410c701200120083602ac07200120133602a4072001200141b8066a3602a8072001200141e0096a3602a00720014180066a200141a0076a107e200128028806220641206a2204417f4c0d070240024020040d00410121030c010b200410322203450d070b200141003602a807200120043602a407200120033602a007200141a0076a4100411010c80120012802a00720012802a80722046a220320012900e005370000200341086a200141e0056a41086a22072900003700002001200441106a22043602a807200141a0076a2004411010c80120012802a00720012802a80722046a220320012900f005370000200341086a200141f0056a41086a22102900003700002001200441106a22033602a8072001280280062104200141a0076a2003200610c80120012802a007220320012802a807220e6a2004200610c9081a2001200e20066a22063602a8070240200128028406450d002004102c0b2003200610b401024020012802a407450d002003102c0b200141e0056a4184dec700410310c501200141f0056a418894c600411310c5012001200a3602b806200141e0096a200141b8066a410410c701200120083602ac07200120133602a4072001200141b8066a3602a8072001200141e0096a3602a00720014180066a200141a0076a107e200128028806220641206a2204417f4c0d070240024020040d00410121030c010b200410322203450d070b200141003602a807200120043602a407200120033602a007200141a0076a4100411010c80120012802a00720012802a80722046a220320012900e005370000200341086a20072900003700002001200441106a22043602a807200141a0076a2004411010c80120012802a00720012802a80722046a220320012900f005370000200341086a20102900003700002001200441106a22033602a8072001280280062104200141a0076a2003200610c80120012802a007220320012802a80722076a2004200610c9081a2001200720066a22063602a8070240200128028406450d002004102c0b2003200610b401024020012802a407450d002003102c0b2005420037030020014180066a41106a2212420037030020014180066a41086a220e42003703002001420037038006200141b8066a4184dec700410310c501200e200141b8066a41086a220f290000370300200120012900b80637038006200141b8066a41fc95c600410d10c501200d41086a2211200f290000370000200d20012900b806370000200141a0076a20014180066a412010b90320012802a0072206410420061b2110024002400240024020012902a407420020061b220c422088a722020e020300010b41002106200a2010280200470d020c010b4100210620022104034020062004410176220320066a2207200a201020074102746a280200491b2106200420036b220441014b0d000b200a201020064102746a280200470d0120062002490d00200620021047000b201020064102746a2204200441046a2006417f7320026a41027410ca081a200c4280808080707c210c0b200120103602a0072001200c3702a4072005420037030020124200370300200e42003703002001420037038006200141b8066a4184dec700410310c501200e200f290000370300200120012900b80637038006200141b8066a41fc95c600410d10c5012011200f290000370000200d20012900b80637000020014180066a4120200141a0076a10d1040240200c42ffffffff0383500d002010102c0b200941046a21092005420037030020124200370300200e42003703002001420037038006200141b8066a4184dec700410310c501200e200f290000370300200120012900b80637038006200141b8066a41c496c600411a10c5012011200f290000370000200d20012900b806370000200141186a20014180066a412010c601200128021c2104200128021821062005420037030020124200370300200e42003703002001420037038006200141b8066a4184dec700410310c501200e200f290000370300200120012900b80637038006200141b8066a41c496c600411a10c5012011200f290000370000200d20012900b80637000002400240024020064101470d002004200a460d010b20014180066a412010b4010c010b2001200a3602a00720014180066a4120200141a0076a410410a7020b20092019470d000b0b0240200ba72206450d00200641ffffffff0371450d00201a102c0b20012903d802200141e0026a29030020012802cc0310c807024020012802a40541ffffff3f71450d0020012802a005102c0b20012802b00541ffffff3f71450d0320012802ac05102c0c030b20012802a009210320012802980921040240200128029409450d002006450d002006102c0b02402003450d002004450d002004102c0b200141a0076a20014180066a10b9010c000b0b200620081044000b200141a0076a41086a2206200141306a41086a28020036020020012001290330220c3703a00702400240200ca722030d00200141e8016a22064200370300200141e0016a22044200370300200141d0016a41086a22034200370300200142003703d001200141c0026a41f6ddc700410b10c5012003200141c0026a41086a2207290000370300200120012900c0023703d001200141c0026a41e9eec600411610c50120062007290000370300200420012900c002370300200141d0016a412010b4010c010b200141e8016a22044200370300200141d0016a41106a22074200370300200141d0016a41086a220a4200370300200142003703d001200141c0026a41f6ddc700410b10c501200a200141c0026a41086a2210290000370300200120012900c0023703d001200141c0026a41e9eec600411610c50120042010290000370300200720012900c002370300200141d0016a200141a0076a108b05024020062802002206450d0020064105742104200341106a210603400240200641786a28020041ffffff3f71450d00200641746a280200102c0b0240200641046a28020041ffffff3f71450d002006280200102c0b200641206a2106200441606a22040d000b0b20012802a40741ffffff3f71450d002003102c0b20014180066a41186a221b420037030020014180066a41106a2213420037030020014180066a41086a221942003703002001420037038006200141e0056a41ac95c400410d10c5012019200141e0056a41086a221f290000370300200120012900e00537038006200141f0056a41c695c400410c10c501201b200141f0056a41086a221d290000370300201320012900f005370300200141c0026a20014180066a10f5022001280298032106200141b8066a41086a221c200141c0026a41086a290300370300200141b8066a41106a200141c0026a41106a290300370300200141b8066a41186a200141c0026a41186a290300370300200141b8066a41206a200141c0026a41206a290300370300201d200141fc026a280200360200200120012903c0023703b806200120012902f4023703f00520012802f00221042019200141c0036a2903003703002013200141c8036a290300370300201b200141d0036a29030037030020014180066a41206a200141d8036a29030037030042c0f0f50b214602404100200420064102461b220620004f0d00200141c0006a10c0032001280240210f02400240200128024822200d004100211220014100360248200f21060c010b2006417f7320006a210d200f41046a2106202041037441786a41037641016a210441002112024003402006280200200d4b0d01200641086a21062004201241016a2212470d000b200421120b20202012490d0520014100360248200f20124103746a210902402012450d0020014180066a41046a2102200141e0096a41086a2114200141b8066a41046a2121200141b8066a41086a211a200141c0026a410c6a211e0340200f280200210a200141e0056a41f1ddc700410510c501200141f0056a4185f6c000410c10c5012001200a36028006200141b8066a20014180066a410410c701200120023602cc022001201a3602c402200120014180066a3602c8022001200141b8066a3602c002200141a0076a200141c0026a107e20012802a807220641206a2204417f4c0d050240024020040d00410121030c010b200410322203450d050b200141003602d801200120043602d401200120033602d001200141d0016a4100411010c80120012802d00120012802d80122046a220320012900e005370000200341086a200141e0056a41086a22112900003700002001200441106a22043602d801200141d0016a2004411010c80120012802d00120012802d80122046a220320012900f005370000200341086a200141f0056a41086a22082900003700002001200441106a22033602d80120012802a0072104200141d0016a2003200610c80120012802d001220320012802d80122076a2004200610c9081a2001200720066a22063602d801024020012802a407450d002004102c0b200141c0026a2003200610bb0302400240024020012802cc0222064102470d00200142003703a807200142043703a00741042103410021100c010b200120012802d0023602b007200120012802c80222103602a807200120012802c4023602a407200120012802c00222033602a007200120063602ac072010450d00200341046a2106201041037441786a41037641016a2107410021040240024003402006280200200d4b0d01200641086a21062007200441016a2204470d000b200721040c010b2004450d010b024002400240024020102004417f6a22064d0d002001200320064103746a2802003602b007200141013602ac0720102004490d01200141003602a8072003200441037422056a210e024020050d00200321060c040b410021060340200141c0026a200a200320066a28020010bf0320012802c002220720012802c80210b401024020012802c402450d002007102c0b2005200641086a2206460d030c000b0b2006201041908ec100103f000b2004201041d089c500104f000b200320066a21060b201020046b2107410021102006200e460d010340200e200641086a2206470d000c020b0b4100210720102104200320104103746a220e21060b200f41086a210f200e20066b2106024003402006450d01200641786a21060c000b0b02402007450d00024020042010460d00200320104103746a200320044103746a200741037410ca081a0b2001200720106a22103602a8070b41002104024020100d00200141e0056a41f1ddc700410510c501200141f0056a418cffc000410510c5012001200a3602b806200141e0096a200141b8066a410410c701200120213602cc02200120143602c4022001200141b8066a3602c8022001200141e0096a3602c00220014180066a200141c0026a107e200128028806220641206a2203417f4c0d060240024020030d00410121070c010b200310322207450d060b200141003602c802200120033602c402200120073602c002200141c0026a4100411010c80120012802c00220012802c80222036a220720012900e005370000200741086a20112900003700002001200341106a22033602c802200141c0026a2003411010c80120012802c00220012802c80222036a220720012900f005370000200741086a20082900003700002001200341106a22073602c8022001280280062103200141c0026a2007200610c80120012802c002220720012802c80222106a2003200610c9081a2001201020066a22063602c8020240200128028406450d002003102c0b20014180066a2007200610b8032001280280062106200129028406210b024020012802c402450d002007102c0b200b200c20061b210c024020060d00410121040c010b200ca7450d002006102c0b200141c0026a41086a200141a0076a41086a290300370300200141c0026a41106a200141a0076a41106a280200360200200120012903a0073703c00220012802d801210320012802d00121060240024020012802cc024102470d002006200310b4010c010b2001410036028806200142013703800620014180066a200141c0026a10bd0320014180066a201e10be0320062003200128028006220720012802880610a7020240200128028406450d002007102c0b20012802c40241ffffffff0171450d0020012802c002102c0b024020012802d401450d002006102c0b02402004450d00200141e0056a41f1ddc700410510c501200141f0056a4185f6c000410c10c5012001200a36028006200141e0096a20014180066a410410c701200120023602cc02200120143602c402200120014180066a3602c8022001200141e0096a3602c002200141a0076a200141c0026a107e20012802a807220641206a2204417f4c0d060240024020040d00410121030c010b200410322203450d060b200141003602c802200120043602c402200120033602c002200141c0026a4100411010c80120012802c00220012802c80222046a220320012900e005370000200341086a20112900003700002001200441106a22043602c802200141c0026a2004411010c80120012802c00220012802c80222046a220320012900f005370000200341086a20082900003700002001200441106a22033602c80220012802a0072104200141c0026a2003200610c80120012802c002220320012802c80222076a2004200610c9081a2001200720066a22063602c802024020012802a407450d002004102c0b2003200610b40120012802c402450d002003102c0b200f2009470d000b0b200f2106202020126b21200240200f2009460d0003402009200f41086a220f470d000b200f21060b2009210f0b200f20066b2106024003402006450d01200641786a21060c000b0b02402020450d000240201220012802482206460d002001280240220420064103746a200420124103746a202041037410ca081a0b2001202020066a3602480b200141c0026a41086a200141c0006a41086a28020036020020012001290340220c3703c00202400240200ca722060d00200141f8066a22064200370300200141f0066a22044200370300200141e0066a41086a22034200370300200142003703e006200141b8066a41f1ddc700410510c5012003200141b8066a41086a2207290000370300200120012900b8063703e006200141b8066a41eef5c000410f10c50120062007290000370300200420012900b806370300200141e0066a412010b4010c010b200141f8066a22044200370300200141f0066a22034200370300200141e0066a41086a22074200370300200142003703e006200141b8066a41f1ddc700410510c5012007200141b8066a41086a220a290000370300200120012900b8063703e006200141b8066a41eef5c000410f10c5012004200a290000370300200320012900b806370300200141e0066a200141c0026a10c10320012802c40241ffffffff0171450d002006102c0b2012ad220c42c0f0f50b7e200c428084afdf007e7c42c0f0f50b7c21460b200141e0066a41186a22044200370300200141e0066a41106a22064200370300200141e0066a41086a22034200370300200142003703e006200141b8066a41bee8c700410d10c5012003201c290000370300200120012900b8063703e006200141b8066a4188eec700411110c5012004201c290000370300200620012900b806370300200141c0026a200141e0066a10eb0420012802c002210720012902c402210c201b420037030020134200370300201942003703002001420037038006200141e0056a41ac95c400410d10c5012019201f290000370300200120012900e00537038006200141f0056a41c695c400410c10c501201341086a220a201d290000370000201320012900f005370000200141c0026a20014180066a10f502201b420037030020134200370300201942003703002001420037038006200141e0056a41f1ddc700410510c5012019201f290000370300200120012900e00537038006200141f0056a41c4fec000410a10c501200a201d290000370000201320012900f005370000200141c0026a20014180066a412010b90320012802c002210a20012902c402210b200442003703002006420037030020034200370300200142003703e006200141b8066a41bee8c700410d10c5012003201c290000370300200120012900b8063703e006200141b8066a41fcefc700410910c5012004201c290000370300200620012900b806370300200141c0026a200141e0066a10f9040240024020012802c00222100d0041002112200141003602482001420437034041042110410021084104210f0c010b200120012902c4022215370244200120103602402015422088a721082015a721122010210f0b200141e0066a41186a220e4200370300200141e0066a41106a220d4200370300200141e0066a41086a22044200370300200142003703e006200141b8066a41bee8c700410d10c5012004200141b8066a41086a2203290000370300200120012900b8063703e006200141b8066a41b4edc700410f10c501200641086a22052003290000370000200620012900b806370000200141c0026a200141e0066a10f504410421024100211a410021144100211c024020012802c0022209450d00200141c0026a41086a2802002114200141cc026a280200211c20012802c402211a200921020b20014180066a41186a420037030020014180066a41106a420037030020014180066a41086a220942003703002001420037038006200141e0056a41c1dcc700410610c5012009200141e0056a41086a290000370300200120012900e00537038006200141f0056a4196a4c600410610c501201341086a200141f0056a41086a290000370000201320012900f005370000200141106a20014180066a412010c6012001280214210920012802102111200e4200370300200d420037030020044200370300200142003703e006200141b8066a41bee8c700410d10c50120042003290000370300200120012900b8063703e006200141b8066a41dcecc700410f10c50120052003290000370000200620012900b806370000200141c0026a200141e0066a10e90420012802c0022206410420061b210e024020012902c402420020061b2215422088a72203450d002003410c6c2104200e210603400240200641046a28020041ffffffff0371450d002006280200102c0b2006410c6a2106200441746a22040d000b0b02402015a72206450d002006410c6c450d00200e102c0b200c420020071b2147200b4200200a1b21482007410420071b2119200a4104200a1b211e2003450d052009410020111b2121200141003602d801200142043703d001200241286a211d201e417c6a2120200f200841346c6a210520192047422088a7412c6c6a21102048422088a7211b200141c0076a2123410021134104211f4100210e41002109410021082019210603402008417f6a2104202020084102746a2103034020102006460d06200341046a2103200441016a2104200628020021072006412c6a220d210620074102470d000b200441016a2108200e21072009210602400340024002402006450d002007210e200621090c010b4100200f200f20054622061b210a2007200f2005476a210e410121092005200f41346a20061b210f200721110b0240200a0d00200128024821220c020b41002106200e2107200a28020022122004490d000b200d21062011212220122004460d010b02400240024002402004201b490d002014450d032014410274417c6a41027641016a2107410021064100210302400340201b201d20066a2802006a2004460d012006412c6a21062007200341016a2203470d000c050b0b200220066a22032802002117200141c0026a41186a22072003411c6a290200370300200141c0026a41106a2212200341146a290200370300200141c0026a41086a22132003410c6a2902003703002001200341046a2902003703c002200341246a280200211820032003412c6a2014412c6c20066b41546a10ca081a20014180066a41186a2007290300220c37030020014180066a41106a2012290300220b37030020014180066a41086a20132903002215370300200120012903c002224537038006200141e0066a41086a22062015370300200141e0066a41106a2203200b370300200141e0066a41186a2207200c370300200120453703e006200141086a2004202110e10520012802080d0141f9fac70041de0041d8fbc700105c000b2003280200211720012004202110e1052001280200450d0620012802042124200141a0076a411f6a200141c0026a411f6a280000360000200141a0076a41186a200141c0026a41186a290000370300200141a0076a41106a200141c0026a41106a290000370300200141a0076a41086a200141c0026a41086a290000370300200120012900c0023703a007410021250c010b200128020c2124200141a0076a41186a2007290300370300200141a0076a41106a2003290300370300200141a0076a41086a2006290300370300200141c0026a41026a2001418c076a41026a2d000022063a0000200120012903e0063703a007200120012f018c0722033b01c002202341026a20063a0000202320033b00002014417f6a21144101212520012802d80121130b200141c0026a411f6a2203200141a0076a411f6a280000360000200141c0026a41186a2207200141a0076a41186a290300370300200141c0026a41106a2212200141a0076a41106a290300370300200141c0026a41086a2216200141a0076a41086a290300370300200120012903a0073703c0020240201320012802d401470d00200141d0016a10a20620012802d80121130b20012802d001221f201341386c6a22062004360204200620223602002006410c6a20253a0000200641086a20173602002006410d6a20012903c002370000200641156a20162903003700002006411d6a2012290300370000200641256a20072903003700002006412c6a2003280000360000200641346a2024360200200641306a20183602002001201341016a22133602d8010b200d21060c000b0b1039000b103b000b41f9fac70041de0041e8fbc700105c000b2012202041d089c500104f000b20012802d401211b0240024002402013450d00201f201341386c6a21134100210541002109201f21060340200641046a290200210c2006410c6a2d0000210d20062802002112200141a0076a41276a200641346a2204280000360000200141a0076a41206a2006412d6a2203290000370300200141a0076a41186a200641256a220e290000370300200141a0076a41106a2006411d6a220f290000370300200141a0076a41086a200641156a221129000037030020012006410d6a22082900003703a007200141c0026a41276a22072004280000360000200141c0026a41206a220a2003290000370300200141c0026a41186a2210200e290000370300200141c0026a41106a220e200f290000370300200141c0026a41086a220f2011290000370300200120082900003703c002200d4102460d0220014180066a41276a2204200728000036000020014180066a41206a2203200a29030037030020014180066a41186a2010290300220b37030020014180066a41106a200e290300221537030020014180066a41086a200f2903002245370300200120012903c00222493703800620072004280000360000200a20032903003703002010200b370300200e2015370300200f2045370300200120493703c00220012802482203200920126a2204490d03024020032001280244470d00200141c0006a20031083040b200941016a21092001280240200441346c6a220441346a20042005200320126b6a41346c10ca081a2004200d3a00082004200c370200200441096a20012903c002370000200441116a200f290300370000200441196a200e290300370000200441216a2010290300370000200441296a200a290300370000200441306a20072800003600002001200341016a3602482005417f6a2105200641386a22062013470d000b0b200141c0026a41276a200141a0076a41276a280000360000200141c0026a41206a200141a0076a41206a290300370300200141c0026a41186a200141a0076a41186a290300370300200141c0026a41106a200141a0076a41106a290300370300200141c0026a41086a200141a0076a41086a290300370300200120012903a0073703c0020b0240201b450d00201b41386c450d00201f102c0b200141c0026a41086a200141c0006a41086a280200360200200120012903403703c002200141c0026a10a3062001201c3602cc02200120143602c8022001201a3602c402200120023602c002200141c0026a10a406200120473702c402200120193602c002200141c0026a10a5062048a72206450d02200641ffffffff0371450d02201e102c0c020b200420031044000b0240201a450d00201a412c6c450d002002102c0b02402012450d00201241346c450d002010102c0b02402048a72206450d00200641ffffffff0371450d00201e102c0b2047a72206450d002006412c6c450d002019102c0b200141c8016a22064200370300200141c0016a22044200370300200141b0016a41086a22034200370300200142003703b001200141c0026a41f6ddc700410b10c5012003200141c0026a41086a2207290000370300200120012900c0023703b001200141c0026a41b0f0c600410e10c50120062007290000370300200420012900c002370300200141b0016a412041c4b5c800410010a702200010d304210c200141f0096a2400427f2046427f200c42c0b2cd3b7c220b200b200c541b7c220c200c2046541b0bbe0202037f017e230041d0006b220224002002412036020420022001360200200241086a2001412010b30102400240200228020822010d00200042003703000c010b200228020c2103024002400240200241086a41086a28020022044108490d00200441787141786a0e09000101010101010100010b20024100360220200242013703182002410f36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c200241b4bcc3003602382002200241286a360248200241346a41dcb7c000200241386a103e1a200235022042208620023502188410000240200228021c450d002002280218102c0b420021050c010b200041186a2001290010370300200041106a200129000837030020002001290000370308420121050b200020053703002003450d002001102c0b200241d0006a24000bc90103017f017e017f230041106b22022400200241003602082002420137030020012903002103200241004108102f2002280200200228020822046a20033700002002200441086a220436020820012903082103200220044108102f2002280200200228020822046a20033700002002200441086a220436020820012903102103200220044108102f20022802002201200228020822046a20033700002002200441086a2204360208200041202001200410a70202402002280204450d002001102c0b200241106a24000bfe0101027f230041106b22032400200341003602082003420137030002400240024002400240024020010e03010203000b200041204101410010a7020c040b200341004101102f2003280200200328020822016a41003a00002003200141016a2201360208200320014104102f20032802002204200328020822016a2002360000200141046a21010c020b200341004101102f20032802002204200328020822016a41013a0000200141016a21010c010b200341004101102f20032802002204200328020822016a41023a0000200141016a21010b2003200136020820032802042102200041202004200110a7022002450d002004102c0b200341106a24000be40e03057f047e027f230041a00d6b2204240020044190096a200141c00310c9081a20044190066a20044190096a10890320042d009006210520042f009106210620042d009306210720044190036a20044190066a41047241fc0210c9081a41012101024002400240024002400240024020054101460d00200441186a20044190036a41046a41f80210c9081a024020032802002205450d00200441106a4186a4c600411010c6012004280214210120042802102106200441d00c6a41086a200341086a280200360200200420032902003703d00c20044190036a41c1dcc700410610c50120044190066a41c0cdc600410d10c50120042001410020061b3602940d200441980d6a200441940d6a410410c7012004419c096a200441940d6a41046a3602002004200441980d6a41086a360294092004200441940d6a360298092004200441980d6a36029009200441e00c6a20044190096a107e20042802e80c220141206a2206417f4c0d040240024020060d00410121070c010b200610322207450d060b20044100360298092004200636029409200420073602900920044190096a4100411010c80120042802900920042802980922066a2207200429009003370000200741086a20044190036a41086a2900003700002004200641106a22063602980920044190096a2006411010c80120042802900920042802980922066a2207200429009006370000200741086a20044190066a41086a2900003700002004200641106a22073602980920042802e00c210620044190096a2007200110c801200428029009220720042802980922086a2006200110c9081a2004200820016a220136029809024020042802e40c450d002006102c0b20072001200441d00c6a108a030240200428029409450d002007102c0b024020042802d40c450d0020042802d00c102c0b410021010b200441d00c6a200441e8006a10b70220044190096a200441186a41f80210c9081a20044190066a20044190096a20042903d00c220920042d00d80c20042d00d90c2002108b0320044190036a41086a20044190066a410c6a29020037030020044190036a41106a20044190066a41146a29020037030020044190036a41186a20044190066a411c6a29020037030020044190036a41206a20044190066a41246a29020037030020044190036a41286a20044190066a412c6a290200370300200441c0036a200441c4066a280200360200200420042902940637039003024020042d0090064101460d00200441e00c6a41286a20044190036a412c6a290200370300200441e00c6a41206a220220044190036a41246a290200370300200441e00c6a41186a20044190036a411c6a290200370300200441e00c6a41106a20044190036a41146a290200220a370300200441e00c6a41086a20044190036a410c6a290200220b3703002004200429029403220c3703e00c2009200a200a2009561b2009200b42015122061b210920042903d80c210a02400240200c4201510d004100210620042d00800d21082009210b200a21090c010b2002108c034192c5c300ad4280808080a00184100041d79ec000ad4280808080e0018410000240024020060d0041cd9ec000ad4280808080a0018410000c010b200441f00c6a29030010010b41c49ec000ad4280808080900184100002400240200441f80c6a2d00004101470d0041c29ec000ad4280808080208410000c010b41bf9ec000ad4280808080308410000b4101210620042802800d210820042902840d210b0b20044190096a41086a220220063a0000200441b0096a200a370300200441a8096a2206200937030020044190096a41106a2207200b3703002004419c096a20083602002004419b096a20044192066a2d00003a0000200420042f0090063b009909200441003602900920044190096a10c802200441086a4186a4c600411010c6012004200428020c41016a410120042802081b220d360290094104210e4186a4c600411020044190096a410410a702200642003703002007420037030020024200370300200442003703900920044190036a41c1dcc700410610c501200220044190036a41086a29000037030020042004290090033703900920044190066a41b0d1c600410e10c501200620044190066a41086a290000370300200720042900900637030020044190096a4100200d1087032004200441880d6a28000036009709200420042900810d370390090240200c4201520d002004200428009709360097062004200429039009370390062004200429039006370390032004200428009706360097032008210e0b200041003a0000200041046a200e3a0000200041056a2004290390033700002000410c6a2004280097033600002005450d072001410173450d030c070b200020042f00910620042d0093064110747222023b0001200041013a0000200041036a20024110763a00000c010b2000200620074110747222053b000141012101200041013a0000200041036a20054110763a0000200328020021050b2005450d0420010d030c040b2003280204450d032005102c0c030b103b000b1039000b2003280204450d002005102c0b200441a00d6a24000bbf290f017f047e017f017e017f017e017f017e017f017e017f017e017f027e047f230041d0126b22022400420221030240024002400240024002400240200129036822044202520d00200241086a20014198016a41a80210c9081a0c010b200241fe026a200141206a41c20010c9081a200141f8006a290300210320012903702105200241c0036a41186a200141186a290000370300200241c0036a41106a200141106a290000370300200241c0036a41086a200141086a290000370300200220012900003703c003200241900d6a20014198016a41a80210c9081a200241b80f6a41106a20014190016a290300370300200241b80f6a41086a20014188016a290300370300200220014180016a2903003703b80f200241a8126a220141002902ecde472206370300200241a0126a220741002902e4de47220837030020024198126a220941002902dcde47220a370300200241f0116a41206a220b41002902d4de47220c370300200241f0116a41186a220d41002902ccde47220e370300200241f0116a41106a220f41002902c4de472210370300200241f0116a41086a221141002902bcde472212370300200241002902b4de4722133703f011200241f0116a10ff0220012006370300200720083703002009200a370300200b200c370300200d200e370300200f201037030020112012370300200220133703f011200241f0116a10ff02200241b0126a41c1dcc700410610c501200241b0116a41fda3c600410910c501200241003602f010200241e0116a200241f0106a410410c701200241fc116a200241f0106a41046a3602002002200241e0116a41086a22113602f4112002200241f0106a3602f8112002200241e0116a3602f01120024190116a200241f0116a107e200228029811220141206a2207417f4c0d010240024020070d00410121090c010b200710322209450d060b200241003602f810200220073602f410200220093602f010200241f0106a4100411010c80120022802f01020022802f81022076a220920022900b012370000200941086a200241b0126a41086a2900003700002002200741106a22073602f810200241f0106a2007411010c80120022802f01020022802f81022076a220920022900b011370000200941086a200241b0116a41086a220b2900003700002002200741106a22093602f8102002280290112107200241f0106a2009200110c80120022802f010220920022802f810220d6a2007200110c9081a2002200d20016a22013602f8100240200228029411450d002007102c0b200241f0116a2009200110c901200b200241f9116a290000370300200241b0116a41106a20024181126a290000370300200241c8116a220120024189126a290000370300200220022900f1113703b0110240024020022d00f0114101460d00200241c5126a4200370000200241c0126a4200370300200241b8126a4200370300200242003703b0124100210d0c010b200241b8126a200241bb116a290000370300200241b0126a41106a200241c3116a290000370300200241c5126a2001290000370000200220022900b3113703b01220022f01b01120022d00b21141107472210d0b024020022802f410450d002009102c0b200241d0106a41086a200241b0126a41086a2201290300370300200241d0106a41106a200241b0126a41106a290300370300200241d0106a41156a200241b0126a41156a290000370000200220022903b0123703d010200241c8116a22074200370300200241b0116a41106a22094200370300200241b0116a41086a220b4200370300200242003703b011200241d0116a41c1dcc700410610c501200b200241d0116a41086a290000370300200220022900d0113703b011200241b0126a4196a4c600410610c50120072001290000370300200920022900b0123703002002200241b0116a412010c60141002109024020044201520d0020054200510d032002280204410020022802001b2101417f210942002001ad220620037d220820082006561b220620037c20062005827d220642ffffffff0f560d002006a721090b200241d0116a41c1dcc700410610c501200241b0126a41fda3c600410910c501200220093602ec11200241e0116a200241ec116a410410c701200241fc116a200241ec116a41046a3602002002200241e8116a3602f4112002200241ec116a3602f8112002200241e0116a3602f011200241b0116a200241f0116a107e20022802b811220141206a2207417f4c0d010240024020070d004101210b0c010b20071032220b450d060b200241003602f811200220073602f4112002200b3602f011200241f0116a4100411010c80120022802f01120022802f81122076a220b20022900d011370000200b41086a200241d0116a41086a2900003700002002200741106a22073602f811200241f0116a2007411010c80120022802f01120022802f81122076a220b20022900b012370000200b41086a200241b0126a41086a2900003700002002200741106a220b3602f81120022802b0112107200241f0116a200b200110c80120022802f011220b20022802f811220f6a2007200110c9081a2002200f20016a22013602f811024020022802b411450d002007102c0b200b200110ce022101024020022802f411450d00200b102c0b024002402001450d00200241b0126a41c1dcc700410610c501200241b0116a41fda3c600410910c501200220093602ec11200241e0116a200241ec116a410410c701200241fc116a200241ec116a41046a360200200220113602f4112002200241ec116a3602f8112002200241e0116a3602f011200241d0116a200241f0116a107e20022802d811220141206a2207417f4c0d030240024020070d00410121090c010b200710322209450d080b200241003602e811200220073602e411200220093602e011200241e0116a4100411010c80120022802e01120022802e81122076a220920022900b012370000200941086a200241b0126a41086a2900003700002002200741106a22073602e811200241e0116a2007411010c80120022802e01120022802e81122076a220920022900b011370000200941086a200241b0116a41086a220b2900003700002002200741106a22093602e81120022802d0112107200241e0116a2009200110c80120022802e011220920022802e811220f6a2007200110c9081a2002200f20016a22013602e811024020022802d411450d002007102c0b200241f0116a2009200110c901200b200241f9116a290000370300200241b0116a41106a20024181126a290000370300200241c8116a220120024189126a290000370300200220022900f1113703b0110240024020022d00f0114101460d00200241c5126a4200370000200241c0126a4200370300200241b8126a4200370300200242003703b012410021010c010b200241b8126a200241bb116a290000370300200241b0126a41106a200241c3116a290000370300200241c5126a2001290000370000200220022900b3113703b01220022f01b01120022d00b2114110747221010b024020022802e411450d002009102c0b20024190116a41156a2207200241b0126a41156a29000037000020024190116a41106a2209200241b0126a41106a290300370300200241f0106a41106a220b2009290300370300200241f0106a41156a22092007290000370000200241f0106a41086a200241b0126a41086a290300220637030020024190106a41086a2207200637030020024190106a41106a220f200b29030037030020024190106a41156a220b2009290000370000200220022903b01222063703f0102002200637039010200241b0106a41156a2209200241d0106a41156a290000370000200241b0106a41106a2211200241d0106a41106a290300370300200241b0106a41086a2214200241d0106a41086a290300370300200220022903d0103703b010200241f00f6a41156a22152009290000370000200241f00f6a41106a22092011290300370300200241f00f6a41086a22112014290300370300200220022903b0103703f00f200241d00f6a41156a2214200b290000370000200241d00f6a41106a220b200f290300370300200241d00f6a41086a220f200729030037030020022002290390103703d00f200241a80a6a41156a22072015290000370000200241a80a6a41106a22152009290300370300200241a80a6a41086a22092011290300370300200220022903f00f3703a80a200241880a6a41156a22112014290000370000200241880a6a41106a2214200b290300370300200241880a6a41086a220b200f290300370300200220022903d00f3703880a200241c80a6a41106a220f200241b80f6a41106a290300370300200241c80a6a41086a2216200241b80f6a41086a290300370300200220022903b80f3703c80a200241e00a6a41046a200241900d6a41a80210c9081a200241d8076a200241e00a6a41ac0210c9081a200241c0076a41106a2217200f290300370300200241c0076a41086a220f2016290300370300200241a0076a41086a22162009290300370300200241a0076a41106a22092015290300370300200241a0076a41156a2215200729000037000020024180076a41086a2207200b29030037030020024180076a41106a220b201429030037030020024180076a41156a22142011290000370000200220022903c80a3703c007200220022903a80a3703a007200220022903880a37038007200241e0036a200241d8076a41046a41a80210c9081a200241c2066a200d4110763a0000200241c0066a200d3b010020024198066a200337030020024190066a2005370300200241a0066a20022903c007370300200241a8066a200f290300370300200241b0066a2017290300370300200241c3066a20022903a007370000200241cb066a2016290300370000200241d3066a2009290300370000200241d8066a201529000037000020022004370388062002420a3703b806200241e2066a20014110763a0000200241e0066a20013b0100200241e3066a200229038007370000200241eb066a2007290300370000200241f3066a200b290300370000200241f8066a20142900003700004108103222010d010c070b200241f0106a41156a20024190116a41156a290000370000200241f00f6a41086a200241b0106a41086a290000370300200241f00f6a41106a200241b0106a41106a290000370300200241f00f6a41156a200241b0106a41156a290000370000200241d00f6a41156a20024190106a41156a290000370000200220022900b0103703f00f200241900d6a10b303200241d8076a200241e00a6a41ac0210c9081a200241c0076a41106a200241c80a6a41106a290300370300200241c0076a41086a200241c80a6a41086a290300370300200241a0076a41086a200241a80a6a41086a290000370300200241a0076a41106a200241a80a6a41106a290000370300200241a0076a41156a200241a80a6a41156a29000037000020024180076a41086a200241880a6a41086a29000037030020024180076a41106a200241880a6a41106a29000037030020024180076a41156a200241880a6a41156a290000370000200220022903c80a3703c007200220022900a80a3703a007200220022900880a37038007200041036a41003a0000200041800a3b0001200041013a00000c050b200242083702dc07200220013602d807200241e0036a200241d8076a10b403200241e0036a41a8026a200241d8076a10b50320022802b8062101200241d8076a20022802e0074104102f20022802d80720022802e0076a2001360000200220022802e00741046a22013602e00720022802bc062107200241d8076a20014104102f20022802d80720022802e0076a2007360000200220022802e00741046a3602e007412010322201450d05200242203702e40a200220013602e00a200241e00a6a41004120102f20022802e00a220720022802e80a22096a2201200241c0066a290300370000200141086a200241c8066a290300370000200141106a200241d0066a290300370000200141186a200241d8066a2903003700002002200941206a22013602e80a200241d8076a20022802e0072001102f20022802d80720022802e0076a2007200110c9081a200220022802e00720016a3602e007024020022802e40a450d002007102c0b412010322201450d05200242203702e40a200220013602e00a200241e00a6a41004120102f20022802e00a220720022802e80a22096a2201200241e0066a290300370000200141086a200241e8066a290300370000200141106a200241f0066a290300370000200141186a200241f8066a2903003700002002200941206a22013602e80a200241d8076a20022802e0072001102f20022802d80720022802e0076a2007200110c9081a200220022802e00720016a22013602e007024020022802e40a450d002007102c20022802e00721010b20022802d80721070240024020014180024b0d00200241fe026a20072001200241c0036a10b60321010c010b200241b0116a20072001109a01200241fe026a200241b0116a4120200241c0036a10b60321010b024020022802dc07450d0020022802d807102c0b2001450d03200241d8026a41086a200241c0036a41086a290300370300200241d8026a41106a200241c0036a41106a290300370300200241d8026a41186a200241c0036a41186a290300370300200241b0026a41086a20024198066a290300370300200241b0026a41106a200241a0066a290300370300200241b0026a41186a200241a8066a290300370300200241d0026a200241b0066a290300370300200220022903c0033703d802200220024190066a2903003703b0022002290388062103200241086a200241e0036a41a80210c9081a0b200041086a20022903d802370300200041286a2003370300200041306a20022903b002370300200041206a200241d8026a41186a290300370300200041186a200241d8026a41106a290300370300200041106a200241d8026a41086a290300370300200041386a200241b0026a41086a290300370300200041c0006a200241b0026a41106a290300370300200041c8006a200241b0026a41186a290300370300200041d0006a200241b0026a41206a290300370300200041d8006a200241086a41a80210c9081a200041003a0000200241d0126a24000f0b103b000b41d0b6c800411941ecb6c800103c000b20004180083b0001200041013a0000200041036a41003a0000200241e0036a1083020b200241d0126a24000f0b1039000ba40301047f230041106b22032400024002402002280208220441046a2205417f4c0d002002280200210202400240024002400240024020050d0020034100360208200342013703000c010b200510322206450d06200341003602082003200536020420032006360200200441c000490d01200441808001490d022004418080808004490d030b200341004101102f2003280200200328020822056a41033a00002003200541016a2205360208200320054104102f2003280200200328020822056a2004360000200541046a21050c030b200341004101102f2003280200200328020822056a20044102743a0000200541016a21050c020b200341004102102f2003280200200328020822056a20044102744101723b0000200541026a21050c010b200341004104102f2003280200200328020822056a2004410274410272360000200541046a21050b20032005360208200320052004102f20032802002205200328020822066a2002200410c9081a2003200620046a2204360208200020012005200410a70202402003280204450d002005102c0b200341106a24000f0b103b000b1039000b904e0c017f017e017f017e037f027e017f017e037f027e027f027e23004180076b22062400024002400240024002400240024002400240024002400240024002400240024002400240200129032022074202520d0020022003200510cc06220841ff01714102470d014200210920064180066a41106a4200370300200641d0016a41086a220a4200370300200641d0016a41106a220b4200370300200641d0016a41186a220c4200370300200642003703d0012001280250417f6a0e0a020c0c0c0c030c0c04050c0b200641d0016a41186a200141186a290000370300200641d0016a41106a200141106a290000370300200641d0016a41086a200141086a290000370300200620012900003703d001200141c8006a290300210d200141c0006a290300210e200141386a280200210f20012903282110200641f0016a41186a22084200370300200641f0016a41106a22114200370300200641f0016a41086a22124200370300200642003703f001200641b8046a41c1dcc700410610c5012012200641b8046a41086a290000370300200620062900b8043703f001200641c8046a4196a4c600410610c5012008200641c8046a41086a290000370300201120062900c804370300200641e8006a200641f0016a412010c601024020074201520d0020104200510d070b200641b8046a41c1dcc700410610c501200641c8046a41acc8c700410710c501200641f0016a200641d0016a10d50220062802f801220841206a2211417f4c0d070240024020110d00410121120c010b201110322212450d090b200641003602782006201136027420062012360270200641f0006a4100411010c8012006280270200628027822116a221220062900b804370000201241086a200641b8046a41086a2900003700002006201141106a2211360278200641f0006a2011411010c8012006280270200628027822116a221220062900c804370000201241086a200641c8046a41086a2900003700002006201141106a221236027820062802f0012111200641f0006a2012200810c80120062802702212200628027822136a2011200810c9081a2006201320086a2208360278024020062802f401450d002011102c0b200641f0016a2012200810d602200641d8046a41086a200641f0016a41106a290300370300200641d8046a41106a200641f0016a41186a290300370300200641d8046a41186a2208200641f0016a41206a290300370300200641d8046a41206a2211200641f0016a41286a290300370300200641d8046a41286a2213200641f0016a41306a290300370300200641d8046a41306a220a200641f0016a41386a290300370300200641d8046a41386a220b200641b0026a290300370300200620062903f8013703d8040240024020062903f0014201510d0020064180066a41386a420037030020064180066a41306a420037030020064180066a41286a420037030020064180066a41206a420037030020064180066a41186a420037030020064190066a420037030020064188066a4200370300200642003703800641002111410021080c010b20064180066a41086a200641d8046a41086a29030037030020064180066a41106a200641d8046a41106a29030037030020064180066a41186a200829030037030020064180066a41206a201129030037030020064180066a41286a201329030037030020064180066a41306a200a29030037030020064180066a41386a200b290300370300200620062903d80437038006200641b8026a280200210820062802bc0221110b02402006280274450d002012102c0b02402008200f470d00200641f0016a41386a20064180066a41386a290300370300200641f0016a41306a20064180066a41306a290300370300200641f0016a41286a20064180066a41286a290300370300200641f0016a41206a20064180066a41206a290300370300200641f0016a41186a20064180066a41186a290300370300200641f0016a41106a20064180066a41106a290300370300200641f0016a41086a20064180066a41086a29030037030020062006290380063703f001200620113602b402410121122006200f41016a3602b002200641b8046a41c1dcc700410610c501200641c8046a41acc8c700410710c501200641d8046a200641d0016a10d50220062802e004220841206a2211417f4c0d0802402011450d00201110322212450d0a0b200641003602782006201136027420062012360270200641f0006a4100411010c8012006280270200628027822116a220f20062900b804370000200f41086a200641b8046a41086a2900003700002006201141106a2211360278200641f0006a2011411010c8012006280270200628027822116a220f20062900c804370000200f41086a200641c8046a41086a2900003700002006201141106a220f36027820062802d8042111200641f0006a200f200810c8012006280270220f200628027822126a2011200810c9081a2006201220086a2208360278024020062802dc04450d002011102c0b200f2008200641f0016a10810302402006280274450d00200f102c0b4180122108200341ff01714102460d0e20022003200510cc06220841ff01714102470d0e200641d8006a20052002200e200d200441ff017141004720031092060240024020062903582207200641d8006a41086a29030022108450450d00420021090c010b20064180066a200641d0016a2007201041014111200e200d84501b410010cd062006280280064101460d0b20064190066a29030021102006290388062107420121090b200641d8046a41086a200641d0016a41086a22082903002214370300200641b0056a41186a200641d0016a41186a22112903002215370300200641b0056a41086a2014370300200641d0066a41186a220f2015370300200641d0066a41106a2212200641d0016a41106a2213290300370300200641d0066a41086a220a2014370300200620062903d0013703d00620064190016a41186a200f29030037030020064190016a41106a201229030037030020064190016a41086a200a290300370300200620062903d00637039001200641b0016a41186a2011290300370300200641b0016a41106a2013290300370300200641b0016a41086a2008290300370300200620062903d0013703b001410121080c100b4180064180042008200f4b1b21080c0d0b20064180066a41186a200641f0016a41186a29020037030020064180066a41106a200641f0016a41106a29020037030020064180066a41086a200641f0016a41086a290200370300200620062902f00137038006200041036a20084110763a0000200020083b0001200041013a00000c0d0b4100211241002108200141d8006a2802004102470d0a200641d0066a410c6a200141e0026a290200370200200641e4066a200141e8026a290200370200200641ec066a200141f0026a290200370200200641e2c289ab063602d0062006200141d8026a2902003702d406200141dc006a2802002108200641c8046a200141e0006a10cc05200641f0006a410c6a200641c8046a41086a28020036020020062008360270200620062903c8043702742006200141ec006a2802003602800120064180066a200641d0066a200641f0006a10ce0620062802c006450d03200641f0016a41056a20064180066a41d00010c9081a200641d8046a200641f0016a41d50010c9081a200641b0056a200641d8046a41056a41d00010c9081a200641f0016a200641b0056a41d00010c9081a200641d8046a410c6a2111410021124100210802400340200841d000460d0141081032220f450d08200642083702dc042006200f3602d80420012903702107200641d8046a41004108102f20062802d804221320062802e004220f6a2007370000201141002900ddd540370000201141086a41002900e5d5403700002006200641f0016a20086a3602f4042006200f41086a3602e00420064180066a200641d8046a10bf06024020062802dc04450d002013102c0b200641d8046a20064180066a10a20220062802d804221320062802e00410ce02210f024020062802dc04450d002013102c0b200841d0006a2108200f0d000b410221120b200641b4026a2802002208450d08200841306c450d08200641b0026a280200102c0c080b4100211241002108200141d8006a2d00004118470d0920064198026a200141e0026a290300370300200641f0016a41206a200141d8026a29030037030020064188026a200141d0026a29030037030020064180026a200141c8026a290300370300200641f8016a200141c0026a2903003703002006200141b8026a2903003703f001200641d8046a200641f0016a200141a8026a28020010a70420062903d8044201520d0820062903e0044202510d084100211220062d00fa044100200641d8046a41206a2d000041ff01714103461b41087441077221080c090b4100211241002108200141d8006a2802004102470d08200641d0066a410c6a200141d8026a290000370200200641e4066a200141e0026a290000370200200641ec066a200141e8026a290000370200200641e7e485f3063602d0062006200141d0026a2900003702d406200141dc006a2802002108200641c8046a200141e0006a10cc05200641f0006a410c6a200641c8046a41086a28020036020020062008360270200620062903c8043702742006200141ec006a2802003602800120064180066a200641d0066a200641f0006a10ce0620062802c006450d01200641f0016a41056a20064180066a41d00010c9081a200641d8046a200641f0016a41d50010c9081a200641b0056a200641d8046a41056a41d00010c9081a20014180016a2903002107200141f0006a290300210d200641f0016a200641b0056a41d00010c9081a200641d8046a410c6a2111410021124100210802400340200841d000460d01200641003602e004200642013703d804200641d8046a41004108102f20062802d80420062802e004220f6a200d3700002006200f41086a220f3602e004200641d8046a200f4108102f20062802d804221320062802e004220f6a2007370000201141002900edd540370000201141086a41002900f5d5403700002006200641f0016a20086a3602f4042006200f41086a3602e00420064180066a200641d8046a10bf06024020062802dc04450d002013102c0b200641d8046a20064180066a10a20220062802d804221320062802e00410ce02210f024020062802dc04450d002013102c0b200841d0006a2108200f0d000b410221120b200641b4026a2802002208450d06200841306c450d06200641b0026a280200102c0c060b200641f0016a200141d4006a10b506024020062d00f0014101460d002006419c026a280200210f20064198026a280200211620064194026a28020021122006418c026a280200211720064188026a2802002113024020064190026a2802002208450d002008410c6c21112013210803400240200841046a280200450d002008280200102c0b2008410c6a2108201141746a22110d000b0b02402017450d002013450d002017410c6c450d002013102c0b0240200f450d00200f410c6c21112012210803400240200841046a280200450d002008280200102c0b2008410c6a2108201141746a22110d000b0b2016450d072012450d072016410c6c450d072012102c0c070b20062d00f10122124102460d0620062f01f20121080c070b41042108410021120c060b41d0b6c800411941ecb6c800103c000b103b000b1039000b200641d8046a41086a200641f0016a41086a290300370300200641d8046a41106a200641f0016a41106a29030037030041800221080c030b4103210820124102470d010b20064190016a41186a200c29030037030020064190016a41106a200b29030037030020064190016a41086a200a290300370300200620062903d00137039001410021084200210e4200210d0c030b200041013a0000200041036a20084108763a0000200020084108742012723b00010c010b200641d0066a41186a200641b0056a41186a290300370300200641d0066a41106a200641b0056a41106a290300370300200641d0066a41086a200641b0056a41086a290300370300200620062903b0053703d006200041036a20084110763a0000200020083b0001200041013a00000b0240024002400240024002400240024002400240024020012802500e1800010c0c0c02030c0405060c0c0c070c0c0c0c0c0c0c08090a0b024002400240024002400240200141d8006a280200417e6a0e080011010211030405110b200141e0006a280200450d10200141dc006a280200102c0c100b200141e0006a280200450d0f200141dc006a280200102c0c0f0b200141e0006a280200450d0e200141dc006a280200102c0c0e0b200141dc006a10c1020c0d0b0240200141e4006a2802002203450d00200141dc006a28020021002003410c6c210303400240200041046a280200450d002000280200102c0b2000410c6a2100200341746a22030d000b0b200141e0006a2802002200450d0c2000410c6c450d0c200128025c102c0c0c0b200141e0006a280200450d0b200141dc006a280200102c0c0b0b02400240200141d8006a2802000e020c00010b200141fc006a102b200141ec016a102b0240200141e8006a2802002203450d00200141e0006a28020021002003410c6c210303400240200041046a280200450d002000280200102c0b2000410c6a2100200341746a22030d000b0b200141e4006a2802002200450d0b2000410c6c450d0b2001280260102c0c0b0b200141fc006a102b200141ec016a102b0240200141e8006a2802002203450d00200141e0006a28020021002003410c6c210303400240200041046a280200450d002000280200102c0b2000410c6a2100200341746a22030d000b0b200141e4006a2802002200450d0a2000410c6c450d0a2001280260102c0c0a0b0240200141dc006a2802002200450d00200041f0006c2103200141d4006a28020041046a210003402000102b200041f0006a2100200341907f6a22030d000b0b200141d8006a2802002200450d09200041f0006c450d092001280254102c0c090b02400240024002400240200141d8006a2d00000e180d0d0d0d0d0d000d0d0d0d0d0d0d0d010d0d020d0d0d0d03040b200141e0006a28020041ffffff3f71450d0c200141dc006a280200102c0c0c0b200141e0006a28020041ffffff3f71450d0b200141dc006a280200102c0c0b0b200141e4006a28020041ffffffff0371450d0a200141e0006a280200102c0c0a0b0240200141e0006a28020041808080807872418080808078460d00200141dc006a280200102c0b200141e8006a10e9010c090b0240200141e0006a28020041808080807872418080808078460d00200141dc006a280200102c0b200141e8006a10e9010c080b200141d4006a2802002200450d07200141d8006a280200450d072000102c0c070b02400240200141d8006a280200417f6a0e020001080b0240200141e8006a2802002203450d00200141e0006a28020021002003410c6c210303400240200041046a280200450d002000280200102c0b2000410c6a2100200341746a22030d000b0b200141e4006a2802002200450d072000410c6c450d072001280260102c0c070b0240200141e8006a2802002203450d00200141e0006a28020021002003410c6c210303400240200041046a280200450d002000280200102c0b2000410c6a2100200341746a22030d000b0b200141e4006a2802002200450d062000410c6c450d062001280260102c0c060b0240200141dc006a280200450d00200141d8006a280200102c0b0240200141ec006a2802002203450d00200141e4006a28020021002003410c6c210303400240200041046a280200450d002000280200102c0b2000410c6a2100200341746a22030d000b0b200141e8006a2802002200450d052000410c6c450d052001280264102c0c050b0240200141dc006a2802002203450d00200141d4006a2802002200200341d0006c6a21080340200041046a410036020020002802002103200041013602000240200041086a280200450d002003102c0b200041d0006a22002008470d000b0b0240200141d8006a2802002200450d00200041d0006c450d002001280254102c0b200141e0006a10c2020c040b200141d4006a2802004101470d030240200141e0006a280200450d00200141dc006a280200102c0b200141ec006a280200450d03200141e8006a280200102c0c030b02400240200141d8006a280200417f6a0e03000401040b0240200141e4006a280200450d00200141e0006a280200102c0b200141f0006a280200450d03200141ec006a280200102c0c030b0240024002400240024002400240200141e0006a2d00000e0700010203040506090b200141e4006a280200200141ec006a28020010c3020240200141e8006a2802002200450d0020004198026c450d002001280264102c0b200141f0006a280200200141f8006a28020010c402200141f4006a2802002200450d0820004188026c450d082001280270102c0c080b200141e4006a280200200141ec006a28020010c3020240200141e8006a2802002200450d0020004198026c450d002001280264102c0b200141f0006a280200200141f8006a28020010c402200141f4006a2802002200450d0720004188026c450d072001280270102c0c070b200141e4006a280200200141ec006a28020010c3020240200141e8006a2802002200450d0020004198026c450d002001280264102c0b200141f0006a280200200141f8006a28020010c402200141f4006a2802002200450d0620004188026c450d062001280270102c0c060b200141e4006a280200200141ec006a28020010c302200141e8006a2802002200450d0520004198026c450d052001280264102c0c050b200141e8006a280200450d04200141e4006a280200102c0c040b200141e8006a10a201200141e4006a220128020010c5022001280200102c0c030b200141e8006a10a201200141e4006a220128020010c5022001280200102c0c020b024002400240200141d8006a2d00000e0404000104020b200141dc006a22012802001083022001280200102c0c030b200141dc006a22012802001083022001280200102c0c020b200141fc006a22012802001083022001280200102c0c010b200641f0006a41186a2211200641b0016a41186a290300370300200641f0006a41106a220f200641b0016a41106a290300370300200641f0006a41086a2212200641b0016a41086a290300370300200620062903b001370370200641d0016a41186a221320064190016a41186a290300370300200641d0016a41106a220a20064190016a41106a290300370300200641d0016a41086a220b20064190016a41086a29030037030020062006290390013703d001200641f0016a200141d0006a41a80210c9081a20064180066a41186a220c201129030037030020064180066a41106a2211200f29030037030020064180066a41086a220f201229030037030020062006290370370380064102210102402008450d00200641d0066a41186a200c290300370300200641d0066a41106a2011290300370300200641d0066a41086a200f29030037030020062006290380063703d006410121010b200641ba056a200641d0066a41086a2208290300370100200641c2056a200641d0066a41106a2211290300370100200641ca056a200641d0066a41186a220f290300370100200620013a00b105200641003a00b005200620062903d0063701b20520064180066a200641b0056a10c702200641d8046a200641f0016a20064180066a10bf02200641d8046a41106a22012903002114200641d8046a41186a22122d0000210c20062903e004211520062903d8042118200f20132903003703002011200a2903003703002008200b290300370300200620062903d0013703d006200641f0016a41186a20064180056a290300370300200641f0016a41106a200641f8046a290300370300200641f0016a41086a2012290300370300200620012903003703f0010240024020184201520d0020064180066a41186a2201200641f0016a41186a29030037030020064180066a41106a2208200641f0016a41106a29030037030020064180066a41086a200641f0016a41086a290300370300200620062903f0013703800620154202510d00200641b0016a41086a20012903003e0200200620082903003703b0010c010b200641043a00b0010b024002400240024002400240200341ff01714102470d0020062d00b00141ff01714104470d010b024020154201520d00201420025a0d004200200220147d221820182002561b2118200641f0016a41186a220f4200370300200641f0016a41106a22014200370300200641f0016a41086a22084200370300200642003703f001200641b8046a41c1dcc700410610c5012008200641b8046a41086a2212290000370300200620062900b8043703f001200641c8046a41c4ccc600410b10c501200f200641c8046a41086a2213290000370300200120062900c80437030020064180066a200641f0016a1085032006200629038806420020062903800642015122111b3703b005200620064180066a41106a220a290300420020111b37039001200620064180066a41186a220b290300420020111b3703f806200641f8066a211102400240024020034103710e03010002010b20064190016a21110c010b200641b0056a21110b201142002011290300221920187d221820182019561b370300200b20062903f806370300200a200629039001370300200620062903b005370388062006420137038006200f42003703002001420037030020084200370300200642003703f001200641b8046a41c1dcc700410610c50120082012290000370300200620062900b8043703f001200641c8046a41c4ccc600410b10c501200141086a2013290000370000200120062900c804370000200641f0016a20064180066a41086a1086030b200641b0056a41186a200641d0066a41186a290300370300200641b0056a41106a200641d0066a41106a290300370300200641b0056a41086a200641d0066a41086a290300370300200620062903d0063703b005200641306a20052002201420142002561b200220154201511b200e200d200441ff0171410146200c41ff01714101467220031092062009500d02200641f0016a200641b0056a42002007200629033022027d220920092007562010200641306a41086a2903007d2007200254ad7d220220105620022010511b22011b4200200220011b10b6044200200641f0016a41086a29030020062802f00141014622011b220920077d200720097d2007200954220320104200200641f0016a41106a29030020011b22145420102014511b22011b2102201420107d2009200754ad7d201020147d2003ad7d20011b210720010d03200641f0016a41106a2201200d20072002200e562007200d562007200d511b22031b2210370300200642003703f0012006200e200220031b220d3703f801200641f0016a10cf062001200720107d2002200d54ad7d2207370300200642003703f00120062002200d7d220e3703f801200641f0016a10cf06200e200d842007201084844200520d0120064188026a2203420037030020014200370300200641f0016a41086a22084200370300200642003703f001200641b8046a41d4dcc700410810c5012008200641b8046a41086a2205290000370300200620062900b8043703f001200641c8046a41bba8c700410d10c5012003200641c8046a41086a220f290000370300200120062900c804370300200641186a200641f0016a412010d301200641186a41106a29030021022006290320210720062802182111200342003703002001420037030020084200370300200642003703f001200641b8046a41d4dcc700410810c50120082005290000370300200620062900b8043703f001200641c8046a41bba8c700410d10c5012003200f290000370300200120062900c80437030020062002420020111b3703880620062007420020111b37038006200641f0016a412020064180066a411010a7020c020b41c0dec400ad4280808080d001841000200641b0016a108c0341801021012009500d0320064188026a22034200370300200641f0016a41106a22084200370300200641f0016a41086a22114200370300200642003703f001200641b8046a41d4dcc700410810c5012011200641b8046a41086a220f290000370300200620062900b8043703f001200641c8046a41bba8c700410d10c5012003200641c8046a41086a2212290000370300200820062900c804370300200641c0006a200641f0016a412010d301200641c0006a41106a29030021022006290348210d20062802402105200342003703002008420037030020114200370300200642003703f001200641b8046a41d4dcc700410810c5012011200f290000370300200620062900b8043703f001200641c8046a41bba8c700410d10c50120032012290000370300200820062900c804370300200642002002420020051b220220107d200d420020051b220d200754ad7d220e200d20077d2207200d56200e200256200e2002511b22031b3703880620064200200720031b37038006200641f0016a412020064180066a411010a7020c030b20064180066a10cd02200641f0016a10cd02200641f0016a427f20022002200e542201200720107c2001ad7c220d200754200d2007511b22011b2202427f200d20011b220710d006200641a8026a2007370300200641a0026a2002370300200641f0016a41086a41043a000020064181026a20064180066a41086a29030037000020064189026a20064180066a41106a29030037000020064191026a20064198066a29030037000020062006290380063700f901200641023602f001200641f0016a10c8020b200041306a200641d8046a41286a290300370300200041286a200641d8046a41206a290300370300200041206a200641d8046a41186a290300370300200041186a200641d8046a41106a290300370300200041106a200641d8046a41086a290300370300200041086a20062903d804370300200041003a000020064180076a24000f0b20064188026a22014200370300200641f0016a41106a22034200370300200641f0016a41086a22084200370300200642003703f001200641b8046a41d4dcc700410810c5012008200641b8046a41086a2205290000370300200620062900b8043703f001200641c8046a41bba8c700410d10c5012001200641c8046a41086a220f290000370300200320062900c8043703002006200641f0016a412010d301200641106a290300210d2006290308210e20062802002111200142003703002003420037030020084200370300200642003703f001200641b8046a41d4dcc700410810c50120082005290000370300200620062900b8043703f001200641c8046a41bba8c700410d10c5012001200f290000370300200320062900c8043703002006427f200d420020111b220d20077c200e420020111b220720027c220e2007542201ad7c220220012002200d542002200d511b22011b370388062006427f200e20011b37038006200641f0016a412020064180066a411010a70241800221010b200020013b0001200041013a0000200041036a41003a00000b20064180076a24000b8b0101017f41f8b8c800ad4280808080d001841000024002400240024020002d00000e0400010203000b200041046a29020010000f0b41eab8c800ad4280808080e0018410000f0b41e0b8c800ad4280808080a0018410000f0b20003100011001200041026a31000010010240200041046a2802002201450d00200041086a3502004220862001ad8410000b0bb50601037f20002d000021022001200141086a22032802004101102f200128020020032802006a21040240024020024101460d00200441003a00002003200328020041016a2202360200024002400240024002400240024002400240024020002d00010e0a000102030405060708090b0b200120024101102f2001280200200141086a22012802006a41003a00002001200128020041016a3602000f0b200120024101102f2001280200200141086a22012802006a41013a00002001200128020041016a3602000f0b200120024101102f2001280200200141086a22012802006a41023a00002001200128020041016a3602000f0b200120024101102f2001280200200141086a22012802006a41033a00002001200128020041016a3602000f0b200120024101102f2001280200200141086a22012802006a41043a00002001200128020041016a3602000f0b200120024101102f2001280200200141086a22012802006a41053a00002001200128020041016a3602000f0b200120024101102f2001280200200141086a22012802006a41063a00002001200128020041016a3602000f0b200120024101102f2001280200200141086a22032802006a41073a00002003200328020041016a2202360200200041026a2d00002100200120024101102f200128020020032802006a20003a00002003200328020041016a3602000f0b200120024101102f2001280200200141086a22012802006a41083a00002001200128020041016a3602000f0b200120024101102f2001280200200141086a22012802006a41093a00002001200128020041016a3602000f0b200441013a00002003200328020041016a220236020002400240024020002d00010e03000102030b200120024101102f2001280200200141086a22012802006a41003a00002001200128020041016a3602000f0b200120024101102f2001280200200141086a22012802006a41013a00002001200128020041016a3602000f0b200120024101102f2001280200200141086a22032802006a41023a00002003200328020041016a2202360200200041026a2d00002100200120024101102f200128020020032802006a20003a00002003200328020041016a3602000b0b8f0201027f20014180feff07714108762102024002402001410171450d00411f210341b9bdc800210102400240200241ff01710e03000103000b41c100210341f8bcc80021010c020b41c100210341b7bcc80021010c010b411f21034198bcc8002101024002400240024002400240024002400240200241ff01710e0a00060102030405090708000b4120210341f8bbc80021010c080b412721034198bbc80021010c070b411721034181bbc80021010c060b41e2bac80021010c050b4126210341bcbac80021010c040b412a21034192bac80021010c030b4139210341bfbbc80021010c020b413b210341d7b9c80021010c010b41d20021034185b9c80021010b20002003360204200020013602000bc22205067f027e017f057e0c7f230022042105200441e0036b416071220424002004200336021420042001360210024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d00004101460d00200241046a28020021020240200141386a220628020022032003417f6a2207200141306a220828020022032001412c6a22092802006b716b4101470d0020091090032006280200417f6a2107200828020021030b20082007200341016a71360200200141346a28020020034102746a2002360200200141286a280200220320024d0d02200441d8006a2001280220200241fc006c6a2201290240220a370300200441386a22032001290220370300200441186a41d8006a2207200141d8006a290200370300200441186a41d0006a2208200141d0006a290200370300200441186a41c8006a2206200141c8006a290200370300200441186a41386a200141386a290200220b370300200441186a41306a2209200141306a290200370300200441186a41286a200141286a290200370300200441186a41186a220c200141186a22022902003703002001290210210d200120042903f0013702102001290208210e200120042903e801370208200220042903f801370200200441003a00e001200441003602e4012001290200210f200120042903e0013702002004200d3703282004200e3703202004200f37031820012902602110200141f8006a2802002102200141f0006a2902002111200441186a41e8006a200141e8006a290200370300200441186a41f0006a2011370300200441186a41f8006a2002360200200441f8006a2010370300200fa741ff01714101460d01200ea72102200e422088a72101200a422088a72112200ba72113200441c0016a41086a22142003290300370300200441c0016a41106a2203200441186a41286a290300370300200441c0016a41186a2009290300370300200441a8016a41086a2008290300370300200441a8016a41106a20072802003602002004200c2903003703c001200420062903003703a801200441d4006a290200220aa7211502400240024002400240200f422088a70e050102030400010b200441e0016a41086a200d370300200441e0016a41106a20042903c001370300200441e0016a41186a201429030037030020044180026a2003290300370300200441e0016a41286a200441c0016a41186a290300370300200420023602e001200420013602e40102400240200141244b0d00200441e9016a21060c010b200d422088a7210620042802f00121010b200241017621080240024020024101710d0020012008490d0941012109410021030c010b200120084d0d09200620086a2d0000410f71210341002109200841016a21080b200141017420026b220241ffff03200241ffff03491b220241017641036a220c10322214450d09200120086b2107200620086a2108200441003602a0012004200c36029c01200420143602980102402015410020151b22060d00200420023602e402200441013b01e002200441e0026a20044198016a109103410021022009450d0d410021010c100b200420023602e40220044181023b01e002200441e0026a20044198016a109103410021022009450d0d410021010c0e0b410110322201450d082004420137029c01200420013602980120044198016a4100410110c80120042802980120042802a0016a41003a0000200420042802a00141016a3602a0010c100b200441e0016a41086a200d370300200441e0016a41106a20042903c001370300200441e0016a41186a201429030037030020044180026a2003290300370300200441e0016a41286a200441c0016a41186a290300370300200420023602e001200420013602e40102400240200141244b0d00200441e9016a21070c010b200d422088a7210720042802f00121010b200241017621030240024020024101710d0020012003490d0a200441e8026a200120036b360200200441003b01e0022004200720036a3602e4020c010b200120034d0d0a200441013a00e002200441e8026a2001200341016a22026b3602002004200720026a3602e4022004200720036a2d0000410f713a00e1020b20044198016a200441e0026a2013200a422088a710920302402013410020151b2201450d002015450d002001102c0b20042802e40141244d0d0f200441ec016a280200102c0c0f0b200441e0016a41086a200d370300200441e0016a41106a20042903c001370300200441e0016a41186a201429030037030020044180026a2003290300370300200441e0016a41286a200441c0016a41186a290300370300200420023602e001200420013602e40102400240200141244b0d00200441e9016a21000c010b200d422088a7210020042802f00121010b200420023602c802200420013602c402200420003602c002200441a0036a200441c0026a1093032004280214200441c0026a41002004109403210120042802102102200441a4026a201236020020044198026a41106a20042903a801370300200441b0026a200441b0016a290300370300200441b8026a200441a8016a41106a2802003602002004200a37029c022004201336029802200441e0026a200220044198026a20042802142204108f0320042001109503109603000b109703000b200041003a000020002002290001370001200041196a200241196a290000370000200041116a200241116a290000370000200041096a200241096a2900003700000c140b20002004290019370001200041003a0000200041196a200441186a41196a290000370000200041116a200441186a41116a290000370000200041096a200441186a41096a2900003700000c120b2002200341b4f3c000103f000b2008200141f0c2c8001058000b200820014180c3c800103f000b1039000b2003200141f0c2c8001058000b200320014180c3c800103f000b410121010c020b410121010b03400240024020010e020001010b200220074f0d03200820026a2d00002103200241016a2102410121010c010b024020042802a0012201200428029c01470d0020044198016a2001410110c8010b20042802980120016a20033a00002004200141016a3602a001410021010c000b0b03400240024020010e020001010b200220074f0d02200820026a2d00002103200241016a2102410121010c010b024020042802a0012201200428029c01470d0020044198016a2001410110c8010b20042802980120016a20033a00002004200141016a3602a001410021010c000b0b20042802a0012216210102402016200428029c01470d0020044198016a2016410110c80120042802a00121010b20042802980120016a41003a0000200420042802a00141016a22013602a00102402001200428029c01470d0020044198016a2001410110c80120042802a00121010b201341c0046a211720042802980120016a41003a0000200420042802a00141016a3602a00102402006450d002006201220044198016a10bb010b024002400240024020172013470d004100210c410021010c010b200441e0026a4101722103200441e9016a2118200441a0036a410172210241002109201321014100210c41012106024002400340200441023a00e0022001290200210f20042903f802210e20042903f002210d20042903e8022110200120042903e0023702002001290208211120012010370208200129021021102001200d370210200141186a2207290200210d2007200e3702002004200d3703b803200420103703b003200420113703a8032004200f3703a003200141206a2802002119200441e0026a41176a2214200241176a290000370000200441e0026a41106a2207200241106a290000370300200441e0026a41086a2208200241086a290000370300200420022900003703e0020240200fa7221a41ff017122124103470d00200c4180fe037141087621010c050b200441c0026a41176a221b2014290000370000200441c0026a41106a22142007290300370300200441c0026a41086a2008290300220f370300200420042903e002220e3703c002200441a0036a41176a221c201b290000370000200441a0036a41106a221b2014290300370300200441a0036a41086a2214200f3703002004200e3703a00302400240024020124102470d00200441023a0098020c010b0240024020042802e401221241244b0d002018211d0c010b20042802f001211220042802ec01211d0b200420042802e0013602d803200420123602d4032004201d3602d0032004280214200441d0036a4101200910940321122004280210211d200320042903a003370000200341086a2014290300370000200341106a201b290300370000200341176a201c2900003700002004201a3a00e002200420193602800320044198026a201d200441e0026a20042802142219108f032019201210950320042d0098024103460d010b200441e0026a41206a20044198026a41206a290300370300200441e0026a41186a20044198026a41186a290300370300200720044198026a41106a290300370300200820044198026a41086a2903003703002004200429039802220f3703e002410021070240024002400240200fa741ff0171417f6a0e020103000b2003412020044198016a10bb010c010b200441a0036a41186a200341186a290000370300201b200341106a2900003703002014200341086a290000370300200420032900003703a003200428028403220741214f0d04200441a0036a200720044198016a10bb010b200621070b200941016a2109200641017421062007200c72210c200141246a22012017460d030c010b0b200c4180fe037141087621010c040b2007412041bce7c300104f000b200c4180fe037141087621010b200441033a00a003200441f7026a20042900b803370000200441f0026a20042900b103370300200441e8026a20042900a903370300200420042900a1033703e0020b200441033a0098020b201641026a21022016417d4b0d0120042802a00122032002490d0220042802980120166a2001410874200c41ff0171723b000002402015450d00200a428080808010200a428080808010561ba72201450d00200a428080808010540d002001102c0b2013102c20042802e40141244d0d00200441ec016a280200102c0b024020042802a0012201411f4b0d00200441f8016a22024200370300200441f0016a22034200370300200441e8016a22074200370300200442003703e001200441e0016a200428029801200110c9081a200041246a2001360200200041013a0000200041196a2002290300370000200041116a2003290300370000200041096a2007290300370000200020042903e0013700010c060b2004280210220241c0006a2802002108200228023c21062004280214220728022c2209410176210220072802002103024002402009410171450d000240024020034125490d002007410c6a220928020022032002490d06200741086a220c280200210720092802002103200c28020021090c010b20032002490d05200741056a220721090b200320024d0d05200441e9026a200920026a2d000041f001713a0000200420073602e002410121030c010b02400240200341244b0d00200741056a21070c010b2007410c6a2802002103200741086a28020021070b20032002490d05200420073602e002410021030b200420033a00e802200420023602e402200441e0016a2006200441e0026a20042802980120012008280214110400200020042903e001370001200041096a200441e8016a290300370000200041116a200441f0016a290300370000200041196a200441f8016a290300370000200041003a000020042802102201200128026c41016a36026c0c050b2016200241cce7c3001059000b2002200341cce7c300104f000b2002200341f0c1c800104f000b200220034180c2c800103f000b200220034190c2c800104f000b02402004280298014100200428029c0122011b2202450d002001450d002002102c0b20042d0018450d010b2004413c6a109803200524000f0b200524000bda0201057f02402000410c6a28020022012001417f6a200041046a28020020002802006b716b4101470d002001210202402001450d0002400240200120016a22022001490d00200241ffffffff037122032002470d00200241027422044100480d002003200246410274210302400240200141027422020d0002402004450d002004103222020d040c020b200321020c030b200028020820022004103522020d020b2003450d001039000b103b000b200020023602082000410c6a200441027622023602000b0240024020022001410174470d0020002802002204200041046a28020022034d0d022003200120046b2205490d0120002802082201200220056b22024102746a200120044102746a200541027410c9081a200020023602000f0b41f8a0c700412b41a4a1c700103c000b2000280208220220014102746a2002200341027410c9081a200041046a2200200028020020016a3602000b0bab0501047f024002400240024020002d00000e03010200010b200041046a280200220241ffff03200241ffff03491b220041c0006a41ff0020002002413e2000413e491b2203461b2102200020036b2103200141086a2100410121040340024002400240200441ff01714102470d00200221050c010b410021052004410171450d00410021040c010b2003450d0402402003418002490d00200341817e6a210341ff012102410221040c010b2003417f6a210241022104410021030b200120002802004101102f200128020020002802006a20023a00002000200028020041016a360200200521020c000b0b2001200141086a22002802004101102f200128020020002802006a41003a00002000200028020041016a3602000c010b200041046a2802002202413e200241ffff03200241ffff03491b2203413e491b2104024020002d0001450d00200341406a417f20032004461b2102200320046b2103200141086a2100410121040340024002400240200441ff01714102470d00200221050c010b410021052004410171450d00410021040c010b2003450d0302402003418002490d00200341817e6a210341ff012102410221040c010b2003417f6a210241022104410021030b200120002802004101102f200128020020002802006a20023a00002000200028020041016a360200200521020c000b0b200341807f7341bf7f20032004461b2102200320046b2103200141086a2100410121040340024002400240200441ff01714102470d00200221050c010b410021052004410171450d00410021040c010b2003450d0202402003418002490d00200341817e6a210341ff012102410221040c010b2003417f6a210241022104410021030b200120002802004101102f200128020020002802006a20023a00002000200028020041016a360200200521020c000b0b0b9b0201067f02400240200141086a280200220441036a2205417f4c0d0020012d000021062001280204210720012d000121084101210102402005450d00200510322201450d020b20002001360200200041086a22014100360200200041046a22092005360200200441017420066a220541ffff03200541ffff03491b41c000200010af060240024020060d00200128020021050c010b2008410f7121060240200128020022012009280200470d00200020014101102f200041086a28020021010b200041086a200141016a2205360200200028020020016a20063a00000b200020052004102f2000280200200041086a220128020022056a2007200410c9081a2001200520046a36020020022003200010bb010f0b103b000b1039000bb70101057f20012802082202410176210320012802042104024002400240024020024101710d0020042003490d02200128020020036a210141002102410021050c010b200420034d0d024101210520012802002202200341016a22066a2101200220036a2d0000410f712102200621030b200020053a000c20002001360204200041003602002000410d6a20023a0000200041086a200420036b3602000f0b2003200441f0c2c8001058000b200320044180c3c800103f000b8d0a01127f230041106b2204240002400240024002400240024020010d00410021010c010b200141086a28020022054101762106200141046a2802002107024002400240024020054101710d00200720064f0d012006200741f0c2c8001058000b200720064b0d01200620074180c3c800103f000b200720066b2108200128020020066a21090c010b20002001280200220120066a2d0000410f7110b7082007200641016a22066b2108200120066a21090b0240024002400240024002400240024002400240200028020022014125490d002000412c6a210a2000410c6a2206280200410174200028022c460d0120080d03410021080c090b2000412c6a210a2001410174200028022c460d0120080d03410021080c080b200628020021010b20042000200810a008024020042802004101470d00200441086a2802000d0941e8c4c800411141fcc4c800103c000b02400240024002400240200028020022064125490d002000410c6a28020022062001490d02200041086a280200210b0c010b20062001490d01200041056a210b0b200b20016a220b20086a200b200620016b10ca081a200b2009200810c9081a200028020041244b0d01200021010c020b4194c6c800411e41b4c6c800103c000b2000410c6a21010b2001200620086a3602000c060b2000410c6a280200220b2006280200417f6a22064b0d01200b21010c0a0b20012001417f6a22064d0d09200041056a20066a2d0000417071210b0c010b200041086a28020020066a2d0000417071210b200141244b0d010b200041056a210c0c010b2000410c6a2802002101200041086a280200210c0b200120064d0d03200c20066a200b3a000020092d0000210b024002402000280200220141244b0d00200041056a210c0c010b2000410c6a2802002101200041086a280200210c0b200120064d0d04200c20066a220120012d0000200b410476723a0000024002402008417f6a220d0d004100210d0c010b2008417f6a210e20084101200841014b1b417f6a210f410021012000410c6a2110200041086a2111200041056a21120340024002400240024020082001460d00200f2001460d01200920016a22062d00002113200641016a2d00002114024002402000280200220b41244b0d004124210b200021062012210c0c010b2011280200210c201021060b20062802002215200b470d0320042000410110a00820042802004101470d02200441086a2802000d0841e8c4c800411141fcc4c800103c000b2008200841d0c2c800103f000b200141016a200841e0c2c800103f000b2000410c6a220628020021152011280200210c0b200c20156a201441f001714104762013410474723a00002006200628020041016a360200200e200141016a2201470d000b0b2009200d6a2d0000211541242106024002402000280200220c41244b0d00200041056a210b200021010c010b2000410c6a2101200041086a280200210b200c21060b02402001280200220c2006470d0020042000410110a008024020042802004101470d00200441086a2802000d0441e8c4c800411141fcc4c800103c000b2000410c6a2201280200210c200041086a280200210b0b200b200c6a20154104743a00002001200128020041016a3602000b200a200a28020020084101746a360200200741017420056b21010b02402002450d002000200310b708200141016a21010b200441106a240020010f0b1039000b2006200141b0c2c800103f000b2006200141c0c2c800103f000b2006200141a0c2c800103f000b900301057f02402001450d0002400240200028022c220220014d0d00200220016b2203410176200341017122046a21052000280200220221010240200241244d0d002000410c6a28020021010b200520014f0d012000410c6a2106200520016b41016a2101034002400240200241244b0d00200021020c010b200621020b024020022802002205450d0020022005417f6a3602000b2001450d02200141016a2101200028020021020c000b0b024002402000280200220141244b0d00200021020c010b2000410c6a220228020021010b02402001450d00200241003602000b2000410036022c0c010b2000200336022c2004450d000240024002400240200028020022014125490d002000410c6a220528020022012001417f6a22024d0d02200041086a220628020020026a2d0000417071210020052802002101200628020021050c010b2001417f6a220220014f0d01200041056a220520026a2d000041707121000b200120024d0d01200520026a20003a00000f0b2002200141d0c1c800103f000b2002200141e0c1c800103f000b0b110041d5a1c800412841ace7c300103c000b110041d5a1c8004128419ce7c300103c000bdb0101017f0240024002400240024020002802000e0404000102030b0240200041086a28020041244d0d00200041106a280200102c0b200041386a2802002201450d03200041346a2802002200450d032001450d032000102c0f0b200041086a28020041244d0d02200041106a280200102c0f0b2000280204102c200041086a2802002201450d012000410c6a280200450d012001102c0c010b0240200041086a28020041244d0d00200041106a280200102c0b200041346a280200102c200041386a2802002201450d002000413c6a280200450d002001102c0f0b0bd90303047f017e017f23004180016b220224000240024002400240024002400240200028020c2203200041106a280200470d002002200141fc0010c908210120002802082203200041046a280200470d03200341016a22042003490d06200341017422052004200520044b1b22044104200441044b1bad42fc007e2206422088a722050d062006a722044100480d0620054541027421070240024002402000280200410020031b22050d002004450d010c040b200341fc006c22030d0120040d030b200721030c030b200520032004103522030d020c040b2000410c6a200041186a280200417f6a200341016a71360200200041146a28020020034102746a28020021032002200141fc0010c908210102402000280208220420034d0d000240024020002802002200200341fc006c6a22042d00000d002000200341fc006c6a41046a1098030c010b2000200341fc006c6a41246a1098030b2004200141fc0010c9081a0c050b2003200441a4f4c000103f000b200410322203450d020b20002003360200200041046a200441fc006e360200200028020821030b2000280200200341fc006c6a200141fc0010c9081a20002000280208220341016a3602080c010b2007450d011039000b20024180016a240020030f0b103b000bbc0401037f23004190016b2206240041002107200641003602080240024020012d00484101460d00200141cc006a28020021080c010b200641366a200141cb006a2d00003a0000200641206a200141d8006a290000370300200641286a200141e0006a290000370300200641306a200141e8006a2d00003a00002006200141c9006a2f00003b01342006200141d0006a290000370318200141cc006a2800002108410121070b200641c8006a41086a2006290318370300200641c8006a41106a200641186a41086a290300370300200641c8006a41186a200641186a41106a290300370300200641e8006a200641186a41186a280200360200200620073a0048200620062f01343b00492006200836024c2006200641366a2d00003a004b2006410036027820062003360274200620023602700240024002402005417f4c0d004101210702402005450d00200510322207450d020b20064100360288012006200536028401200620073602800120064180016a4100200510c80120062802800120062802880122076a2004200510c9081a2006200720056a36028801200641386a2001200641c8006a200641f0006a20064180016a200641086a109b03200628023c2105024020062802384101460d00200141003a00482000200629030837020420004100360200200141cc006a20053602002000410c6a200641106a2802003602000c030b200041013602002000200536020420062802082201450d02200628020c450d022001102c0c020b103b000b1039000b20064190016a24000bcd3205077f017e017f0b7e0b7f230022062107200641e0086b4160712206240002400240024002400240024020022d00004101470d00200641b8036a200241196a290000370300200641b0036a200241116a290000370300200641a8036a200241096a290000370300200620022900013703a003200328020822084101762102200328020421092003280200210a024002402008410171450d0020092002490d03200220094f0d01200a20026a2d00004170712109410121080c040b024020092002490d00410021080c040b2002200941c8c4c800104f000b2002200941d8c4c800103f000b200241046a28020021020c020b2002200941b8c4c800104f000b200141c0006a280200210b200128023c210c200641e9046a20093a0000200620083a00e804200620023602e4042006200a3602e004200620062f01c8073b01ea0420064188086a200c200641a0036a200641e0046a200b28020c1106000240024020062802880822090d00200641f0056a2201200641ab036a290000370300200641e8056a41106a2203200641b3036a290000370300200641fd056a2209200641b8036a290000370000200620062900a3033703e80520062d00a203210520062f01a003210a4130103222020d011039000b200629028c08210d200641c0046a41186a200641a0036a41186a2208290300370300200641c0046a41106a200641a0036a41106a220b290300370300200641c0046a41086a200641a0036a41086a220c290300370300200620062903a0033703c004200641e0046a200641c0046a2009200d422088a7200141206a220e109c0320062802e404210220062802e004210a20064188086a200641e0046a41086a41d40010c9081a200a4101460d02200641e0036a20064188086a41d40010c9081a200620023602840520064188056a200641e0036a41d40010c9081a200641f9046a2008290300370000200641f1046a200b290300370000200641e9046a200c290300370000200641013a00e004200620062903a0033700e104200e200641e0046a1099032102200da7450d012009102c0c010b2002200a20054110747222053b0001200241013a0000200220062903e805370004200220062900e004370021200241036a20054110763a00002002410c6a2001290300370000200241146a2003290300370000200241196a2009290000370000200241286a200641e7046a2900003700000c020b0240200141386a220b28020022092009417f6a2208200141306a220a28020022092001412c6a220c2802006b716b4101470d00200c109003200b280200417f6a2108200a28020021090b200a2008200941016a71360200200141346a28020020094102746a200236020002400240024002400240024002400240200141286a280200220920024d0d00200141206a220a280200200241fc006c6a2202290210210f200220062903f00437021020022902082110200220062903e804370208200241186a22092902002111200920062903f804370200200641003a00e004200641003602e4042002290200210d200220062903e00437020020022902402112200241c8006a2902002113200241d0006a2902002114200241d8006a290200211520022902202116200241286a2902002117200241306a2902002118200241386a290200211920064180036a41086a2209200241e8006a29020037030020064180036a41106a2208200241f0006a29020037030020064180036a41186a220b200241f8006a280200360200200620113703f8032006200f3703f003200620103703e8032006200d3703e003200620193703d804200620183703d004200620173703c804200620163703c004200620153703b803200620143703b003200620133703a803200620123703a0032006200229026037038003200641d0036a41086a2202200441086a280200360200200620042902003703d0030240024002400240024002400240200da7220c41ff01714101470d002003280200210e2003280204211a2003280208210420064188076a41186a20062802fc0336020020064188076a41106a20062902f40337030020064188076a41086a20062902ec03370300200620062902e40337038807200641bc086a2015370200200641b4086a201437020020064188086a41246a2013370200200641a4086a201237020020064188086a41186a20062802dc0436020020064188086a41106a20062902d40437030020064188086a41086a20062902cc04370300200620062902c4043703880820064188086a413c6a20062903800337020020064188086a41c4006a2009290300370200200641d4086a2008290300370200200641dc086a200b280200360200200641e8056a41086a2002280200360200200620062903d0033703e805200641e0046a200120064188086a2003200641e8056a2005109d0320062802e404210220062802e0044101460d06200d420888a721052016a72108200641e8076a41186a220b20064180056a280200360200200641e8076a41106a221b200641e0046a41186a290300370300200641e8076a41086a221c200641e0046a41106a221d290300370300200641c8076a41086a221e2006418d056a290000370300200641c8076a41106a221f20064195056a290000370300200641c8076a41176a2220200641e0046a413c6a29000037000020062006290085053703c8072006200641e0046a41086a22212903003703e807200641e0046a41246a2d00002103200641a8076a41086a2222200641ad056a290000370300200641a8076a41106a2223200641b5056a290000370300200641a8076a41176a2224200641bc056a280000360000200620062900a5053703a807200641e0046a41c4006a2d0000210920020e03020501020b200641bc086a2019370200200641b4086a201837020020064188086a41246a2017370200200641a4086a201637020020064188086a41186a20062802fc0336020020064188086a41106a20062902f40337030020064188086a41086a20062902ec0337030020064188086a413c6a20062903a00337020020064188086a41c4006a20062903a803370200200641d4086a20062903b003370200200641dc086a20062802b803360200200620062902e4033703880820064188076a41086a2002280200360200200620062903d00337038807200641e0046a200120064188086a200320064188076a2005109d0320062802e404210220062802e0044101460d05200641e8056a41186a220920064180056a280200360200200641e8056a41106a2208200641e0046a41186a290300370300200641e8056a41086a220b200641e0046a41106a290300370300200641c8076a41086a220c2006418d056a290000370300200641c8076a41106a220e20064195056a290000370300200641c8076a41176a221a200641e0046a413c6a29000037000020062006290085053703c8072006200641e0046a41086a2903003703e805200641e0046a41246a2d00002103200641e8076a41086a221b200641ad056a290000370300200641e8076a41106a221c200641b5056a290000370300200641e8076a41176a221d200641bc056a280000360000200620062900a5053703e807200641e0046a41c4006a2d0000210541022101024020020e03000304000b200641e8066a41186a2009280200360200200641e8066a41106a2008290300370300200641e8066a41086a200b290300370300200641c8066a41086a200c290300370300200641c8066a41106a200e290300370300200641c8066a41176a201a290000370000200641a8066a41086a201b290300370300200641a8066a41106a201c290300370300200641a8066a41176a201d280000360000200620062903e8053703e806200620062903c8073703c806200620062903e8073703a80641002101410121040c030b20044101762102024002402004410171450d00201a2002490d082002201a4f0d01200e20026a2d00004170712103410121040c0b0b0240201a2002490d00410021040c0b0b2002201a41c8c4c800104f000b2002201a41d8c4c800103f000b20044101762102024002402004410171450d00201a2002490d082002201a4f0d01200e20026a2d000041707121044101210b0c090b0240201a2002490d004100210b0c090b2002201a41c8c4c800104f000b2002201a41d8c4c800103f000b200641e8066a41186a2009280200360200200641e8066a41106a2008290300370300200641e8066a41086a200b290300370300200641c8066a41086a200c290300370300200641c8066a41106a200e290300370300200641c8066a41176a201a290000370000200641a8066a41086a201b290300370300200641a8066a41106a201c290300370300200641a8066a41176a201d280000360000200620062903e8053703e806200620062903c8073703c806200620062903e8073703a80641002104410021010b410021020c080b200641e8066a41086a20064188076a41086a290300370300200641e8066a41106a20064188076a41106a290300370300200641e8066a41186a20064188076a41186a280200360200200641eb046a201c290300370000200641f3046a201b290300370000200641fb046a200b280200360000200641a8066a41176a2020290000370000200641a8066a41106a201f290300370300200641a8066a41086a201e29030037030020062006290388073703e806200620062903e8073700e304200620062903c8073703a80620064188066a41176a202428000036000020064188066a41106a202329030037030020064188066a41086a2022290300370300200641c8066a41176a200641e0046a41176a290000370000200641c8066a41106a201d290000370300200641c8066a41086a2021290000370300200620062903a80737038806200620062900e0043703c806410121014100210420032105200821030c060b410121010c070b2002200941b4f3c000103f000b2002201a41b8c4c800104f000b2002201a41b8c4c800104f000b20064188086a200e2002109e03200641b5086a20043a0000200641eb046a20064188076a41086a290300370000200641f3046a20064188076a41106a290300370000200641fb046a20064188076a41186a280200360000200641e0046a41286a20064188086a41086a29030037030020064190056a20064188086a41106a29030037030020064198056a20064188086a41186a290300370300200641a0056a200641a8086a2903003703002006200b3a00b408200641a8056a20064188086a41286a290300370300200620083a00ff0420062006290388073700e304200620062903880837038005200620053b01e004200620054110763a00e2042001200641e0046a109f03200641e8066a41086a200641e8076a41086a290300370300200641e8066a41106a200641e8076a41106a290300370300200641e8066a41186a200641e8076a41186a280200360200200641c8066a41086a200641c8076a41086a290300370300200641c8066a41106a200641c8076a41106a290300370300200641c8066a41176a200641c8076a41176a290000370000200641a8066a41086a200641a8076a41086a290300370300200641a8066a41106a200641a8076a41106a290300370300200641a8066a41176a200641a8076a41176a280000360000200620062903e8073703e806200620062903c8073703c806200620062903a8073703a8064100210141012104200921050c010b20064188086a200e2002109e03200641b5086a20033a0000200641eb046a20064188076a41086a290300370000200641f3046a20064188076a41106a290300370000200641fb046a20064188076a41186a280200360000200641e0046a41286a20064188086a41086a29030037030020064190056a20064188086a41106a29030037030020064198056a20064188086a41186a290300370300200641a0056a200641a8086a290300370300200620043a00b408200641a8056a20064188086a41286a290300370300200620083a00ff0420062006290388073700e304200620062903880837038005200620053b01e004200620054110763a00e2042001200641e0046a109f03410221010b200c41807e7121020b200641c8076a41186a200641e8066a41186a280200360200200641c8076a41106a200641e8066a41106a290300370300200641c8076a41086a200641e8066a41086a290300370300200641e0046a41086a200641c8066a41086a290300370300200641e0046a41106a200641c8066a41106a290300370300200641e0046a41176a200641c8066a41176a29000037000020064188086a41086a200641a8066a41086a29030037030020064188086a41106a200641a8066a41106a29030037030020064188086a41176a200641a8066a41176a290000370000200620062903e8063703c807200620062903c8063703e004200620062903a80637038808200641e8056a41176a20064188066a41176a280000360000200641e8056a41106a20064188066a41106a290300370300200641e8056a41086a20064188066a41086a29030037030020062006290388063703e80520012002722102410021010b200641e0026a41086a2208200641c8076a41086a290300370300200641e0026a41106a220b200641c8076a41106a290300370300200641e0026a41186a220c200641c8076a41186a280200360200200641c0026a41086a220e200641e0046a41086a290300370300200641c0026a41106a221a200641e0046a41106a290300370300200641c0026a41176a221b200641e0046a41176a290000370000200620062903c8073703e002200620062903e0043703c002200641a0026a41176a221c20064188086a41176a290000370000200641a0026a41106a221d20064188086a41106a290300370300200641a0026a41086a221e20064188086a41086a29030037030020064180026a41086a221f200641e8056a41086a29030037030020064180026a41106a2220200641e8056a41106a29030037030020064180026a41176a2221200641e8056a41176a28000036000020062006290388083703a002200620062903e805370380020240024020010d00200641e0016a41186a200c280200360200200641e0016a41106a200b290300370300200641e0016a41086a2008290300370300200641c0016a41086a200e290300370300200641c0016a41106a201a290300370300200641c0016a41176a201b290000370000200641a0016a41086a201e290300370300200641a0016a41106a201d290300370300200641a0016a41176a201c290000370000200620062903e0023703e001200620062903c0023703c001200620062903a0023703a00120064180016a41176a202128000036000020064180016a41106a202029030037030020064180016a41086a201f290300370300200620062903800237038001200241ff01714102460d01200641e0006a41186a2201200641e0016a41186a280200360200200641e0006a41106a2208200641e0016a41106a290300370300200641e0006a41086a220b200641e0016a41086a290300370300200641c0006a41086a220c200641c0016a41086a290300370300200641c0006a41106a220e200641c0016a41106a290300370300200641c0006a41176a221a200641c0016a41176a290000370000200641206a41086a221b200641a0016a41086a290300370300200641206a41106a221c200641a0016a41106a290300370300200641206a41176a221d200641a0016a41176a290000370000200620062903e001370360200620062903c001370340200620062903a001370320200641176a221e20064180016a41176a280000360000200641106a221f20064180016a41106a290300370300200641086a222020064180016a41086a2903003703002006200629038001370300200641c0046a41086a2221200b290300370300200641c0046a41106a220b2008290300370300200641c0046a41186a22082001280200360200200620062903603703c00420064188086a41086a2201200c29030037030020064188086a41106a220c200e29030037030020064188086a41176a220e201a2900003700002006200629034037038808200641e0036a41086a221a201b290300370300200641e0036a41106a221b201c290300370300200641e0036a41176a221c201d290000370000200620062903203703e003200641a0036a41176a221d201e280000360000200641a0036a41106a221e201f290300370300200641a0036a41086a221f2020290300370300200620062903003703a00320064180056a20033a0000200620023a00e004200620024118763a00e304200620024108763b00e104200641ec046a2021290300370200200641f4046a200b290300370200200641fc046a2008280200360200200620062903c0043702e40420064181056a20062903880837000020064189056a200129030037000020064191056a200c29030037000020064198056a200e290000370000200641a0056a20053a0000200641b8056a201c290000370000200641b1056a201b290300370000200641a9056a201a290300370000200641a1056a20062903e003370000200641c0056a20093a0000200641d8056a201d280000360000200641d1056a201e290300370000200641c9056a201f290300370000200641c1056a20062903a003370000200a200641e0046a1099032106200041086a20043a00002000200636020420004100360200200724000f0b2000410136020020002002360204200724000f0b41b4f4c000411841ccf4c000105c000b200da7450d002009102c0b2000410136020020002002360204024020042802042206450d0020042802002202450d002006450d002002102c0b200724000bcda40120047f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e027f017e087f017e087f017e230041b00e6b22052400200541086a2002200310a003024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020052d00084101470d0020052d00092102200541900e6a41086a2203200141086a290000370300200541900e6a41106a2204200141106a290000370300200541900e6a41186a2206200141186a290000370300200520012900003703900e4130103222010d010c2a0b200541d4016a2802002107200541d0016a2802002108200541c8016a2903002109200541c4016a280200210a200541bc016a290200210b200541b8016a280200210c200541b0016a290300210d200541ac016a280200210e200541a4016a290200210f200541a0016a280200211020054198016a290300211120054194016a28020021122005418c016a290200211320054188016a280200211420054180016a2903002115200541fc006a2802002116200541f4006a2902002117200541f0006a2802002118200541e8006a2903002119200541e4006a280200211a200541dc006a290200211b200541086a41d0006a280200211c200541086a41c8006a290300211d200541086a41c4006a280200211e200541086a413c6a290200211f200541086a41386a2802002120200541386a2903002121200541086a412c6a2802002122200541086a41246a22232902002124200541286a22252802002126200541086a411c6a22272802002128200541086a41186a222928020021022005411c6a222a280200212b200541086a410c6a222c290200212d200541086a41086a222e280200212f41002130200528020c0e051502030401150b200141033a0000200120052903900e370001200120023a0021200120052901e00d370122200141096a2003290300370000200141116a2004290300370000200141196a2006290300370000200141286a200541e60d6a29010037010020004101360200200020013602040c270b200541e0016a2802002131200541dc016a2802002132200541d8016a28020021334102210302400240202b4102470d0041002102410021060c010b200541900e6a41186a2206200141186a290000370300200541900e6a41106a2234200141106a290000370300200541900e6a41086a2235200141086a290000370300200520012900003703900e200541e00d6a41086a2028360200200520023602e40d2005202b3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012102024020052802084101460d002006200541286a2903003703002034200541086a41186a2903003703002035200541086a41106a2903003703002005200541086a41086a2903003703900e410021020b200341807e7121060b200541c0066a41186a2234200541900e6a41186a290300370300200541c0066a41106a222b200541900e6a41106a290300370300200541c0066a41086a2235200541900e6a41086a290300370300200520052903900e3703c0062006200341ff017172210620020d03200541a0066a41186a2034290300370300200541a0066a41106a202b290300370300200541a0066a41086a2035290300370300200520052903c0063703a006410221024100210341002134024020264102460d00200541900e6a41186a2234200141186a290000370300200541900e6a41106a222b200141106a290000370300200541900e6a41086a2235200141086a290000370300200520012900003703900e200520243702e40d200520263602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210241012103024020052802084101460d002034200541286a290300370300202b200541086a41186a2903003703002035200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b200241807e7121340b20054180076a41186a222b200541900e6a41186a29030037030020054180076a41106a2235200541900e6a41106a29030037030020054180076a41086a2230200541900e6a41086a290300370300200520052903900e370380072034200241ff017172210220030d04200541e0066a41186a202b290300370300200541e0066a41106a2035290300370300200541e0066a41086a203029030037030020052005290380073703e00641022103410021344100212b024020224102460d00200541900e6a41186a222b200141186a290000370300200541900e6a41106a2235200141106a290000370300200541900e6a41086a2230200141086a290000370300200520012900003703900e200520213702e40d200520223602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012134024020052802084101460d00202b200541286a2903003703002035200541086a41186a2903003703002030200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200341807e71212b0b200541c0076a41186a2235200541900e6a41186a290300370300200541c0076a41106a2230200541900e6a41106a290300370300200541c0076a41086a2225200541900e6a41086a290300370300200520052903900e3703c007202b200341ff017172212b20340d05200541a0076a41186a2035290300370300200541a0076a41106a2030290300370300200541a0076a41086a2025290300370300200520052903c0073703a007410221034100213441002135024020204102460d00200541900e6a41186a2235200141186a290000370300200541900e6a41106a2230200141106a290000370300200541900e6a41086a2225200141086a290000370300200520012900003703900e2005201f3702e40d200520203602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012134024020052802084101460d002035200541286a2903003703002030200541086a41186a2903003703002025200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200341807e7121350b20054180086a41186a2230200541900e6a41186a29030037030020054180086a41106a2225200541900e6a41106a29030037030020054180086a41086a2229200541900e6a41086a290300370300200520052903900e370380082035200341ff017172213520340d06200541e0076a41186a2030290300370300200541e0076a41106a2025290300370300200541e0076a41086a202929030037030020052005290380083703e0074102210341002134410021300240201e4102460d00200541900e6a41186a2230200141186a290000370300200541900e6a41106a2225200141106a290000370300200541900e6a41086a2229200141086a290000370300200520012900003703900e2005201d3702e40d2005201e3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012134024020052802084101460d002030200541286a2903003703002025200541086a41186a2903003703002029200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200341807e7121300b200541c0086a41186a2225200541900e6a41186a290300370300200541c0086a41106a2229200541900e6a41106a290300370300200541c0086a41086a222c200541900e6a41086a290300370300200520052903900e3703c0082030200341ff017172213020340d07200541a0086a41186a2025290300370300200541a0086a41106a2029290300370300200541a0086a41086a202c290300370300200520052903c0083703a0084102210341002134410021250240201c4102460d00200541900e6a41186a2225200141186a290000370300200541900e6a41106a2229200141106a290000370300200541900e6a41086a222c200141086a290000370300200520012900003703900e2005201b3702e40d2005201c3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012134024020052802084101460d002025200541286a2903003703002029200541086a41186a290300370300202c200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200341807e7121250b20054180096a41186a2229200541900e6a41186a29030037030020054180096a41106a222c200541900e6a41106a29030037030020054180096a41086a2228200541900e6a41086a290300370300200520052903900e370380092025200341ff017172212520340d08200541e0086a41186a2029290300370300200541e0086a41106a202c290300370300200541e0086a41086a202829030037030020052005290380093703e0084102210341002134410021290240201a4102460d00200541900e6a41186a2229200141186a290000370300200541900e6a41106a222c200141106a290000370300200541900e6a41086a2228200141086a290000370300200520012900003703900e200520193702e40d2005201a3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012134024020052802084101460d002029200541286a290300370300202c200541086a41186a2903003703002028200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200341807e7121290b200541c0096a41186a222c200541900e6a41186a290300370300200541c0096a41106a2228200541900e6a41106a290300370300200541c0096a41086a2226200541900e6a41086a290300370300200520052903900e3703c0092029200341ff017172212920340d09200541a0096a41186a202c290300370300200541a0096a41106a2028290300370300200541a0096a41086a2026290300370300200520052903c0093703a00941022103410021344100212c024020184102460d00200541900e6a41186a222c200141186a290000370300200541900e6a41106a2228200141106a290000370300200541900e6a41086a2226200141086a290000370300200520012900003703900e200520173702e40d200520183602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012134024020052802084101460d00202c200541286a2903003703002028200541086a41186a2903003703002026200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200341807e71212c0b200541800a6a41186a2228200541900e6a41186a290300370300200541800a6a41106a2226200541900e6a41106a290300370300200541800a6a41086a2223200541900e6a41086a290300370300200520052903900e3703800a202c200341ff017172212c20340d0a200541e0096a41186a2028290300370300200541e0096a41106a2026290300370300200541e0096a41086a2023290300370300200520052903800a3703e009410221034100213441002128024020164102460d00200541900e6a41186a2228200141186a290000370300200541900e6a41106a2226200141106a290000370300200541900e6a41086a2223200141086a290000370300200520012900003703900e200520153702e40d200520163602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012134024020052802084101460d002028200541286a2903003703002026200541086a41186a2903003703002023200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200341807e7121280b200541c00a6a41186a2226200541900e6a41186a290300370300200541c00a6a41106a2223200541900e6a41106a290300370300200541c00a6a41086a2227200541900e6a41086a290300370300200520052903900e3703c00a2028200341ff017172212820340d0b200541a00a6a41186a2026290300370300200541a00a6a41106a2023290300370300200541a00a6a41086a2027290300370300200520052903c00a3703a00a410221034100213441002126024020144102460d00200541900e6a41186a2226200141186a290000370300200541900e6a41106a2223200141106a290000370300200541900e6a41086a2227200141086a290000370300200520012900003703900e200520133702e40d200520143602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012134024020052802084101460d002026200541286a2903003703002023200541086a41186a2903003703002027200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200341807e7121260b200541800b6a41186a2223200541900e6a41186a290300370300200541800b6a41106a2227200541900e6a41106a290300370300200541800b6a41086a222a200541900e6a41086a290300370300200520052903900e3703800b2026200341ff017172212620340d0c200541e00a6a41186a2023290300370300200541e00a6a41106a2027290300370300200541e00a6a41086a202a290300370300200520052903800b3703e00a410221034100213441002123024020124102460d00200541900e6a41186a2223200141186a290000370300200541900e6a41106a2227200141106a290000370300200541900e6a41086a222a200141086a290000370300200520012900003703900e200520113702e40d200520123602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012134024020052802084101460d002023200541286a2903003703002027200541086a41186a290300370300202a200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200341807e7121230b200541c00b6a41186a2227200541900e6a41186a290300370300200541c00b6a41106a222a200541900e6a41106a290300370300200541c00b6a41086a2222200541900e6a41086a290300370300200520052903900e3703c00b2023200341ff017172212320340d0d200541a00b6a41186a2027290300370300200541a00b6a41106a202a290300370300200541a00b6a41086a2022290300370300200520052903c00b3703a00b410221034100213441002127024020104102460d00200541900e6a41186a2227200141186a290000370300200541900e6a41106a222a200141106a290000370300200541900e6a41086a2222200141086a290000370300200520012900003703900e2005200f3702e40d200520103602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012134024020052802084101460d002027200541286a290300370300202a200541086a41186a2903003703002022200541086a41106a2903003703002005200541086a41086a2903003703900e410021340b200341807e7121270b200541800c6a41186a222a200541900e6a41186a290300370300200541800c6a41106a2222200541900e6a41106a290300370300200541800c6a41086a222e200541900e6a41086a290300370300200520052903900e3703800c2027200341ff017172212720340d0e200541e00b6a41186a202a290300370300200541e00b6a41106a2022290300370300200541e00b6a41086a202e290300370300200520052903800c3703e00b41022134410021034100212a0240200e4102460d00200541900e6a41186a222a200141186a290000370300200541900e6a41106a2222200141106a290000370300200541900e6a41086a222e200141086a290000370300200520012900003703900e2005200d3702e40d2005200e3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c213441012103024020052802084101460d00202a200541286a2903003703002022200541086a41186a290300370300202e200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b203441807e71212a203441ff017121340b200541c00c6a41186a2222200541900e6a41186a290300370300200541c00c6a41106a222e200541900e6a41106a290300370300200541c00c6a41086a2220200541900e6a41086a290300370300200520052903900e3703c00c202a203472213420030d0f200541a00c6a41186a2022290300370300200541a00c6a41106a202e290300370300200541a00c6a41086a2020290300370300200520052903c00c3703a00c4102212a41002103410021220240200c4102460d00200541900e6a41186a2222200141186a290000370300200541900e6a41106a222e200141106a290000370300200541900e6a41086a2220200141086a290000370300200520012900003703900e2005200b3702e40d2005200c3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c212a41012103024020052802084101460d002022200541286a290300370300202e200541086a41186a2903003703002020200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b202a41807e712122202a41ff0171212a0b200541800d6a41186a222e200541900e6a41186a290300370300200541800d6a41106a2220200541900e6a41106a290300370300200541800d6a41086a221e200541900e6a41086a290300370300200520052903900e3703800d2022202a72212a20030d10200541e00c6a41186a202e290300370300200541e00c6a41106a2020290300370300200541e00c6a41086a201e290300370300200520052903800d3703e00c41022122410021034100212e0240200a4102460d00200541900e6a41186a222e200141186a290000370300200541900e6a41106a2220200141106a290000370300200541900e6a41086a221e200141086a290000370300200520012900003703900e200520093702e40d2005200a3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c212241012103024020052802084101460d00202e200541286a2903003703002020200541086a41186a290300370300201e200541086a41106a2903003703002005200541086a41086a2903003703900e410021030b202241807e71212e202241ff017121220b200541c00d6a41186a2220200541900e6a41186a290300370300200541c00d6a41106a221e200541900e6a41106a290300370300200541c00d6a41086a221c200541900e6a41086a290300370300200520052903900e3703c00d202e202272212220030d24200541a00d6a41186a2020290300370300200541a00d6a41106a201e290300370300200541a00d6a41086a201c290300370300200520052903c00d3703a00d4102210320084102470d1141002101410021040c120b200541086a202f202da7109e03200541900e6a41086a2029290300370300200541900e6a41106a2025290300370300200541900e6a41186a200541306a2802003602002005200541086a41106a2903003703900e2002417f4c0d13202c2802002134200529020c213620052802082106410121304101210102402002450d00200210322201450d270b202d422088a72135200541003602102005200236020c20052001360208200541086a4100200210c80120052802082203200528021022016a202b200210c9081a20054180026a41086a200541900e6a41086a29030037030020054180026a41106a200541900e6a41106a29030037030020054180026a41186a200541900e6a41186a2802003602002005200120026a360210200520052903900e37038002200529020c222d422088a72132202da721330c120b200541086a202f202da7109e03200541e00d6a41086a2029290300370300200541e00d6a41106a22352025290300370300200541e00d6a41186a200541306a2802003602002005200541086a41106a22312903003703e00d202c280200213420052802082106200529020c2136200541900e6a41186a200141186a290000370300200541900e6a41106a200141106a290000370300200541900e6a41086a200141086a290000370300200520012900003703900e200541a00d6a41086a2028360200200520023602a40d2005202b3602a00d200541086a200541900e6a200541a00d6a200410a103200541c00d6a41086a2027290200370300200541c00d6a41106a220120232802003602002005202a2902003703c00d200528020c2103024020052802084101460d00202e290300212420312802002131200541e8016a41106a2001280200360200200541e8016a41086a200541c00d6a41086a29030037030020054180026a41086a200541e00d6a41086a29030037030020054180026a41106a203529030037030020054180026a41186a200541e00d6a41186a280200360200200520052903c00d3703e801200520052903e00d370380022024422088a72132202d422088a721352024a72133410221300c120b2000410136020020002003360204200641244d0d242036422088a72200450d242000102c0c240b4102210341002134410021060240202f4102460d00200541900e6a41186a2234200141186a290000370300200541900e6a41106a2235200141106a290000370300200541900e6a41086a2231200141086a290000370300200520012900003703900e2005202d3702e40d2005202f3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012106024020052802084101460d002034200541286a2903003703002035200541086a41186a2903003703002031200541086a41106a2903003703002005200541086a41086a2903003703900e410021060b200341807e7121340b200541c0066a41186a2235200541900e6a41186a290300370300200541c0066a41106a2231200541900e6a41106a290300370300200541c0066a41086a2233200541900e6a41086a290300370300200520052903900e3703c006200341ff0171203472213420060d12200541a0066a41186a2035290300370300200541a0066a41106a2031290300370300200541a0066a41086a2033290300370300200520052903c0063703a0064102210302400240202b4102470d0041002106410021020c010b200541900e6a41186a2206200141186a290000370300200541900e6a41106a2235200141106a290000370300200541900e6a41086a2231200141086a290000370300200520012900003703900e200541e00d6a41086a2028360200200520023602e40d2005202b3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210341012102024020052802084101460d002006200541286a2903003703002035200541086a41186a2903003703002031200541086a41106a2903003703002005200541086a41086a2903003703900e410021020b200341807e7121060b20054180076a41186a222b200541900e6a41186a29030037030020054180076a41106a2235200541900e6a41106a29030037030020054180076a41086a2231200541900e6a41086a290300370300200520052903900e37038007200341ff0171200672210320020d13200541e0066a41186a202b290300370300200541e0066a41106a2035290300370300200541e0066a41086a203129030037030020052005290380073703e006410221024100212b41002106024020264102460d00200541900e6a41186a222b200141186a290000370300200541900e6a41106a2235200141106a290000370300200541900e6a41086a2231200141086a290000370300200520012900003703900e200520243702e40d200520263602e00d200541086a200541900e6a200541e00d6a200410a103200528020c210241012106024020052802084101460d00202b200541286a2903003703002035200541086a41186a2903003703002031200541086a41106a2903003703002005200541086a41086a2903003703900e410021060b200241807e71212b0b200541c0076a41186a2235200541900e6a41186a290300370300200541c0076a41106a2231200541900e6a41106a290300370300200541c0076a41086a2233200541900e6a41086a290300370300200520052903900e3703c007200241ff0171202b72210220060d14200541a0076a41186a2035290300370300200541a0076a41106a2031290300370300200541a0076a41086a2033290300370300200520052903c0073703a00741022106410021354100212b024020224102460d00200541900e6a41186a2235200141186a290000370300200541900e6a41106a2231200141106a290000370300200541900e6a41086a2233200141086a290000370300200520012900003703900e200520213702e40d200520223602e00d200541086a200541900e6a200541e00d6a200410a103200528020c21064101212b024020052802084101460d002035200541286a2903003703002031200541086a41186a2903003703002033200541086a41106a2903003703002005200541086a41086a2903003703900e4100212b0b200641807e7121350b20054180086a41186a2231200541900e6a41186a29030037030020054180086a41106a2233200541900e6a41106a29030037030020054180086a41086a2232200541900e6a41086a290300370300200520052903900e37038008200641ff01712035722106202b0d15200541e0076a41186a2031290300370300200541e0076a41106a2033290300370300200541e0076a41086a203229030037030020052005290380083703e0074102212b4100213141002135024020204102460d00200541900e6a41186a2231200141186a290000370300200541900e6a41106a2233200141106a290000370300200541900e6a41086a2232200141086a290000370300200520012900003703900e2005201f3702e40d200520203602e00d200541086a200541900e6a200541e00d6a200410a103200528020c212b41012135024020052802084101460d002031200541286a2903003703002033200541086a41186a2903003703002032200541086a41106a2903003703002005200541086a41086a2903003703900e410021350b202b41807e7121310b200541c0086a41186a2233200541900e6a41186a290300370300200541c0086a41106a2232200541900e6a41106a290300370300200541c0086a41086a2230200541900e6a41086a290300370300200520052903900e3703c008202b41ff0171203172212b20350d16200541a0086a41186a2033290300370300200541a0086a41106a2032290300370300200541a0086a41086a2030290300370300200520052903c0083703a0084102213541002133410021310240201e4102460d00200541900e6a41186a2233200141186a290000370300200541900e6a41106a2232200141106a290000370300200541900e6a41086a2230200141086a290000370300200520012900003703900e2005201d3702e40d2005201e3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c213541012131024020052802084101460d002033200541286a2903003703002032200541086a41186a2903003703002030200541086a41106a2903003703002005200541086a41086a2903003703900e410021310b203541807e7121330b20054180096a41186a2232200541900e6a41186a29030037030020054180096a41106a2230200541900e6a41106a29030037030020054180096a41086a222f200541900e6a41086a290300370300200520052903900e37038009203541ff0171203372213320310d17200541e0086a41186a2032290300370300200541e0086a41106a2030290300370300200541e0086a41086a202f29030037030020052005290380093703e0084102213541002132410021310240201c4102460d00200541900e6a41186a2232200141186a290000370300200541900e6a41106a2230200141106a290000370300200541900e6a41086a222f200141086a290000370300200520012900003703900e2005201b3702e40d2005201c3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c213541012131024020052802084101460d002032200541286a2903003703002030200541086a41186a290300370300202f200541086a41106a2903003703002005200541086a41086a2903003703900e410021310b203541807e7121320b200541c0096a41186a2230200541900e6a41186a290300370300200541c0096a41106a222f200541900e6a41106a290300370300200541c0096a41086a2225200541900e6a41086a290300370300200520052903900e3703c009203541ff0171203272213220310d18200541a0096a41186a2030290300370300200541a0096a41106a202f290300370300200541a0096a41086a2025290300370300200520052903c0093703a0094102213541002130410021310240201a4102460d00200541900e6a41186a2230200141186a290000370300200541900e6a41106a222f200141106a290000370300200541900e6a41086a2225200141086a290000370300200520012900003703900e200520193702e40d2005201a3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c213541012131024020052802084101460d002030200541286a290300370300202f200541086a41186a2903003703002025200541086a41106a2903003703002005200541086a41086a2903003703900e410021310b203541807e7121300b200541800a6a41186a222f200541900e6a41186a290300370300200541800a6a41106a2225200541900e6a41106a290300370300200541800a6a41086a2229200541900e6a41086a290300370300200520052903900e3703800a203541ff0171203072213020310d19200541e0096a41186a202f290300370300200541e0096a41106a2025290300370300200541e0096a41086a2029290300370300200520052903800a3703e009410221354100212f41002131024020184102460d00200541900e6a41186a222f200141186a290000370300200541900e6a41106a2225200141106a290000370300200541900e6a41086a2229200141086a290000370300200520012900003703900e200520173702e40d200520183602e00d200541086a200541900e6a200541e00d6a200410a103200528020c213541012131024020052802084101460d00202f200541286a2903003703002025200541086a41186a2903003703002029200541086a41106a2903003703002005200541086a41086a2903003703900e410021310b203541807e71212f0b200541c00a6a41186a2225200541900e6a41186a290300370300200541c00a6a41106a2229200541900e6a41106a290300370300200541c00a6a41086a222c200541900e6a41086a290300370300200520052903900e3703c00a203541ff0171202f72212f20310d1a200541a00a6a41186a2025290300370300200541a00a6a41106a2029290300370300200541a00a6a41086a202c290300370300200520052903c00a3703a00a410221354100212541002131024020164102460d00200541900e6a41186a2225200141186a290000370300200541900e6a41106a2229200141106a290000370300200541900e6a41086a222c200141086a290000370300200520012900003703900e200520153702e40d200520163602e00d200541086a200541900e6a200541e00d6a200410a103200528020c213541012131024020052802084101460d002025200541286a2903003703002029200541086a41186a290300370300202c200541086a41106a2903003703002005200541086a41086a2903003703900e410021310b203541807e7121250b200541800b6a41186a2229200541900e6a41186a290300370300200541800b6a41106a222c200541900e6a41106a290300370300200541800b6a41086a2228200541900e6a41086a290300370300200520052903900e3703800b203541ff0171202572212520310d1b200541e00a6a41186a2029290300370300200541e00a6a41106a202c290300370300200541e00a6a41086a2028290300370300200520052903800b3703e00a410221354100213141002129024020144102460d00200541900e6a41186a2229200141186a290000370300200541900e6a41106a222c200141106a290000370300200541900e6a41086a2228200141086a290000370300200520012900003703900e200520133702e40d200520143602e00d200541086a200541900e6a200541e00d6a200410a103200528020c213541012131024020052802084101460d002029200541286a290300370300202c200541086a41186a2903003703002028200541086a41106a2903003703002005200541086a41086a2903003703900e410021310b203541807e7121290b200541c00b6a41186a222c200541900e6a41186a290300370300200541c00b6a41106a2228200541900e6a41106a290300370300200541c00b6a41086a2226200541900e6a41086a290300370300200520052903900e3703c00b2029203541ff017172212920310d1c200541a00b6a41186a202c290300370300200541a00b6a41106a2028290300370300200541a00b6a41086a2026290300370300200520052903c00b3703a00b41022135410021314100212c024020124102460d00200541900e6a41186a222c200141186a290000370300200541900e6a41106a2228200141106a290000370300200541900e6a41086a2226200141086a290000370300200520012900003703900e200520113702e40d200520123602e00d200541086a200541900e6a200541e00d6a200410a103200528020c213541012131024020052802084101460d00202c200541286a2903003703002028200541086a41186a2903003703002026200541086a41106a2903003703002005200541086a41086a2903003703900e410021310b203541807e71212c0b200541800c6a41186a2228200541900e6a41186a290300370300200541800c6a41106a2226200541900e6a41106a290300370300200541800c6a41086a2223200541900e6a41086a290300370300200520052903900e3703800c202c203541ff017172212c20310d1d200541e00b6a41186a2028290300370300200541e00b6a41106a2026290300370300200541e00b6a41086a2023290300370300200520052903800c3703e00b410221314100213541002128024020104102460d00200541900e6a41186a2228200141186a290000370300200541900e6a41106a2226200141106a290000370300200541900e6a41086a2223200141086a290000370300200520012900003703900e2005200f3702e40d200520103602e00d200541086a200541900e6a200541e00d6a200410a103200528020c213141012135024020052802084101460d002028200541286a2903003703002026200541086a41186a2903003703002023200541086a41106a2903003703002005200541086a41086a2903003703900e410021350b203141807e712128203141ff017121310b200541c00c6a41186a2226200541900e6a41186a290300370300200541c00c6a41106a2223200541900e6a41106a290300370300200541c00c6a41086a2227200541900e6a41086a290300370300200520052903900e3703c00c2028203172213120350d1e200541a00c6a41186a2026290300370300200541a00c6a41106a2023290300370300200541a00c6a41086a2027290300370300200520052903c00c3703a00c4102212841002135410021260240200e4102460d00200541900e6a41186a2226200141186a290000370300200541900e6a41106a2223200141106a290000370300200541900e6a41086a2227200141086a290000370300200520012900003703900e2005200d3702e40d2005200e3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c212841012135024020052802084101460d002026200541286a2903003703002023200541086a41186a2903003703002027200541086a41106a2903003703002005200541086a41086a2903003703900e410021350b202841807e712126202841ff017121280b200541800d6a41186a2223200541900e6a41186a290300370300200541800d6a41106a2227200541900e6a41106a290300370300200541800d6a41086a222a200541900e6a41086a290300370300200520052903900e3703800d2026202872212820350d1f200541e00c6a41186a2023290300370300200541e00c6a41106a2027290300370300200541e00c6a41086a202a290300370300200520052903800d3703e00c4102212641002135410021230240200c4102460d00200541900e6a41186a2223200141186a290000370300200541900e6a41106a2227200141106a290000370300200541900e6a41086a222a200141086a290000370300200520012900003703900e2005200b3702e40d2005200c3602e00d200541086a200541900e6a200541e00d6a200410a103200528020c212641012135024020052802084101460d002023200541286a2903003703002027200541086a41186a290300370300202a200541086a41106a2903003703002005200541086a41086a2903003703900e410021350b202641807e712123202641ff017121260b200541c00d6a41186a2227200541900e6a41186a290300370300200541c00d6a41106a222a200541900e6a41106a290300370300200541c00d6a41086a2222200541900e6a41086a290300370300200520052903900e3703c00d2023202672212620350d20200541a00d6a41186a2027290300370300200541a00d6a41106a202a290300370300200541a00d6a41086a2022290300370300200520052903c00d3703a00d4102212341002135410021270240200a4102460d00200541900e6a41186a2223200141186a290000370300200541900e6a41106a2227200141106a290000370300200541900e6a41086a222a200141086a290000370300200520012900003703900e200520093702840e2005200a3602800e200541086a200541900e6a200541800e6a200410a103200528020c210141012135024020052802084101460d002023200541286a2903003703002027200541086a41186a290300370300202a200541086a41106a2903003703002005200541086a41086a2903003703900e410021350b200141807e712127200141ff017121230b200541e00d6a41186a2204200541900e6a41186a290300370300200541e00d6a41106a222a200541900e6a41106a290300370300200541e00d6a41086a2222200541900e6a41086a290300370300200520052903900e3703e00d20272023722101024020350d00200541a0026a41186a2004290300370300200541a0026a41106a202a290300370300200541a0026a41086a202229030037030020054180066a41086a200541a0066a41086a29030037030020054180066a41106a200541a0066a41106a29030037030020054180066a41186a200541a0066a41186a290300370300200541e0056a41086a200541e0066a41086a290300370300200541e0056a41106a200541e0066a41106a290300370300200541e0056a41186a200541e0066a41186a290300370300200520052903e00d3703a002200520052903a00637038006200520052903e0063703e005200541c0056a41186a200541a0076a41186a290300370300200541c0056a41106a200541a0076a41106a290300370300200541c0056a41086a200541a0076a41086a290300370300200541a0056a41086a200541e0076a41086a290300370300200541a0056a41106a200541e0076a41106a290300370300200541a0056a41186a200541e0076a41186a29030037030020054180056a41086a200541a0086a41086a29030037030020054180056a41106a200541a0086a41106a29030037030020054180056a41186a200541a0086a41186a290300370300200520052903a0073703c005200520052903e0073703a005200520052903a00837038005200541e0046a41186a200541e0086a41186a290300370300200541e0046a41106a200541e0086a41106a290300370300200541e0046a41086a200541e0086a41086a290300370300200541c0046a41186a200541a0096a41186a290300370300200541c0046a41106a200541a0096a41106a290300370300200541c0046a41086a200541a0096a41086a290300370300200541a0046a41186a200541e0096a41186a290300370300200541a0046a41106a200541e0096a41106a290300370300200541a0046a41086a200541e0096a41086a290300370300200520052903e0083703e004200520052903a0093703c004200520052903e0093703a00420054180046a41186a200541a00a6a41186a29030037030020054180046a41106a200541a00a6a41106a29030037030020054180046a41086a200541a00a6a41086a290300370300200520052903a00a37038004200541e0036a41186a200541e00a6a41186a290300370300200541e0036a41106a200541e00a6a41106a290300370300200541e0036a41086a200541e00a6a41086a290300370300200520052903e00a3703e003200541c0036a41186a200541a00b6a41186a290300370300200541c0036a41106a200541a00b6a41106a290300370300200541c0036a41086a200541a00b6a41086a290300370300200520052903a00b3703c003200541a0036a41186a200541e00b6a41186a290300370300200541a0036a41106a200541e00b6a41106a290300370300200541a0036a41086a200541e00b6a41086a290300370300200520052903e00b3703a00320054180036a41186a200541a00c6a41186a29030037030020054180036a41106a200541a00c6a41106a29030037030020054180036a41086a200541a00c6a41086a290300370300200520052903a00c37038003200541e0026a41186a200541e00c6a41186a290300370300200541e0026a41106a200541e00c6a41106a290300370300200541e0026a41086a200541e00c6a41086a290300370300200520052903e00c3703e002200541c0026a41186a200541a00d6a41186a290300370300200541c0026a41106a200541a00d6a41106a290300370300200541c0026a41086a200541a00d6a41086a290300370300200520052903a00d3703c00241c00410322235450d2520352034360200203520052903800637020420352003360224203520052903e0053702282035410c6a20054180066a41086a290300370200203541146a20054180066a41106a2903003702002035411c6a20054180066a41186a290300370200203541306a200541e0056a41086a290300370200203541386a200541e0056a41106a290300370200203541c0006a200541e0056a41186a290300370200203520023602482035200636026c203520052903c00537024c203541d4006a200541c0056a41086a290300370200203541dc006a200541c0056a41106a290300370200203541e4006a200541c0056a41186a290300370200203520052903a005370270203541f8006a200541a0056a41086a29030037020020354180016a200541a0056a41106a29030037020020354188016a200541a0056a41186a2903003702002035202b36029001203520333602b401203541ac016a20054180056a41186a290300370200203541a4016a20054180056a41106a2903003702002035419c016a20054180056a41086a290300370200203520052903800537029401203541d0016a200541e0046a41186a290300370200203541c8016a200541e0046a41106a290300370200203541c0016a200541e0046a41086a290300370200203520052903e0043702b801203520323602d801203541f4016a200541c0046a41186a290300370200203541ec016a200541c0046a41106a290300370200203541e4016a200541c0046a41086a290300370200203520052903c0043702dc01203520303602fc0120354198026a200541a0046a41186a29030037020020354190026a200541a0046a41106a29030037020020354188026a200541a0046a41086a290300370200203520052903a004370280022035202f3602a002203541bc026a20054180046a41186a290300370200203541b4026a20054180046a41106a290300370200203541ac026a20054180046a41086a29030037020020352005290380043702a402203520253602c402203541e0026a200541e0036a41186a290300370200203541d8026a200541e0036a41106a290300370200203541d0026a200541e0036a41086a290300370200203520052903e0033702c802203520293602e80220354184036a200541c0036a41186a290300370200203541fc026a200541c0036a41106a290300370200203541f4026a200541c0036a41086a290300370200203520052903c0033702ec022035202c36028c03203541a8036a200541a0036a41186a290300370200203541a0036a200541a0036a41106a29030037020020354198036a200541a0036a41086a290300370200203520052903a00337029003203520313602b003203541cc036a20054180036a41186a290300370200203541c4036a20054180036a41106a290300370200203541bc036a20054180036a41086a29030037020020352005290380033702b403203520283602d403203541f0036a200541e0026a41186a290300370200203541e8036a200541e0026a41106a290300370200203541e0036a200541e0026a41086a290300370200203520052903e0023702d803203520263602f80320354194046a200541c0026a41186a2903003702002035418c046a200541c0026a41106a29030037020020354184046a200541c0026a41086a290300370200203520052903c0023702fc032035200136029c04203541b8046a200541a0026a41186a290300370200203541b0046a200541a0026a41106a290300370200203541a8046a200541a0026a41086a290300370200203520052903a0023702a00441032130024020080d00410021060c120b2007417f4c0d120240024020070d00410121010c010b200710322201450d260b200541003602102005200736020c20052001360208200541086a4100200710c80120052802082206200528021022016a2008200710c9081a2005200120076a360210200529020c21360c110b20004101360200200020013602040c230b20004101360200200020063602040c220b20004101360200200020023602040c210b200041013602002000202b3602040c200b20004101360200200020353602040c1f0b20004101360200200020303602040c1e0b20004101360200200020253602040c1d0b20004101360200200020293602040c1c0b200041013602002000202c3602040c1b0b20004101360200200020283602040c1a0b20004101360200200020263602040c190b20004101360200200020233602040c180b20004101360200200020273602040c170b20004101360200200020343602040c160b200041013602002000202a3602040c150b200541900e6a41186a222e200141186a290000370300200541900e6a41106a2220200141106a290000370300200541900e6a41086a221e200141086a290000370300200520012900003703900e200541800e6a41086a2033360200200520073602840e200520083602800e200541086a200541900e6a200541800e6a200410a103200528020c210341012101024020052802084101460d00202e200541286a2903003703002020200541086a41186a290300370300201e200541086a41106a2903003703002005200541086a41086a2903003703900e410021010b200341807e712104200341ff017121030b200541e00d6a41186a2233200541900e6a41186a290300370300200541e00d6a41106a222e200541900e6a41106a290300370300200541e00d6a41086a2220200541900e6a41086a290300370300200520052903900e3703e00d2004200372210420010d12200541a0026a41186a2033290300370300200541a0026a41106a202e290300370300200541a0026a41086a202029030037030020054180066a41086a200541a0066a41086a29030037030020054180066a41106a200541a0066a41106a29030037030020054180066a41186a200541a0066a41186a290300370300200541e0056a41086a200541e0066a41086a290300370300200541e0056a41106a200541e0066a41106a290300370300200541e0056a41186a200541e0066a41186a290300370300200520052903e00d3703a002200520052903a00637038006200520052903e0063703e005200541c0056a41186a200541a0076a41186a290300370300200541c0056a41106a200541a0076a41106a290300370300200541c0056a41086a200541a0076a41086a290300370300200541a0056a41086a200541e0076a41086a290300370300200541a0056a41106a200541e0076a41106a290300370300200541a0056a41186a200541e0076a41186a29030037030020054180056a41086a200541a0086a41086a29030037030020054180056a41106a200541a0086a41106a29030037030020054180056a41186a200541a0086a41186a290300370300200520052903a0073703c005200520052903e0073703a005200520052903a00837038005200541e0046a41186a200541e0086a41186a290300370300200541e0046a41106a200541e0086a41106a290300370300200541e0046a41086a200541e0086a41086a290300370300200541c0046a41186a200541a0096a41186a290300370300200541c0046a41106a200541a0096a41106a290300370300200541c0046a41086a200541a0096a41086a290300370300200541a0046a41186a200541e0096a41186a290300370300200541a0046a41106a200541e0096a41106a290300370300200541a0046a41086a200541e0096a41086a290300370300200520052903e0083703e004200520052903a0093703c004200520052903e0093703a00420054180046a41186a200541a00a6a41186a29030037030020054180046a41106a200541a00a6a41106a29030037030020054180046a41086a200541a00a6a41086a290300370300200520052903a00a37038004200541e0036a41186a200541e00a6a41186a290300370300200541e0036a41106a200541e00a6a41106a290300370300200541e0036a41086a200541e00a6a41086a290300370300200520052903e00a3703e003200541c0036a41186a200541a00b6a41186a290300370300200541c0036a41106a200541a00b6a41106a290300370300200541c0036a41086a200541a00b6a41086a290300370300200520052903a00b3703c003200541a0036a41186a200541e00b6a41186a290300370300200541a0036a41106a200541e00b6a41106a290300370300200541a0036a41086a200541e00b6a41086a290300370300200520052903e00b3703a00320054180036a41186a200541a00c6a41186a29030037030020054180036a41106a200541a00c6a41106a29030037030020054180036a41086a200541a00c6a41086a290300370300200520052903a00c37038003200541e0026a41186a200541e00c6a41186a290300370300200541e0026a41106a200541e00c6a41106a290300370300200541e0026a41086a200541e00c6a41086a290300370300200520052903e00c3703e002200541c0026a41186a200541a00d6a41186a290300370300200541c0026a41106a200541a00d6a41106a290300370300200541c0026a41086a200541a00d6a41086a290300370300200520052903a00d3703c00241c00410322203450d1420032006360200200320052903800637020420032002360224200320052903e0053702282003410c6a20054180066a41086a290300370200200341146a20054180066a41106a2903003702002003411c6a20054180066a41186a290300370200200341306a200541e0056a41086a290300370200200341386a200541e0056a41106a290300370200200341c0006a200541e0056a41186a2903003702002003202b3602482003203536026c200320052903c00537024c200341d4006a200541c0056a41086a290300370200200341dc006a200541c0056a41106a290300370200200341e4006a200541c0056a41186a290300370200200320052903a005370270200341f8006a200541a0056a41086a29030037020020034180016a200541a0056a41106a29030037020020034188016a200541a0056a41186a2903003702002003203036029001200320253602b401200341ac016a20054180056a41186a290300370200200341a4016a20054180056a41106a2903003702002003419c016a20054180056a41086a290300370200200320052903800537029401200341d0016a200541e0046a41186a290300370200200341c8016a200541e0046a41106a290300370200200341c0016a200541e0046a41086a290300370200200320052903e0043702b801200320293602d801200341f4016a200541c0046a41186a290300370200200341ec016a200541c0046a41106a290300370200200341e4016a200541c0046a41086a290300370200200320052903c0043702dc012003202c3602fc0120034198026a200541a0046a41186a29030037020020034190026a200541a0046a41106a29030037020020034188026a200541a0046a41086a290300370200200320052903a00437028002200320283602a002200341bc026a20054180046a41186a290300370200200341b4026a20054180046a41106a290300370200200341ac026a20054180046a41086a29030037020020032005290380043702a402200320263602c402200341e0026a200541e0036a41186a290300370200200341d8026a200541e0036a41106a290300370200200341d0026a200541e0036a41086a290300370200200320052903e0033702c802200320233602e80220034184036a200541c0036a41186a290300370200200341fc026a200541c0036a41106a290300370200200341f4026a200541c0036a41086a290300370200200320052903c0033702ec022003202736028c03200341a8036a200541a0036a41186a290300370200200341a0036a200541a0036a41106a29030037020020034198036a200541a0036a41086a290300370200200320052903a00337029003200320343602b003200341cc036a20054180036a41186a290300370200200341c4036a20054180036a41106a290300370200200341bc036a20054180036a41086a29030037020020032005290380033702b4032003202a3602d403200341f0036a200541e0026a41186a290300370200200341e8036a200541e0026a41106a290300370200200341e0036a200541e0026a41086a290300370200200320052903e0023702d803200320223602f80320034194046a200541c0026a41186a2903003702002003418c046a200541c0026a41106a29030037020020034184046a200541c0026a41086a290300370200200320052903c0023702fc032003200436029c04200341b8046a200541a0026a41186a290300370200200341b0046a200541a0026a41106a290300370200200341a8046a200541a0026a41086a290300370200200320052903a0023702a004200541086a202f202da7109e03200541900e6a41086a2201200541086a41186a290300370300200541900e6a41106a2202200541286a290300370300200541900e6a41186a2204200541306a2802003602002005200541086a41106a2903003703900e200541086a410c6a2802002134200529020c2136200528020821060240024020320d00410021330c010b2031417f4c0d020240024020310d004101212b0c010b20311032222b450d160b200541003602102005203136020c2005202b360208200541086a4100203110c801200528020822332005280210222b6a2032203110c9081a202b20316a2131200528020c21320b202d422088a7213520054180026a41186a200428020036020020054180026a41106a200229030037030020054180026a41086a2001290300370300200520052903900e37038002410421300b20002030360204200041186a2034360200200041106a20363702002000410c6a2006360200200041086a20353602002000411c6a200529038002370200200041c4006a2031360200200041386a2003360200200041c8006a20052903e801370200200041246a20054180026a41086a2903003702002000412c6a20054180026a41106a290300370200200041346a20054180026a41186a280200360200200041d0006a200541e8016a41086a290300370200200041d8006a200541e8016a41106a2802003602002000413c6a2032ad4220862033ad84370200200041003602000c120b103b000b20004101360200200020343602040c100b20004101360200200020033602040c0f0b20004101360200200020023602040c0e0b20004101360200200020063602040c0d0b200041013602002000202b3602040c0c0b20004101360200200020333602040c0b0b20004101360200200020323602040c0a0b20004101360200200020303602040c090b200041013602002000202f3602040c080b20004101360200200020253602040c070b20004101360200200020293602040c060b200041013602002000202c3602040c050b20004101360200200020313602040c040b20004101360200200020283602040c030b20004101360200200020263602040c020b20004101360200200020223602040c010b20004101360200200020043602040b200541b00e6a24000f0b1039000be95303117f047e037f23002206210720064180056b41607122062400200641106a41086a200341086a2802003602002006200329020037031002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022802000e050104000203010b20064180016a2002412c6a290200370300200641f8006a200241246a290200370300200641d8006a41186a2002411c6a290200370300200641d8006a41106a2208200241146a290200370300200641d8006a41086a2002410c6a29020037030020062002290204370358200641a6016a200241376a2d00003a000020064188016a41086a200241c4006a29020037030020064188016a41106a200241cc006a29020037030020064188016a41186a200241d4006a280200360200200620022f00353b01a40120062002413c6a29020037038801200241346a2d00002109200241386a280200210a02400240200628025c220b41244b0d00200641e1006a210c0c010b2008280200210b200641d8006a410c6a280200210c0b20062006280258220d3602b0012006200c3602a8012006280214210e2006280218210f2006200b3602ac01200b4101742210200d6b2211200e410174200f6b2202200220114b1b2212450d04410021022006280210211302400340200f20026a22084101762214200e4f0d09200d20026a22154101762216200b4f0d0a201320146a2d00002214410f71201441f0017141047620084101711b200c20166a2d00002208410f71200841047620154101711b470d012012200241016a2202470d000b201221020b2002450d0420022011460d05200b200d20026a22144101762208490d1f200641b8016a200c20086a200b20086b109e032003200328020820026a36020820064198036a41086a221520062902b80137030020064198036a41106a220b200641b8016a41086a29020037030020064198036a41186a220d200641b8016a41106a29020037030020064198036a41206a220c200641b8016a41186a29020037030020064198036a41286a220e200641b8016a41206a290200370300200641c8036a200641b8016a41286a280200360200200641cc036a20093a00002006201441017136029c03410221162006410236029803200641cf036a200641a4016a41026a2d00003a0000200620062f01a4013b00cd03200641d0036a200a360200200641ec036a20064188016a41186a280200360200200641e4036a20064188016a41106a290300370200200641dc036a20064188016a41086a290300370200200641d4036a200629038801370200200641f0036a41086a200441086a280200360200200620042902003703f00320064180046a200120064198036a2003200641f0036a2005109d0320062802840421142006280280042108200641c0026a20064180046a41086a41d80010c9081a20084101460d06200641e8016a200641c0026a41d80010c9081a20064198036a200641a8016a200210a20320064180046a410472200641e8016a41d80010c9081a41002111200641003a008004200141206a20064180046a1099032102200641386a41086a200d290300370300200641386a41106a200c290300370300200641386a41186a200e2903003703002006200b2903003703382002ad211720152802002103200641a4036a28020021152006280298032102200628029c032114410021080c270b4101211620062802142208200628021822144101762202490d0820064180046a200628021020026a200820026b109e03200641386a41086a20064194046a290200370300200641c8006a2006419c046a290200370300200641d0006a200641a4046a29020037030020062006418c046a2902003703382014410171210220064180046a41086a2802002115200628028404210320062802800421142004290204211720042802002111410021080c270b200241106a280200210d2002410c6a280200210c200241086a280200210b20022802042102024002400240024002402006280214221441017420062802182208460d002008410176221520144f0d0d200628021020156a2d000021142003200328020841016a36020820022014410f71201441047620084101711b221541246c6a22142902102118201420062903900437021020142902082119201420062903880437020820142902002117200641023a0080042014200629038004370200201441186a2208290200211a20082006290398043702002017a741ff01714102470d0120032802042216200328020822054101762208490d0e20064198036a200328020020086a201620086b109e032006418c046a20062902980337020020064194046a20064198036a41086a2902003702002006419c046a200641a8036a29020037020020064180046a41246a200641b0036a290200370200200641ac046a20064198036a41206a290200370200200641b4046a200641c0036a280200360200200641b8046a2004290200370300200641c0046a200441086a280200360200200641013602840420064180046a41086a200541017136020041002108200641003a0080042002201541246c6a41046a200141206a20064180046a109903360200201441003a00000c020b02400240200b0d002004280208211520042802002114410021080c010b2004280200211441002108200d20042802082215470d00024002402014200b470d00410121080c010b200b2014200d10cc084521080b200d21150b20042802042103024020052802002216450d002005280204450d002016102c0b2005200c3602042005200b360200200541086a200d360200200641386a41086a20064180046a41086a290200370300200641386a41106a20064180046a41106a290200370300200641386a41186a20064180046a41186a290200370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a28020036020020062006290280043703382006200629029803370320410321160c2a0b200641a0046a201428022036020020064180046a41186a201a37030020062019370388042006201737038004200620183703900420064198036a41086a200441086a2802003602002006200429020037039803200641c0026a200120064180046a200320064198036a2005109b0320062802c402211620062802c0024101460d01200641c0026a41086a2d0000210341002108201441003a00002002201541246c6a41046a2016360200200341ff0171450d020b41032116200d2115200c2103200b21140c280b20004101360200200020163602040240200b450d00200c450d00200b102c0b2002102c0c250b2000428080808010370200200041186a200d360200200041146a200c360200200041106a200b3602002000410c6a2002360200200041086a4103360200200724000f0b200641c0036a2002412c6a290200370300200641b8036a200241246a290200370300200641b0036a2002411c6a290200370300200641a8036a2208200241146a29020037030020064198036a41086a2002410c6a2902003703002006200229020437039803200241346a2802002111200241386a280200210a2002413c6a280200211b200241c0006a280200211c02400240200628029c03220b41244b0d00200641a1036a210c0c010b2008280200210b20064198036a410c6a280200210c0b2006200628029803220d360290012006200c360288012006280214210e2006280218210f2006200b36028c01410021020240200b410174200d6b2209200e410174200f6b2210201020094b1b2212450d00200628021021130340200f20026a22084101762214200e4f0d0b200d20026a22154101762216200b4f0d0c201320146a2d00002214410f71201441f0017141047620084101711b200c20166a2d00002208410f71200841047620154101711b470d012012200241016a2202470d000b201221020b024002400240024020022009470d0020092010460d010b20022009490d01200f20026a22144101762208200e4f0d0f200628021020086a2d000021082003200220032802086a41016a36020820112008410f71200841047620144101711b221441246c6a22022902102118200220062903900437021020022902082119200220062903880437020820022902002117200641023a0080042002200629038004370200200241186a2208290200211a20082006290398043702002017a741ff01714102470d0220032802042215200328020822164101762208490d14200641c0026a200328020020086a201520086b109e032006418c046a20062902c00237020020064194046a200641c0026a41086a2902003702002006419c046a200641d0026a29020037020020064180046a41246a200641d8026a290200370200200641ac046a200641c0026a41206a290200370200200641b4046a200641e8026a280200360200200641b8046a2004290200370300200641c0046a200441086a280200360200200641013602840420064180046a41086a2016410171360200200641003a0080042011201441246c6a41046a200141206a20064180046a109903360200200241003a00000c230b410021080240200a450d00201c2004280208470d00024020042802002202200a470d00410121080c010b200a2002201c10cc084521080b200b200d4101762202490d0d20064180046a200c20026a200b20026b109e03200641c0026a41086a221620064194046a290200370300200641c0026a41106a220c2006419c046a290200370300200641c0026a41186a220e200641a4046a29020037030020062006418c046a2902003703c002200d410171210220064180046a41086a220d2802002115200628028404210320062802800421142004280208210b20042902002117024020052802002204450d002005280204450d002004102c0b2005201b3602042005200a360200200541086a201c360200200641386a41086a2016290300370300200641386a41106a200c290300370300200641386a41186a200e290300370300200641206a41086a200d290200370300200641206a41106a20064180046a41106a280200360200200620062903c00237033820062006290280043703200c230b200b200d200241016a22126a22154101762208490d0e200641d8006a200c20086a200b20086b109e03200641e8016a41086a2208200641d8006a41086a290300370300200641e8016a41106a2203200641d8006a41106a290300370300200641e8016a41186a2205200641d8006a41186a290300370300200641e8016a41206a220e200641d8006a41206a290300370300200641e8016a41286a220f200641d8006a41286a280200360200200620062903583703e801200d20026a220d4101762214200b4f0d0f200c20146a2d0000211410a303211620064180046a41086a20154101713602002006418c046a220b20062903e80137020020064194046a20082903003702002006419c046a200329030037020020064180046a41246a2005290300370200200641ac046a200e290300370200200641b4046a200f280200360200200641c4046a201c360200200641c0046a201b360200200641bc046a200a360200200641b8046a20113602002006410436028404200641c8046a20062902b801370300200641d0046a200641b8016a41086a290200370300200641d8046a200641b8016a41106a28020036020041002108200641003a00800420162014410f712014410476200d4101711b41246c6a2214200141206a220320064180046a109903360204201441003a0000024020062802142214410174200628021822156b2002460d00201520026a220b410176220d20144f0d112014201520126a22054101762208490d122006280210220c200d6a2d00002115200641c0026a200c20086a201420086b109e032006418c046a221420062902c00237020020064194046a200641c0026a41086a2902003702002006419c046a200641c0026a41106a29020037020020064180046a41246a200641c0026a41186a290200370200200641ac046a200641c0026a41206a290200370200200641b4046a200641c0026a41286a280200360200200641b8046a2004290200370300200641c0046a200441086a280200360200200641013602840420064180046a41086a2204200541017136020041002108200641003a00800420162015410f71201541f00171410476200b4101711b41246c6a2215200320064180046a109903360204201541003a000020064180046a20064188016a200210a203200641386a41086a20064180046a41186a290300370300200641386a41106a20064180046a41206a290300370300200641386a41186a20064180046a41286a290300370300200620064180046a41106a29030037033820142802002115200428020021032006280284042114200628028004210242002117201621110c230b20064180046a20064188016a200210a203200641386a41086a20064180046a41186a290300370300200641386a41106a200641a0046a290300370300200641386a41186a200641a8046a290300370300200620064180046a41106a290300370338200b280200211520064180046a41086a28020021032004280208210b2004290200211720062802840421142006280280042102201621110c220b200641a0046a200228022036020020064180046a41186a201a370300200620193703880420062017370380042006201837039004200641c0026a41086a200441086a280200360200200620042902003703c002200641e8016a200120064180046a2003200641c0026a2005109b0320062802ec0121080240024020062802e8014101460d00200641e8016a41086a2d00002115200241003a00002011201441246c6a41046a2008360200201541ff01710d22200b200d4101762202490d1420064180046a200c20026a200b20026b109e032000410c6a200d41017136020020004281808080c000370204200041c8006a201c360200200041c4006a201b360200200041c0006a200a3602002000413c6a2011360200200041106a200629028004370200200041186a20064188046a290200370200200041206a20064180046a41106a290200370200200041286a20064180046a41186a290200370200200041306a20064180046a41206a290200370200200041386a20064180046a41286a280200360200200041003602000c010b20004101360200200020083602040240200a450d00201b450d00200a102c0b2011102c0b200628029c0341244d0d23200641a4036a280200102c200724000f0b200641e8026a2002412c6a290200370300200641e0026a200241246a290200370300200641d8026a2002411c6a290200370300200641d0026a2208200241146a290200370300200641c0026a41086a2002410c6a290200370300200620022902043703c0022002413c6a280200210a200241386a280200211c200241346a28020021100240024020062802c402220b41244b0d00200641c9026a210d0c010b2008280200210b200641c0026a410c6a280200210d0b410021020240200b41017420062802c002220c6b22112006280214220e4101742006280218220f6b2209200920114b1b2212450d00200628021021130340200f20026a22084101762214200e4f0d14200c20026a22154101762216200b4f0d15201320146a2d00002214410f71201441f0017141047620084101711b200d20166a2d00002208410f71200841047620154101711b470d012012200241016a2202470d000b201221020b0240024020022011470d0020112009470d00410021020240200a2004280208470d000240201020042802002202470d00410121020c010b20102002200a10cc084521020b024020052802002208450d002005280204450d002008102c0b2005201c36020420052010360200200541086a200a360200024020020d00200620062802c0023602800420064180046a41047221150240024020062802c402221441244b0d00200641c9026a21020c010b200641d0026a2802002114200641cc026a28020021020b4100210820064180046a41086a221641003a0000200641003602840420152002200220146a10a403200641386a41086a20064180046a41186a290300370300200641386a41106a200641a0046a290300370300200641386a41186a200641a8046a290300370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a280200360200200620064180046a41106a29030037033820062006290298033703202006418c046a280200211520162802002103200429020421172004280200211120062802840421142006280280042102410121160c020b200620062802c0023602800420064180046a41047221140240024020062802c402220841244b0d00200641c9026a21020c010b200641d0026a2802002108200641cc026a28020021020b20064180046a41086a221641003a0000200641003602840420142002200220086a10a403200641386a41086a20064180046a41186a290300370300200641386a41106a200641a0046a290300370300200641386a41186a200641a8046a290300370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a280200360200200620064180046a41106a29030037033820062006290298033703202006418c046a28020021152016280200210320042902042117200428020021112006280284042114200628028004210241012116410121080c010b0240200220114f0d0010a3032114200c20026a22154101762216200b4f0d16200b201541016a220c4101762208490d17200d20166a2d0000211620064198036a200d20086a200b20086b109e032006418c046a220b20062902980337020020064180046a41146a220d20064198036a41086a220e29020037020020064180046a411c6a220f20064198036a41106a221229020037020020064180046a41246a221320064198036a41186a29020037020020064180046a412c6a221120064198036a41206a29020037020020064180046a41346a220920064198036a41286a280200360200200641c0046a221b200a360200200641bc046a220a201c36020020064180046a41386a2010360200200641013602840420064180046a41086a2210200c41017136020041002108200641003a00800420142016410f71201641f0017141047620154101711b41246c6a2215200141206a20064180046a109903360204201541003a000020064180046a200641106a200210a203200641a8016a41086a2202200b280200360200200641d8006a41086a221520064180046a41186a220c290300370300200641d8006a41106a221620064180046a41206a290300370300200641d8006a41186a221c20064180046a41286a29030037030020062006290284043703a801200620064180046a41106a221d290300370358200620062802800436029c032006410436029803200e20062903a8013703002012200228020036020020064198036a41386a410036020020064198036a41346a201436020020064198036a41146a200629035837020020064198036a411c6a201529030037020020064198036a41246a201629030037020020064198036a412c6a201c290300370200200641dc036a20062902880137020020064198036a41cc006a20064188016a41086a29020037020020064198036a41d4006a20064188016a41106a280200360200200641f0036a41086a200441086a280200360200200620042902003703f00320064180046a200120064198036a2003200641f0036a2005109d03200641e8016a41086a22052013290200370300200641e8016a41106a220e2011290200370300200641e8016a41186a221220092902003703002006200f2902003703e80120102802002116200b2802002102201d2802002114200d2802002103200c2802002115200a2802002111201b2903002117200641c8046a280200210b200628028404210d2006280280042104200641b8016a41106a220c200641dc046a280200360200200641b8016a41086a220f20064180046a41d4006a290200370300200620064180046a41cc006a2902003703b801024020044101460d00200641386a41186a2012290300370300200641386a41106a200e290300370300200641386a41086a2005290300370300200641206a41086a200f290300370300200641206a41106a200c280200360200200620062903e801370338200620062903b8013703200c020b200041013602002000200d3602040c200b200b200c4101762202490d17200641e8016a200d20026a200b20026b109e0310a303210220064198036a41086a20062902e80137030020064198036a41106a200641e8016a41086a29020037030020064198036a41186a200641e8016a41106a29020037030020064198036a41206a200641e8016a41186a29020037030020064198036a41286a200641e8016a41206a290200370300200641c8036a200641e8016a41286a28020036020020064198036a41c0006a200a36020020064198036a413c6a201c360200200641d0036a201036020020064198036a41346a20023602002006200c41017136029c03200641043602980320064188016a41086a200441086a280200360200200620042902003703880120064180046a200120064198036a200320064188016a2005109d03200641d8006a41086a2204200641a4046a290200370300200641d8006a41106a220d200641ac046a290200370300200641d8006a41186a220520064180046a41346a29020037030020062006419c046a29020037035820064180046a41086a28020021162006418c046a280200210220064180046a41106a280200211420064194046a280200210320064180046a41186a280200211520064180046a413c6a280200211120064180046a41c0006a2903002117200641c8046a280200210b200628028404210c2006280280042108200641b8016a41106a220e200641dc046a280200360200200641b8016a41086a220f200641d4046a2902003703002006200641cc046a2902003703b80120084101460d18200641386a41186a2005290300370300200641386a41106a200d290300370300200641386a41086a2004290300370300200641206a41086a200f290300370300200641206a41106a200e28020036020020062006290358370338200620062903b801370320410021080b20062802c40241244d0d24200641cc026a280200102c0c240b2010200d460d18200d4101762202200b4f0d17200c20026a2d0000210210a30321140240024020114101460d00200b200d41016a22154101762208490d1b20064198036a200c20086a200b20086b109e0320064180046a41086a20154101713602002006418c046a20062902980337020020064194046a20064198036a41086a2902003702002006419c046a20064198036a41106a290200370200200641a4046a20064198036a41186a290200370200200641ac046a20064198036a41206a290200370200200641b4046a200641c0036a280200360200200641b8046a20093a0000200641b9046a20062f01a4013b00002006410236028404200641bb046a200641a4016a41026a2d00003a0000200641bc046a200a360200200641c0046a200629038801370300200641c8046a20064188016a41086a290300370300200641d0046a20064188016a41106a290300370300200641d8046a20064188016a41186a28020036020041002109200641003a008004200141206a20064180046a109903210a0c010b20064198036a41026a200641a4016a41026a2d00003a000020064180046a41086a20064188016a41086a29030037030020064180046a41106a20064188016a41106a29030037030020064180046a41186a20064188016a41186a280200360200200620062f01a4013b0198032006200629038801370380040b20142002410f712002410476200d4101711b41246c6a220220093a0000200220062f0198033b00012002200a3602042002200629038004370208200241036a2006419a036a2d00003a0000200241106a20064180046a41086a2215290300370200200241186a20064180046a41106a220b290300370200200241206a20064180046a41186a220d2802003602004100210820064198036a41086a41003602002006201436029c032006410336029803200641b8016a41086a200441086a280200360200200620042902003703b80120064180046a200120064198036a2003200641b8016a2005109d03200641c0026a41086a220520064180046a41246a290200370300200641c0026a41106a220c200641ac046a290200370300200641c0026a41186a220e200641b4046a29020037030020062006419c046a2902003703c002201528020021162006418c046a2802002102200b280200211420064194046a2802002103200d2802002115200641bc046a2802002111200641c0046a2903002117200641c8046a280200210b200628028404210d2006280280042104200641e8016a41106a220f200641dc046a280200360200200641e8016a41086a2212200641d4046a2902003703002006200641cc046a2902003703e801024020044101460d00200641386a41186a200e290300370300200641386a41106a200c290300370300200641386a41086a2005290300370300200641206a41086a2012290300370300200641206a41106a200f280200360200200620062903c002370338200620062903e8013703200c230b200041013602002000200d3602040c1c0b2003200328020820116a36020820064180046a41086a20062903880137030020064180046a41106a20064188016a41086a29030037030020064180046a41186a20064188016a41106a290300370300200641a0046a20064188016a41186a280200360200200620093a008004200620062f01a4013b0081042006200641a6016a2d00003a0083042006200a3602840420064198036a41086a200441086a2802003602002006200429020037039803200641c0026a200120064180046a200320064198036a2005109b0320062802c4022116024020062802c0024101460d00200b200d4101762202490d1b200641c0026a41086a2d0000210820064180046a200c20026a200b20026b109e03200641386a41086a20064194046a290200370300200641386a41106a2006419c046a290200370300200641d0006a200641a4046a290200370300200641206a41086a20064198036a41086a290200370300200641206a41106a20064198036a41106a28020036020020062006418c046a2902003703382006200629029803370320200d4101712102200841ff017145210820064180046a41086a2802002115200628028404210320062802800421142016ad211741022116410021110c220b20004101360200200020163602040c1b0b20004101360200200020143602040c1a0b2014200e41f8c3c800103f000b2016200b41f8c3c800103f000b200220084188c4c8001058000b2015201441f8c3c800103f000b200820164188c4c8001058000b2014200e41f8c3c800103f000b2016200b41f8c3c800103f000b2002200b4188c4c8001058000b2008200e41f8c3c800103f000b2008200b4188c4c8001058000b2014200b41f8c3c800103f000b200d201441f8c3c800103f000b200820144188c4c8001058000b200820154188c4c8001058000b2002200b4188c4c8001058000b2014200e41f8c3c800103f000b2016200b41f8c3c800103f000b2016200b41f8c3c800103f000b2008200b4188c4c8001058000b2002200b4188c4c8001058000b200041013602002000200c3602040c060b2002200b41f8c3c800103f000b41dcf4c000412a4188f5c000103c000b2008200b4188c4c8001058000b2008200b4188c4c8001058000b2002200b4188c4c8001058000b200628025c41244d0d04200641e4006a280200102c200724000f0b20062802c40241244d0d03200641cc026a280200102c200724000f0b200b200d4101762202490d0120064180046a200c20026a200b20026b109e03200641386a41086a20064194046a290200370300200641c8006a2006419c046a290200370300200641d0006a200641a4046a29020037030020062006418c046a290200370338200d4101712102201bad422086200aad84211720064180046a41086a28020021152006280284042103200628028004211441002108201c210b0b0240200628029c0341244d0d00200641a4036a280200102c0b410421160c030b2002200b4188c4c8001058000b200724000f0b200628025c41244d0d00200641e4006a280200102c0b20002008360204200041186a2015360200200041146a2003360200200041106a20143602002000410c6a2002360200200041086a20163602002000411c6a2006290338370200200041c8006a200b360200200041c0006a20173702002000413c6a2011360200200041cc006a2006290320370200200041246a200641386a41086a2903003702002000412c6a200641386a41106a290300370200200041346a200641386a41186a290300370200200041d4006a200641206a41086a290300370200200041dc006a200641206a41106a28020036020020004100360200200724000bdd0301097f230041106b22032400200041003a00042000410036020020032000200210a0080240024020032802004101470d00200341086a2802000d0141e8c4c800411141fcc4c800103c000b41242104024002402000280200220541244b0d00200041056a210620052107200021080c010b2000410c6a22082802002107200041086a2802002106200521040b02400240024020072004490d00200121050c010b2002210920012105024003402009450d01200620076a20052d00003a00002009417f6a2109200541016a21052004200741016a2207470d000b200421070c010b200820073602000c010b20082007360200200120026a22082005460d00200541016a21072000410c6a210a200041056a210b20052d000021060340024002402000280200220241244b0d00412421012002210520002109200b21040c010b200028020c210520002802082104200a2109200221010b024020052001470d0020032000410110a008024020032802004101470d00200341086a2802000d0441e8c4c800411141fcc4c800103c000b200028020c210520002802082104200a21090b200420056a20063a00002009200928020041016a36020020082007460d0120072d00002106200741016a21070c000b0b200341106a24000f0b1039000bbf0703017f027e177f230041c0016b22022400200241086a200141d00010c9081a200041086a290300210320002903002104200241003602702002200337036820022004370360200241086a200241e0006a10a503200229036022032003200229036822048520048920022802704101461b2203421988a7220541ff007141818284086c2106200041106a2107200041146a28020021082002412d6a2109200241346a280200210a200241306a280200210b2002280228220c41244b210d200241d4006a2d000041ff0171210e200241086a41cd006a2d000041ff0171210f200028021022102003a72211712212211341002114024003400240200820136a28000022152006732201417f73200141fffdfb776a71418081828478712201450d000240034002400240200241086a2008410020016841037620136a2010716b41d0006c6a221641b07f6a2217460d00200241086a2017412010cc080d010b201641506a211802400240200d0d0020092119200c211a0c010b200b2119200a211a0b024002402018280200221b41244b0d00201841056a21180c010b2016415c6a280200211b201641586a28020021180b201a201b470d00024020192018460d0020192018201a10cc080d010b200e2016417c6a2d0000470d00200e450d02200f201741cd006a2d000041ff0171460d020b2001417f6a2001712201450d020c000b0b200c41244d0d02200b450d02200b102c0c020b201441046a221420136a2010712113201520154101747141808182847871450d000b2002200036025c200241e0006a200241086a41d00010c9081a4104210103402012221620016a2010712112200141046a2101200820166a280000418081828478712217450d000b0240200820176841037620166a20107122016a2c000022164100480d0020082008280200418081828478716841037622016a2d000021160b200041186a2802002117024020164101712218450d0020170d00200241b0016a2007200241dc006a10a603200028021022102011712116200041146a28020021084104210103402016221720016a2010712116200141046a2101200820176a28000041808182847871221b450d000b02402008201b6841037620176a20107122016a2c00004100480d002008280200418081828478716841037621010b200028021821170b2000201720186b360218200820016a200541ff007122163a000020102001417c6a7120086a41046a20163a00002008410020016b41d0006c6a41b07f6a200241e0006a41d00010c9081a2000411c6a2201200128020041016a3602000b200241c0016a24000bb51101147f230041b0096b2203240041002104200341003602a806200320023602a406200320013602a0064101210541012106024002402002450d0041012107200341013602a8060240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000022080d000c010b41012106024002400240024002400240024002400240024002400240200841c00171220741c001460d0002402007418001460d00200741c000470d202008413f712204413f470d024102210741412104024003402007417f6a20024f0d22200320073602a806200120076a417f6a2d0000220841ff01470d01200441817e6a210441012109200741016a2207418302470d000b418202210741ffff0321040c050b200820046b21040c030b2008413f712204413f470d054102210741412104024003402007417f6a20024f0d21200320073602a806200120076a417f6a2d0000220841ff01470d01200441817e6a210441012109200741016a2207418302470d000b418202210741ffff032104410121080c0b0b200820046b21040c060b2008413f712204413f470d074102210741412104024003402007417f6a20024f0d20200320073602a806200120076a417f6a2d0000220841ff01470d01200441817e6a210441012109200741016a2207418302470d000b418202210741ffff032104410021080c0a0b200820046b2104410021080c080b410121070b20044101712209450d010b200720024f0d0341002106200120076a2d0000410f4b0d1b0b410121062007200441016a4101766a220a20024b0d1a2003200a3602a8062003200341a0066a10ae0620032802000d1a20032802a806220b20032802046a220c20032802a4064b0d1a2003200c3602a806200341e0046a200341f0076a41c00110c9081a410121040c070b410121070b410121080c020b2007200241fce6c300103f000b41002108410121070b20044101712209450d010b200720024f0d0241002106200120076a2d0000410f4b0d140b410121062007200441016a4101766a220a20024b0d132003200a3602a806200a41026a220420024b0d13200320043602a806200a417e4f0d052001200a6a2f0000210d410021044100210b024020080d00200341106a200341a0066a10ae0620032802100d1420032802a806220c20032802146a220e20032802a4064b0d142003200e3602a8064101210b0b200341023602a40920034102360298092003410236028c092003410236028009200341023602f408200341023602e808200341023602dc08200341023602d008200341023602c408200341023602b808200341023602ac08200341023602a00820034102360294082003410236028808200341023602fc07200341023602f007200341f0076a2106200d41ffff0371210f03400240200f2004410f7176410171450d00200341086a200341a0066a10ae060240024020032802080d0020032802a806220d200328020c22106a220820032802a4064d0d010b410121060c160b200320083602a806200641086a2008360200200641046a200d360200200620104120473602000b2006410c6a2106200441016a22044110470d000b200341e0046a200341f0076a41c00110c9081a410421040b200341a0036a200341e0046a41c00110c9081a200341c0016a41186a200e360200200341c0016a41146a200c360200200341c0016a41106a200b360200200341c0016a410c6a2009360200200341c0016a41086a200a360200200320073602c401200320043602c001200341c0016a411c6a200341a0036a41c00110c9081a410021054100211120040e050d020101030d0b20072002418ce7c300103f0b000b200a2007490d02200a20024b0d03200c200b490d04200c20024b0d05200a20076b2108200120076a21062001200b6a2112200c200b6b2113410121110c0a0b200341023602a40920034102360298092003410236028c092003410236028009200341023602f408200341023602e808200341023602dc08200341023602d008200341023602c408200341023602b808200341023602ac08200341023602a00820034102360294082003410236028808200341023602fc07200341023602f007410021060340410221080240200341c0016a20066a2204411c6a220f2802004102460d00200441246a280200210d200441206a280200210402400240200f2802004101470d00200d2004490d0941012108200d20024d0d01200d200241f4c6c800104f000b200d2004490d0941002108200d20024b0d0a0b200d20046b210d200120046a21100b200341f0076a20066a22042008360200200441086a200d360200200441046a20103602002006410c6a220641c001460d090c000b0b200a200441ece6c3001059000b2007200a41ecc7c8001059000b200a200241ecc7c800104f000b200b200c41fcc7c8001059000b200c200241fcc7c800104f000b2004200d41f4c6c8001059000b2004200d4184c7c8001059000b200d20024184c7c800104f000b02400240200b4101460d00410021100c010b200e200c490d02200e20024b0d03200e200c6b210d2001200c6a21100b200a2007490d03200a20024b0d04200341f8076a280200211420032802f407211320032802f0072112200341186a200341fc076a41a80110c9081a200a20076b2108200120076a2106200341ac096a280200210f200341a8096a280200211520032802a4092116410421110b2000411c6a2014360200200041186a2013360200200041146a2012360200200041106a20093602002000410c6a2008360200200041086a2006360200200041046a2011360200200041206a200341186a41a80110c9081a200041d8016a200d360200200041d4016a2010360200200041d0016a200f360200200041cc016a2015360200200041c8016a20163602000c050b200c200e418cc8c8001059000b200e2002418cc8c800104f000b2007200a41ecc7c8001059000b200a200241ecc7c800104f000b200341a0036a200341e0046a41c00110c9081a200020063a00010b200020053a0000200341b0096a24000baa0801047f230041f0026b22042400024002400240024002400240024020022802004101470d00200241086a280200210520022802042102200441d0016a41186a200141186a290000370300200441d0016a41106a200141106a290000370300200441d0016a41086a200141086a290000370300200420012900003703d001200441f0016a200441d0016a200220052003109c0320042802f401210120042802f0012102200441f8006a200441f0016a41086a220541d40010c9081a20024101460d03200441246a200441f8006a41d40010c9081a200420013602f4012005200441246a41d40010c9081a41002102200441003a00f0012003200441f0016a10990321010c010b2002280204210302400240200241086a28020022024120460d00200441f0016a41086a200141086a290000370300200441f0016a41106a200141106a290000370300200441f0016a41186a200141186a290000370300200420012900003703f0012002417f4c0d050240024020020d00410121010c010b200210322201450d070b200441003602d801200420023602d401200420013602d001200441d0016a4100200210c80120042802d00120042802d80122016a2003200210c9081a2004412f6a200120026a360000200420042903d001370027413010322201450d06200141043a0000200120042903f00137000120012004290024370021200141096a200441f8016a290300370000200141116a20044180026a290300370000200141196a20044188026a290300370000200141286a2004412b6a290000370000410121020c010b200441246a41026a200341026a2d00003a0000200441f0016a41086a2003410f6a29000037030020044180026a200341176a29000037030020044188026a2003411f6a2d00003a0000200420032f00003b0124200420032900073703f00120032800032101410021020b200441206a41026a2203200441246a41026a2d00003a0000200441f8006a41086a2205200441f0016a41086a290300370300200441f8006a41106a2206200441f0016a41106a290300370300200441f8006a41186a2207200441f0016a41186a2d00003a0000200420042f01243b0120200420042903f00137037820020d012004411c6a41026a20032d00003a0000200441086a2005290300370300200441106a2006290300370300200441186a20072d00003a0000200420042f01203b011c20042004290378370300410121020b200020023a000420004100360200200041056a20042f011c3b0000200041086a20013602002000410c6a2004290300370200200041076a2004411e6a2d00003a0000200041146a200441086a2903003702002000411c6a200441106a290300370200200041246a200441186a2802003602000c040b20004101360200200020013602040c030b20004101360200200020013602040c020b103b000b1039000b200441f0026a24000bdd0e01097f230041f0006b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141046a2802002204410174200141086a28020022056b20024d0d0020054101762106200520026a220741017621082007410171450d04200841016a22072006490d06200820044f0d072003200128020020066a200720066b10b808200341306a410472220941286a200341286a280200360200200941206a200341206a290300370200200941186a200341186a290300370200200941106a200341106a290300370200200941086a200341086a290300370200200920032903003702002003200241017122013602302005410171220520014b0d01200520014f0d19412421052003280234220441244b0d02200341396a2102200921010c030b200420054101762202490d04200341306a200128020020026a200420026b109e0320002005410171360200200020032903303702042000410c6a200341386a290300370200200041146a200341c0006a2903003702002000411c6a200341c8006a290300370200200041246a200341d0006a2903003702002000412c6a200341d8006a2802003602000c190b02400240200328023422054125490d00200341c0006a2201280200417f6a220a0d0120012802000d154100410041acc9c800103f000b2005417f6a220a450d150b200a417f6a210b200341396a2107410021010340200141016a21020240024020054125490d002003280240220520014d0d142003280240220520024d0d09200328023c20016a2d00004104742104200328023c20016a41016a2d0000410476210620032802402105200328023c21080c010b200520014d0d13200520024d0d08200720016a22062d00004104742104200641016a2d00004104762106200721080b200520014d0d08200820016a20062004723a00000240200b2001460d0020032802342105200221010c010b0b02400240200328023422014125490d0020032802402201200a4d0d0a200328023c200a6a2d0000210220032802402101200328023c21070c010b2001200a4d0d092007200a6a2d000021020b2001200a4d0d092007200a6a21010c160b200341c0006a21012003413c6a2802002102200421050b0240200128020022042005470d00200341e0006a2009410110a008024020032802604101470d00200341e8006a2802000d0a41e8c4c800411141fcc4c800103c000b200341c0006a220128020021042003413c6a28020021020b200220046a41003a00002001200128020041016a3602002003280234220521010240200541244d0d00200341c0006a28020021010b024020014102490d002001417e6a2101200341396a21070340200141016a21020240024020054125490d002003280240220520014d0d142003280240220520024d0d0d200328023c20016a2d00004104742104200328023c20016a41016a2d0000410476210620032802402105200328023c21080c010b200520014d0d13200520024d0d0c200720016a22062d00004104742104200641016a2d00004104762106200721080b200520024d0d0c200820016a41016a20062004723a00002001417f6a210120032802342105200241014b0d000b0b0240024020054125490d00200341c0006a2205280200450d0d2003413c6a22022802002d0000210120052802002105200228020021020c010b2005450d0c200341396a210220032d003921010b2005450d0c2002200141f001714104763a00000c150b20082006490d0c20042008490d0d200341306a200128020020066a200820066b10b80820002005410171360200200020032903303702042000410c6a200341386a290300370200200041146a200341c0006a2903003702002000411c6a200341c8006a290300370200200041246a200341d0006a2903003702002000412c6a200341d8006a2802003602000c150b200220044188c4c8001058000b200620074198c4c8001059000b200720044198c4c800104f000b200141016a2005418cc9c800103f000b20012005419cc9c800103f000b200a200141acc9c800103f000b200a200141bcc9c800103f000b1039000b200141016a200541d4c6c800103f000b200141016a200541e4c6c800103f000b4100410041ccc9c800103f000b4100410041dcc9c800103f000b2006200841a8c4c8001059000b2008200441a8c4c800104f000b2001200541fcc8c800103f000b2001200541c4c6c800103f000b2003413c6a22012802002d00002102200341c0006a2802002105200128020021010c010b200341396a22012d000021020b20050d004100410041bcc9c800103f000b200120024104743a00000b0240200328023441244d0d00200341c0006a21090b024020092802002201450d0020092001417f6a3602000b20002003290330370200200041286a200341306a41286a290300370200200041206a200341306a41206a290300370200200041186a200341306a41186a290300370200200041106a200341306a41106a290300370200200041086a200341306a41086a2903003702000b200341f0006a24000b800d01027f230041b0046b22002400024041c004103222010d001039000b200141023a00002001200029008d04370001200141023a0024200120002900ea03370025200141096a2000418d046a41086a290000370000200141116a2000418d046a41106a290000370000200141196a2000418d046a41186a290000370000200141206a2000418d046a411f6a2800003600002001412d6a200041ea036a41086a290000370000200141356a200041ea036a41106a2900003700002001413d6a200041ea036a41186a290000370000200141c4006a200041ea036a411f6a280000360000200141023a0048200141023a006c200120002900c703370049200141d1006a200041c7036a41086a290000370000200141d9006a200041c7036a41106a290000370000200141e1006a200041c7036a41186a290000370000200141e8006a200041c7036a411f6a280000360000200120002900a40337006d200141f5006a200041a4036a41086a290000370000200141fd006a200041a4036a41106a29000037000020014185016a200041a4036a41186a2900003700002001418c016a200041a4036a411f6a280000360000200141023a009001200141023a00b40120012000290081033700910120014199016a20004181036a41086a290000370000200141a1016a20004181036a41106a290000370000200141a9016a20004181036a41186a290000370000200141b0016a20004181036a411f6a280000360000200120002900de023700b501200141bd016a200041de026a41086a290000370000200141c5016a200041de026a41106a290000370000200141cd016a200041de026a41186a290000370000200141d4016a200041de026a411f6a280000360000200141023a00d801200141f8016a200041bb026a411f6a280000360000200141f1016a200041bb026a41186a290000370000200141e9016a200041bb026a41106a290000370000200141e1016a200041bb026a41086a290000370000200120002900bb023700d901200141023a00fc012001419c026a20004198026a411f6a28000036000020014195026a20004198026a41186a2900003700002001418d026a20004198026a41106a29000037000020014185026a20004198026a41086a29000037000020012000290098023700fd01200141023a00a002200141c0026a200041f5016a411f6a280000360000200141b9026a200041f5016a41186a290000370000200141b1026a200041f5016a41106a290000370000200141a9026a200041f5016a41086a290000370000200120002900f5013700a102200141023a00c402200141e4026a200041d2016a411f6a280000360000200141dd026a200041d2016a41186a290000370000200141d5026a200041d2016a41106a290000370000200141cd026a200041d2016a41086a290000370000200120002900d2013700c502200141023a00e80220014188036a200041af016a411f6a28000036000020014181036a200041af016a41186a290000370000200141f9026a200041af016a41106a290000370000200141f1026a200041af016a41086a290000370000200120002900af013700e902200141023a008c03200141ac036a2000418c016a411f6a280000360000200141a5036a2000418c016a41186a2900003700002001419d036a2000418c016a41106a29000037000020014195036a2000418c016a41086a2900003700002001200029008c0137008d03200141023a00b003200141d0036a200041e9006a411f6a280000360000200141c9036a200041e9006a41186a290000370000200141c1036a200041e9006a41106a290000370000200141b9036a200041e9006a41086a290000370000200120002900693700b103200141023a00d403200141f4036a200041c6006a411f6a280000360000200141ed036a200041c6006a41186a290000370000200141e5036a200041c6006a41106a290000370000200141dd036a200041c6006a41086a290000370000200120002900463700d503200141023a00f80320014198046a200041236a411f6a28000036000020014191046a200041236a41186a29000037000020014189046a200041236a41106a29000037000020014181046a200041236a41086a290000370000200120002900233700f903200141023a009c04200141bc046a2000411f6a280000360000200141b5046a200041186a290000370000200141ad046a200041106a290000370000200141a5046a200041086a2900003700002001200029000037009d04200041b0046a240020010bb20301097f230041106b2203240020032000200220016b10a008024002400240024020032802004101470d00200341086a2802000d0141e8c4c800411141fcc4c800103c000b41242104024002402000280200220541244b0d00200041056a210620052107200021080c010b2000410c6a22082802002107200041086a2802002106200521040b0240200720044f0d00034020022001460d03200620076a20012d00003a0000200141016a21012004200741016a2207470d000b200421070b2008200736020020012002460d02200141016a21072000410c6a2109200041056a210a20012d000021050340024002402000280200220841244b0d004124210b2008210120002104200a21060c010b200028020c210120002802082106200921042008210b0b02402001200b470d0020032000410110a008024020032802004101470d00200341086a2802000d0341e8c4c800411141fcc4c800103c000b200028020c210120002802082106200921040b200620016a20053a00002004200428020041016a36020020022007460d0320072d00002105200741016a21070c000b0b1039000b200820073602000b200341106a24000be50804027f027e027f017e230041b0016b2202240020012001280210220341026a360210200241a0016a200129030042adfed5e4d485fda8d8007e220442a0cbbf9599b5a19f0a7c2205200029021885200029020020058542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852000290208200442efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852000290210200442bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010ce082001200241a8016a29030020022903a0017c2204370300024002402000280220220641244b0d00200041256a21070c010b2000412c6a2802002106200041286a28020021070b2001200341036a36021020024190016a20042006ad220585420042adfed5e4d485fda8d800420010ce08200120022903900120057c20024190016a41086a2903007c42adfed5e4d485fda8d8007e2205370300024002400240200641084b0d00200641014b0d014200210402402006450d00200731000021040b2001200341046a220336021020024180016a2004200585420042adfed5e4d485fda8d800420010ce0820024188016a2903002002290380017c21040c020b0240200641104b0d00200241d0006a2007290000200585420042adfed5e4d485fda8d800420010ce082001200341056a2203360210200241c0006a200241d0006a41086a29030020022903507c200620076a41786a29000085420042adfed5e4d485fda8d800420010ce08200241c0006a41086a29030020022903407c21040c020b200620076a41786a2900002108200521040340200729000020048542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e2005852105200741086a2107200442cf829ebbefefde82147c2104200641786a220641084b0d000b2001200341056a2203360210200241306a2005200885420042adfed5e4d485fda8d800420010ce08200241386a29030020022903307c21040c010b024020064104490d002001200341046a2203360210200241e0006a200620076a417c6a350000422086200735000084200585420042adfed5e4d485fda8d800420010ce08200241e8006a29030020022903607c21040c010b2001200341046a2203360210200241f0006a200620076a417f6a310000422086200733000084200585420042adfed5e4d485fda8d800420010ce08200241f8006a29030020022903707c21040b2001200437030002400240200041cc006a2d00000d002001200341016a36021020022004420042adfed5e4d485fda8d800420010ce08200241086a29030020022903007c21040c010b200241206a2004420185420042adfed5e4d485fda8d800420010ce082001200341026a360210200241106a200241206a41086a29030020022903207c200041cd006a31000085420042adfed5e4d485fda8d800420010ce08200241106a41086a29030020022903107c21040b20012004370300200241b0016a24000b820f06087f017e067f017e017f027e230041c0006b220324000240200128020c220441016a22052004490d000240024002400240200520012802002206200641016a220741037641076c20064108491b22064101764d0d00024002402005200641016a2206200520064b1b22050d0041c08ec1002108410021094100210a0c010b0240024020054108490d000240200541ffffffff01712005470d00417f2005410374220541076e417f6a677641016a41012005410d4b1b21050c020b41d5edc400411c41f4edc400103c000b4104410820054104491b21050b2005ad42d0007e220b422088a70d04200ba72206200541046a22096a22082006490d04200810322208450d03200820066a220841ff01200910cb081a2005417f6a2209200541037641076c20094108491b210a0b200141046a280200220c41046a210d200c20076a210e200c280200417f734180818284787121072002280200220f41086a211003400240024020070d0002400340200d200e4f0d01200c41c07d6a210c200d2802002105200d41046a2206210d2005418081828478712205418081828478460d000b2005418081828478732207417f6a20077121112006210d0c020b2001200436020c200041003602002001200a20046b3602082001280200210520012009360200200141046a22062802002107200620083602002005450d042007200541016aad42d0007ea76b102c0c040b2007417f6a20077121110b2010290300210b200f290300211241002105200341003602382003200b37033020032012370328200c41002007684103766b41d0006c6a41b07f6a2213200341286a10a5032003290328220b200b200329033022128520128920032802384101461b220ba721060340200541046a2205200620097122076a2106200820076a280000418081828478712202450d000b0240200820026841037620076a20097122056a2c00004100480d002008280200418081828478716841037621050b200820056a200ba741197622063a00002005417c6a20097120086a41046a20063a00002008410020056b41d0006c6a41b07f6a201341d00010c9081a201121070c000b0b4100210641002105024003400240024020064101710d00200520074f0d0320052106200541016a21050c010b200541036a220620054922080d0220062007492209450d022007200541046a20081b200720091b21050b200141046a28020020066a220620062802002206410776417f73418182840871200641fffefdfb07726a360200410121060c000b0b200141046a280200210502400240200128020041016a22064104490d00200520066a20052800003600000c010b200541046a2005200610ca081a0b4100210502402001280200220a417f460d00200141046a210c2002280200220f41086a21104100210503400240200c2802002206200522136a2d0000418001470d00410020136b2104024003402010290300210b200f290300211241002105200341003602382003200b370330200320123703282006200441d0006c6a220e41b07f6a220d200341286a10a503200c2802002109200128020021082003290328220b200b200329033022128520128920032802384101461b220ba7221121060340200541046a2205200620087122076a2106200920076a280000418081828478712202450d000b0240200920026841037620076a20087122056a2c00004100480d002009280200418081828478716841037621050b2005200820117122066b201320066b732008714104490d01200920056a22062d000021072006200ba741197622023a00002005417c6a20087120096a41046a20023a00000240200741ff01460d00200c280200410020056b41d0006c6a220741b07f6a2205290200210b2005200d290200370200200541186a220629020021122006200d41186a2208290200370200200541106a220629020021142006200d41106a2209290200370200200541086a220529020021152005200d41086a2206290200370200200d200b370200200620153702002009201437020020082012370200200741506a220541186a2208290200210b2008200e41506a220641186a2209290200370200200541106a220829020021122008200641106a2202290200370200200541086a220829020021142008200641086a220d2902003702002005290200211520052006290200370200200620153702002009200b37020020022012370200200d2014370200200741706a220541086a2207290000210b2007200e41706a220641086a22082900003700002005290000211220052006290000370000200620123700002008200b370000200c28020021060c010b0b200c280200220620136a41ff013a0000200620012802002013417c6a716a41046a41ff013a0000200c280200410020056b41d0006c6a41b07f6a200d41d00010c9081a0c010b200920136a200ba741197622053a000020082013417c6a7120096a41046a20053a00000b201341016a21052013200a470d000b20012802002205200541016a41037641076c20054108491b21050b2000410036020020012005200128020c6b3602080b200341c0006a24000f0b1039000b41d5edc400411c41f4edc400103c000b41d5edc400411c41f4edc400103c000bdc0803017f047e037f230041d00b6b22032400200341d8036a200141e80110c9081a024002400240200241ff01714101460d00200341ec016a200341d8036a41e80110c9081a0c010b200341a80b6a200341d8036a10a803200341d0076a200341d8036a41e80110c9081a024020032d00a80b4101460d00200341b8096a41076a200341d0076a41e80110c9081a200341e0056a200341b8096a41ef0110c9081a200341ec016a200341e0056a41076a41e80110c9081a0c010b200341b8096a41186a200341c10b6a290000370300200341b8096a41106a200341b90b6a290000370300200341b8096a41086a200341b10b6a290000370300200320032900a90b3703b809200341d0076a10a201200341e0056a200341b8096a41ef0110c9081a200341c0056a41186a200341e0056a41186a2900002204370300200341c0056a41106a200341e0056a41106a2900002205370300200341c0056a41086a200341e0056a41086a2900002206370300200320032900e00522073703c005200341c2096a2006370100200341ca096a2005370100200341d2096a200437010020034180023b01b809200320073701ba09200341e8016a200341b8096a10c70220004100360200200041046a200341e8016a41ec0110c9081a0c010b2003200341e8016a41046a41e80110c908220120023a00b809200141c0096a200141e80110c90821080240024002400240200241ff017122090d0020012903c0094201520d00200141c8096a2d00004101460d010b200141d8036a200141e0056a41046a200841e80110c90841e80110c9081a200120023a00b8092008200141d8036a41e80110c908210820090d0220012903c0094201520d02200141c8096a22092d00004102470d0220012802ec09220a0e03010201020b200120012802cc093602ec01200141013a00e801200141e0056a200141e8016a10c702200810a20120004100360200200041046a200141e0056a41ec0110c9081a0c020b200141f0096a280200210820012802f4092102200141f2016a200941096a290000370100200141fa016a200941116a29000037010020014182026a200941196a29000037010020014180023b01e801200120092900013701ea01200141e0056a200141e8016a10c7020240200a4101470d002008410020021b2208450d002002450d002008102c0b20004100360200200041046a200141e0056a41ec0110c9081a0c010b200141d0076a200141e4056a200841e80110c908220941e80110c9081a200120023a00b809200141b8096a41086a200141d0076a41e80110c908210802400240200241ff01714102470d0020012903c0094201520d00200141c8096a2d00004101470d0020012802cc0941e807490d010b200141e8016a2009200841e80110c90841e80110c9081a200041086a200141e8016a41e80110c9081a200041013602000c010b200141003b01a80b200141e0056a200141a80b6a10c702200810a20120004100360200200041046a200141e0056a41ec0110c9081a0b200341d00b6a24000bb50504057f017e027f037e230041e0016b22022400024002400240024020012903004201520d00200141086a2103024020012d000822014101470d0020032802042101410410322203450d022002420437022c20022003360228200241286a41004104102f2002280228200228023022036a41f0c2c98b063600002002200341046a2203360230200241286a20034104102f20022802282204200228023022036a20013600002002200341046a2201360230200241003a00980120042105410021030340200241003a0058200241d8006a20052001410047220610c9081a024020010d00200241003a00580b20012006490d04200241f8006a20036a20022d00583a00002002200341016a22033a009801200120066b2101200520066a210520034120470d000b200241d8006a41186a200241f8006a41186a22012903002207370300200241386a41086a2205200241f8006a41086a2203290300370300200241386a41106a2208200241f8006a41106a2206290300370300200241386a41186a2209200737030020022002290378370338200120092903003703002006200829030037030020032005290300370300200220022903383703780240200228022c450d002004102c0b200241086a41086a20032903002207370300200241086a41106a2006290300220a370300200241086a41186a2001290300220b37030020022002290378220c370308200041196a200b370000200041116a200a370000200041096a20073700002000200c370001200041013a00000c040b20014102470d00024020032802240e03000100010b200041013a000020002003290001370001200041196a200341196a290000370000200041116a200341116a290000370000200041096a200341096a2900003700000c030b200041003a00000c020b1039000b2006200141d0b8c8001058000b200241e0016a24000bbb0302037f017e20004201370200200041086a2202410036020002400240024002400240024020012802000e050001020304050b200041004101102f2000280200200228020022036a41013a00002002200341016a3602002000200141046a10aa030f0b200041004101102f2000280200200228020022036a41023a00002002200341016a220336020020012802042104200020034104102f2000280200200228020022036a20043600002002200341046a3602002000200141086a10aa030f0b200041004101102f2000280200200228020022036a41033a00002002200341016a2203360200200141086a2903002105200020034108102f2000280200200228020022006a20053700002002200041086a3602000f0b200041004101102f2000280200200228020022036a41043a00002002200341016a220336020020012802042101200020034104102f2000280200200228020022006a20013600002002200041046a3602000f0b200041004101102f2000280200200228020022036a41053a00002002200341016a220336020020012802042101200020034104102f2000280200200228020022006a20013600002002200041046a3602000b0b920202047f017e20012802002102200020012802082203108f010240024020030d00200041086a28020021040c010b2002200341286c6a2105200041086a220328020021040340200020044120102f200028020020032802006a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a2900003700002003200328020041206a2204360200200241206a2903002106200020044108102f200028020020032802006a20063700002003200328020041086a22043602002005200241286a2202470d000b0b200128020c2103200020044104102f2000280200200041086a22022802006a20033600002002200228020041046a3602000bd34009047f017e017f027e037f037e017f017e117f230041900d6b220224000240024002402001280200220328020422044108490d002003280200220529000021062003200441786a3602042003200541086a360200200128020022032802042204450d01200328020022052d0000210720032004417f6a3602042003200541016a36020002400240024002400240024020070e020001070b2001280200220328020422044108490d062003280200220529000021082003200441786a3602042003200541086a36020041002103200241003a00e80c0240024002400340200128020022042802042205450d01200241c80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00e80c20034120470d000b200241880a6a41186a200241c80c6a41186a2903002209370300200241c8096a41086a2203200241c80c6a41086a290300370300200241c8096a41106a2204200241c80c6a41106a290300370300200241c8096a41186a22052009370300200220022903c80c3703c809200241a8076a41186a22072005290300370300200241a8076a41106a22052004290300370300200241a8076a41086a22042003290300370300200220022903c8093703a80720024188076a41186a200729030037030020024188076a41106a200529030037030020024188076a41086a2004290300370300200220022903a8073703880741002103200241003a00e80c0340200128020022042802042205450d02200241c80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00e80c20034120470d000b200241880a6a41186a200241c80c6a41186a2903002209370300200241c8096a41086a2204200241c80c6a41086a290300370300200241c8096a41106a2205200241c80c6a41106a290300370300200241c8096a41186a22072009370300200220022903c80c3703c80920012802002203280204220a4104490d092003280200220b280000210c2003200a417c6a3602042003200b41046a360200200241a8086a41086a2004290300370300200241a8086a41106a2005290300370300200241a8086a41186a2007290300370300200220022903c8093703a808200241c80c6a200110ac0320022d00c80c4101460d09200241880a6a41386a200241810d6a2900002209370300200241880a6a41306a200241f90c6a290000220d370300200241880a6a41286a200241f10c6a290000220e370300200241880a6a41206a200241e90c6a290000220f370300200241c8096a41086a2203200241d10c6a290000370300200241c8096a41106a2204200241d90c6a290000370300200241c8096a41186a2205200241e10c6a290000370300200241c8096a41206a2207200f370300200241c8096a41286a220a200e370300200241c8096a41306a220b200d370300200241c8096a41386a22102009370300200220022900c90c3703c809200241a8076a41386a2010290300370300200241a8076a41306a200b290300370300200241a8076a41286a200a290300370300200241a8076a41206a2007290300370300200241a8076a41186a2005290300370300200241a8076a41106a2004290300370300200241a8076a41086a2003290300370300200220022903c8093703a80720024188086a41186a2203200241a8086a41186a29030037030020024188086a41106a2204200241a8086a41106a29030037030020024188086a41086a2205200241a8086a41086a290300370300200220022903a80837038808200241e8076a41186a2003290300370300200241e8076a41106a2004290300370300200241e8076a41086a200529030037030020022002290388083703e80741002103200241003a00e80c0340200128020022042802042205450d03200241c80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00e80c20034120470d000b200241880a6a41186a200241c80c6a41186a2903002209370300200241c8096a41086a2204200241c80c6a41086a290300370300200241c8096a41106a2205200241c80c6a41106a290300370300200241c8096a41186a22072009370300200220022903c80c3703c80920012802002203280204220a4104490d0920032802002210280000210b2003200a417c6a3602042003201041046a360200200241a8086a41086a2004290300370300200241a8086a41106a2005290300370300200241a8086a41186a2007290300370300200220022903c8093703a808200241c80c6a200110ac0320022d00c80c4101460d09200241880a6a41386a200241810d6a2900002209370300200241880a6a41306a200241f90c6a290000220d370300200241880a6a41286a200241f10c6a290000220e370300200241880a6a41206a200241e90c6a290000220f370300200241880a6a41186a200241e10c6a2900002211370300200241c8096a41086a2201200241d10c6a290000370300200241c8096a41106a2203200241d90c6a290000370300200241c8096a41186a22042011370300200241c8096a41206a2205200f370300200241c8096a41286a2207200e370300200241c8096a41306a220a200d370300200241c8096a41386a22102009370300200220022900c90c3703c809200241c8056a41386a22122010290300370300200241c8056a41306a2210200a290300370300200241c8056a41286a220a2007290300370300200241c8056a41206a22072005290300370300200241c8056a41186a22052004290300370300200241c8056a41106a22042003290300370300200241c8056a41086a22032001290300370300200220022903c8093703c80520024188086a41186a2201200241a8086a41186a29030037030020024188086a41106a2213200241a8086a41106a29030037030020024188086a41086a2214200241a8086a41086a290300370300200220022903a8083703880820024188066a41186a2215200129030037030020024188066a41106a2201201329030037030020024188066a41086a22132014290300370300200220022903880837038806200241a8056a41186a221420024188076a41186a290300370300200241a8056a41106a221620024188076a41106a290300370300200241a8056a41086a221720024188076a41086a29030037030020022002290388073703a805200241e8066a41186a2218200241e8076a41186a290300370300200241e8066a41106a2219200241e8076a41106a290300370300200241e8066a41086a221a200241e8076a41086a290300370300200220022903e8073703e806200241a8066a41386a221b200241a8076a41386a290300370300200241a8066a41306a221c200241a8076a41306a290300370300200241a8066a41286a221d200241a8076a41286a290300370300200241a8066a41206a221e200241a8076a41206a290300370300200241a8066a41186a221f200241a8076a41186a290300370300200241a8066a41106a2220200241a8076a41106a290300370300200241a8066a41086a2221200241a8076a41086a290300370300200220022903a8073703a80620024188056a41186a2222201829030037030020024188056a41106a2218201929030037030020024188056a41086a2219201a290300370300200220022903e80637038805200241c8046a41386a221a201b290300370300200241c8046a41306a221b201c290300370300200241c8046a41286a221c201d290300370300200241c8046a41206a221d201e290300370300200241c8046a41186a221e201f290300370300200241c8046a41106a221f2020290300370300200241c8046a41086a22202021290300370300200220022903a8063703c804200241a8046a41186a22212015290300370300200241a8046a41106a22152001290300370300200241a8046a41086a2201201329030037030020022002290388063703a804200241e8036a41386a22132012290300370300200241e8036a41306a22122010290300370300200241e8036a41286a2210200a290300370300200241e8036a41206a220a2007290300370300200241e8036a41186a22072005290300370300200241e8036a41106a22052004290300370300200241e8036a41086a22042003290300370300200220022903c8053703e803200241c8036a41186a22032014290300370300200241c8036a41106a22142016290300370300200241c8036a41086a22162017290300370300200220022903a8053703c803200241a8036a41186a2022290300370300200241a8036a41106a2018290300370300200241a8036a41086a201929030037030020022002290388053703a803200241e8026a41386a201a290300370300200241e8026a41306a201b290300370300200241e8026a41286a201c290300370300200241e8026a41206a201d290300370300200241e8026a41186a201e290300370300200241e8026a41106a201f290300370300200241e8026a41086a2020290300370300200220022903c8043703e802200241c8026a41186a2021290300370300200241c8026a41106a2015290300370300200241c8026a41086a2001290300370300200220022903a8043703c80220024188026a41386a201329030037030020024188026a41306a201229030037030020024188026a41286a201029030037030020024188026a41206a200a29030037030020024188026a41186a200729030037030020024188026a41106a200529030037030020024188026a41086a2004290300370300200220022903e80337038802200241e8016a41186a2003290300370300200241e8016a41106a2014290300370300200241e8016a41086a2016290300370300200220022903c8033703e801420021090c040b200341ff0171450d08200241003a00e80c0c080b200341ff0171450d07200241003a00e80c0c070b200341ff0171450d06200241003a00e80c0c060b2001280200220328020422044108490d052003280200220529000021082003200441786a3602042003200541086a36020041002103200241003a00e80c0340200128020022042802042205450d02200241c80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00e80c20034120470d000b200241880a6a41186a200241c80c6a41186a2903002209370300200241c8096a41086a2203200241c80c6a41086a290300370300200241c8096a41106a2204200241c80c6a41106a290300370300200241c8096a41186a22052009370300200220022903c80c3703c809200241a8076a41186a22072005290300370300200241a8076a41106a22052004290300370300200241a8076a41086a22042003290300370300200220022903c8093703a80720024188076a41186a200729030037030020024188076a41106a200529030037030020024188076a41086a2004290300370300200220022903a8073703880741002103200241003a00e80c0340200128020022042802042205450d03200241c80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00e80c20034120470d000b200241880a6a41186a200241c80c6a41186a2903002209370300200241c8096a41086a2204200241c80c6a41086a290300370300200241c8096a41106a2205200241c80c6a41106a290300370300200241c8096a41186a22072009370300200220022903c80c3703c80920012802002203280204220a4104490d052003280200220b280000210c2003200a417c6a3602042003200b41046a360200200241a8086a41086a2004290300370300200241a8086a41106a2005290300370300200241a8086a41186a2007290300370300200220022903c8093703a808200241c80c6a200110ac0320022d00c80c4101460d05200241880a6a41386a200241810d6a2900002209370300200241880a6a41306a200241f90c6a290000220d370300200241880a6a41286a200241f10c6a290000220e370300200241880a6a41206a200241e90c6a290000220f370300200241c8096a41086a2203200241d10c6a290000370300200241c8096a41106a2204200241d90c6a290000370300200241c8096a41186a2205200241e10c6a290000370300200241c8096a41206a2207200f370300200241c8096a41286a220a200e370300200241c8096a41306a220b200d370300200241c8096a41386a22102009370300200220022900c90c3703c809200241a8076a41386a2010290300370300200241a8076a41306a200b290300370300200241a8076a41286a200a290300370300200241a8076a41206a2007290300370300200241a8076a41186a2005290300370300200241a8076a41106a2004290300370300200241a8076a41086a2003290300370300200220022903c8093703a80720024188086a41186a2203200241a8086a41186a29030037030020024188086a41106a2204200241a8086a41106a29030037030020024188086a41086a2205200241a8086a41086a290300370300200220022903a80837038808200241e8076a41186a2003290300370300200241e8076a41106a2004290300370300200241e8076a41086a200529030037030020022002290388083703e80741002103200241003a00e80c0340200128020022042802042205450d04200241c80c6a20036a200428020022072d00003a000020042005417f6a3602042004200741016a3602002002200341016a22033a00e80c20034120470d000b200241880a6a41186a200241c80c6a41186a2903002209370300200241c8096a41086a2204200241c80c6a41086a290300370300200241c8096a41106a2205200241c80c6a41106a290300370300200241c8096a41186a22072009370300200220022903c80c3703c80920012802002203280204220a4104490d0520032802002210280000210b2003200a417c6a3602042003201041046a360200200241a8086a41086a2004290300370300200241a8086a41106a2005290300370300200241a8086a41186a2007290300370300200220022903c8093703a808200241c80c6a200110ac0320022d00c80c4101460d05200241880a6a41386a200241810d6a2900002209370300200241880a6a41306a200241f90c6a290000220d370300200241880a6a41286a200241f10c6a290000220e370300200241880a6a41206a200241e90c6a290000220f370300200241880a6a41186a200241e10c6a2900002211370300200241c8096a41086a2201200241d10c6a290000370300200241c8096a41106a2203200241d90c6a290000370300200241c8096a41186a22042011370300200241c8096a41206a2205200f370300200241c8096a41286a2207200e370300200241c8096a41306a220a200d370300200241c8096a41386a22102009370300200220022900c90c3703c809200241c8056a41386a22122010290300370300200241c8056a41306a2210200a290300370300200241c8056a41286a220a2007290300370300200241c8056a41206a22072005290300370300200241c8056a41186a22052004290300370300200241c8056a41106a22042003290300370300200241c8056a41086a22032001290300370300200220022903c8093703c80520024188086a41186a2201200241a8086a41186a29030037030020024188086a41106a2213200241a8086a41106a29030037030020024188086a41086a2214200241a8086a41086a290300370300200220022903a8083703880820024188066a41186a2215200129030037030020024188066a41106a2201201329030037030020024188066a41086a22132014290300370300200220022903880837038806200241a8056a41186a221420024188076a41186a290300370300200241a8056a41106a221620024188076a41106a290300370300200241a8056a41086a221720024188076a41086a29030037030020022002290388073703a805200241e8066a41186a2218200241e8076a41186a290300370300200241e8066a41106a2219200241e8076a41106a290300370300200241e8066a41086a221a200241e8076a41086a290300370300200220022903e8073703e806200241a8066a41386a221b200241a8076a41386a290300370300200241a8066a41306a221c200241a8076a41306a290300370300200241a8066a41286a221d200241a8076a41286a290300370300200241a8066a41206a221e200241a8076a41206a290300370300200241a8066a41186a221f200241a8076a41186a290300370300200241a8066a41106a2220200241a8076a41106a290300370300200241a8066a41086a2221200241a8076a41086a290300370300200220022903a8073703a80620024188056a41186a2222201829030037030020024188056a41106a2218201929030037030020024188056a41086a2219201a290300370300200220022903e80637038805200241c8046a41386a221a201b290300370300200241c8046a41306a221b201c290300370300200241c8046a41286a221c201d290300370300200241c8046a41206a221d201e290300370300200241c8046a41186a221e201f290300370300200241c8046a41106a221f2020290300370300200241c8046a41086a22202021290300370300200220022903a8063703c804200241a8046a41186a22212015290300370300200241a8046a41106a22152001290300370300200241a8046a41086a2201201329030037030020022002290388063703a804200241e8036a41386a22132012290300370300200241e8036a41306a22122010290300370300200241e8036a41286a2210200a290300370300200241e8036a41206a220a2007290300370300200241e8036a41186a22072005290300370300200241e8036a41106a22052004290300370300200241e8036a41086a22042003290300370300200220022903c8053703e803200241c8036a41186a22032014290300370300200241c8036a41106a22142016290300370300200241c8036a41086a22162017290300370300200220022903a8053703c803200241a8036a41186a2022290300370300200241a8036a41106a2018290300370300200241a8036a41086a201929030037030020022002290388053703a803200241e8026a41386a201a290300370300200241e8026a41306a201b290300370300200241e8026a41286a201c290300370300200241e8026a41206a201d290300370300200241e8026a41186a201e290300370300200241e8026a41106a201f290300370300200241e8026a41086a2020290300370300200220022903c8043703e802200241c8026a41186a2021290300370300200241c8026a41106a2015290300370300200241c8026a41086a2001290300370300200220022903a8043703c80220024188026a41386a201329030037030020024188026a41306a201229030037030020024188026a41286a201029030037030020024188026a41206a200a29030037030020024188026a41186a200729030037030020024188026a41106a200529030037030020024188026a41086a2004290300370300200220022903e80337038802200241e8016a41186a2003290300370300200241e8016a41106a2014290300370300200241e8016a41086a2016290300370300200220022903c8033703e801420121090b200241c8016a41186a2201200241a8036a41186a290300370300200241c8016a41106a2203200241a8036a41106a290300370300200241c8016a41086a2204200241a8036a41086a29030037030020024188016a41086a2205200241e8026a41086a29030037030020024188016a41106a2207200241e8026a41106a29030037030020024188016a41186a220a200241e8026a41186a29030037030020024188016a41206a2210200241e8026a41206a29030037030020024188016a41286a2212200241e8026a41286a29030037030020024188016a41306a2213200241e8026a41306a29030037030020024188016a41386a2214200241e8026a41386a290300370300200220022903a8033703c801200220022903e80237038801200241e8006a41186a2215200241c8026a41186a290300370300200241e8006a41106a2216200241c8026a41106a290300370300200241e8006a41086a2217200241c8026a41086a290300370300200241286a41386a221820024188026a41386a290300370300200241286a41306a221920024188026a41306a290300370300200241286a41286a221a20024188026a41286a290300370300200241286a41206a221b20024188026a41206a290300370300200241286a41186a221c20024188026a41186a290300370300200241286a41106a221d20024188026a41106a290300370300200241286a41086a221e20024188026a41086a290300370300200220022903c8023703682002200229038802370328200241086a41186a221f200241e8016a41186a290300370300200241086a41106a2220200241e8016a41106a290300370300200241086a41086a2221200241e8016a41086a290300370300200220022903e801370308200041186a200c360200200020083703102000200937030820002006370300200020022903c80137021c200041246a20042903003702002000412c6a2003290300370200200041346a2001290300370200200020022903880137023c200041c4006a2005290300370200200041cc006a2007290300370200200041d4006a200a290300370200200041dc006a2010290300370200200041e4006a2012290300370200200041ec006a2013290300370200200041f4006a2014290300370200200041fc006a200b36020020004198016a201529030037030020004190016a201629030037030020004188016a201729030037030020004180016a2002290368370300200041d8016a2018290300370300200041d0016a2019290300370300200041c8016a201a290300370300200041c0016a201b290300370300200041b8016a201c290300370300200041b0016a201d290300370300200041a8016a201e290300370300200041a0016a2002290328370300200041f8016a201f290300370300200041f0016a2020290300370300200041e8016a2021290300370300200041e0016a20022903083703000c050b200341ff0171450d03200241003a00e80c0c030b200341ff0171450d02200241003a00e80c0c020b200341ff0171450d01200241003a00e80c0c010b200042023703080c010b200042023703080b200241900d6a24000bb40301077f230041d0016b2202240041002103200241003a0048024002400340200128020022042802042205450d01200241086a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a0048200341c000470d000b200241d0006a41086a2203200241086a41086a290300370300200241d0006a41106a2204200241086a41106a290300370300200241d0006a41186a2205200241086a41186a290300370300200241d0006a41206a2206200241086a41206a290300370300200241d0006a41286a2201200241086a41286a290300370300200241d0006a41306a2207200241086a41306a290300370300200241d0006a41386a2208200241086a41386a29030037030020022002290308370350200041396a2008290300370000200041316a2007290300370000200041296a2001290300370000200041216a2006290300370000200041196a2005290300370000200041116a2004290300370000200041096a200329030037000020002002290350370001200041003a00000c010b200041013a0000200341ff0171450d00200241003a00480b200241d0016a24000b9b3a09037f017e037f017e047f017e017f017e0f7f230041b00b6b22022400024002400240200128020422034108490d002001280200220429000021052001200341786a22063602042001200441086a22073602002006450d0120072d000021062001200341776a22083602042001200741016a36020002400240024002400240024020060e020001070b20084108490d062007290001210920012003416f6a220a3602042001200741096a36020041002107200241003a00e80920032106200a210b0240024002400340200a2007460d01200241c8096a20076a200420076a220841116a2d00003a000020012006416e6a3602042001200841126a3602002002200741016a22083a00e8092006417f6a2106200b417f6a210b2008210720084120470d000b200241a8076a41086a2207200241c8096a41086a290300370300200241a8076a41106a220a200241c8096a41106a290300370300200241a8076a41186a220c200241c8096a41186a290300370300200220022903c8093703a807200841ff0171411f4d0d09200320086b416f6a210d200241c8086a41086a2007290300220e37030020024188076a41186a200c29030037030020024188076a41106a200a29030037030020024188076a41086a200e370300200220022903a807220e3703c8082002200e3703880741002107200241003a00e809200420086a210f2006416e6a210a0340200d2007460d02200241c8096a20076a200f20076a220c41116a2d00003a00002001200a3602042001200c41126a3602002002200741016a220c3a00e809200a417f6a210a2003417f6a2103200c2107200c4120470d000b200241f00a6a41086a2207200241c8096a41086a290300370300200241f00a6a41106a2203200241c8096a41106a290300370300200241f00a6a41186a220a200241c8096a41186a290300370300200220022903c8093703f00a200c41ff0171411f4d0d09200241c8086a41086a2007290300370300200241c8086a41106a2003290300370300200241c8086a41186a200a290300370300200220022903f00a3703c8082006200c6b2207416f6a4104490d092004200b411f200b411f491b6a20086a41126a280000210820012007416b6a360204200241a8086a41086a2207200241c8086a41086a290300370300200241a8086a41106a2203200241c8086a41106a290300370300200241a8086a41186a2204200241c8086a41186a2903003703002001200f200c6a41156a360200200220022903c8083703a808200241c8096a200110ae0320022d00c8094101460d09200241e8076a41086a2007290300370300200241e8076a41106a2003290300370300200241e8076a41186a2004290300370300200241a8076a41086a200241d1096a290000370300200241a8076a41106a200241d9096a290000370300200241a8076a41186a200241e1096a290000370300200241a8076a41206a200241e9096a290000370300200241d0076a200241f1096a290000370300200241d8076a200241f9096a290000370300200241e0076a200241810a6a290000370300200220022903a8083703e807200220022900c9093703a80741002107200241003a00e80920012802042106417f2103034020062007460d03200241c8096a20076a200128020022042d00003a00002001200620036a3602042001200441016a3602002002200741016a22043a00e8092003417f6a21032004210720044120470d000b200241f00a6a41086a2207200241c8096a41086a290300370300200241f00a6a41106a2203200241c8096a41106a290300370300200241f00a6a41186a220b200241c8096a41186a290300370300200220022903c8093703f00a200441ff0171411f4d0d09200241c8086a41086a2007290300370300200241c8086a41106a2003290300370300200241c8086a41186a200b290300370300200220022903f00a3703c808200620046b22074104490d0920012802002204280000210320012007417c6a3602042001200441046a360200200241a8086a41086a2207200241c8086a41086a290300370300200241a8086a41106a2204200241c8086a41106a290300370300200241a8086a41186a2206200241c8086a41186a290300370300200220022903c8083703a808200241c8096a200110ae0320022d00c8094101460d0920024188086a41186a2006290300220e37030020024188086a41106a2004290300221037030020024188066a41086a2201200729030037030020024188066a41106a2207201037030020024188066a41186a2204200e370300200241c8056a41086a2206200241d1096a290000370300200241c8056a41106a220b200241d9096a290000370300200241c8056a41186a220a200241e1096a290000370300200241c8056a41206a220c200241e9096a290000370300200241c8056a41286a220d200241f1096a290000370300200241c8056a41306a220f200241f9096a290000370300200241c8056a41386a2211200241810a6a290000370300200220022903a80837038806200220022900c9093703c805200241a8056a41186a221220024188076a41186a290300370300200241a8056a41106a221320024188076a41106a290300370300200241a8056a41086a221420024188076a41086a290300370300200241e8066a41186a2215200241e8076a41186a290300370300200241e8066a41106a2216200241e8076a41106a290300370300200241e8066a41086a2217200241e8076a41086a290300370300200241a8066a41386a2218200241a8076a41386a290300370300200241a8066a41306a2219200241a8076a41306a290300370300200241a8066a41286a221a200241a8076a41286a290300370300200241a8066a41206a221b200241a8076a41206a290300370300200241a8066a41186a221c200241a8076a41186a290300370300200241a8066a41106a221d200241a8076a41106a290300370300200241a8066a41086a221e200241a8076a41086a29030037030020022002290388073703a805200220022903e8073703e806200220022903a8073703a80620024188056a41186a221f201529030037030020024188056a41106a2215201629030037030020024188056a41086a22162017290300370300200220022903e80637038805200241c8046a41386a22172018290300370300200241c8046a41306a22182019290300370300200241c8046a41286a2219201a290300370300200241c8046a41206a221a201b290300370300200241c8046a41186a221b201c290300370300200241c8046a41106a221c201d290300370300200241c8046a41086a221d201e290300370300200220022903a8063703c804200241a8046a41186a221e2004290300370300200241a8046a41106a22042007290300370300200241a8046a41086a2207200129030037030020022002290388063703a804200241e8036a41386a22012011290300370300200241e8036a41306a2211200f290300370300200241e8036a41286a220f200d290300370300200241e8036a41206a220d200c290300370300200241e8036a41186a220c200a290300370300200241e8036a41106a220a200b290300370300200241e8036a41086a220b2006290300370300200220022903c8053703e803200241c8036a41186a22062012290300370300200241c8036a41106a22122013290300370300200241c8036a41086a22132014290300370300200220022903a8053703c803200241a8036a41186a201f290300370300200241a8036a41106a2015290300370300200241a8036a41086a201629030037030020022002290388053703a803200241e8026a41386a2017290300370300200241e8026a41306a2018290300370300200241e8026a41286a2019290300370300200241e8026a41206a201a290300370300200241e8026a41186a201b290300370300200241e8026a41106a201c290300370300200241e8026a41086a201d290300370300200220022903c8043703e802200241c8026a41186a201e290300370300200241c8026a41106a2004290300370300200241c8026a41086a2007290300370300200220022903a8043703c80220024188026a41386a200129030037030020024188026a41306a201129030037030020024188026a41286a200f29030037030020024188026a41206a200d29030037030020024188026a41186a200c29030037030020024188026a41106a200a29030037030020024188026a41086a200b290300370300200220022903e80337038802200241e8016a41186a2006290300370300200241e8016a41106a2012290300370300200241e8016a41086a2013290300370300200220022903c8033703e8014200210e0c040b200741ff0171450d08200241003a00e8090c080b200741ff0171450d07200241003a00e8090c070b200741ff0171450d06200241003a00e8090c060b20084108490d052007290001210920012003416f6a220a3602042001200741096a36020041002107200241003a00e80920032106200a210b0340200a2007460d02200241c8096a20076a200420076a220841116a2d00003a000020012006416e6a3602042001200841126a3602002002200741016a22083a00e8092006417f6a2106200b417f6a210b2008210720084120470d000b200241a8076a41086a2207200241c8096a41086a290300370300200241a8076a41106a220a200241c8096a41106a290300370300200241a8076a41186a220c200241c8096a41186a290300370300200220022903c8093703a807200841ff0171411f4d0d05200320086b416f6a210d200241c8086a41086a2007290300220e37030020024188076a41186a200c29030037030020024188076a41106a200a29030037030020024188076a41086a200e370300200220022903a807220e3703c8082002200e3703880741002107200241003a00e809200420086a210f2006416e6a210a0340200d2007460d03200241c8096a20076a200f20076a220c41116a2d00003a00002001200a3602042001200c41126a3602002002200741016a220c3a00e809200a417f6a210a2003417f6a2103200c2107200c4120470d000b200241f00a6a41086a2207200241c8096a41086a290300370300200241f00a6a41106a2203200241c8096a41106a290300370300200241f00a6a41186a220a200241c8096a41186a290300370300200220022903c8093703f00a200c41ff0171411f4d0d05200241c8086a41086a2007290300370300200241c8086a41106a2003290300370300200241c8086a41186a200a290300370300200220022903f00a3703c8082006200c6b2207416f6a4104490d052004200b411f200b411f491b6a20086a41126a280000210820012007416b6a360204200241a8086a41086a2207200241c8086a41086a290300370300200241a8086a41106a2203200241c8086a41106a290300370300200241a8086a41186a2204200241c8086a41186a2903003703002001200f200c6a41156a360200200220022903c8083703a808200241c8096a200110ae0320022d00c8094101460d05200241e8076a41086a2007290300370300200241e8076a41106a2003290300370300200241e8076a41186a2004290300370300200241a8076a41086a200241d1096a290000370300200241a8076a41106a200241d9096a290000370300200241a8076a41186a200241e1096a290000370300200241a8076a41206a200241e9096a290000370300200241d0076a200241f1096a290000370300200241d8076a200241f9096a290000370300200241e0076a200241810a6a290000370300200220022903a8083703e807200220022900c9093703a80741002107200241003a00e80920012802042106417f2103034020062007460d04200241c8096a20076a200128020022042d00003a00002001200620036a3602042001200441016a3602002002200741016a22043a00e8092003417f6a21032004210720044120470d000b200241f00a6a41086a2207200241c8096a41086a290300370300200241f00a6a41106a2203200241c8096a41106a290300370300200241f00a6a41186a220b200241c8096a41186a290300370300200220022903c8093703f00a200441ff0171411f4d0d05200241c8086a41086a2007290300370300200241c8086a41106a2003290300370300200241c8086a41186a200b290300370300200220022903f00a3703c808200620046b22074104490d0520012802002204280000210320012007417c6a3602042001200441046a360200200241a8086a41086a2207200241c8086a41086a290300370300200241a8086a41106a2204200241c8086a41106a290300370300200241a8086a41186a2206200241c8086a41186a290300370300200220022903c8083703a808200241c8096a200110ae0320022d00c8094101460d0520024188086a41186a2006290300220e37030020024188086a41106a2004290300221037030020024188066a41086a2201200729030037030020024188066a41106a2207201037030020024188066a41186a2204200e370300200241c8056a41086a2206200241d1096a290000370300200241c8056a41106a220b200241d9096a290000370300200241c8056a41186a220a200241e1096a290000370300200241c8056a41206a220c200241e9096a290000370300200241c8056a41286a220d200241f1096a290000370300200241c8056a41306a220f200241f9096a290000370300200241c8056a41386a2211200241810a6a290000370300200220022903a80837038806200220022900c9093703c805200241a8056a41186a221220024188076a41186a290300370300200241a8056a41106a221320024188076a41106a290300370300200241a8056a41086a221420024188076a41086a290300370300200241e8066a41186a2215200241e8076a41186a290300370300200241e8066a41106a2216200241e8076a41106a290300370300200241e8066a41086a2217200241e8076a41086a290300370300200241a8066a41386a2218200241a8076a41386a290300370300200241a8066a41306a2219200241a8076a41306a290300370300200241a8066a41286a221a200241a8076a41286a290300370300200241a8066a41206a221b200241a8076a41206a290300370300200241a8066a41186a221c200241a8076a41186a290300370300200241a8066a41106a221d200241a8076a41106a290300370300200241a8066a41086a221e200241a8076a41086a29030037030020022002290388073703a805200220022903e8073703e806200220022903a8073703a80620024188056a41186a221f201529030037030020024188056a41106a2215201629030037030020024188056a41086a22162017290300370300200220022903e80637038805200241c8046a41386a22172018290300370300200241c8046a41306a22182019290300370300200241c8046a41286a2219201a290300370300200241c8046a41206a221a201b290300370300200241c8046a41186a221b201c290300370300200241c8046a41106a221c201d290300370300200241c8046a41086a221d201e290300370300200220022903a8063703c804200241a8046a41186a221e2004290300370300200241a8046a41106a22042007290300370300200241a8046a41086a2207200129030037030020022002290388063703a804200241e8036a41386a22012011290300370300200241e8036a41306a2211200f290300370300200241e8036a41286a220f200d290300370300200241e8036a41206a220d200c290300370300200241e8036a41186a220c200a290300370300200241e8036a41106a220a200b290300370300200241e8036a41086a220b2006290300370300200220022903c8053703e803200241c8036a41186a22062012290300370300200241c8036a41106a22122013290300370300200241c8036a41086a22132014290300370300200220022903a8053703c803200241a8036a41186a201f290300370300200241a8036a41106a2015290300370300200241a8036a41086a201629030037030020022002290388053703a803200241e8026a41386a2017290300370300200241e8026a41306a2018290300370300200241e8026a41286a2019290300370300200241e8026a41206a201a290300370300200241e8026a41186a201b290300370300200241e8026a41106a201c290300370300200241e8026a41086a201d290300370300200220022903c8043703e802200241c8026a41186a201e290300370300200241c8026a41106a2004290300370300200241c8026a41086a2007290300370300200220022903a8043703c80220024188026a41386a200129030037030020024188026a41306a201129030037030020024188026a41286a200f29030037030020024188026a41206a200d29030037030020024188026a41186a200c29030037030020024188026a41106a200a29030037030020024188026a41086a200b290300370300200220022903e80337038802200241e8016a41186a2006290300370300200241e8016a41106a2012290300370300200241e8016a41086a2013290300370300200220022903c8033703e8014201210e0b200241c8016a41186a2201200241a8036a41186a290300370300200241c8016a41106a2207200241a8036a41106a290300370300200241c8016a41086a2204200241a8036a41086a29030037030020024188016a41086a2206200241e8026a41086a29030037030020024188016a41106a220b200241e8026a41106a29030037030020024188016a41186a220a200241e8026a41186a29030037030020024188016a41206a220c200241e8026a41206a29030037030020024188016a41286a220d200241e8026a41286a29030037030020024188016a41306a220f200241e8026a41306a29030037030020024188016a41386a2211200241e8026a41386a290300370300200220022903a8033703c801200220022903e80237038801200241e8006a41186a2212200241c8026a41186a290300370300200241e8006a41106a2213200241c8026a41106a290300370300200241e8006a41086a2214200241c8026a41086a290300370300200241286a41386a221520024188026a41386a290300370300200241286a41306a221620024188026a41306a290300370300200241286a41286a221720024188026a41286a290300370300200241286a41206a221820024188026a41206a290300370300200241286a41186a221920024188026a41186a290300370300200241286a41106a221a20024188026a41106a290300370300200241286a41086a221b20024188026a41086a290300370300200220022903c8023703682002200229038802370328200241086a41186a221c200241e8016a41186a290300370300200241086a41106a221d200241e8016a41106a290300370300200241086a41086a221e200241e8016a41086a290300370300200220022903e801370308200041186a2008360200200020093703102000200e37030820002005370300200020022903c80137021c200041246a20042903003702002000412c6a2007290300370200200041346a2001290300370200200020022903880137023c200041c4006a2006290300370200200041cc006a200b290300370200200041d4006a200a290300370200200041dc006a200c290300370200200041e4006a200d290300370200200041ec006a200f290300370200200041f4006a2011290300370200200041fc006a200336020020004198016a201229030037030020004190016a201329030037030020004188016a201429030037030020004180016a2002290368370300200041d8016a2015290300370300200041d0016a2016290300370300200041c8016a2017290300370300200041c0016a2018290300370300200041b8016a2019290300370300200041b0016a201a290300370300200041a8016a201b290300370300200041a0016a2002290328370300200041f8016a201c290300370300200041f0016a201d290300370300200041e8016a201e290300370300200041e0016a20022903083703000c050b200741ff0171450d03200241003a00e8090c030b200741ff0171450d02200241003a00e8090c020b200741ff0171450d01200241003a00e8090c010b200042023703080c010b200042023703080b200241b00b6a24000be10502087f077e230041d0026b2202240041002103200241003a00c8012001280204417f6a210402400240024003402004417f460d0120024188016a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8012004417f6a210420052103200541c000470d000b200241d0016a41086a220420024188016a41086a290300370300200241d0016a41106a220120024188016a41106a290300370300200241d0016a41186a220320024188016a41186a290300370300200241d0016a41206a220620024188016a41206a290300370300200241d0016a41286a220720024188016a41286a290300370300200241d0016a41306a220820024188016a41306a290300370300200241d0016a41386a220920024188016a41386a29030037030020022002290388013703d001200541ff0171413f4d0d01200241c8006a41386a22052009290300370300200241c8006a41306a2008290300220a370300200241c8006a41286a2007290300220b370300200241c8006a41206a2006290300220c370300200241c8006a41186a2003290300220d370300200241c8006a41106a2001290300220e370300200241c8006a41086a2004290300220f370300200220022903d0012210370348200241086a41306a2204200a370300200241086a41286a2201200b370300200241086a41206a2203200c370300200241086a41186a2206200d370300200241086a41106a2207200e370300200241086a41086a2208200f370300200241086a41386a2209200529030037030020022010370308200041396a2009290300370000200041316a2004290300370000200041296a2001290300370000200041216a2003290300370000200041196a2006290300370000200041116a2007290300370000200041096a200829030037000020002002290308370001410021040c020b200341ff0171450d00200241003a00c8010b410121040b200020043a0000200241d0026a24000b951103057f057e027f230041d0096b22022400200241286a200110b003024002400240024002400240024002400240024020022802280d00200228022c210320012001280204220441016a2205360204200520012802084b0d0002402003450d0041002105410020036b2103034020054101460d0620032005417f6a2205470d000b0b20012004360204200128020022052802042203450d01200528020022062d0000210420052003417f6a3602042005200641016a360200200441ff00714104470d022004411874411875417f4c0d03420221070c070b200042033703680c080b200042033703680c070b200042033703680c060b41002105200241003a00c804024002400240024002400240024002400340200128020022032802042204450d01200241a8046a20056a200328020022062d00003a000020032004417f6a3602042003200641016a3602002002200541016a22053a00c80420054120470d000b20024180026a41186a200241a8046a41186a2903002207370300200241d8066a41086a200241a8046a41086a290300370300200241d8066a41106a200241a8046a41106a290300370300200241d8066a41186a2007370300200220022903a8043703d806200128020022052802042203450d09200528020022042d0000210620052003417f6a3602042005200441016a36020020060e03010203090b200541ff0171450d08200241003a00c8040c080b200241a8046a200110ac0320022d00a8044101460d0720024180026a41386a200241e1046a290000220737030020024180026a41306a200241d9046a290000220837030020024180026a41286a200241d1046a290000220937030020024180026a41206a200241c9046a290000220a37030020024180026a41186a200241c1046a290000220b370300200241c8076a200241b1046a290000370300200241d0076a200241b9046a290000370300200241c0076a41186a200b370300200241c0076a41206a200a370300200241c0076a41286a2009370300200241c0076a41306a2008370300200241c0076a41386a2007370300200220022900a9043703c007410021030c020b200241a8046a200110ac0320022d00a8044101460d0620024180026a41386a200241e1046a290000220737030020024180026a41306a200241d9046a290000220837030020024180026a41286a200241d1046a290000220937030020024180026a41206a200241c9046a290000220a37030020024180026a41186a200241c1046a290000220b370300200241c8076a200241b1046a290000370300200241d0076a200241b9046a290000370300200241c0076a41186a200b370300200241c0076a41206a200a370300200241c0076a41286a2009370300200241c0076a41306a2008370300200241c0076a41386a2007370300200220022900a9043703c007410121030c010b41002105200241003a00e9040340200128020022032802042204450d02200241a8046a20056a200328020022062d00003a000020032004417f6a3602042003200641016a3602002002200541016a22053a00e904200541c100470d000b20024180026a200241a8046a41c10010c9081a2002418c096a20024180026a41c10010c9081a200241cb086a2002418c096a41c10010c9081a200241c0076a200241cb086a41c10010c9081a410221030b200241ff066a200241c0076a41c10010c9081a200128020022052802042204450d0420052802002206310000210920052004417f6a3602042005200641016a360200200950450d01420021070c020b200541ff0171450d03200241003a00e904420221070c040b200128020022052802042204450d0220052802002206310000210a20052004417f6a3602042005200641016a36020042022009420f838622084204540d0242012107200a4208862009844204882008420c882209420120094201561b7e220920085a0d020b200241206a200110b00320022802200d0120022802242104200241086a200110b1032002290308a70d01200241086a41106a290300210b2002290310210a20024180026a41186a200241d8066a41186a29030037030020024180026a41106a200241d8066a41106a29030037030020024180026a41086a200241d8066a41086a290300370300200220022903d80637038002200241a8046a200241ff066a41c10010c9081a2002418c096a41046a200241d2066a41046a2f01003b0100200220022801d20636028c090c020b103b000b420221070b200241e0016a41186a220520024180026a41186a290300370300200241e0016a41106a220620024180026a41106a290300370300200241e0016a41086a220c20024180026a41086a29030037030020022002290380023703e0012002419f016a200241a8046a41c10010c9081a20024198016a41046a220d2002418c096a41046a2f01003b01002002200228028c093602980120074202510d01200241f8006a41186a2005290300370300200241f8006a41106a2006290300370300200241f8006a41086a200c290300370300200220022903e001370378200241376a2002419f016a41c10010c9081a200241306a41046a200d2f01003b010020022002280298013602300b200241a8046a200110b20320022802a804210520024180026a200241a8046a41047241a40210c9081a024020054119460d0020002002290378370300200020033a0020200041186a200241f8006a41186a290300370300200041106a200241f8006a41106a290300370300200041086a200241f8006a41086a290300370300200041216a200241376a41c10010c9081a200041e6006a200241306a41046a2f01003b01002000200228023036016220004190016a200b37030020004188016a200a37030020004198016a200536020020004180016a2004360200200041f8006a200937030020002008370370200020073703682000419c016a20024180026a41a40210c9081a0c020b200042033703680c010b200042033703680b200241d0096a24000bfb0201057f02400240200128020022022802042203450d00200228020022042d0000210520022003417f6a360204410121032002200441016a3602000240200541037122024103460d0002400240024020020e03000102000b20054102762102410021030c040b200128020022022802042203450d02200228020022012d0000210420022003417f6a360204410121032002200141016a3602002004410874200572220141ffff0371418002490d03200141fcff03714102762102410021030c030b2001280200220228020422034103490d012002280200220141026a2d0000210420012f000021062002200141036a36020020022003417d6a3602042006200441107472410874200572220241808004492103200241027621020c020b0240200541034d0d000c020b2001280200220128020422054104490d0120012802002203280000210220012005417c6a3602042001200341046a36020020024180808080044921030c010b410121030b20002002360204200020033602000ba10606057f017e027f017e027f017e230041206b2202240002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020002400240200641037122034103460d00024002400240024020030e03000102000b2006410276ad21070c020b200128020022012802042203450d04200128020022042d0000210520012003417f6a360204410121032001200441016a3602002005410874200672220141ffff0371418002490d03200141fcff0371410276ad21070c010b410121032001280200220128020422044103490d022001280200220541026a2d0000210820052f000021092001200541036a36020020012004417d6a3602042009200841107472410874200672220141808004490d022001410276ad21070b4200210a410021030c030b02400240024002402006410276220b0e0d00030303010303030303030302030b2001280200220328020422014104490d0420032802002206350000210720032001417c6a3602042003200641046a36020020074280808080045421034200210a0c050b2001280200220328020422014108490d032003280200220629000021072003200141786a3602042003200641086a3602002007428080808080808080015421034200210a0c040b2001280200220328020422014110490d022003280200220641086a290000210a200629000021072003200641106a3602002003200141706a360204200a428080808080808080015421030c030b200641334b0d01200b41046a21094100210441012103200241186a210c420021074200210a0340200128020022062802042205450d0120062802002208310000210d20062005417f6a3602042006200841016a360200200241106a200d4200200441037441f8007110cd08200c290300200a84210a20022903102007842107200441016a22062104200641ff01712009490d000b2002427f427f41e800200b4103746b41f8007110c6082007200229030058200a200241086a290300220d58200a200d511b21030c020b0c010b410121030b20002007370308200041106a200a37030020002003ad370300200241206a24000bb7af0211057f017e057f057e027f047e027f017e127f017e0c7f017e1e7f027e257f017e277f23004180146b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020020060e1c01020304051206070812090a0b0c120d0e0f1e1d1c1b1a1918171614120b200041193602000c390b200128020022032802042204450d37200328020022052d0000210620032004417f6a3602042003200541016a360200410a210402400240024002400240024002400240024020060e0a0001020304050607083e400b2001280200220128020422044104490d3f20012802002205280000210320012004417c6a3602042001200541046a3602002003418194ebdc034f0d3f410121040c3d0b200241b00f6a200110c60420022802b00f2203450d3e20022902b40f2107410221040c3b0b2001280200220128020422034108490d3d2001280200220429000021072001200341786a3602042001200441086a360200410321040c3b0b200241b00f6a200110c60420022802b00f2203450d3c20022902b40f2107410421040c390b200241b00f6a200110c60420022802b00f2203450d3b20022902b40f2107410521040c380b200241b00f6a200110e70420022802b00f22034102460d3a20022902b40f2107410621040c370b200241186a200110b00320022802180d39200228021c2206200128020028020441186e2203200320064b1bad42187e2207422088a70d132007a72204417f4c0d130240024020040d00410421030c010b200410322203450d160b2001200128020441016a2205360204200241003602b80f200220033602b00f2002200441186e3602b40f200520012802084b0d3802402006450d00410021080340200241106a200110b00320022802100d3a20012802002205280204220920022802142204490d3a2004417f4c0d150240024020040d004101210a0c010b20041037220a450d182001280200220528020421090b024002400240024020092004490d00200a2005280200200410c90821092005280204220b20044f0d012004200b4194afc0001058000b2004450d3d20040d010c3d0b2005200b20046b3602042005200528020020046a3602002009450d3c2004ad22074220862007842107200241086a200110b003024020022802080d0020012802002205280204220b200228020c2204490d002004417f4c0d180240024020040d004101210c0c010b20041037220c450d1b20012802002205280204210b0b02400240200b2004490d00200c2005280200200410c908210b2005280204220c20044f0d012004200c4194afc0001058000b2004450d012004450d01200c102c0c010b2005200c20046b3602042005200528020020046a360200200b0d020b2007a7450d3c0b200a102c0c3b0b2004ad220d422086200d84210d0240200820022802b40f470d00200241b00f6a200810fd0320022802b80f210820022802b00f21030b2003200841186c6a2204200b36020c2004200737020420042009360200200441106a200d370200200220022802b80f41016a22083602b80f2006417f6a22060d000b2001280204210520022802b00f21030b20012005417f6a3602042003450d394107410b20031b210420022902b40f21070c360b200241b00f6a200110b30520022802b00f2203450d3820022902b40f2107410821040c350b200241b00f6a200110c60420022802b00f2203450d3720022902b40f210702402001280200220128020422044104490d0020012802002206280000210520012004417c6a3602042001200641046a360200410921040c360b2007a7450d372003102c0c370b02400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602000240024020060e020001020b200241d8116a2001108706200241e4116a280200450d01200241b00f6a200241d8116a41880210c9081a02402001280200220328020422044104490d0020032802002206280000210520032004417c6a3602042003200641046a360200200241d8116a200110b30520022802d8112204450d0020022902dc112107024020012802002201280204220641044f0d0002402007422088a72201450d002001410c6c21032004210103400240200141046a280200450d002001280200102c0b2001410c6a2101200341746a22030d000b0b2007a72201450d012001410c6c450d012004102c0c010b20012802002208280000210320012006417c6a3602042001200841046a36020020040d030b200241bc0f6a102b200241ac106a102b0c010b200241d8116a2001108706200241e4116a280200450d00200241b00f6a200241d8116a41880210c9081a02402001280200220328020422044104490d0020032802002206280000210520032004417c6a3602042003200641046a360200200241d8116a200110b30520022802d8112204450d0020022902dc112107024020012802002201280204220641044f0d0002402007422088a72201450d002001410c6c21032004210103400240200141046a280200450d002001280200102c0b2001410c6a2101200341746a22030d000b0b2007a72201450d012001410c6c450d012004102c0c010b20012802002208280000210320012006417c6a3602042001200841046a36020020040d340b200241bc0f6a102b200241ac106a102b0b200041193602000c380b20024198056a200241b00f6a41880210c9081a410121010c320b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020020060d00200241206a200110c5042002290320a70d002002290328210720004102360200200041086a2007370300200041106a200241d8116a41980210c9081a0c370b200041193602000c360b200128020022032802042204450d2e200328020022052d0000210620032004417f6a3602042003200541016a3602000240024002400240024002400240024020060e050001020304360b2001280200220128020422034104490d3520012802002204280000210620012003417c6a3602042001200441046a360200410121084100210941002105410021010c060b41002103200241003a00d00f02400340200128020022042802042205450d01200241b00f6a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00d00f20034120470d000b2001280200220128020422084104490d3520022900c70f2107200241cf0f6a310000210d200241b00f6a410f6a290000210e20022900b70f210f20022800b30f210620022f00b10f210320022d00b00f210420012802002209280000210520012008417c6a3602042001200941046a36020020022007422888200d42188684a72201ad422886200742ffffffffff1f83843703980a2002200e3703900a200141107621092002200f3703880a200f421888a7210a200f420888a7210b200241880a6a410f6a290000210d200229008f0a2107200fa7210c410221080c050b200341ff0171450d34200241003a00d00f0c340b2001280200220128020422034104490d3320012802002204280000210620012003417c6a3602042001200441046a360200200241c7096a290000210d20022900bf09210720022d00b809210c20022f00b909210b20022800bb09210a410321080c020b41002103200241003a00d00f0240024002400340200128020022042802042205450d01200241b00f6a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00d00f20034120470d000b2001280200220828020422094104490d3520022900c70f2107200241cf0f6a310000210d200241bf0f6a290000210e20022900b70f210f20022800b30f210620022f00b10f210320022d00b00f21042008280200220b280000210520082009417c6a3602042008200b41046a360200200128020022012802042208450d35200128020022092d0000210b20012008417f6a3602042001200941016a36020041002101200b0e020201350b200341ff0171450d34200241003a00d00f0c340b410121010b2007423888200d42088684a7210920022007422888200d42188684a73b01b40b20022007421888a73b01b20b20022007421088a73a00b10b20022007a73b00af0b2002200e3700a70b2002200f37009f0b200f421888a7210a200f420888a7210b200241ae0b6a290100210d20022901a60b2107200fa7210c410421080c030b2001280200220128020422034104490d3120012802002204280000210620012003417c6a3602042001200441046a36020042002107410521084200210d0b0b0b200041003b0126200020013a00252000200b3b000d200020033b0006200020043a0005200020083a0004200041033602002000411b6a200d370000200041136a2007370000200041286a2005360200200041236a20093b00002000410f6a200a3600002000410c6a200c3a0000200041086a20063602002000412c6a200241d8116a41fc0110c9081a0c350b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020002400240024002400240024020060e0400010203060b41002103200241003a00d00f02400340200128020022042802042205450d01200241b00f6a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00d00f20034120470d000b200241980b6a411f6a200241b00f6a411f6a31000022103c0000200241980b6a410f6a200241b00f6a410f6a2900002207370000200220022900c70f220f3700af0b200220022900b70f220d37009f0b200220022800b30f220836009b0b200220022f00b10f22093b00990b200220022d00b00f220b3a00980b200241306a200110b1032002290330a70d06200241c0006a290300210e20022903382111200f423888201042ff0183221042088684a72101200f422888201042188684a7210a200f421088a7210c200f421888a72112200fa72113410121060c040b200341ff0171450d05200241003a00d00f0c050b41002103200241003a00d00f02400340200128020022042802042205450d01200241b00f6a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00d00f20034120470d000b200241bf0f6a2900002107200241cf0f6a310000211420022900b70f210d20022800b30f210820022f00b10f210920022d00b00f210b20022900c70f2115200241e0006a200110b1032002290360a70d05200241e0006a41106a290300210e20022903682111200241c8006a200110b1032002290348a70d052015421888a721122015421088a7210c2015a72113200241c8006a41106a29030021102002290350210f2015422888201442188684a7220a4110762101410221060c030b200341ff0171450d04200241003a00d00f0c040b41002103200241003a00d00f024002400340200128020022042802042205450d01200241b00f6a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00d00f20034120470d000b200241bf0f6a2900002107200241cf0f6a310000210e20022900b70f210d20022800b30f210820022f00b10f210920022d00b00f210b20022900c70f210f41002103200241003a00d00f200f422888200e42188684a7210a200f42ffffffffff1f83220e421888a72112200e421088a7210c200fa721130340200128020022042802042205450d02200241b00f6a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00d00f20034120470d000b200241b8096a410f6a200241b00f6a410f6a290000220e370000200220022900b70f22113700bf09200220022800b30f22043600bb09200220022f00b10f22033b00b909200220022d00b00f22053a00b809200241cf0f6a310000211020022900c70f210f200241f8006a200110b1032002290378a70d05200241f8006a41106a29030021142002290380012115200f422888201042188684a72206ad422886200f42ffffffffff1f832210421888a7ad4218862010421088a7ad42ff018342108684200fa7ad42ffff03838442ffffffffff1f8384210f200a41107621012006411876ad2110410321060c030b200341ff0171450d04200241003a00d00f0c040b200341ff0171450d03200241003a00d00f0c030b41002103200241003a00d00f0340200128020022042802042205450d02200241b00f6a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00d00f20034120470d000b200241bf0f6a2900002107200241cf0f6a310000211020022900b70f210d20022800b30f210820022f00b10f210920022d00b00f210b20022900c70f210f20024190016a200110b103200229039001a70d02200f421888a72112200f421088a7210c200fa7211320024190016a41106a290300210e2002290398012111200f422888201042188684a7220a4110762101200241b00b6a2903002114200241a00b6a290300211020022903a80b211520022903980b210f410421060b200020033b002a200020053a00292000200c3a0022200020093b000a2000200b3a000920004104360200200041d8006a2014370200200041d0006a2015370200200041c8006a2010370200200041c0006a200f370200200041386a200e370200200041306a20113702002000412c6a2004360000200041276a20013b0000200041256a200a3b0000200041236a20123b0000200041206a20133b0000200041186a2007370000200041106a200d3700002000410c6a2008360000200041086a20063a0000200041e0006a200241d8116a41c80110c9081a0c360b200341ff0171450d00200241003a00d00f0b200041193602000c340b200128020022032802042204450d2b200328020022052d0000210620032004417f6a3602042003200541016a36020020060d2b200241a8016a200110b00320022802a8010d2b20022802ac012205200128020028020441f0006e2203200320054b1bad42f0007e2207422088a70d0c2007a72203417f4c0d0c0240024020030d00410421060c010b200310322206450d0f0b2001200128020441016a2204360204200241003602d809200220063602d0092002200341f0006e3602d409200420012802084b0d2a02402005450d00200241b00f6a41086a2109410021030340200241b00f6a200110ab0520022802b40f210420022802b00f210820024198056a200941e80010c9081a024020040d0020022802d00921062003450d2d200341f0006c2103200641046a210103402001102b200141f0006a2101200341907f6a22030d000c2e0b0b20024190036a20024198056a41e80010c9081a0240200320022802d409470d00200241d0096a200310990520022802d809210320022802d00921060b2006200341f0006c6a2203200436020420032008360200200341086a20024190036a41e80010c9081a200220022802d80941016a22033602d8092005417f6a22050d000b2001280204210420022802d00921060b20012004417f6a3602042006450d2b20022902d40921072000200636020420004105360200200041086a2007370200200041106a200241d8116a41980210c9081a0c330b200128020022032802042204450d25200328020022052d0000210620032004417f6a3602042003200541016a360200410721050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020060e180001020304053f060708090a0b0c0d0e0f101112131415163c0b41002103200241003a00f0090240024002400240024002400340200128020022042802042205450d01200241d0096a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00f00920034120470d000b200241980b6a411f6a200241d0096a411f6a3100003c0000200241980b6a410f6a200241d0096a410f6a290000370000200220022900e7093700af0b200220022900d70937009f0b200220022800d30936009b0b200220022f00d1093b00990b200220022d00d0093a00980b200241b00b6a2903002110200241a00b6a290300211520022903980b211620022903a80b2107200241b0016a200110b10320022903b001a70d41200128020022032802042204450d41200241c0016a290300211120022903b801210e200328020022062d0000210820032004417f6a360204410121052003200641016a3602004100210b20080e0404010203410b200341ff0171450d40200241003a00f0090c400b4101210b0c020b4102210b0c010b41002103200241003a00f0090340200128020022042802042206450d02200241d0096a20036a200428020022082d00003a000020042006417f6a3602042004200841016a3602002002200341016a22033a00f00920034120470d000b20022900e7092214422888200241ef096a31000042188684a7210a2014421888a7210c2014421088a72112200241df096a290000210f20022900d709210d20022800d309210320022f00d109210420022d00d00921062014a721134103210b0b200220073703c80a200241b80a6a41186a2010370300200241d00d6a41046a200241a8086a41046a2f01003b0100200220163703b80a200220153703c00a200220043b00890a200220063a00880a200220022801a8083602d00d2002200336008b0a200241c70a6a2900002117200228018a0a211820022f01880a211920022900bf0a211a20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d80720074238882010420886842115201a42208820174220868421072003411876211b20104238882114201742208821102016421888a721032016420888a721082016a72104201aa721090c3f0b200341ff0171450d3b200241003a00f0090c3b0b200241c8016a200110b10320022903c801a70d3a200241c8016a41106a290300210d20022903d001210f200241d00d6a41046a200241d0096a41046a2f01003b0100200220022801d0093602d00d20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d807200f422088200d422086842107200d4220882110200fa72109410221050c3d0b200241e0016a200110b10320022903e001a70d39200241e0016a41106a290300210d20022903e801210f200241d00d6a41046a200241d0096a41046a2f01003b0100200220022801d0093602d00d20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d807200f422088200d422086842107200d4220882110200fa72109410321050c3c0b410421052001280200220128020422044104490d3820012802002206280000210320012004417c6a3602042001200641046a360200200241d00d6a41046a200241d0096a41046a2f01003b0100200220022801d0093602d00d20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d80742002107420021100c3b0b200241f8016a200110b00320022802f8010d3720022802fc012101200241d00d6a41046a200241980b6a41046a2f01003b0100200220022801980b3602d00d2002418094ebdc033602d409200220013602d009200241d0096a2001418094ebdc034b4102746a280200210320024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d8074200210741052105420021100c3a0b200241d0096a200110ba0720022802d0092203450d36200241d00d6a41046a200241980b6a41046a2f01003b0100200220022801980b3602d00d200241d0096a41086a350200210720022802d409210920024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d80742002110410621050c390b200128020022032802042204450d35200328020022052d0000210c20032004417f6a3602042003200541016a3602004100210402400240024002400240200c0e04030001023a0b410121040c020b410221040c010b41002103200241003a00f0090340200128020022042802042205450d02200241d0096a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00f00920034120470d000b20022900e709220f422888200241ef096a31000042188684a72106200f421888a72103200f421088a72105200241df096a290000210720022900d709210d20022800d309210920022f00d109210b20022d00d009210a200fa72108410321040b200241a70b6a2007370000200241d00d6a41046a200241b80a6a41046a2f01003b01002002200d37009f0b2002200936009b0b2002200b3b00990b2002200a3a00980b200220033b01b20b200220053a00b10b200220083b00af0b200220022801b80a3602d00d200220063601b40b200241b60b6a3100002114200241a60b6a290100210d200228019a0b210320022f01980b210820022901ae0b2115200229019e0b210f20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a29010037030041082105200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d807200f422088200d4220868421072006411876210b200d4220882110200fa721090c390b200341ff0171450d35200241003a00f0090c350b41002103200241003a00f00902400340200128020022042802042205450d01200241d0096a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00f00920034120470d000b200241d00d6a41046a200241980b6a41046a2f00003b0100200220022800980b3602d00d200241ef096a3100002114200241df096a290000210d20022900e709211520022800d309210320022f00d109210820022d00d009210420022900d709210f20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290000370100200241d8076a41286a200241b00f6a41286a290000370300200241d8076a41206a200241b00f6a41206a290000370300200241d8076a41186a200241b00f6a41186a290000370300200241d8076a41106a200241b00f6a41106a290000370300200241d8076a41086a200241b00f6a41086a290000370300200220022900b00f3703d807200f422088200d422086842107200d4220882110200fa72109410921050c380b200341ff0171450d34200241003a00f0090c340b20024180026a200110b0032002280280020d332002280284022103200241d00d6a41046a200241d0096a41046a2f01003b0100200220022801d0093602d00d20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d80742002107410a2105420021100c360b20024188026a200110b0032002280288020d32200228028c022103200241d00d6a41046a200241d0096a41046a2f01003b0100200220022801d0093602d00d20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d80742002107410b2105420021100c350b200128020022012802042203450d31200128020022052d0000210420012003417f6a3602042001200541016a360200200441e4004b0d31200241d00d6a41046a200241d0096a41046a2f01003b0100200220022801d0093602d00d20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d80742002107410c2105420021100c340b410d21050c330b410e21050c320b200241d0096a200110ba0720022802d0092203450d2e200241d00d6a41046a200241980b6a41046a2f01003b0100200220022801980b3602d00d200241d0096a41086a350200210720022802d409210920024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d80742002110410f21050c310b41002103200241003a00f00902400340200128020022042802042205450d01200241d0096a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00f00920034120470d000b200241880a6a41186a2205200241ef096a3100003c0000200220022900e7093703980a200220022900d7093703880a2002200241df096a2900003703900a2001280200220128020422064104490d2e20022800d309210320022f00d109210820022d00d009210420012802002209280000211820012006417c6a3602042001200941046a360200200241d00d6a41046a200241980b6a41046a2f01003b0100200220022801980b3602d00d20053100002114200241880a6a41086a290300210d20022903980a211520022903880a210f20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a29010037030041102105200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d807200f422088200d422086842107200d4220882110200fa721090c310b200341ff0171450d2d200241003a00f0090c2d0b411121050c2f0b2001280200220428020422054104490d2b20042802002206280000210320042005417c6a3602042004200641046a36020020024190026a200110b0032002280290020d2b2001280200220528020422062002280294024102742204490d2b2004417f4c0d110240024020040d00410121080c010b200410372208450d142001280200220528020421060b0240024020062004490d0020082005280200200410c90821012005280204220620044f0d01200420064194afc0001058000b2008410020041b2201450d2c2004450d2c2001102c0c2c0b2005200620046b3602042005200528020020046a3602002001450d2b02402004ad22074220862007842207422088a722040d002007a721040c2d0b024020014103710d0020044103710d002007a722044103710d0020044102762205450d2d2001450d2c20074202884280808080f0ffffff3f832005ad842107200121090c2e0b2007a7450d2b2001102c0c2b0b41002103200241003a00f00902400340200128020022042802042205450d01200241d0096a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00f00920034120470d000b200241b8096a410f6a2203200241d0096a410f6a290000370000200220022900d7093700bf09200220022800d3093600bb09200220022f00d1093b00b909200220022d00d0093a00b8092001280200220128020422044104490d2b20022900e7092107200241ef096a310000210e20012802002205280000211820012004417c6a3602042001200541046a360200200241d00d6a41046a200241980b6a41046a2f01003b0100200220022801980b3602d00d2003290000210d20022d00b809210420022f00b909210820022800bb09210320022900bf09210f20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d8072007422888200e42188684a72201ad422886200742ffffffffff1f83842115200f422088200d422086842107200d42208821102001411876ad2114200fa72109411321050c2e0b200341ff0171450d2a200241003a00f0090c2a0b20024198026a200110b103200229039802a70d2920024198026a41106a290300210d20022903a002210f200241d00d6a41046a200241d0096a41046a2f01003b0100200220022801d0093602d00d20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d807200f422088200d422086842107200d4220882110200fa72109411421050c2c0b200241b8026a200110b00320022802b8020d2820022802bc022103200241b0026a200110b00320022802b0020d2820022802b4022109200241d00d6a41046a200241d0096a41046a2f01003b0100200220022801d0093602d00d20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d807411521050c2b0b41002103200241003a00f00902400340200128020022042802042205450d01200241d0096a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00f00920034120470d000b2001280200220128020422054104490d2820022900e7092107200241d0096a411f6a310000210e200241df096a290000210d20022900d709210f20022800d309210320022f00d109210820022d00d009210420012802002206280000211820012005417c6a3602042001200641046a360200200241d00d6a41046a200241b80a6a41046a2f01003b010020022007423888200e42088684a73b01b60b20022007422888200e42188684a73b01b40b20022007421888a73b01b20b20022007421088a73a00b10b20022007a73b00af0b2002200336009b0b200220083b00990b200220043a00980b200220022801b80a3602d00d200241980b6a411f6a31000021142002200f37009f0b2002200d3700a70b20022900af0b211520024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d807200f422088200d422086842107200d4220882110200fa72109411621050c2b0b200341ff0171450d27200241003a00f0090c270b200241d0026a200110b00320022802d0020d2620012802002204280204220520022802d4024101742203490d262003417f4c0d0c0240024020030d00410121060c010b200310372206450d0f2001280200220428020421050b024020052003490d0020062004280200200310c9082105200428020422082003490d0b2004200820036b3602042004200428020020036a3602002005450d2702402003ad22074220862007842207422088a722030d002007a721040c250b024020052003724101710d002007a722044101710d0020044101762209450d252005450d282007422188a72106200521030c260b2007a7450d270b2006102c0c260b200241e8026a200110b00320022802e8020d2520012802002204280204220520022802ec024101742203490d252003417f4c0d0b0240024020030d00410121060c010b200310372206450d0e2001280200220428020421050b024020052003490d0020062004280200200310c9082105200428020422082003490d092004200820036b3602042004200428020020036a3602002005450d2602402003ad22074220862007842207422088a722030d002007a721040c220b024020052003724101710d002007a722044101710d0020044101762209450d222005450d272007422188a72106200521030c230b2007a7450d260b2006102c0c250b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041193602000c310b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200410021030240024002400240024002400240024020060e020001080b41002103200241003a00d00f0340200128020022042802042205450d02200241b00f6a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00d00f20034120470d000b200241bf0f6a290000210f200241cf0f6a310000210e20022900b70f210d20022800b30f210b20022f00b10f210920022d00b00f210820022900c70f210741002103200241003a00d00f2007422888200e42188684a7211c200742ffffffffff1f8321140340200128020022042802042205450d03200241b00f6a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00d00f20034120470d000b200220022900b70f3703880a200220022900c70f22074218883d009b0a2002200241bf0f6a2900003703900a20022007a722033b01980a200220034110763a009a0a20022007422888200241cf0f6a310000421886843e009d0a20022800b30f211220022f00b10f210c20022d00b00f210a41002103200241003a00d00f0340200128020022042802042205450d04200241b00f6a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00d00f20034120470d000b200241bf0f6a2900002111200241cf0f6a310000211020022900b70f210e20022800b30f211d20022f00b10f211e20022d00b00f211320022900c70f210741002103200241003a00d00f2007422888201042188684a7211f200742ffffffffff1f8321170340200128020022042802042205450d05200241b00f6a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00d00f20034120470d000b200241b8096a410f6a200241b00f6a410f6a290000370000200220022900b70f3700bf09200220022800b30f3600bb09200220022f00b10f3b00b909200220022d00b00f3a00b809200241cf0f6a310000211020022900c70f210741002103200241003a00d00f2007422888201042188684a721042007421888a721202007421088a721212007a721220340200128020022052802042206450d06200241b00f6a20036a200528020022182d00003a000020052006417f6a3602042005201841016a3602002002200341016a22033a00d00f20034120470d000b200241980b6a410f6a200241b00f6a410f6a290000370000200220022900b70f37009f0b200220022800b30f36009b0b200220022f00b10f3b00990b200220022d00b00f3a00980b200220022900c70f22074218883d01b20b20022007a722033b00af0b200220034110763a00b10b20022007422888200241cf0f6a310000421886843e02b40b41002103200241003a00d00f0340200128020022052802042206450d07200241b00f6a20036a200528020022182d00003a000020052006417f6a3602042005201841016a3602002002200341016a22033a00d00f20034120470d000b200241a0076a41086a2203200241880a6a41086a290300370300200241a0076a41106a2206200241880a6a41106a290300370300200241a0076a41186a2219200241880a6a41186a2d00003a0000200241d00d6a41086a2223200241b8096a41086a290300370300200241d00d6a410f6a2224200241b8096a410f6a290000370000200220022903880a3703a007200220022903b8093703d00d200241b00f6a410f6a2900002115200241cf0f6a310000211a20022900b70f211020022800b30f211b20022f00b10f211820022d00b00f210520022900c70f211620024198056a41186a2225200241980b6a41186a29030037030020024198056a41106a2226200241980b6a41106a29030037030020024198056a41086a2227200241980b6a41086a290300370300200220022903980b37039805200241b80a6a41186a222820192d00003a0000200241b80a6a41106a22292006290300370300200241b80a6a41086a22062003290300370300200220022903a0073703b80a200241f80b6a410f6a222a2024290000370000200241f80b6a41086a222b2023290300370300200220022903d00d3703f80b20024190036a41186a222c202529030037030020024190036a41106a2225202629030037030020024190036a41086a22262027290300370300200220022903980537039003200241b00f6a200110c60420022802b00f2203450d072016421888a721242016421088a721232016a72119200241e0086a41086a2006290300370300200241e0086a41106a2029290300370300200241e0086a41186a20282d00003a0000200241c8086a41086a202b290300370300200241c8086a410f6a202a290000370000200241d0096a41086a2026290300370300200241d0096a41106a2025290300370300200241d0096a41186a202c290300370300200220022903b80a3703e008200220022903f80b3703c80820022002290390033703d0092020ad4218862021ad42ff0183421086842022ad42ffff03838421072016422888201a42188684a722204110762121201cad4228862014842116201fad422886201784211a201c411876ad2117201f411876ad212d20022902b40f21140b200241a8086a41186a2201200241e0086a41186a2d00003a0000200241a8086a41106a2206200241e0086a41106a290300370300200241a8086a41086a221c200241e0086a41086a29030037030020024190086a41086a221f200241c8086a41086a29030037030020024190086a410f6a2222200241c8086a410f6a290000370000200241d8076a41086a2225200241d0096a41086a290300370300200241d8076a41106a2226200241d0096a41106a290300370300200241d8076a41186a2227200241d0096a41186a290300370300200220022903e0083703a808200220022903c80837039008200220022903d0093703d8072000412f6a20173c0000200041276a20163700002000411f6a200f370000200041176a200d370000200041336a2012360000200041316a200c3b0000200041306a200a3a0000200041136a200b360000200041116a20093b0000200041106a20083a0000200041086a20143702002000200336020420004108360200200020022903a8083700372000413f6a201c290300370000200041c7006a2006290300370000200041cf006a20012d00003a0000200041ef006a202d3c0000200041e7006a201a370000200041df006a2011370000200041d7006a200e370000200041d3006a201d360000200041d1006a201e3b0000200041d0006a20133a00002000418c016a200436020020004187016a20073e00002000418b016a20074220883c0000200041ff006a2022290000370000200041f8006a201f290300370200200041f0006a200229039008370200200041a8016a2027290300370200200041a0016a202629030037020020004198016a202529030037020020004190016a20022903d807370200200041ce016a20213b0100200041cc016a20203b0100200041ca016a20243b0100200020233a00c901200041c7016a20193b0000200041bf016a2015370000200041b7016a2010370000200041b3016a201b360000200041b1016a20183b0000200041b0016a20053a0000200041d0016a200241d8116a41d80010c9081a0c370b200341ff0171450d05200241003a00d00f0c050b200341ff0171450d04200241003a00d00f0c040b200341ff0171450d03200241003a00d00f0c030b200341ff0171450d02200241003a00d00f0c020b200341ff0171450d01200241003a00d00f0c010b200341ff0171450d00200241003a00d00f0b200041193602000c300b200128020022032802042204450d1c200328020022052d0000210620032004417f6a3602042003200541016a360200024002400240024020060e03000102200b200241d8116a200110ab0320022903e0114202510d1f200241b00f6a200241d8116a41800210c9081a2001280200220328020422044104490d1f20032802002206280000210520032004417c6a3602042003200641046a360200200241d8116a200110b30520022802d8112204450d1f20022902dc112107024020012802002203280204220641044f0d0002402007422088a72201450d002001410c6c21032004210103400240200141046a280200450d002001280200102c0b2001410c6a2101200341746a22030d000b0b2007a72201450d202001410c6c450d200c1f0b20032802002208280000210120032006417c6a3602042003200841046a3602002004450d1f20024198056a200241b00f6a41800210c9081a410121030c020b200241d8116a200110ab0320022903e0114202510d1e200241b00f6a200241d8116a41800210c9081a2001280200220328020422044104490d1e20032802002206280000210520032004417c6a3602042003200641046a360200200241d8116a200110b30520022802d8112204450d1e20022902dc112107024020012802002203280204220641044f0d0002402007422088a72201450d002001410c6c21032004210103400240200141046a280200450d002001280200102c0b2001410c6a2101200341746a22030d000b0b2007a72201450d1f2001410c6c0d1e0c1f0b20032802002208280000210120032006417c6a3602042003200841046a3602002004450d1e20024198056a200241b00f6a41800210c9081a410221030c010b2001280200220328020422044104490d1d20032802002206280000210520032004417c6a3602042003200641046a3602002001280200220128020422034104490d1d20012802002206280000210420012003417c6a3602042001200641046a36020020024198056a200241d8116a41800210c9081a410321030b20024190036a20024198056a41800210c9081a2000411c6a2001360200200041146a2007370200200041106a20043602002000410c6a2005360200200041086a200336020020004109360200200041206a20024190036a41800210c9081a0c2f0b200128020022032802042204450d19200328020022052d0000210620032004417f6a3602042003200541016a36020020060d192001280200220328020422044104490d1920032802002205280000210b20032004417c6a3602042003200541046a360200200241b00f6a200110c60420022802b00f2208450d19200241b80f6a280200210a20022802b40f2109200241f0026a200110b00320022802f0020d1820022802f40222042001280200280204410c6e2203200320044b1bad420c7e2207422088a70d072007a72206417f4c0d070240024020060d00410421050c010b200610322205450d0a0b2001200128020441016a220c36020441002103200241003602a005200220053602980520022006410c6e220636029c05200c20012802084b0d1702402004450d00410021030340200241b00f6a200110c604024020022802b00f22060d0020022802980521052003450d1a2003410c6c21032005210103400240200141046a280200450d002001280200102c0b2001410c6a2101200341746a22030d000c1b0b0b20022902b40f210702402003200228029c05470d0020024198056a2003410110ec0120022802a005210320022802980521050b20052003410c6c6a2203200737020420032006360200200220022802a00541016a22033602a0052004417f6a22040d000b2001280204210c200228029c05210620022802980521050b2001200c417f6a3602042005450d182008450d19024002400240024020012802002204280204220c4104490d002004280200221228000021132004200c417c6a3602042004201241046a36020020012802002204280204220c4104490d0120042802002212280000211e2004200c417c6a3602042004201241046a36020020012802002204280204220c4104490d0220042802002212280000211d2004200c417c6a3602042004201241046a360200200241b00f6a200110ac0320022d00b00f4101470d0302402009450d002008102c0b02402003450d002003410c6c21032005210103400240200141046a280200450d002001280200102c0b2001410c6a2101200341746a22030d000b0b2005410020061b2201450d1d2006410c6c450d1d2001102c0c1d0b02402009450d002008102c0b02402003450d002003410c6c21032005210103400240200141046a280200450d002001280200102c0b2001410c6a2101200341746a22030d000b0b2005410020061b2201450d1c2006410c6c450d1c2001102c0c1c0b02402009450d002008102c0b02402003450d002003410c6c21032005210103400240200141046a280200450d002001280200102c0b2001410c6a2101200341746a22030d000b0b2005410020061b2201450d1b2006410c6c450d1b2001102c0c1b0b02402009450d002008102c0b02402003450d002003410c6c21032005210103400240200141046a280200450d002001280200102c0b2001410c6a2101200341746a22030d000b0b2005410020061b2201450d1a2006410c6c450d1a2001102c0c1a0b200241d00c6a41086a2201200241d50f6a280000360200200241c00c6a41086a2204200241ed0f6a2800003602002002200241cd0f6a2900003703d00c2002200241e50f6a2900003703c00c200241c90f6a2800002112200241c50f6a2800002118200241c10f6a280000211b200241bd0f6a2800002119200241b90f6a2800002123200241d90f6a2800002124200241dd0f6a2800002120200241e10f6a280000212120022800b50f211c20022800b10f211f200241b00e6a41086a20012802002201360200200241900c6a41086a220c200428020036020020024190036a41086a22042001360200200220022903d00c22073703b00c200220022903c00c220d3703a00c200220073703b00e2002200d3703900c2002200737039003200241d0096a41086a2201200c280200360200200220022903900c3703d0092008450d19200241d8076a41086a220c2004280200360200200241a0076a41086a2204200128020036020020022002290390033703d807200220022903d0093703a007200041c4006a2012360200200041c0006a20183602002000413c6a201b360200200041386a2019360200200041346a2023360200200041306a201c3602002000412c6a201f360200200041286a201d360200200041246a201e360200200041206a20133602002000411c6a2003360200200041186a2006360200200041146a2005360200200041106a200a3602002000410c6a2009360200200041086a20083602002000200b3602042000410a360200200041dc006a2021360200200041d8006a2020360200200041d4006a2024360200200041c8006a20022903d807370200200041d0006a200c280200360200200041e0006a20022903a007370200200041e8006a2004280200360200200041ec006a200241d8116a41bc0110c9081a0c2e0b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041193602000c2d0b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020060e24000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223250b2001280200220128020422034104490d2420012802002205280000210420012003417c6a3602042001200541046a360200410121030c230b2001280200220128020422034104490d2320012802002205280000210420012003417c6a3602042001200541046a360200410221030c220b2001280200220128020422034104490d2220012802002205280000210420012003417c6a3602042001200541046a360200410321030c210b410421032001280200220128020422054104490d2120012802002206280000210420012005417c6a3602042001200641046a3602000c200b2001280200220128020422034104490d2020012802002205280000210420012003417c6a3602042001200541046a360200410521030c1f0b2001280200220128020422034104490d1f20012802002205280000210420012003417c6a3602042001200541046a360200410621030c1e0b2001280200220128020422034104490d1e20012802002205280000210420012003417c6a3602042001200541046a360200410721030c1d0b2001280200220128020422034104490d1d20012802002205280000210420012003417c6a3602042001200541046a360200410821030c1c0b2001280200220128020422034104490d1c20012802002205280000210420012003417c6a3602042001200541046a360200410921030c1b0b2001280200220128020422034104490d1b20012802002205280000210420012003417c6a3602042001200541046a360200410a21030c1a0b2001280200220128020422034104490d1a20012802002205280000210420012003417c6a3602042001200541046a360200410b21030c190b2001280200220128020422034104490d1920012802002205280000210420012003417c6a3602042001200541046a360200410c21030c180b200128020022032802042204450d18200328020022052d0000210620032004417f6a3602042003200541016a360200410021040240024020060e0201001a0b2001280200220128020422044104490d1920012802002205280000210320012004417c6a3602042001200541046a360200410121040b2003ad21074200210d410d21030c170b2001280200220128020422034104490d1720012802002205280000210420012003417c6a3602042001200541046a360200410e21030c160b2001280200220128020422034104490d1620012802002205280000210420012003417c6a3602042001200541046a360200410f21030c150b2001280200220128020422034104490d1520012802002205280000210420012003417c6a3602042001200541046a360200411021030c140b2001280200220128020422034104490d1420012802002205280000210420012003417c6a3602042001200541046a360200411121030c130b2001280200220128020422034104490d1320012802002205280000210420012003417c6a3602042001200541046a360200411221030c120b2001280200220128020422034104490d1220012802002205280000210420012003417c6a3602042001200541046a360200411321030c110b2001280200220128020422034104490d1120012802002205280000210420012003417c6a3602042001200541046a360200411421030c100b2001280200220128020422034104490d1020012802002205280000210420012003417c6a3602042001200541046a360200411521030c0f0b2001280200220128020422034104490d0f20012802002205280000210420012003417c6a3602042001200541046a360200411621030c0e0b2001280200220128020422034108490d0e2001280200220429000021072001200341786a3602042001200441086a3602004200210d411721030c0d0b2001280200220128020422034104490d0d20012802002205280000210420012003417c6a3602042001200541046a360200411821030c0c0b2001280200220128020422034104490d0c20012802002205280000210420012003417c6a3602042001200541046a360200411921030c0b0b2001280200220128020422034104490d0b20012802002205280000210420012003417c6a3602042001200541046a360200411a21030c0a0b2001280200220128020422034110490d0a2001280200220441086a290000210d200429000021072001200441106a3602002001200341706a360204411b21030c090b2001280200220128020422034110490d092001280200220441086a290000210d200429000021072001200441106a3602002001200341706a360204411c21030c080b2001280200220128020422034104490d0820012802002205280000210420012003417c6a3602042001200541046a360200411d21030c070b2001280200220128020422034104490d0720012802002205280000210420012003417c6a3602042001200541046a360200411e21030c060b2001280200220128020422034104490d0620012802002205280000210420012003417c6a3602042001200541046a360200411f21030c050b2001280200220128020422034104490d0520012802002205280000210420012003417c6a3602042001200541046a360200412021030c040b2001280200220128020422034104490d0420012802002205280000210420012003417c6a3602042001200541046a360200412121030c030b2001280200220128020422034104490d0320012802002205280000210420012003417c6a3602042001200541046a360200412221030c020b2001280200220128020422034104490d0220012802002205280000210420012003417c6a3602042001200541046a360200412321030c010b2001280200220128020422034104490d0120012802002205280000210420012003417c6a3602042001200541046a36020042002107412421034200210d0b2000410c360200200041186a200d370200200041106a20073702002000410c6a2004360200200041086a2003360200200041206a200241d8116a41880210c9081a0c2d0b200041193602000c2c0b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041193602000c2b0b200128020022032802042204450d12200328020022052d0000210620032004417f6a3602042003200541016a36020020060d1220024188036a200110b0032002280288030d12200228028c032206200128020028020441d0006e2203200320064b1bad42d0007e2207422088a70d032007a72203417f4c0d030240024020030d00410421080c010b200310322208450d060b2001200128020441016a220536020441002104200241003602980320022008360290032002200341d0006e220b36029403200520012802084b0d1102402006450d00200241e50f6a211f200241cd0f6a2122410021040340200241b00f6a200110b3060240024020022802b00f2205450d0020022902b40f21070240024002402001280200220328020422094104490d002003280200220b280000210a20032009417c6a3602042003200b41046a360200200241b00f6a200110ac0320022d00b00f4101460d01200241b00e6a41086a2203202241086a280000360200200241900c6a41086a2209201f41086a280000360200200220222900003703b00e2002201f2900003703900c20022800c90f211920022800c50f211b20022800c10f211820022800bd0f211d20022800b90f211e20022800b50f211320022800b10f211220022800d90f212320022800dd0f212420022800e10f2120200241b80a6a41086a20032802002203360200200241880a6a41086a20092802002209360200200241e0086a41086a220b2003360200200241b8096a41086a22032009360200200220022903b00e220d3703b80a200220022903900c220f3703880a2002200d3703e0082002200f3703b809200241c8086a41086a2209200b280200360200200220022903e0083703c808200241c00e6a41086a220b2003280200360200200220022903b8093703c00e200241b00f6a41086a2009280200360200200220022903c8083703b00f20024198056a41086a200b280200360200200220022903c00e370398052007210d200a210c0c040b2007422088a72203202120031b21212003450d0220210d010c020b2007422088a72203201c20031b211c2003450d01201c450d010b2005102c0b410021050b200241900d6a41086a2203200241b00f6a41086a280200360200200241800d6a41086a220920024198056a41086a280200360200200220022903b00f3703900d20022002290398053703800d2005450d12200241f00c6a41086a220b2003280200360200200241e00c6a41086a220a2009280200360200200220022903900d3703f00c200220022903800d3703e00c02402004200228029403470d0020024190036a20044101109705200228029803210420022802900321080b2008200441d0006c6a220320193602282003201b360224200320183602202003201d36021c2003201e36021820032013360214200320123602102003200c36020c2003200d37020420032005360200200b280200210520022903f00c2107200320203602402003202436023c20032023360238200341346a20053602002003200737022c200320022903e00c370244200341cc006a200a2802003602002002200441016a2204360298032006417f6a22060d000b20012802042105200228029403210b20022802900321080b20012005417f6a3602042008450d1220024180036a200110b0032002280280030d0f2002280284032220200128020028020441b4026e2203200320204b1bad42b4027e2207422088a70d032007a72203417f4c0d030240024020030d00410421050c010b200310322205450d060b2001200128020441016a2206360204200241003602a80d200220053602a00d2002200341b4026e3602a40d0240200620012802084b0d0002402020450d00200241e50f6a212e200241cd0f6a212f200241dc0f6a2130200241880a6a4105722131200241b00f6a4107722121200241cf0f6a2132200241cb0f6a21334100210a0340024002402001280200220328020422054104490d0020032802002206280000211e20032005417c6a3602042003200641046a36020041002103200241003a00d00f02400240024002400240024002400340200128020022052802042206450d01200241b00f6a20036a200528020022092d00003a000020052006417f6a3602042005200941016a3602002002200341016a22033a00d00f20034120470d000b200241980b6a41086a220c202141086a290000370300200241980b6a41106a2212202141106a290000370300200241980b6a41186a2213202141186a2d00003a000020022021290000221637039805200220163703980b20022d00b00f211d20022f00b10f211820022800b30f211b200241880a6a41186a20132d00003a0000200241880a6a41106a2012290300370300200241880a6a41086a2219200c290300370300200220022903980b3703880a41002103200241003a00d00f0340200128020022052802042206450d02200241b00f6a20036a200528020022092d00003a000020052006417f6a3602042005200941016a3602002002200341016a22033a00d00f20034120470d000b200241b00f6a410f6a2223290000211a2032310000211720022900b70f212d20022d00b00f213420022f00b10f213520022800b30f213620022900c70f211641002103200241003a00d00f2016422888201742188684a72137201642ffffffffff1f8321170340200128020022052802042206450d03200241b00f6a20036a200528020022092d00003a000020052006417f6a3602042005200941016a3602002002200341016a22033a00d00f20034120470d000b20024198056a410f6a2238202329000037000020024198056a41086a2223200241b00f6a41086a2239290300370300200241980b6a410f6a22032038290000370000200c2023290300370300200241b80a6a41086a2224200c290300370300200241b80a6a410f6a22052003290000370000200220022903b00f3703b80a2033310000213a20022802cc0f213b20023500c70f2116200241b8096a410f6a223c2005290000370000200241b8096a41086a223d2024290300370300200220022903b80a3703b80941002103200241003a00d00f2016203a42208684223a421888a7213e203a421088a7213f2016a721400340200128020022052802042206450d04200241b00f6a20036a200528020022092d00003a000020052006417f6a3602042005200941016a3602002002200341016a22033a00d00f20034120470d000b20024198056a41186a200241b00f6a41186a22412903002216370300200c20392903003703002012200241b00f6a41106a224229030037030020132016370300200220022903b00f3703980b41002103200241003a00d00f0340200128020022052802042206450d05200241b00f6a20036a200528020022092d00003a000020052006417f6a3602042005200941016a3602002002200341016a22033a00d00f20034120470d000b20022d00b00f214320022f00b10f214420022800b30f214520022900b70f211620022900bf0f213a20022f00c70f214620022d00c90f214720022f01ca0f214820022f01cc0f214920022f01ce0f214a200241b00f6a200110ac0320022d00b00f4101460d07200241d00c6a41086a2206202f41086a224b280000360200200241c00c6a41086a2209202e41086a224c2800003602002002202f2900003703d00c2002202e2900003703c00c20022800c90f214d20022800c50f214e20022800c10f214f20022800bd0f215020022800b90f215120022800b50f215220022800b10f215320022800d90f215420022800dd0f215520022800e10f2156200241c00e6a41086a22572006280200360200200241b00e6a41086a22582009280200360200200220022903d00c22593703b00c200220022903c00c225a3703a00c200220593703c00e2002205a3703b00e2002201d3a00900c200220183b00910c2002201b3600930c200220022d00880a3a00970c20022f008b0a215b20022d008a0a215c20022d00890a215d200241c8086a41106a2203203141106a280000360200200241c8086a41086a221d203141086a290000370300200220312900003703c808200241e0086a410f6a225e203c290000370000200241e0086a41086a225f203d290300370300200220022903b8093703e00820024190036a41186a223c201329030037030020024190036a41106a2260201229030037030020024190036a41086a2213200c290300370300200220022903980b37039003200241b00f6a200110b20520022802b00f2205450d07200241800e6a41086a2261203041086a28020036020020024190086a41086a2262201d29030037030020024190086a41106a22632003280200360200200220302902003703800e200220022903c8083703900820022802d80f211820022802d40f216420022802d00f216520022802cc0f216620022802c80f216720022802c40f216820022802c00f211b20022802bc0f216920022902b40f215920022802900c216a20022802940c216b200241a8086a410f6a226c205e290000370000200241a8086a41086a226d205f290300370300200220022903e0083703a808200241d0096a41186a226e203c290300370300200241d0096a41106a226f2060290300370300200241d0096a41086a2270201329030037030020022002290390033703d009200241a00e6a41086a22712057280200360200200220022903c00e3703a00e200241900e6a41086a22722058280200360200200220022903b00e3703900e200241f8026a200110b0032059422088a721732059a7213c20022802f802450d050c060b200341ff0171450d06200241003a00d00f0c060b200341ff0171450d05200241003a00d00f0c050b200341ff0171450d04200241003a00d00f0c040b200341ff0171450d03200241003a00d00f0c030b200341ff0171450d02200241003a00d00f0c020b20022802fc02225e200128020028020441c1006e22032003205e4b1bad42c1007e225a422088a70d09205aa72203417f4c0d090240024020030d00410121740c010b200310322274450d0c0b2001200128020441016a2275360204200241003602a00b200220743602980b2002200341c1006e220336029c0b0240207520012802084b0d004100211202400240205e450d000340200128020022032802042275450d02200328020022762d0000217720032075417f6a3602042003207641016a3602000240024002402077417f6a0e020001050b200241b00f6a200110ac0320022d00b00f4101460d042006204b2800003602002009204c2800003602002002202f2900003703d00c2002202e2900003703c00c20022800c90f217520022800c50f217620022800c10f217720022800bd0f217820022800b90f217920022800b50f217a20022800b10f217b20022800d90f217c20022800dd0f217d20022800e10f217e200241b00c6a41086a20062802002203360200200241a00c6a41086a2009280200227f360200202420033602002019207f360200200220022903d00c225a3703b00c200220022903c00c2280013703a00c2002205a3703b80a20022080013703880a20232024280200360200200220022903b80a3703980520132019280200360200200220022903880a370390034100217f0c010b200241b00f6a200110ac0320022d00b00f4101460d032006204b2800003602002009204c2800003602002002202f2900003703d00c2002202e2900003703c00c20022800c90f217520022800c50f217620022800c10f217720022800bd0f217820022800b90f217920022800b50f217a20022800b10f217b20022800d90f217c20022800dd0f217d20022800e10f217e200241b00c6a41086a20062802002203360200200241a00c6a41086a2009280200227f36020020582003360200200241900c6a41086a2203207f360200200220022903d00c225a3703b00c200220022903c00c2280013703a00c2002205a3703b00e20022080013703900c20232058280200360200200220022903b00e3703980520132003280200360200200220022903900c370390034101217f0b205f20232802002203360200203d2013280200228101360200201d200336020020572081013602002002200229039805225a3703e00820022002290390032280013703b8092002205a3703c80820022080013703c00e02402012200228029c0b470d00200241980b6a2012410110960520022802a00b211220022802980b21740b2074201241c1006c6a2203207536001920032076360015200320773600112003207836000d200320793600092003207a3600052003207b3600012003207f3a0000201d280200217520022903c808215a2003207e3600312003207d36002d2003207c360029200341256a20753600002003205a37001d200320022903c00e3700352003413d6a20572802003600002002201241016a22123602a00b205e417f6a225e0d000b20012802042175200228029c0b210320022802980b21740b20012075417f6a3602042074450d02200241b00f6a200110b306024020022802b00f450d00203ead421886203fad42ff0183421086842040ad42ffff03838421072037ad42288620178421152037411876ad2114205f203928020036020020132062290300370300206020632802003602002023206d2903003703002038206c290000370000200220022903b00f3703e008200220022903900837039003200220022903a808370398052041206e2903003703002042206f29030037030020392070290300370300200220022903d0093703b00f200c2071280200360200200220022903a00e3703980b20242072280200360200200220022903900e3703b80a20192061280200360200200220022903800e3703880a201e211c206a211f206b2122205d2125205c2126205b21272059210d20692128201b21292068212a2067212b2066212c206521820120642183012018218401207421850120032186012012218701204321880120442189012045218a012016210f203a210e2046218b012047218c012048218d012049218e01204a218f01203b219001203421910120352192012036219301202d2111201a21102053219401205221950120512196012050219701204f219801204e219901204d219a012054219b012055219c012056219d010c050b200341c1006c209e0120031b219e0102402003450d00209e01450d002074102c0b02402073450d002073410c6c21062005210303400240200341046a280200450d002003280200102c0b2003410c6a2103200641746a22060d000b0b203c410c6c209f01203c1b219f010240203c450d00209f01450d002005102c0b02402068450d0020684104742105206941046a210303400240200341046a280200450d002003280200102c0b200341106a2103200541706a22050d000b0b201b41047420a001201b1b21a001024020694100201b1b2203450d0020a001450d002003102c0b02402067450d00206620a10120661b21a1012066450d0020a101450d002067102c0b201820a20120181b21a2012064410020181b2203450d0320a201450d032003102c0c030b200228029c0b21030b200341c1006c20a30120031b21a30120022802980b410020031b2203450d0020a301450d002003102c0b02402073450d002073410c6c21062005210303400240200341046a280200450d002003280200102c0b2003410c6a2103200641746a22060d000b0b203c410c6c20a401203c1b21a4010240203c450d0020a401450d002005102c0b02402068450d0020684104742105206941046a210303400240200341046a280200450d002003280200102c0b200341106a2103200541706a22050d000b0b201b41047420a501201b1b21a501024020694100201b1b2203450d0020a501450d002003102c0b02402067450d00206620a60120661b21a6012066450d0020a601450d002067102c0b201820a70120181b21a7012064410020181b2203450d0020a701450d002003102c0b410021050b200241a0096a41106a220320024190036a41106a280200360200200241a0096a41086a220620024190036a41086a290300370300200241f80b6a41086a220920024198056a41086a290300370300200241f80b6a410f6a220c20024198056a410f6a290000370000200241a0076a41086a2212200241b00f6a41086a290300370300200241a0076a41106a2213200241b00f6a41106a290300370300200241a0076a41186a221e200241b00f6a41186a29030037030020022002290390033703a00920022002290398053703f80b200220022903b00f3703a00720024190096a41086a221d200241980b6a41086a28020036020020024180096a41086a2218200241b80a6a41086a280200360200200241900d6a41086a221b200241880a6a41086a280200360200200241800d6a41086a2219200241e0086a41086a280200360200200220022903980b37039009200220022903b80a37038009200220022903880a3703900d200220022903e0083703800d2005450d02200a41016a210a200241e80d6a41106a22232003280200360200200241e80d6a41086a22242006290300370300200241d00d6a41086a22062009290300370300200241d00d6a410f6a2209200c290000370000200241d8076a41086a220c2012290300370300200241d8076a41106a22122013290300370300200241d8076a41186a2213201e290300370300200220022903a0093703e80d200220022903f80b3703d00d200220022903a0073703d807200241c00d6a41086a221e201d280200360200200241b00d6a41086a221d2018280200360200200241f00c6a41086a2218201b280200360200200241e00c6a41086a221b201928020036020020022002290390093703c00d20022002290380093703b00d200220022903900d3703f00c200220022903800d3703e00c024020022802a80d220320022802a40d470d00200241a00d6a20034101109b0520022802a80d21030b20022802a00d200341b4026c6a2203201f3602042003201c36020020032091013a0024200341c3006a20143c00002003413b6a2015370000200341336a20103700002003412b6a20113700002003410e6a20273b01002003410d6a20263a00002003410c6a20253a0000200341086a2022360200200341106a20022903e80d370200200341186a2024290300370200200341206a2023280200360200200341276a209301360000200341256a2092013b0000200341df006a20074220883c0000200341db006a20073e0000200341e0006a20900136020020034187016a208a013600002003418b016a200f37000020034193016a200e37000020032094013602a401200341a8016a209501360200200341ac016a209601360200200341b0016a209701360200200341b4016a209801360200200341b8016a209901360200200341bc016a209a01360200200341a2016a208f013b0100200341a0016a208e013b01002003419e016a208d013b01002003419d016a208c013a00002003419b016a208b013b000020034185016a2089013b000020032088013a008401200341d3006a2009290000370000200341cc006a2006290300370200200320022903d00d370244200320022903d807370264200341ec006a200c290300370200200341f4006a2012290300370200200341fc006a2013290300370200200341cc016a209b01360200200341d0016a209c01360200200341d4016a209d01360200200320053602e401200341e8016a200d370200200341f0016a2028360200200341f4016a2029360200200341f8016a202a360200200341fc016a202b36020020034180026a202c36020020034184026a20820136020020034188026a2083013602002003418c026a208401360200200341c8016a201e280200360200200341c0016a20022903c00d370200200341d8016a20022903b00d370200200341e0016a201d280200360200200341a4026a208701360200200341a0026a2086013602002003419c026a20850136020020034198026a201828020036020020034190026a20022903f00c370200200341a8026a20022903e00c370200200341b0026a201b280200360200200220022802a80d41016a3602a80d200a2020470d000b2001280204210620022802a00d21050b20012006417f6a3602042005450d102008450d1320022902a40d2107200020083602042000410e360200200041146a2007370200200041106a20053602002000410c6a2004360200200041086a200b3602002000411c6a200241d8116a418c0210c9081a0c2b0b200241a00d6a10c2020c0f0b200320084194afc0001058000b200320084194afc0001058000b200041193602000c270b103b000b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200024002400240024002400240024020060e0400010203070b2001200128020441016a2203360204200320012802084b0d06200241d8116a200110b20320022802d8112104200241b00f6a200241d8116a41047241a40210c9081a20044119460d06200241d8116a200241b00f6a41a40210c9081a41a80210322203450d0720032004360200200341046a200241d8116a41a40210c9081a20012001280204417f6a36020420022903b809210d20022903c009210f20022f01c809210820022d00ca09210920022f00cb09210b20022f00cd0921014101210a0c030b2001200128020441016a2203360204200320012802084b0d05200241d8116a200110b20320022802d8112104200241b00f6a200241d8116a41047241a40210c9081a20044119460d05200241d8116a200241b00f6a41a40210c9081a41a80210322203450d0620032004360200200341046a200241d8116a41a40210c9081a20012001280204417f6a3602042001280200220128020422044108490d0420012802002205290000210d2001200441786a3602042001200541086a3602004102210a0c020b41002103200241003a00f81102400340200128020022042802042205450d01200241d8116a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00f81120034120470d000b20022900ef112207423888200241f7116a310000220d42088684a7210c2007422888200d42188684a721012007421888a7210b2007421088a72109200241e7116a290000210f20022900df11210d20022800db11210320022f00d911210420022d00d81121052007a721084103210a0c020b200341ff0171450d04200241003a00f8110c040b41002103200241003a00f8110340200128020022042802042205450d02200241d8116a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00f81120034120470d000b200241e7116a290000210f200241f7116a310000210e20022900df11210d20022800db11210320022f00d911210420022d00d811210520022900ef1121072001200128020441016a2206360204200620012802084b0d03200241d8116a200110b20320022802d811210a200241b00f6a200241d8116a41047241a40210c9081a200a4119460d03200241d8116a200241b00f6a41a40210c9081a41a80210322206450d042007421888a7210b2007421088a721092007a721082006200a3602004104210a200641046a200241d8116a41a40210c9081a20012001280204417f6a3602042007422888200e42188684a72201411076210c0b200020093a0022200020043b000a200020053a0009200041183602002000412c6a2006360200200041276a200c3b0000200041256a20013b0000200041236a200b3b0000200041206a20083b0100200041186a200f370200200041106a200d3702002000410c6a2003360200200041086a200a3a0000200041306a20024198056a41f80110c9081a0c280b200341ff0171450d01200241003a00f8110c010b20031083022003102c0b200041193602000c250b1039000b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602000240024002400240024020060e0400010203050b2001280200220428020422054104490d0420042802002206280000210320042005417c6a3602042004200641046a360200200241e0086a200110c60420022802e0082204450d04200241e8086a220b280200210820022802e4082105200241e0086a200110c604024002400240024020022802e00822060d0020050d010c080b20022802e4082109024020012802002201280204220a450d00200b280200210b2001280200220c2d000021122001200a417f6a3602044101210a2001200c41016a3602004100210120120e020302000b02402009450d002006102c0b2005450d070b2004102c0c060b410121010b200241b80a6a41106a200241a0076a41106a280200360200200241b80a6a41086a200241a0076a41086a290200370300200241d8076a41086a200241d0096a41086a290200370300200241d8076a410f6a200241d0096a410f6a29000037000020024198056a41086a200241d8116a41086a29020037030020024198056a41106a200241d8116a41106a29020037030020024198056a41186a200241d8116a41186a290200370300200220022902a0073703b80a200220022902d0093703d807200220022902d81137039805200241b8096a41086a200241a8086a41086a280200360200200241c8086a41086a200241d00d6a41086a280200360200200220022902a8083703b809200220022902d00d3703c8080c030b2001280200220128020422044104490d0320012802002205280000210320012004417c6a3602042001200541046a360200200241b80a6a41086a200241a0076a41086a290200370300200241b80a6a41106a200241a0076a41106a280200360200200241d8076a41086a200241d0096a41086a290200370300200241d8076a410f6a200241d0096a410f6a29000037000020024198056a41186a200241d8116a41186a29020037030020024198056a41106a200241d8116a41106a29020037030020024198056a41086a200241d8116a41086a290200370300200220022902a0073703b80a200220022902d0093703d807200220022902d81137039805200241b8096a41086a200241e0086a41086a280200360200200241c8086a41086a200241a8086a41086a280200360200200220022902e0083703b809200220022902a8083703c8084102210a0c020b2001280200220428020422054104490d0220042802002206280000210320042005417c6a3602042004200641046a360200200241d8116a200110c20420022d00d811410a460d02200241b80a6a41086a200241fc116a290200370300200241b80a6a41106a20024184126a2802003602002002200241f4116a2902003703b80a20024197126a29000021112002418f126a290000210e200241a7126a31000021152002419f126a2900002110200241f2116a2f0100210c200241f1116a2d0000218201200241d8116a41186a2d00002101200241ec116a280200210b200241d8116a41106a2802002109200241e4116a2802002106200241d8116a41086a280200210820024188126a2d0000212020024189126a2f000021212002418b126a280000211c20022802dc11210520022802d8112104200241e7076a200241b7126a290000370000200241d8076a41086a200241b0126a29030037030020024198056a41086a200241d0126a29030037030020024198056a41106a200241d8126a29030037030020024198056a41186a200241e0126a2903003703002002200241a8126a2903003703d8072002200241c8126a29030037039805200241c4126a2802002124200241e8126a2d00002112200241e9126a2f00002113200241ff126a2f0000211d20024181136a2d0000211820024182136a2f0100211b20024184136a2f0100211920024186136a2f01002123200241a0136a28020021292002419c136a280200212820024198136a280200212720024194136a280200212620024190136a28020021252002418c136a280200212220024188136a280200211f200241f7126a290000210f200241ef126a290000210d200241eb126a280000211e200241bf126a3500002107200241c3126a3100002114200241b8096a41086a200241ac136a280200360200200241c8086a41086a200241c4136a2802003602002002200241a4136a2902003703b8092002200241bc136a2902003703c80820072014422086842107200241b0136a280200212a200241b4136a280200212b200241b8136a280200212c4103210a0c010b2001280200220428020422054104490d0120042802002206280000210320042005417c6a3602042004200641046a3602002001280200220528020422064104490d0120052802002208280000210420052006417c6a3602042005200841046a36020020012802002206280204220841034d0d0120062802002209280000210520062008417c6a3602042006200941046a3602002001280200220128020422064104490d0120012802002209280000210820012006417c6a3602044104210a2001200941046a360200200241b80a6a41086a200241a0096a41086a290200370300200241b80a6a41106a200241a0096a41106a280200360200200241d8076a41086a200241f80b6a41086a290200370300200241d8076a410f6a200241f80b6a410f6a29000037000020024198056a41186a200241a0076a41186a29020037030020024198056a41106a200241a0076a41106a29020037030020024198056a41086a200241a0076a41086a290200370300200220022902a0093703b80a200220022902f80b3703d807200220022902a00737039805200241b8096a41086a20024190096a41086a280200360200200241c8086a41086a20024180096a41086a28020036020020022002290290093703b80920022002290280093703c8080b200241880a6a41106a228301200241b80a6a41106a280200360200200241880a6a41086a228401200241b80a6a41086a290300370300200241980b6a41086a228501200241d8076a41086a290300370300200241980b6a410f6a228601200241d8076a410f6a29000037000020024190036a41086a22870120024198056a41086a29030037030020024190036a41106a22880120024198056a41106a29030037030020024190036a41186a22890120024198056a41186a290300370300200220022903b80a3703880a200220022903d8073703980b20022002290398053703900320024190086a41086a228a01200241b8096a41086a280200360200200241e80d6a41086a228b01200241c8086a41086a280200360200200220022903b80937039008200220022903c8083703e80d2000200c3b002a20002082013a0029200041286a20013a0000200041246a200b360200200041206a20093602002000411c6a2006360200200041186a2008360200200041146a2005360200200041106a20043602002000410c6a2003360200200041086a200a36020020004117360200200041df006a20153c0000200041d7006a2010370000200041cf006a2011370000200041c7006a200e370000200041c3006a201c360000200041c1006a20213b0000200041c0006a20203a00002000412c6a20022903880a370200200041346a2084012903003702002000413c6a208301280200360200200041ef006a208601290000370000200041e8006a208501290300370200200041e0006a20022903980b370200200041fb006a20074220883c0000200041f7006a20073e0000200041fc006a202436020020004198016a20890129030037020020004190016a20880129030037020020004188016a20870129030037020020004180016a200229039003370200200041d8016a2029360200200041d4016a2028360200200041d0016a2027360200200041cc016a2026360200200041c8016a2025360200200041c4016a2022360200200041c0016a201f360200200041be016a20233b0100200041bc016a20193b0100200041ba016a201b3b0100200020183a00b901200041b7016a201d3b0000200041af016a200f370000200041a7016a200d370000200041a3016a201e360000200041a1016a20133b0000200041a0016a20123a0000200041e8016a202a360200200041ec016a202b360200200041f0016a202c360200200041e4016a208a01280200360200200041dc016a200229039008370200200041f4016a20022903e80d370200200041fc016a208b0128020036020020004180026a20022903b00f37030020004188026a200241b00f6a41086a29030037030020004190026a200241b00f6a41106a29030037030020004198026a200241b00f6a41186a290300370300200041a0026a200241b00f6a41206a2903003703000c240b200041193602000c230b0240200128020022032802042204450d00200328020022052d0000210820032004417f6a3602042003200541016a3602004102210602400240024002400240024020080e050005010203060b2001280200220328020422054104490d0520032802002206280000210420032005417c6a3602042003200641046a360200200241b00f6a200110c60420022802b00f2203450d0520022902b40f2107200241b00f6a200110c60420022802b00f22050d032007a7450d052003102c0c050b410321060c030b410421060c020b2001280200220128020422034104490d0220012802002205280000210420012003417c6a3602042001200541046a360200410521060c010b20022902b40f210d410121060b20002006360204200041163602002000411c6a200d370200200041186a2005360200200041106a20073702002000410c6a2003360200200041086a2004360200200041246a200241d8116a41840210c9081a0c230b200041193602000c220b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041193602000c210b0240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200024002400240024020060e03000102040b2001280200220328020422054104490d0320032802002206280000210420032005417c6a3602042003200641046a3602002001280200220528020422064104490d0320052802002208280000210320052006417c6a3602042005200841046a3602002001280200220528020422064104490d0320052802002208280000210120052006417c6a3602042005200841046a360200410121050c020b2001280200220128020422034104490d0220012802002205280000210420012003417c6a3602042001200541046a360200410221050c010b2001280200220328020422054104490d0120032802002206280000210420032005417c6a3602042003200641046a3602002001280200220128020422054104490d0120012802002206280000210320012005417c6a3602042001200641046a360200410321050b2000200536020420004114360200200041106a20013602002000410c6a2003360200200041086a2004360200200041146a200241d8116a41940210c9081a0c210b200041193602000c200b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041193602000c1f0b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041193602000c1e0b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041193602000c1d0b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041193602000c1c0b0240200128020022012802042203450d0020012003417f6a3602042001200128020041016a3602000b200041193602000c1b0b02402004450d002008200441d0006c6a2106200821010340200141046a41003602002001280200210520014101360200200141086a2802002203200420031b210402402003450d002004450d002005102c0b200141d0006a22012006470d000b0b200b450d02200b41d0006c450d022008102c0c020b2004450d002002280290032201200441d0006c6a21060340200141046a41003602002001280200210520014101360200200141086a2802002203200420031b210402402003450d002004450d002005102c0b200141d0006a22012006470d000b0b200228029003410020022802940322011b2203450d00200141d0006c450d002003102c0b200041193602000c170b20054100200228029c0522011b2203450d002001410c6c450d002003102c0b2009450d002008102c0b200041193602000c140b2004102c0b200041193602000c120b410021094102210302402004450d002005102c0b410021060b200241d8116a2001108704024002400240024020022802d811450d00200241b00f6a200241d8116a41c00110c9081a200241003a0088122001280200220428020422054110490d032004280200220841086a29000021072008290000210d2004200841106a3602002004200541706a360204200241013a0088122002200d3703d811200220073703e011200128020022042802042205410f4b0d010c020b20090d050c060b2004280200220841086a29000021072008290000210d2004200841106a3602002004200541706a360204200241d8116a41186a22052007370300200241023a0088122002200d3703e8112001280200220428020422084110490d002004280200220b41086a2900002107200b290000210d2004200b41106a360200200241d8116a41286a20073703002004200841706a360204200241033a0088122002200d3703f811200241980b6a41086a200241d8116a41086a290300220f370300200241980b6a41106a200241d8116a41106a290300220e370300200241980b6a41186a20052903002211370300200241980b6a41206a200d370300200241980b6a41286a2007370300200220022903d81122103703980b200241b80a6a41286a22042007370300200241b80a6a41206a2205200d370300200241b80a6a41186a22082011370300200241b80a6a41106a220b200e370300200241b80a6a41086a220a200f370300200220103703b80a200241880a6a41286a2004290300370300200241880a6a41206a2005290300370300200241880a6a41186a2008290300370300200241880a6a41106a200b290300370300200241880a6a41086a200a290300370300200220022903b80a3703880a024002402001280200220428020422054104490d0020042802002208280000211e20042005417c6a3602042004200841046a360200200241e0026a200110880420022f01e0020d0120022f01e202211d200241d8026a200110b00320022802d8020d0120022802dc022123200241d40d6a200241e60f6a2f01003b0100200220022801e20f3602d00d200241d10f6a290000210f200241b00f6a41106a3100002114200241f00f6a2903002111200241e80f6a290300210e200241dc0f6a2f0100210c200241c40f6a280200211820022900c90f210d20022903b80f211520022801de0f210a20022d00db0f211220022f00d90f211320022d00c80f211b20022f01c20f211920022d00c10f210b20022903b00f210720024198056a200241f80f6a41f80010c9081a200241de096a200241880a6a41086a290300370100200241e6096a200241880a6a41106a29030037010041182105200241ee096a200241880a6a41186a290300370100200241f6096a200241880a6a41206a290300370100200241d0096a412e6a200241880a6a41286a2903002210370100200241d8076a412e6a2010370100200220022903880a3701d609200241d8076a41086a200241d0096a41086a290100370300200241d8076a41106a200241d0096a41106a290100370300200241d8076a41186a200241d0096a41186a290100370300200241d8076a41206a200241d0096a41206a290100370300200241d8076a41286a200241d0096a41286a290100370300200220022901d0093703d8072007422088211020074220862006ad8421070c0a0b200241b00f6a10e90120090d050c060b200241b00f6a10e9012009450d050c040b200241003a0088120b200241b00f6a10e90120090d020c030b410021094102210302402004450d002005102c0b410021060b200241d8116a2001108704024002400240024020022802d811450d00200241b00f6a200241d8116a41c00110c9081a200241003a0088122001280200220428020422054110490d032004280200220841086a29000021072008290000210d2004200841106a3602002004200541706a360204200241013a0088122002200d3703d811200220073703e011200128020022042802042205410f4b0d010c020b20090d030c040b2004280200220841086a29000021072008290000210d2004200841106a3602002004200541706a360204200241d8116a41186a22052007370300200241023a0088122002200d3703e8112001280200220428020422084110490d002004280200220b41086a2900002107200b290000210d2004200b41106a360200200241d8116a41286a20073703002004200841706a360204200241033a0088122002200d3703f811200241980b6a41086a200241d8116a41086a290300220f370300200241980b6a41106a200241d8116a41106a290300220e370300200241980b6a41186a20052903002211370300200241980b6a41206a200d370300200241980b6a41286a2007370300200220022903d81122103703980b200241b80a6a41286a22042007370300200241b80a6a41206a2205200d370300200241b80a6a41186a22082011370300200241b80a6a41106a220b200e370300200241b80a6a41086a220a200f370300200220103703b80a200241880a6a41286a2004290300370300200241880a6a41206a2005290300370300200241880a6a41186a2008290300370300200241880a6a41106a200b290300370300200241880a6a41086a200a290300370300200220022903b80a3703880a024002402001280200220428020422054104490d0020042802002208280000211e20042005417c6a3602042004200841046a360200200241c8026a200110880420022f01c8020d0120022f01ca02211d200241c0026a200110b00320022802c0020d0120022802c4022123200241d40d6a200241e60f6a2f01003b0100200220022801e20f3602d00d200241d10f6a290000210f200241b00f6a41106a3100002114200241f00f6a2903002111200241e80f6a290300210e200241dc0f6a2f0100210c200241c40f6a280200211820022900c90f210d20022903b80f211520022801de0f210a20022d00db0f211220022f00d90f211320022d00c80f211b20022f01c20f211920022d00c10f210b20022903b00f210720024198056a200241f80f6a41f80010c9081a200241de096a200241880a6a41086a290300370100200241e6096a200241880a6a41106a290300370100200241ee096a200241880a6a41186a290300370100200241f6096a200241880a6a41206a290300370100200241d0096a412e6a200241880a6a41286a2903002210370100200241d8076a412e6a2010370100200220022903880a3701d609200241d8076a41086a200241d0096a41086a290100370300200241d8076a41106a200241d0096a41106a290100370300200241d8076a41186a200241d0096a41186a290100370300200241d8076a41206a200241d0096a41206a290100370300200241d8076a41286a200241d0096a41286a290100370300200220022901d0093703d8072007422088211020074220862006ad842107411721050c080b200241b00f6a10e90120090d030c040b200241b00f6a10e90120090d020c030b200241003a0088120b200241b00f6a10e9012009450d010b2003102c0b200041193602000c0c0b41042109420021072004450d002001102c0b200241d00d6a41046a200241d0096a41046a2f01003b0100200220022801d0093602d00d20024198056a200241d8116a41f80010c9081a200241d8076a412e6a200241b00f6a412e6a290100370100200241d8076a41286a200241b00f6a41286a290100370300200241d8076a41206a200241b00f6a41206a290100370300200241d8076a41186a200241b00f6a41186a290100370300200241d8076a41106a200241b00f6a41106a290100370300200241d8076a41086a200241b00f6a41086a290100370300200220022901b00f3703d80742002110411221050b200241f80b6a41046a2201200241d00d6a41046a2f01003b0100200220022802d00d3602f80b20024190036a20024198056a41f80010c9081a200241a0076a412e6a2206200241d8076a412e6a290100370100200241a0076a41286a2224200241d8076a41286a290300370300200241a0076a41206a2220200241d8076a41206a290300370300200241a0076a41186a2221200241d8076a41186a290300370300200241a0076a41106a221c200241d8076a41106a290300370300200241a0076a41086a221f200241d8076a41086a290300370300200220022903d8073703a007200041396a200f370000200041316a200d370000200041286a20143c0000200041206a2015370200200041186a2010422086200742208884370200200041106a20074220862009ad84370200200041c6006a200a360100200041c4006a200c3b0100200020123a0043200041c1006a20133b0000200041306a201b3a00002000412c6a2018360200200020193b012a2000200b3a00292000410c6a2003360200200020083b010a200020043a0009200041086a20053a000020004106360200200041d8006a2011370200200041d0006a200e370200200020022802f80b36014a200041ce006a20012f01003b0100200041e0006a20024190036a41f80010c9081a200041e0016a201d3b0100200041dc016a2023360200200041d8016a201e360200200020022903a0073701e201200041ea016a201f290300370100200041f2016a201c290300370100200041fa016a202129030037010020004182026a20202903003701002000418a026a202429030037010020004190026a200629010037010020004198026a20022903e008370300200041a0026a200241e0086a41086a2903003703000c090b2006410020022802d40922011b2203450d00200141f0006c450d002003102c0b200041193602000c070b200041193602000c060b20024198056a200241b00f6a41880210c9081a410221010b20024190036a20024198056a41880210c9081a2000411c6a2003360200200041146a2007370200200041106a20043602002000410c6a2005360200200041086a200136020020004101360200200041206a20024190036a41880210c9081a0c040b0b20004100360200200041186a2005360200200041106a20073702002000410c6a2003360200200041086a2004360200200041206a200241d8116a41880210c9081a0c020b200241b00f6a10c1020b200041193602000b20024180146a24000bd51201057f02400240024002400240024002400240024002400240024020002802000e1800010b0b0b02030b0405060b0b0b070b0b0b0b0b0b0b08090a0b024002400240024002400240200041086a280200417e6a0e080010010210030405100b200041106a2802002201450d0f2000410c6a2802002200450d0f2001450d0f2000102c0f0b200041106a2802002201450d0e2000410c6a2802002200450d0e2001450d0e2000102c0f0b200041106a2802002201450d0d2000410c6a2802002200450d0d2001450d0d2000102c0f0b2000410c6a10c1020f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041106a2802002201450d0b200028020c2200450d0b2001410c6c450d0b2000102c0f0b200041106a2802002201450d0a2000410c6a2802002200450d0a2001450d0a2000102c0f0b02400240200041086a2802000e020b00010b2000412c6a102b2000419c016a102b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0a20002802102200450d0a2001410c6c450d0a2000102c0f0b2000412c6a102b2000419c016a102b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0920002802102200450d092001410c6c450d092000102c0f0b02402000410c6a2802002201450d00200141f0006c2102200028020441046a210103402001102b200141f0006a2101200241907f6a22020d000b0b200041086a2802002201450d0820002802042200450d08200141f0006c450d082000102c0f0b02400240024002400240200041086a2d00000e180c0c0c0c0c0c000c0c0c0c0c0c0c0c010c0c020c0c0c0c03040b200041106a2802002201450d0b2000410c6a2802002200450d0b200141ffffff3f71450d0b2000102c0f0b200041106a2802002201450d0a2000410c6a2802002200450d0a200141ffffff3f71450d0a2000102c0f0b200041146a2802002201450d09200041106a2802002200450d09200141ffffffff0371450d092000102c0f0b0240200041106a2802002201450d002000410c6a2802002202450d00200141ffffffff0771450d002002102c0b200041186a10e9010f0b0240200041106a2802002201450d002000410c6a2802002202450d00200141ffffffff0771450d002002102c0b200041186a10e9010f0b20002802042201450d06200041086a280200450d062001102c0f0b02400240200041086a280200417f6a0e020001070b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0620002802102200450d062001410c6c450d062000102c0f0b0240200041186a2802002202450d00200041106a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041146a2802002201450d0520002802102200450d052001410c6c450d052000102c0f0b02402000410c6a2802002201450d00200041086a2802002202450d002001450d002002102c0b02402000411c6a2802002202450d00200041146a28020021012002410c6c210203400240200141046a280200450d002001280200102c0b2001410c6a2101200241746a22020d000b0b200041186a2802002201450d0420002802142200450d042001410c6c450d042000102c0f0b02402000410c6a2802002202450d0020002802042201200241d0006c6a21030340200141046a41003602002001280200210420014101360200200141086a2802002202200520021b210502402002450d002005450d002004102c0b200141d0006a22012003470d000b0b0240200041086a2802002201450d0020002802042202450d00200141d0006c450d002002102c0b200041106a10c2020f0b20002802044101470d020240200041106a2802002201450d002000410c6a2802002202450d002001450d002002102c0b2000411c6a2802002201450d02200041186a2802002200450d022001450d022000102c0f0b02400240200041086a280200417f6a0e03000301030b0240200041146a2802002201450d00200041106a2802002202450d002001450d002002102c0b200041206a2802002201450d022000411c6a2802002200450d022001450d022000102c0c020b0240024002400240024002400240200041106a2d00000e0700010203040506080b200041146a2802002000411c6a28020010c3020240200041186a2802002201450d0020002802142202450d0020014198026c450d002002102c0b200041206a280200200041286a28020010c402200041246a2802002201450d0720002802202200450d0720014188026c450d072000102c0f0b200041146a2802002000411c6a28020010c3020240200041186a2802002201450d0020002802142202450d0020014198026c450d002002102c0b200041206a280200200041286a28020010c402200041246a2802002201450d0620002802202200450d0620014188026c450d062000102c0f0b200041146a2802002000411c6a28020010c3020240200041186a2802002201450d0020002802142202450d0020014198026c450d002002102c0b200041206a280200200041286a28020010c402200041246a2802002201450d0520002802202200450d0520014188026c450d052000102c0f0b200041146a2802002000411c6a28020010c302200041186a2802002201450d0420002802142200450d0420014198026c450d042000102c0f0b200041186a2802002201450d03200041146a2802002200450d032001450d032000102c0f0b200041186a10a201200041146a220128020010c5022001280200102c0f0b200041186a10a201200041146a220128020010c5022001280200102c0f0b024002400240200041086a2d00000e0403000103020b2000410c6a22012802001083022001280200102c0f0b2000410c6a22012802001083022001280200102c0f0b2000412c6a22012802001083022001280200102c0f0b0bc9840104047f017e057f017e230041106b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802000e19000102030405060708090a0b0c0d0e0f101112131415161718190b2001200141086a22032802004101102f200128020020032802006a41003a00002003200328020041016a22043602000240024002400240024002400240024002400240200041086a280200417f6a0e0a00010203040506070809220b200120044101102f200128020020032802006a41003a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c210b200120044101102f200128020020032802006a41013a00002003200328020041016a3602002000410c6a280200200041146a280200200110bb010c200b200120044101102f200128020020032802006a41023a00002003200328020041016a2204360200200041106a2903002106200120044108102f200128020020032802006a20063700002003200328020041086a3602000c1f0b200120044101102f200128020020032802006a41033a00002003200328020041016a3602002000410c6a280200200041146a280200200110bb010c1e0b200120044101102f200128020020032802006a41043a00002003200328020041016a3602002000410c6a280200200041146a280200200110bb010c1d0b200120044101102f200128020020032802006a41053a00002003200328020041016a36020020012000410c6a1085020c1c0b200120044101102f200128020020032802006a41063a00002003200328020041016a3602002000410c6a28020021032001200041146a2802002204108f012004450d1b2003200441186c6a210403402003280200200341086a280200200110bb012003410c6a280200200341146a280200200110bb01200341186a22032004470d000c1c0b0b200120044101102f200128020020032802006a41073a00002003200328020041016a3602002000410c6a28020021032001200041146a2802002204108f012004450d1a20032004410c6c6a210403402003280200200341086a280200200110bb012003410c6a22032004470d000c1b0b0b200120044101102f200128020020032802006a41083a00002003200328020041016a3602002000410c6a280200200041146a280200200110bb01200041186a2802002104200120032802004104102f200128020020032802006a20043600002003200328020041046a3602000c190b200120044101102f200128020020032802006a41093a00002003200328020041016a3602000c180b2001200141086a22032802004101102f200128020020032802006a41013a00002003200328020041016a220436020002400240200041086a280200417f6a0e020001190b200120044101102f200128020020032802006a41003a00002003200328020041016a2204360200200120044120102f200128020020032802006a220420004188026a290000370000200441186a200041a0026a290000370000200441106a20004198026a290000370000200441086a20004190026a2900003700002003200328020041206a2204360200200041206a2903002106200120044108102f200128020020032802006a20063700002003200328020041086a3602002001200041286a10b507200120004198016a10b50720012000410c6a10ab070c180b200120044101102f200128020020032802006a41013a00002003200328020041016a2204360200200120044120102f200128020020032802006a220420004188026a290000370000200441186a200041a0026a290000370000200441106a20004198026a290000370000200441086a20004190026a2900003700002003200328020041206a2204360200200041206a2903002106200120044108102f200128020020032802006a20063700002003200328020041086a3602002001200041286a10b507200120004198016a10b50720012000410c6a10ab070c170b2001200141086a22032802004101102f200128020020032802006a41023a00002003200328020041016a2204360200200120044101102f200128020020032802006a41003a00002003200328020041016a3602002001200041086a10a6010c160b2001200141086a22032802004101102f200128020020032802006a41033a00002003200328020041016a2205360200200041046a21040240024002400240024020002d0004417f6a0e0500010203041a0b200120054101102f200128020020032802006a41003a00002003200328020041016a2204360200200041086a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c190b200120054101102f200128020020032802006a41013a00002003200328020041016a2205360200200120054120102f200128020020032802006a22052004290001370000200541186a200441196a290000370000200541106a200441116a290000370000200541086a200441096a2900003700002003200328020041206a2204360200200041286a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c180b200120054101102f200128020020032802006a41023a00002003200328020041016a2204360200200041086a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c170b200120054101102f200128020020032802006a41033a00002003200328020041016a2205360200200120054120102f200128020020032802006a22052004290001370000200541186a200441196a290000370000200541106a200441116a290000370000200541086a200441096a2900003700002003200328020041206a2204360200200041286a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a220436020020002d00252105200120044101102f200128020020032802006a20053a00002003200328020041016a3602000c160b200120054101102f200128020020032802006a41043a00002003200328020041016a2204360200200041086a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c150b2001200141086a22032802004101102f200128020020032802006a41043a00002003200328020041016a22053602000240024002400240200041086a22042d0000417f6a0e0400010203180b200120054101102f200128020020032802006a41003a00002003200328020041016a2205360200200120054120102f200128020020032802006a22052004290001370000200541186a200441196a290000370000200541106a200441116a290000370000200541086a200441096a2900003700002003200328020041206a3602002002200041306a3602002002200110e9030c170b200120054101102f200128020020032802006a41013a00002003200328020041016a2205360200200120054120102f200128020020032802006a22052004290001370000200541186a200441196a290000370000200541106a200441116a290000370000200541086a200441096a2900003700002003200328020041206a3602002002200041306a3602002002200110e9032002200041c0006a3602002002200110e9030c160b200120054101102f200128020020032802006a41023a00002003200328020041016a2205360200200120054120102f200128020020032802006a22052004290001370000200541186a200441196a290000370000200541106a200441116a290000370000200541086a200441096a2900003700002003200328020041206a2205360200200120054120102f200128020020032802006a2205200441216a290000370000200541186a200441396a290000370000200541106a200441316a290000370000200541086a200441296a2900003700002003200328020041206a3602002002200041d0006a3602002002200110e9030c150b200120054101102f200128020020032802006a41033a00002003200328020041016a2205360200200120054120102f200128020020032802006a22052004290001370000200541186a200441196a290000370000200541106a200441116a290000370000200541086a200441096a2900003700002003200328020041206a3602002002200041306a3602002002200110e9030c140b2001200141086a22032802004101102f200128020020032802006a41063a00002003200328020041016a2204360200200120044101102f200128020020032802006a41003a00002003200328020041016a3602002000280204210520012000410c6a2802002204108f012004450d13200441f0006c2107034020052104412010322205450d152002422037020420022005360200200241004120102f20022802002208200228020822096a2205200441106a290000370000200541086a200441186a290000370000200541106a200441206a290000370000200541186a200441286a2900003700002002200941206a2205360208200120032802002005102f200128020020032802006a2008200510c9081a2003200328020020056a36020020022802042205200020051b210002402005450d002000450d002008102c0b02400240024002402004280200220541c000490d00200541808001490d012005418080808004490d02200120032802004101102f200128020020032802006a41033a00002003200328020041016a220536020020042802002108200120054104102f200128020020032802006a20083600002003200328020041046a3602000c030b200120032802004101102f200128020020032802006a20054102743a00002003200328020041016a3602000c020b200120032802004102102f200128020020032802006a20054102744101723b00002003200328020041026a3602000c010b200120032802004104102f200128020020032802006a20054102744102723600002003200328020041046a3602000b412010322205450d152002422037020420022005360200200241004120102f20022802002208200228020822096a2205200441306a290000370000200541086a200441386a290000370000200541106a200441c0006a290000370000200541186a200441c8006a2900003700002002200941206a2205360208200120032802002005102f200128020020032802006a2008200510c9081a2003200328020020056a36020020022802042205200a20051b210a02402005450d00200a450d002008102c0b412010322205450d152002422037020420022005360200200241004120102f20022802002208200228020822096a2205200441d0006a290000370000200541086a200441d8006a290000370000200541106a200441e0006a290000370000200541186a200441e8006a2900003700002002200941206a2205360208200120032802002005102f200128020020032802006a2008200510c9081a2003200328020020056a36020020022802042205200b20051b210b02402005450d00200b450d002008102c0b200441f0006a21052001200441046a10aa05200741907f6a22070d000c140b0b2001200141086a22032802004101102f200128020020032802006a41073a00002003200328020041016a2204360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a22052d0000417f6a0e18000102030405060708090a0b0c0d0e0f10111213141516172a0b200120044101102f200128020020032802006a41003a00002003200328020041016a2204360200200120044120102f200128020020032802006a22042005290001370000200441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002003200328020041206a3602002002200041d0006a3602002002200110e9032001200541216a10ae070c290b200120044101102f200128020020032802006a41013a00002003200328020041016a3602002002200041106a3602002002200110e9030c280b200120044101102f200128020020032802006a41023a00002003200328020041016a3602002002200041106a3602002002200110e9030c270b200120044101102f200128020020032802006a41033a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c260b200120044101102f200128020020032802006a41043a00002003200328020041016a22043602000240024002402000410c6a280200220341c000490d00200341808001490d012003418080808004490d02200120044101102f2001280200200141086a22032802006a41033a00002003200328020041016a2204360200200028020c2105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c280b200120044101102f2001280200200141086a22042802006a20034102743a00002004200428020041016a3602000c270b200120044102102f2001280200200141086a22042802006a20034102744101723b00002004200428020041026a3602000c260b200120044104102f2001280200200141086a22042802006a20034102744102723600002004200428020041046a3602000c250b200120044101102f200128020020032802006a41053a00002003200328020041016a3602002000410c6a28020021032001200041146a2802002204108f012004450d2420044105742100200141086a220528020021040340200120044120102f200128020020052802006a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002005200528020041206a2204360200200341206a2103200041606a22000d000c250b0b200120044101102f200128020020032802006a41063a00002003200328020041016a3602000c230b200120044101102f200128020020032802006a41073a00002003200328020041016a3602002001200541016a10ae070c220b200120044101102f200128020020032802006a41083a00002003200328020041016a2204360200200120044120102f200128020020032802006a22042005290001370000200441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002003200328020041206a3602000c210b200120044101102f200128020020032802006a41093a00002003200328020041016a22043602000240024002402000410c6a280200220341c000490d00200341808001490d012003418080808004490d02200120044101102f2001280200200141086a22032802006a41033a00002003200328020041016a2204360200200028020c2105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c230b200120044101102f2001280200200141086a22042802006a20034102743a00002004200428020041016a3602000c220b200120044102102f2001280200200141086a22042802006a20034102744101723b00002004200428020041026a3602000c210b200120044104102f2001280200200141086a22042802006a20034102744102723600002004200428020041046a3602000c200b200120044101102f200128020020032802006a410a3a00002003200328020041016a22043602000240024002402000410c6a280200220341c000490d00200341808001490d012003418080808004490d02200120044101102f2001280200200141086a22032802006a41033a00002003200328020041016a2204360200200028020c2105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c220b200120044101102f2001280200200141086a22042802006a20034102743a00002004200428020041016a3602000c210b200120044102102f2001280200200141086a22042802006a20034102744101723b00002004200428020041026a3602000c200b200120044104102f2001280200200141086a22042802006a20034102744102723600002004200428020041046a3602000c1f0b200120044101102f200128020020032802006a410b3a00002003200328020041016a220436020020052d00012105200120044101102f200128020020032802006a20053a00002003200328020041016a3602000c1e0b200120044101102f200128020020032802006a410c3a00002003200328020041016a3602000c1d0b200120044101102f200128020020032802006a410d3a00002003200328020041016a3602000c1c0b200120044101102f200128020020032802006a410e3a00002003200328020041016a3602002000410c6a28020021032001200041146a2802002204108f012004450d1b20044105742100200141086a220528020021040340200120044120102f200128020020052802006a22042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a2900003700002005200528020041206a2204360200200341206a2103200041606a22000d000c1c0b0b200120044101102f200128020020032802006a410f3a00002003200328020041016a2204360200200120044120102f200128020020032802006a22042005290001370000200441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002003200328020041206a22043602002000412c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c1a0b200120044101102f200128020020032802006a41103a00002003200328020041016a3602000c190b200120044101102f200128020020032802006a41113a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a360200200041106a280200200041186a280200200110d5030c180b200120044101102f200128020020032802006a41123a00002003200328020041016a2204360200200120044120102f200128020020032802006a22042005290001370000200441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002003200328020041206a22043602002000412c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c170b200120044101102f200128020020032802006a41133a00002003200328020041016a3602002002200041106a3602002002200110e9030c160b200120044101102f200128020020032802006a41143a00002003200328020041016a220436020002400240024002402000410c6a280200220341c000490d00200341808001490d012003418080808004490d02200120044101102f2001280200200141086a22032802006a41033a00002003200328020041016a2204360200200028020c2105200120044104102f200128020020032802006a20053600002003200328020041046a22043602000c030b200120044101102f2001280200200141086a22052802006a20034102743a00002005200528020041016a22043602000c020b200120044102102f2001280200200141086a22052802006a20034102744101723b00002005200528020041026a22043602000c010b200120044104102f2001280200200141086a22052802006a20034102744102723600002005200528020041046a22043602000b0240024002402000280210220341c000490d00200341808001490d012003418080808004490d02200120044101102f2001280200200141086a22032802006a41033a00002003200328020041016a220436020020002802102105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c180b200120044101102f2001280200200141086a22042802006a20034102743a00002004200428020041016a3602000c170b200120044102102f2001280200200141086a22042802006a20034102744101723b00002004200428020041026a3602000c160b200120044104102f2001280200200141086a22042802006a20034102744102723600002004200428020041046a3602000c150b200120044101102f200128020020032802006a41153a00002003200328020041016a2204360200200120044120102f200128020020032802006a22042005290001370000200441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002003200328020041206a22043602002000412c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c140b200120044101102f200128020020032802006a41163a00002003200328020041016a36020020012000410c6a10ad072002200041186a109201200228020021052001200328020020022802082204102f200128020020032802006a2005200410c9081a2003200420032802006a2204360200200041dc016a210a200041e8016a210302402002280204450d002005102c200141086a28020021040b200120044130102f2001280200200141086a22042802006a22052003290000370000200541286a200341286a290000370000200541206a200341206a290000370000200541186a200341186a290000370000200541106a200341106a290000370000200541086a200341086a2900003700002004200428020041306a220336020020002802d8012105200120034104102f200128020020042802006a20053600002004200428020041046a3602002001200a10b0070c130b200120044101102f200128020020032802006a41173a00002003200328020041016a36020020012000410c6a10ad072002200041186a109201200228020021052001200328020020022802082204102f200128020020032802006a2005200410c9081a2003200420032802006a2204360200200041dc016a210a200041e8016a210302402002280204450d002005102c200141086a28020021040b200120044130102f2001280200200141086a22042802006a22052003290000370000200541286a200341286a290000370000200541206a200341206a290000370000200541186a200341186a290000370000200541106a200341106a290000370000200541086a200341086a2900003700002004200428020041306a220336020020002802d8012105200120034104102f200128020020042802006a20053600002004200428020041046a3602002001200a10b0070c120b2001200141086a22032802004101102f200128020020032802006a41083a00002003200328020041016a360200200110c0010c110b2001200141086a22032802004101102f200128020020032802006a410a3a00002003200328020041016a220436020002402000280204450d00200120044101102f200128020020032802006a41003a00002003200328020041016a2204360200200120044120102f200128020020032802006a2204200041106a290000370000200441186a200041286a290000370000200441106a200041206a290000370000200441086a200041186a2900003700002003200328020041206a2204360200200120044120102f200128020020032802006a2204200041306a290000370000200441186a200041c8006a290000370000200441106a200041c0006a290000370000200441086a200041386a2900003700002003200328020041206a2204360200200120044120102f200128020020032802006a2204200041d0006a290000370000200441186a200041e8006a290000370000200441106a200041e0006a290000370000200441086a200041d8006a2900003700002003200328020041206a2204360200200120044120102f200128020020032802006a2204200041f0006a290000370000200441186a20004188016a290000370000200441106a20004180016a290000370000200441086a200041f8006a2900003700002003200328020041206a2204360200200120044120102f200128020020032802006a220420004190016a290000370000200441186a200041a8016a290000370000200441106a200041a0016a290000370000200441086a20004198016a2900003700002003200328020041206a2204360200200120044120102f200128020020032802006a2204200041b0016a290000370000200441186a200041c8016a290000370000200441106a200041c0016a290000370000200441086a200041b8016a2900003700002003200328020041206a36020020002802042000410c6a280200200110bb010c110b200120044101102f200128020020032802006a41013a00002003200328020041016a3602000c100b2001200141086a22032802004101102f200128020020032802006a410b3a00002003200328020041016a2204360200024002400240200041086a280200417f6a0e03000102120b200120044101102f200128020020032802006a41003a00002003200328020041016a3602002001200041206a10b40720012000410c6a10ab070c110b200120044101102f200128020020032802006a41013a00002003200328020041016a3602002001200041206a10b40720012000410c6a10ab070c100b200120044101102f200128020020032802006a41023a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a2204360200200041106a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c0f0b2001200141086a22042802004101102f200128020020042802006a410c3a00002004200428020041016a2203360200200120034101102f200128020020042802006a41003a00002004200428020041016a220336020020002802042105200120034104102f200128020020042802006a20053600002004200428020041046a360200200041086a280200200041106a280200200110bb01200041146a280200210320012000411c6a2802002205108f012000412c6a210a02402005450d0020032005410c6c6a210503402003280200200341086a280200200110bb012003410c6a22032005470d000b0b200041206a2802002103200120042802004104102f200128020020042802006a20033600002004200428020041046a2203360200200041246a2802002105200120034104102f200128020020042802006a20053600002004200428020041046a2203360200200041286a2802002105200120034104102f200128020020042802006a20053600002004200428020041046a22033602002001200341c000102f200128020020042802006a2203200a290000370000200341386a200a41386a290000370000200341306a200a41306a290000370000200341286a200a41286a290000370000200341206a200a41206a290000370000200341186a200a41186a290000370000200341106a200a41106a290000370000200341086a200a41086a2900003700002004200428020041c0006a3602000c0e0b2001200141086a22032802004101102f200128020020032802006a410d3a00002003200328020041016a360200200110c0010c0d0b2001200141086a22032802004101102f200128020020032802006a410f3a00002003200328020041016a2204360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a280200417f6a0e24000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223300b200120044101102f200128020020032802006a41003a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c2f0b200120044101102f200128020020032802006a41013a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c2e0b200120044101102f200128020020032802006a41023a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c2d0b200120044101102f200128020020032802006a41033a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c2c0b200120044101102f200128020020032802006a41043a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c2b0b200120044101102f200128020020032802006a41053a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c2a0b200120044101102f200128020020032802006a41063a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c290b200120044101102f200128020020032802006a41073a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c280b200120044101102f200128020020032802006a41083a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c270b200120044101102f200128020020032802006a41093a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c260b200120044101102f200128020020032802006a410a3a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c250b200120044101102f200128020020032802006a410b3a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c240b200120044101102f200128020020032802006a410c3a00002003200328020041016a36020020012000410c6a10be030c230b200120044101102f200128020020032802006a410d3a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c220b200120044101102f200128020020032802006a410e3a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c210b200120044101102f200128020020032802006a410f3a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c200b200120044101102f200128020020032802006a41103a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c1f0b200120044101102f200128020020032802006a41113a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c1e0b200120044101102f200128020020032802006a41123a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c1d0b200120044101102f200128020020032802006a41133a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c1c0b200120044101102f200128020020032802006a41143a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c1b0b200120044101102f200128020020032802006a41153a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c1a0b200120044101102f200128020020032802006a41163a00002003200328020041016a2204360200200041106a2903002106200120044108102f200128020020032802006a20063700002003200328020041086a3602000c190b200120044101102f200128020020032802006a41173a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c180b200120044101102f200128020020032802006a41183a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c170b200120044101102f200128020020032802006a41193a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c160b200120044101102f200128020020032802006a411a3a00002003200328020041016a2204360200200041106a2903002106200041186a290300210c200120044110102f200128020020032802006a2204200c370008200420063700002003200328020041106a3602000c150b200120044101102f200128020020032802006a411b3a00002003200328020041016a2204360200200041106a2903002106200041186a290300210c200120044110102f200128020020032802006a2204200c370008200420063700002003200328020041106a3602000c140b200120044101102f200128020020032802006a411c3a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c130b200120044101102f200128020020032802006a411d3a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c120b200120044101102f200128020020032802006a411e3a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c110b200120044101102f200128020020032802006a411f3a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c100b200120044101102f200128020020032802006a41203a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c0f0b200120044101102f200128020020032802006a41213a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c0e0b200120044101102f200128020020032802006a41223a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c0d0b200120044101102f200128020020032802006a41233a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c0c0b2001200141086a22032802004101102f200128020020032802006a41103a00002003200328020041016a360200200110c0010c0b0b2001200141086a22052802004101102f200128020020052802006a41113a00002005200528020041016a2203360200200120034101102f200128020020052802006a41003a00002005200528020041016a3602002000280204210320012000410c6a2802002204108f0102402004450d002003200441d0006c6a210a03402001200310e3052003410c6a2802002104200120052802004104102f200128020020052802006a20043600002005200528020041046a22043602002001200441c000102f200128020020052802006a2204200341106a290000370000200441386a200341c8006a290000370000200441306a200341c0006a290000370000200441286a200341386a290000370000200441206a200341306a290000370000200441186a200341286a290000370000200441106a200341206a290000370000200441086a200341186a2900003700002005200528020041c0006a360200200a200341d0006a2203470d000b0b200028021021082001200041186a2802002203108f012003450d0a2008200341b4026c6a2109200141086a210403402001200810c804200841e4016a200110b505200828029c022105200120082802a4022203108f01200841b4026a210702402003450d00200341c1006c210a034020052d00002100200120042802004101102f200541016a2103200128020020042802006a210b0240024020004101460d00200b41013a00002004200428020041016a22003602002001200041c000102f200128020020042802006a22002003290000370000200041386a200341386a290000370000200041306a200341306a290000370000200041286a200341286a290000370000200041206a200341206a290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a2900003700000c010b200b41023a00002004200428020041016a22003602002001200041c000102f200128020020042802006a22002003290000370000200041386a200341386a290000370000200041306a200341306a290000370000200041286a200341286a290000370000200041206a200341206a290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a2900003700000b200541c1006a21052004200428020041c0006a360200200a41bf7f6a220a0d000b0b2001200841a8026a10e3052007210820072009470d000c0b0b0b2001200141086a22032802004101102f200128020020032802006a41123a00002003200328020041016a360200200110c0010c090b2001200141086a22032802004101102f200128020020032802006a41133a00002003200328020041016a360200200110c0010c080b2001200141086a22032802004101102f200128020020032802006a41143a00002003200328020041016a360200200110c0010c070b2001200141086a22032802004101102f200128020020032802006a41153a00002003200328020041016a360200200110c0010c060b2001200141086a22032802004101102f200128020020032802006a41163a00002003200328020041016a360200200110c0010c050b2001200141086a22032802004101102f200128020020032802006a41173a00002003200328020041016a22043602000240024002402000280204417f6a0e03000102070b200120044101102f200128020020032802006a41003a00002003200328020041016a2204360200200041086a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a2204360200200041106a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c060b200120044101102f200128020020032802006a41013a00002003200328020041016a2204360200200041086a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c050b200120044101102f200128020020032802006a41023a00002003200328020041016a2204360200200041086a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c040b2001200141086a22032802004101102f200128020020032802006a41183a00002003200328020041016a360200200110c0010c030b2001200141086a22032802004101102f200128020020032802006a41193a00002003200328020041016a2204360200024002400240024002402000280204417f6a0e050001020304070b200120044101102f200128020020032802006a41003a00002003200328020041016a2204360200200041086a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602002000410c6a280200200041146a280200200110bb01200041186a280200200041206a280200200110bb010c060b200120044101102f200128020020032802006a41013a00002003200328020041016a3602000c050b200120044101102f200128020020032802006a41023a00002003200328020041016a3602000c040b200120044101102f200128020020032802006a41033a00002003200328020041016a3602000c030b200120044101102f200128020020032802006a41043a00002003200328020041016a2204360200200041086a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c020b2001200141086a22032802004101102f200128020020032802006a411a3a00002003200328020041016a22043602000240024002400240200041086a280200417f6a0e0400010203050b200120044101102f200128020020032802006a41003a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a360200200041106a280200200041186a280200200110bb012000411c6a280200200041246a280200200110bb01200041286a2d00002104200120032802004101102f200128020020032802006a20043a00002003200328020041016a3602000c040b200120044101102f200128020020032802006a41013a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c030b200120044101102f200128020020032802006a41023a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a2204360200200120044101102f200128020020032802006a41003a00002003200328020041016a360200200041106a200110f6020c020b200120044101102f200128020020032802006a41033a00002003200328020041016a22043602002000410c6a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a2204360200200041106a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a2204360200200041146a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a2204360200200041186a2802002105200120044104102f200128020020032802006a20053600002003200328020041046a3602000c010b2001200141086a22032802004101102f200128020020032802006a411b3a00002003200328020041016a22053602000240024002400240200041086a22042d0000417f6a0e0400010203040b200120054101102f200128020020032802006a41003a00002003200328020041016a3602002000410c6a280200200110b4030c030b200120054101102f200128020020032802006a41013a00002003200328020041016a3602002000410c6a280200200110b403200041106a2903002106200120032802004108102f200128020020032802006a20063700002003200328020041086a3602000c020b200120054101102f200128020020032802006a41023a00002003200328020041016a2205360200200120054120102f200128020020032802006a22012004290001370000200141186a200441196a290000370000200141106a200441116a290000370000200141086a200441096a2900003700002003200328020041206a3602000c010b200120054101102f200128020020032802006a41033a00002003200328020041016a2205360200200120054120102f200128020020032802006a22052004290001370000200541186a200441196a290000370000200541106a200441116a290000370000200541086a200441096a2900003700002003200328020041206a3602002000412c6a280200200110b4030b200241106a24000f0b1039000bf90305017f027e017f017e027f230041106b220224000240024020002903004201520d00200041106a2903002103200029030821042001200141086a22052802004102102f200128020020052802006a20032004420c882206420120064201561b80a741047420047aa7417f6a22074101200741014b1b2207410f2007410f491b723b00002005200528020041026a22073602000c010b2001200141086a22052802004101102f200128020020052802006a41003a00002005200528020041016a22073602000b02400240024002402000280218220541c000490d00200541808001490d012005418080808004490d02200120074101102f2001280200200141086a22052802006a41033a00002005200528020041016a220736020020002802182108200120074104102f200128020020052802006a20083600002005200528020041046a3602000c030b200120074101102f2001280200200141086a22072802006a20054102743a00002007200728020041016a3602000c020b200120074102102f2001280200200141086a22072802006a20054102744101723b00002007200728020041026a3602000c010b200120074104102f2001280200200141086a22072802006a20054102744102723600002007200728020041046a3602000b2002200041206a36020c2002410c6a200110e903200241106a24000b8c0301017f23004190016b22042400024002400240024020002d00000e03000102000b200441206a41186a200341186a290000370300200441206a41106a200341106a290000370300200441206a41086a200341086a29000037030020042003290000370320200041016a20012002200441206a10a60521000c020b200441206a41186a200341186a290000370300200441206a41106a200341106a290000370300200441206a41086a200341086a29000037030020042003290000370320200041016a20012002200441206a102d21000c010b200420012002109a0141012101200441206a200041016a200410a7054100210020042d00200d00200441c8006a41206a200441206a41216a2d00003a0000200441e0006a200441396a290000370300200441d8006a200441316a290000370300200441d0006a200441296a29000037030020042004290021370348200441f0006a200441c8006a4121109a0102402003200441f0006a460d00200441f0006a2003412010cc084521010b200121000b20044190016a240020000bff1b050b7f017e017f037e107f230041f0026b22022400200241a0016a2203420037030020024198016a2204420037030020024188016a41086a220542003703002002420037038801200241d8006a41ac95c400410d10c5012005200241d8006a41086a22062900003703002002200229005837038801200241306a41c695c400410c10c5012003200241306a41086a220729000037030020042002290030370300200241c0016a20024188016a10f50220022802fc01210820022802980221092003420037030020044200370300200542003703002002420037038801200241d8006a41c1dcc700410610c501200520062900003703002002200229005837038801200241306a4196a4c600410610c5012003200729000037030020042002290030370300200220024188016a412010c6012002280204210a2002280200210b200241d8006a41f1ddc700410510c501200241306a418cffc000410510c501200220013602b001200241286a200241b0016a410410c701200241c0016a410c6a200241b0016a41046a3602002002200241286a41086a220c3602c4012002200241b0016a3602c8012002200241286a3602c00120024188016a200241c0016a107e02400240200228029001220341206a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b200241003602c801200220043602c401200220053602c001200241c0016a4100411010c80120022802c00120022802c80122046a22052002290058370000200541086a200241d8006a41086a2900003700002002200441106a22043602c801200241c0016a2004411010c80120022802c00120022802c80122046a22052002290030370000200541086a200241306a41086a2900003700002002200441106a22053602c8012002280288012104200241c0016a2005200310c80120022802c001220520022802c80122066a2004200310c9081a2002200620036a22033602c8010240200228028c01450d002004102c0b20024188016a2005200310b803200229028c01210d200228028801210e024020022802c401450d002005102c0b0240024002400240200e450d00200241d8006a4187dec700410410c501200241306a41ecb1c500411810c50120022001360278200241b0016a200241f8006a410410c701200241cc016a200241f8006a41046a3602002002200241b8016a3602c4012002200241f8006a3602c8012002200241b0016a3602c00120024188016a200241c0016a107e200228029001220341206a2204417f4c0d040240024020040d00410121050c010b200410322205450d060b200241003602c801200220043602c401200220053602c001200241c0016a4100411010c80120022802c00120022802c80122046a22052002290058370000200541086a200241d8006a41086a2900003700002002200441106a22043602c801200241c0016a2004411010c80120022802c00120022802c80122046a22052002290030370000200541086a200241306a41086a2900003700002002200441106a22053602c8012002280288012104200241c0016a2005200310c80120022802c001220520022802c80122066a2004200310c9081a2002200620036a22033602c8010240200228028c01450d002004102c0b20024188016a2005200310b903200229028c01420020022802880122041b210f024020022802c401450d002005102c0b200f422088221042247e2211422088a70d042011a72203417f4c0d040240024020030d00410421120c010b200310322212450d060b2004410420041b2113200341246e211402402010a722030d00410021070c030b20034102742115200241f5016a21034100211641002117410121182013211903402019280200211a200241d8006a4187dec700410410c501200241306a41acb1c500410c10c501200241003602b801200242013703b001200241b0016a41004104102f20022802b00120022802b80122046a201a3600002002200441046a22043602b801200241b0016a20044104102f20022802b001220420022802b80122056a20013600002002200541046a22053602b801200241286a2004200510c7012002200420056a3602940120022004360290012002200c36028c012002200241286a36028801200241f8006a20024188016a107e024020022802b401450d002004102c0b200228028001220441206a2205417f4c0d050240024020050d00410121060c010b200510322206450d070b200241003602b801200220053602b401200220063602b001200241b0016a4100411010c80120022802b00120022802b80122056a22062002290058370000200641086a200241d8006a41086a221b2900003700002002200541106a22053602b801200241b0016a2005411010c80120022802b00120022802b80122056a22062002290030370000200641086a200241306a41086a221c2900003700002002200541106a22063602b80120022802782105200241b0016a2006200410c80120022802b001221d20022802b80122066a2005200410c9081a2002200620046a22043602b8010240200228027c450d002005102c0b200241c0016a201d200410f30220024188016a41086a2205200341086a29000037030020024188016a41106a2206200341106a29000037030020024188016a41186a2207200341186a29000037030020024188016a411f6a22042003411f6a2800003600002002200329000037038801024020022d00f401221e410246221f0d00200241306a411f6a2004280000360000200241306a41186a2007290300370300200241306a41106a2006290300370300201c200529030037030020022002290388013703300b024020022802b401450d00201d102c0b200241c0016a411f6a200241306a411f6a280000360000200241c0016a41186a2204200241306a41186a290300370300200241c0016a41106a221d200241306a41106a290300370300200241c0016a41086a2220201c290300370300200220022903303703c0014100211c0240201f0d00200720042903003703002006201d29030037030020052020290300370300200220022903c00137038801201e211c0b2018417f6a211f20044200370300201d420037030020204200370300200242003703c00102400240201c4101460d00200241d8006a41186a2004290300370300200241d8006a41106a201d290300370300201b2020290300370300200220022903c0013703580c010b200241d8006a41186a2007290300370300200241d8006a41106a2006290300370300201b200529030037030020022002290388013703580b2007200241d8006a41186a2903003703002006200241d8006a41106a2903003703002005201b29030037030020022002290358370388010240201f2014470d0020172018201720184b1b22044104200441044b1bad42247e2210422088a70d0641000d062010a722044100480d062016202120171b21210240024002402012410020171b221b0d0020040d01410421120c020b024020210d0020040d01410421120c020b201b2021200410352212450d090c010b200410322212450d080b200441246e21140b201941046a2119201220166a2204201a360200200441046a2002290388013702002004410c6a2005290300370200200441146a20062903003702002004411c6a2007290300370200201641246a2116201741026a2117201841016a21182015417c6a2215450d020c000b0b200041003602000c020b2018417f6a21070b0240200fa72203450d00200341ffffffff0371450d002013102c0b200241d8006a4181dec700410310c501200241306a4198c2c000411910c501200220013602b001200241286a200241b0016a410410c701200241cc016a200241b0016a41046a3602002002200c3602c4012002200241b0016a3602c8012002200241286a3602c00120024188016a200241c0016a107e200228029001220341206a2204417f4c0d010240024020040d00410121050c010b200410322205450d030b200241003602b801200220043602b401200220053602b001200241b0016a4100411010c80120022802b00120022802b80122046a22052002290058370000200541086a200241d8006a41086a2900003700002002200441106a22043602b801200241b0016a2004411010c80120022802b00120022802b80122046a22052002290030370000200541086a200241306a41086a2900003700002002200441106a22053602b8012002280288012104200241b0016a2005200310c80120022802b001220520022802b80122066a2004200310c9081a2002200620036a22033602b8010240200228028c01450d002004102c0b20094102462104200a417f6a2106200241c0016a2005200310c90120024188016a41086a200241c9016a29000037030020024188016a41106a200241d1016a29000037030020024188016a41186a2203200241d9016a290000370300200220022900c101370388010240024020022d00c0014101460d00200241086a41186a4200370300200241186a4200370300200241106a4200370300200242003703080c010b200241086a41186a2003290300370300200241086a41106a20024188016a41106a290300370300200241086a41086a20024188016a41086a29030037030020022002290388013703080b4100200820041b21032006417f200b1b2104024020022802b401450d002005102c0b2000200d3702042000200e3602002000411c6a2003360200200041186a2007360200200041146a2014360200200041106a20123602002000410c6a2004360200200041206a2002290308370200200041286a200241106a290300370200200041306a200241086a41106a290300370200200041386a200241086a41186a2903003702000b200241f0026a24000f0b103b000b1039000ba80201027f230041e0006b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00200041003602000c010b200328021421022003200341186a28020036022420032001360220200341c8006a200341206a108a0202400240200328024822040d0020034100360230200342013703282003410f36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341b4bcc3003602482003200341386a360258200341c4006a41dcb7c000200341c8006a103e1a200335023042208620033502288410000240200328022c450d002003280228102c0b200041003602000c010b2000200329024c370204200020043602000b2002450d002001102c0b200341e0006a24000bb60201017f230041e0006b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00200041003602000c010b200328021421022003200341106a41086a28020036022420032001360220200341c8006a200341206a10f8040240024020032802480d0020034100360230200342013703282003410f36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341b4bcc3003602482003200341386a360258200341c4006a41dcb7c000200341c8006a103e1a200335023042208620033502288410000240200328022c450d002003280228102c0b200041003602000c010b20002003290348370200200041086a200341c8006a41086a2802003602000b2002450d002001102c0b200341e0006a24000bbd0b02067f017e230041f0006b22042400200441d0006a41f1ddc700410510c501200441186a4185f6c000410c10c5012004200036026c200441086a200441ec006a410410c701200441306a410c6a200441ec006a41046a3602002004200441106a3602342004200441ec006a3602382004200441086a360230200441e0006a200441306a107e02400240024002400240024002402004280268220541206a2206417f4c0d000240024020060d00410121070c010b200610322207450d020b200441003602102004200636020c20042007360208200441086a4100411010c8012004280208200428021022066a22072004290050370000200741086a200441d0006a41086a22082900003700002004200641106a2206360210200441086a2006411010c8012004280208200428021022066a22072004290018370000200741086a200441186a41086a2900003700002004200641106a220636021020042802602109200441086a2006200510c80120042802082206200428021022076a2009200510c9081a2004200720056a220736021002402004280264450d002009102c0b200441306a2006200710bb032008200441306a41086a2802003602002004200429033037035002400240200428023c22094102470d0041002108200441003602202004420437031841002105410021090c010b200441286a2004280240360200200441186a41086a200441d0006a41086a280200220536020020042004290350370318200428021c21080b20042009360224024020052008470d00200441186a200810bc03200428022021050b200428021820054103746a22092002360204200920013602002004200541016a360220200441386a2004290320370300200441306a41106a200441186a41106a2802003602002004200429031837033002400240200428023c4102470d002006200710b4010c010b2004410036025820044201370350200441d0006a200441306a10bd03200441d0006a2004413c6a10be032006200720042802502205200428025810a70202402004280254450d002005102c0b200428023441ffffffff0171450d002004280230102c0b0240200428020c450d002006102c0b200441186a41086a200341086a28020036020020042003290200370318200441306a2000200110bf03200428023022052004280238200441186a108a0302402004280234450d002005102c0b0240200428021c450d002004280218102c0b200441e0006a10c00341002105200428026021090240200428026822080e020403000b4100210520082106034020052006410176220320056a2207200920074103746a41046a28020020014b1b2105200620036b220641014b0d000c030b0b103b000b1039000b20082005200920054103746a41046a2802002001496a2205490d010b024020082004280264470d00200441e0006a200810bc03200428026021090b200920054103746a220641086a2006200820056b41037410ca081a20062002360204200620003602002004200841016a2205360268200441d0006a41086a200536020020042004290360220a370350200aa722050d01200441c8006a22054200370300200441c0006a22064200370300200441306a41086a2203420037030020044200370330200441186a41f1ddc700410510c5012003200441186a41086a220729000037030020042004290018370330200441186a41eef5c000410f10c5012005200729000037030020062004290018370300200441306a412010b4010c020b200520081044000b200441c8006a22064200370300200441c0006a22034200370300200441306a41086a2207420037030020044200370330200441186a41f1ddc700410510c5012007200441186a41086a220129000037030020042004290018370330200441186a41eef5c000410f10c5012006200129000037030020032004290018370300200441306a200441d0006a10c103200428025441ffffffff0171450d002005102c0b200441f0006a24004280a7f2a6010be705010a7f230041e0006b220324002003200236020c20032001360208200341106a2001200210b3010240024002400240200328021022040d002000410236020c0c010b200328021421052003200341186a280200360224200320043602202003200341206a1087020240024020032802000d002003280204220620032802244103762201200120064b1b22074103742201417f4c0d030240024020070d00410421080c010b200110322208450d050b41002101200341003602502003200736024c20032008360248024002400240024002402006450d00410021010340200328022422074104490d022003280220220228000021092003200241046a36022020032007417c6a220a360224200a4104490d022002280004210a2003200741786a3602242003200241086a36022002402001200328024c470d00200341c8006a200110bc0320032802502101200328024821080b200820014103746a2202200a360204200220093602002003200141016a22013602502006417f6a22060d000b200328024c2107200328024821080b2008450d0420032802242206450d032003280220220a2d0000210920032006417f6a220b3602242003200a41016a3602204100210220090e020201030b200328024c41ffffffff0171450d032003280248102c0c030b200b4104490d01200a280001210c20032006417b6a3602242003200a41056a360220410121020b2000200c3602102000200136020820002007360204200020083602000c020b200741ffffffff0171450d002008102c0b20034100360230200342013703282003410f36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341b4bcc3003602482003200341386a360258200341c4006a41dcb7c000200341c8006a103e1a200335023042208620033502288410000240200328022c450d002003280228102c0b410221020b2000200236020c2005450d002004102c0b200341e0006a24000f0b103b000b1039000bd30101037f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1b220241ffffffff017122042002470d02200241037422034100480d0220042002464102742104024002400240024002402000280200410020011b22020d002003450d010c030b200141037422010d0120030d020b200421010c020b200220012003103522010d010c030b200310322201450d020b20002001360200200041046a20034103763602000b0f0b2004450d001039000b103b000ba30101047f20012802002102200020012802082201108f0102402001450d00200220014103746a2103200041086a22012802002104034020022802002105200020044104102f200028020020012802006a20053600002001200128020041046a2204360200200241046a2802002105200020044104102f200028020020012802006a20053600002001200128020041046a2204360200200241086a22022003470d000b0b0b9a0101027f024020012802004101460d002000200041086a22022802004101102f200028020020022802006a41003a00002002200228020041016a3602000f0b2000200041086a22022802004101102f200028020020022802006a41013a00002002200228020041016a220336020020012802042101200020034104102f200028020020022802006a20013600002002200228020041046a3602000b830401047f230041e0006b22032400200341086a41f1ddc700410510c501200341186a41fdf5c000410810c50102400240410410322204450d002003420437023c20032004360238200341386a41004104102f2003280238200328024022046a20013600002003200441046a2201360240200341386a20014104102f20032802382201200328024022046a20023600002003200441046a2202360240200341c8006a2001200210c701200341dc006a200120026a360200200320013602582003200341c8006a41086a3602542003200341c8006a360250200341286a200341d0006a107e0240200328023c450d002001102c0b2003280230220241206a2201417f4c0d010240024020010d00410121040c010b200110322204450d010b2000200136020420002004360200200041086a2201410036020020004100411010c8012000280200200128020022046a220520032900083700002001200441106a2204360200200541086a200341086a41086a29000037000020002004411010c8012000280200200128020022046a220520032900183700002001200441106a2206360200200541086a200341186a41086a2900003700002003280228210420002006200210c8012000280200200128020022006a2004200210c9081a2001200020026a3602000240200328022c450d002004102c0b200341e0006a24000f0b1039000b103b000be105020a7f017e23004180016b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41f1ddc700410510c501200141e8006a41eef5c000410f10c5012002200141e8006a41086a290000370300200320012900683703002001412036022c2001200141086a360228200141306a200141086a412010b3010240024002400240200128023022040d00410021050c010b200128023421062001200141306a41086a280200360244200120043602402001200141c0006a1087020240024020012802000d002001280204220720012802444103762202200220074b1b22034103742202417f4c0d030240024020030d00410421050c010b200210322205450d050b41002102200141003602702001200336026c20012005360268024002402007450d000340200128024422084104490d022001280240220328000021092001200341046a36024020012008417c6a220a360244200a4104490d022003280004210a2001200841786a3602442001200341086a36024002402002200128026c470d00200141e8006a200210bc0320012802702102200128026821050b200520024103746a2203200a360204200320093602002001200241016a22023602702007417f6a22070d000b200128026821050b200129026c210b2005450d010c020b0240200128026c41ffffffff0171450d002001280268102c0b0b4100210520014100360250200142013703482001410f36025c2001200141286a3602582001200141c8006a360264200141fc006a41013602002001420137026c200141b4bcc3003602682001200141d8006a360278200141e4006a41dcb7c000200141e8006a103e1a20013502504220862001350248841000200128024c450d002001280248102c0b2006450d002004102c0b0240024020050d0020004100360208200042043702000c010b2000200b370204200020053602000b20014180016a24000f0b103b000b1039000b940201057f230041106b2202240002400240200128020822034103744104722204417f4c0d0020012802002101200410322205450d0120024100360208200220043602042002200536020020022003108f010240024020030d0020022802002105200228020821030c010b200120034103746a210620022802082103034020012802002104200220034104102f2002280200200228020822036a20043600002002200341046a2203360208200141046a2802002104200220034104102f20022802002205200228020822036a20043600002002200341046a2203360208200141086a22012006470d000b0b200041202005200310a70202402002280204450d002005102c0b200241106a24000f0b103b000b1039000b3400200041f1ddc70036020420004100360200200041146a410c360200200041106a41a4f6c000360200200041086a42053702000b4401017f230041206b22022400200041003602082000420137020020024200370310200242043703082000200241086a10bd032000200241146a10be03200241206a24000b09002000410010c5030b5001017f02404101103222020d001039000b2000420137020420002002360200200041004101102f2000280200200041086a220028020022026a200141ff01714101463a00002000200241016a3602000b2901017f230041106b2202240020024100360208200242043703002000200210c703200241106a24000bbc0101047f024002402001280208220241027441046a2203417f4c0d00200128020021010240024020030d00410121040c010b200310322204450d020b2000200336020420002004360200200041086a2203410036020020002002108f0102402002450d002002410274210220032802002104034020012802002105200020044104102f2000280200200328020022046a20053600002003200441046a2204360200200141046a21012002417c6a22020d000b0b0f0b103b000b1039000bed0701057f230041e0006b22022400200241306a41f1ddc700410510c501200241c0006a4191f6c000411210c5012002200136025c200241206a200241dc006a410410c701200241146a200241dc006a41046a3602002002200241286a36020c2002200241dc006a3602102002200241206a360208200241d0006a200241086a107e024002402002280258220341206a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b200241003602102002200436020c20022005360208200241086a4100411010c8012002280208200228021022046a22052002290030370000200541086a200241306a41086a2900003700002002200441106a2204360210200241086a2004411010c8012002280208200228021022046a22052002290040370000200541086a200241c0006a41086a2900003700002002200441106a220536021020022802502104200241086a2005200310c80120022802082205200228021022066a2004200310c9081a2002200620036a220336021002402002280254450d002004102c0b20022005200310c60120022802042103200228020021060240200228020c450d002005102c0b41012104024020064101460d00200241306a41f1ddc700410510c501200241c0006a4185f6c000410c10c5012002200136025c200241206a200241dc006a410410c701200241086a410c6a200241dc006a41046a3602002002200241286a36020c2002200241dc006a3602102002200241206a360208200241d0006a200241086a107e2002280258220341206a2204417f4c0d010240024020040d00410121050c010b200410322205450d030b200241003602282002200436022420022005360220200241206a4100411010c8012002280220200228022822046a22052002290030370000200541086a200241306a41086a2900003700002002200441106a2204360228200241206a2004411010c8012002280220200228022822046a22052002290040370000200541086a200241c0006a41086a2900003700002002200441106a220536022820022802502104200241206a2005200310c80120022802202205200228022822016a2004200310c9081a2002200120036a220336022802402002280254450d002004102c0b200241086a2005200310bb0320022802082101200228020c210641002002280210200228021441024622031b210402402002280224450d002005102c0b4104200120031b21054100200620031b21010240024020040d00410021040c010b200441037420056a41786a2802002103410121040b2001450d002005450d00200141ffffffff0171450d002005102c0b2000200336020420002004360200200241e0006a24000f0b103b000b1039000baa02010a7f230041206b22022400200241106a2001108a0202400240200228021022030d00200041023a00180c010b200241186a2204280200210520022802142106200241106a2001108a020240200228021022070d00200041023a00182006450d012003102c0c010b20022802142108024020012802042209450d002004280200210a200128020022042d0000210b20012009417f6a3602042001200441016a3602004100210102400240200b0e020100020b410121010b200020013a00182000200a360214200020083602102000200736020c200020053602082000200636020420002003360200200020022f000d3b00192000411b6a2002410f6a2d00003a00000c010b200041023a001802402008450d002007102c0b2006450d002003102c0b200241206a24000bc80502097f037e23004180026b2202240020022001108702024002402002280200450d00200041003602000c010b0240024002402002280204220320012802044105762204200420034b1b22044105742205417f4c0d000240024020040d00410121060c010b200510322206450d020b41002107200241003602102002200436020c20022006360208024002402003450d0041002108034041002105200241003a00b801200841016a21082001280204417f6a210403402004417f460d0320024198016a20056a200128020022092d00003a0000200120043602042001200941016a3602002002200541016a22093a00b8012004417f6a21042009210520094120470d000b200241c0016a41086a220420024198016a41086a290300370300200241c0016a41106a220520024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200941ff0171411f4d0d05200241386a41086a2004290300220b370300200241386a41106a2005290300220c370300200241386a41186a200a290300220d370300200241186a41186a2205200d370300200241186a41106a2209200c370300200241186a41086a220a200b370300200220022903c001220b3703582002200b3703382002200b37031802402007200228020c470d00200241086a2007410110d60120022802082106200228021021070b200620074105746a22042002290318370000200441186a2005290300370000200441106a2009290300370000200441086a200a2903003700002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c040b200541ff0171450d02200241003a00b8010c020b103b000b1039000b2000410036020020064100200228020c22041b2201450d00200441ffffff3f71450d002001102c0b20024180026a24000bc40202047f027e230041d0006b220224002002412036020420022001360200200241086a2001412010b30102400240200228020822010d00200042023703000c010b200228020c210302400240200241106a28020022044104490d0020044104460d0020012800002105420021060240024020012d00040e020100020b2004417b6a4108490d0120012900052107420121060b20002007370308200041106a20053602000c010b20024100360220200242013703182002410f36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c200241b4bcc3003602382002200241286a360248200241346a41dcb7c000200241386a103e1a200235022042208620023502188410000240200228021c450d002002280218102c0b420221060b200020063703002003450d002001102c0b200241d0006a24000bcb0a020f7f047e230041c0046b220324002003200236021420032001360210200341186a2001200210b30102400240200328021822040d00200041003602000c010b200328021c21052003200341206a280200220136022c200320043602280240024020014104490d002004280000210620032001417c6a36022c2003200441046a360228200341086a200341286a10870220032802080d00200328020c2107410021082003410036024820034100360240024002402007450d00200341b0016a41106a2109200341b6046a210a034041002101200341003a00d001200841016a2108200328022c210b417f210202400240024002400340200b2001460d01200341b0016a20016a2003280228220c2d00003a00002003200b20026a36022c2003200c41016a3602282003200141016a220d3a00d0012002417f6a2102200d2101200d4120470d000b20034190046a41186a2202200341b0016a41186a29030037030020034190046a41106a220e200929030037030020034190046a41086a220f200341b0016a41086a290300370300200320032903b00137039004200d41ff01714120490d01200341f0006a41086a2201200f290300370300200341f0006a41106a2210200e290300370300200341f0006a41186a221120022903003703002003200329039004370370200b200d6b220d4104490d01200341d0006a41086a20012903002212370300200341d0006a41106a20102903002213370300200341d0006a41186a20112903002214370300200320032903702215370350200c280001210b2003200c41056a3602282003200d417c6a36022c20034190016a41186a220c201437030020034190016a41106a2210201337030020034190016a41086a22112012370300200320153703900120032802402201450d022003280244210d0c030b200141ff0171450d00200341003a00d0010b200341b0016a41086a200341c0006a41086a280200360200200320032903403703b001200341b0016a10cf030c050b41940310322201450d034100210d200141003602002001200329029004370204200141003b01322001410c6a200f290200370200200141146a200e2902003702002001411c6a2002290200370200200141246a20034190046a41206a2902003702002001412a6a200a290100370100200141346a200341b0016a41e00210c9081a20034100360244200320013602400b200341b0016a200d200120034190016a10900220032802bc01210120032802b801210d0240024020032802b0014101470d00200f20112903002212370300200e201029030022133703002002200c2903002214370300200320032903900122153703900420032802b401210220092015370200200941086a2012370200200941106a2013370200200941186a2014370200200320013602b8012003200d3602b401200320023602b0012003200341c0006a3602bc01200341b0016a200b10cd031a0c010b200d20014102746a41046a200b3602000b20082007470d000b0b20034190046a41086a200341c0006a41086a28020022013602002003200329034022123703900420002006360204200041086a2012370200200041106a2001360200410121010c020b1039000b41002101200341003602980420034201370390042003410f360294012003200341106a36029001200320034190046a360270200341c4016a4101360200200342013702b401200341b4bcc3003602b001200320034190016a3602c001200341f0006a41dcb7c000200341b0016a103e1a200335029804422086200335029004841000200328029404450d00200328029004102c0b200020013602002005450d002004102c0b200341c0046a24000ba11903177f047e097f230041c0046b22022400200028020821032000280200210420002802042105200241c0006a41186a2206200041286a290000370300200241c0006a41106a2207200041206a290000370300200241c0006a41086a2208200041186a290000370300200220002900103703400240024002400240024002400240024020052f01322209410b490d00410521064100210a02400240200341054f0d0041042106200321070c010b41052107024002402003417b6a0e020201000b200341796a21074101210a410621060c010b410021074101210a0b4194031032220b450d03200b4100360200200b200229028001370204200b41003b0132200b410c6a20024180016a41086a2208290200370200200b41146a20024180016a41106a2209290200370200200b411c6a20024180016a41186a220c290200370200200b41246a200241a0016a220d290200370200200b412a6a200241a6016a220e290100370100200b41346a200241b0016a41e00210c908210f200241e0006a41086a2210200541346a221120064105746a220341086a290000370300200241e0006a41106a2212200341106a290000370300200241e0006a41186a2213200341186a29000037030020022003290000370360200541046a221420064102746a2802002115200f2011200641016a22164105746a20052f01322006417f736a220341057410c9081a200b41046a201420164102746a200341027410c9081a200520063b0132200b20033b0132200c201329030037030020092012290300370300200820102903003703002002200229036037038001200b2005200a1b220341346a2206200741016a220a4105746a200620074105746a220620032f013220076b41057410ca081a200641186a200241c0006a41186a2214290300370000200641106a200241c0006a41106a2216290300370000200641086a200241c0006a41086a221729030037000020062002290340370000200341046a2206200a4102746a200620074102746a221820032f013220076b41027410ca081a20182001360200200241206a41186a200c2903002219370300200320032f013241016a3b0132200241206a41106a2009290300221a370300200241206a41086a2008290300221b3703002002200229038001221c370320200241186a221d2019370300200241106a221e201a370300200241086a221f201b3703002002201c37030002400240200528020022030d00410021040c010b410021060340200b2120201521212005210b20032105200b2f013021012014201d2903003703002016201e2903003703002017201f2903003703002002200229030037034020042006470d0602400240024020052f0132220b410b490d004100211141042107024020014105490d0020012107024002402001417b6a0e020201000b200141796a210141012111410621070c010b4100210141012111410521070b41c4031032220b450d08200441016a210441002103200b4100360200200b200229028001370204200b41003b0132200b410c6a2008290200370200200b41146a2009290200370200200b411c6a200c290200370200200b41246a200d290200370200200b412a6a200e290100370100200b41346a200241b0016a41900310c90821222013200541346a220a20074105746a220641186a2900003703002012200641106a2900003703002010200641086a29000037030020022006290000370360200541046a220f20074102746a28020021152022200a200741016a22234105746a20052f013222242007417f736a220641057410c9082122200b41046a200f202341027422236a200641027410c9082125200520073b0132200b20063b0132200c201329030037030020092012290300370300200820102903003703002002200229036037038001200b4194036a200520236a4194036a202420076b41027410c908212302400340200b20034102746a4194036a280200220720033b01302007200b3602002003200320064922076a220320064b0d0120070d000b0b200241b0016a41186a200c2903002219370300200241b0016a41106a2009290300221a370300200241b0016a41086a2008290300221b3703002002200229038001221c3703b001200c20193703002009201a3703002008201b3703002002201c370380012011450d012001410274220720236a41086a2023200141016a2203410274220a6a2206200b2f013220016b41027410ca081a20062020360200202220034105746a202220014105746a2206200b2f013220016b41057410ca081a200641186a2014290300370000200641106a2016290300370000200641086a2017290300370000200620022903403700002025200a6a202520076a2206200b2f013220016b41027410ca081a20062021360200200b200b2f013241016a22063b01322003200641ffff037122064b0d020340200b20034102746a4194036a280200220720033b01302007200b360200200320032006496a220720064b0d03200320064f2101200721032001450d000c030b0b2001410274220620054194036a22076a41086a2007200141016a220341027422086a2207200b20016b2209410274220c10ca081a20072020360200200541346a220b20034105746a200b20014105746a220b200941057410ca081a200b41186a200241c0006a41186a290300370000200b41106a200241c0006a41106a290300370000200b41086a200241c0006a41086a290300370000200b2002290340370000200541046a220b20086a200b20066a220b200c10ca081a200b2021360200200520052f013241016a220b3b01322001200b41ffff0371220b4f0d050340200520034102746a4194036a280200220620033b01302006200536020020032003200b496a2206200b4b0d062003200b4f2107200621032007450d000c060b0b2001410274220720054194036a22066a41086a2006200141016a220341027422116a220620052f013220016b41027410ca081a20062020360200200a20034105746a200a20014105746a220620052f013220016b41057410ca081a200641186a2014290300370000200641106a2016290300370000200641086a201729030037000020062002290340370000200f20116a200f20076a220620052f013220016b41027410ca081a20062021360200200520052f013241016a22063b01322003200641ffff037122064b0d000340200520034102746a4194036a280200220720033b0130200720053602002003200320064922076a220320064b0d0120070d000b0b201d200c290300370300201e2009290300370300201f2008290300370300200220022903800137030020042106200528020022030d000b0b2014201d29030022193703002016201e290300221a3703002017201f290300221b37030020022002290300221c370340201320193703002012201a3703002010201b3703002002201c370360200028020c2206280200450d0541c40310322203450d03200341003602002003200229028001370204200341003b01322003410c6a20024180016a41086a290200370200200341146a20024180016a41106a2902003702002003411c6a20024180016a41186a290200370200200341246a200241a0016a2902003702002003412a6a200241a6016a290100370100200341346a200241b0016a41900310c9081a200320062802002207360294032006200336020020062006280204220541016a360204200741003b013020072003360200200241b0016a41186a200241e0006a41186a290300370300200241b0016a41106a200241e0006a41106a290300370300200241b0016a41086a200241e0006a41086a290300370300200220022903603703b00120052004470d0620032f01322207410a4b0d072003200741016a22013b0132200320074105746a220541346a20022903b0013700002005413c6a200241b8016a290300370000200541c4006a200241c0016a290300370000200541cc006a200241c8016a290300370000200320074102746a41046a2015360200200320014102746a4194036a200b360200200b2003360200200b20013b01302006200628020841016a3602080c020b200541346a220b200341016a220c4105746a200b20034105746a220b200920036b41057410ca081a200b41186a2006290300370000200b41106a2007290300370000200b41086a2008290300370000200b2002290340370000200541046a220b200c4102746a200b20034102746a221820052f013220036b41027410ca081a20182001360200200520052f013241016a3b01320b200028020c2203200328020841016a3602080b200241c0046a240020180f0b1039000b41a5d0c800413541dcd0c800103c000b41ecd0c800412b41bcd2c800103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b7901037f230041106b22032400200341003602082003420137030020022802002104200341004104102f2003280200200328020822056a20043600002003200541046a3602082003200241046a10e6032000200120032802002202200328020810a70202402003280204450d002002102c0b200341106a24000beb0201067f4100210102400240200028020022020d0041002100410021030c010b20002802082103200028020421042002210003402004450d012004417f6a2104200220022f01324102746a4194036a280200210220002802940321000c000b0b0240024003402003450d012000450d022003417f6a210302400240200120002f01324f0d00200141016a21010c010b2004210220002104034002400240200428020022000d0041002100200521020c010b20042f01302106200241016a220221050b2004102c20002104200620002f01324f0d000b200641016a210141002104200221052002450d01200020014102746a4194036a280200210002402002417f6a2204450d00034020002802940321002004417f6a22040d000b0b41002101200221050b410021040c000b0b02402000450d00200028020021042000102c2004450d000340200428020021002004102c2000210420000d000b0b0f0b41ecd0c800412b4198d1c800103c000be70301057f230041d0006b22032400200341086a41e6dcc700410710c501200341186a41be92c100411310c50120032001360234200341386a200341346a410410c701200341cc006a200341346a41046a3602002003200341c0006a3602442003200341346a3602482003200341386a360240200341286a200341c0006a107e200341c0006a200210e4020240024020032802302201200328024822046a41206a2202417f4c0d000240024020020d00410121050c010b200210322205450d020b2000200236020420002005360200200041086a2202410036020020004100411010c8012000280200200228020022056a220620032900083700002002200541106a2205360200200641086a200341086a41086a29000037000020002005411010c8012000280200200228020022056a220620032900183700002002200541106a2207360200200641086a200341186a41086a2900003700002003280228210520002007200110c8012000280200200228020022066a2005200110c9081a2002200620016a22063602002003280240210120002006200410c8012000280200200228020022006a2001200410c9081a2002200020046a36020002402003280244450d002001102c0b0240200328022c450d002005102c0b200341d0006a24000f0b103b000b1039000be70301057f230041d0006b22032400200341086a41e6dcc700410710c501200341186a41ab92c100411310c50120032001360234200341386a200341346a410410c701200341cc006a200341346a41046a3602002003200341c0006a3602442003200341346a3602482003200341386a360240200341286a200341c0006a107e200341c0006a200210e4020240024020032802302201200328024822046a41206a2202417f4c0d000240024020020d00410121050c010b200210322205450d020b2000200236020420002005360200200041086a2202410036020020004100411010c8012000280200200228020022056a220620032900083700002002200541106a2205360200200641086a200341086a41086a29000037000020002005411010c8012000280200200228020022056a220620032900183700002002200541106a2207360200200641086a200341186a41086a2900003700002003280228210520002007200110c8012000280200200228020022066a2005200110c9081a2002200620016a22063602002003280240210120002006200410c8012000280200200228020022006a2001200410c9081a2002200020046a36020002402003280244450d002001102c0b0240200328022c450d002005102c0b200341d0006a24000f0b103b000b1039000bf70402097f017e230041e0006b220324002003200236020c20032001360208200341106a2001200210b30102400240024002400240200328021022010d002000410036020c0c010b200328021421042003200341186a280200220236022420032001360220024002400240024020024104490d00200128000021052003200141046a36022020032002417c6a220636022420064104490d002003200141086a360220200128000421072003200241786a220636022420064104490d002003200241746a36022420032001410c6a360220200128000821062003200341206a10870220032802000d0020032802242208200328020422094102742202490d002002417f4c0d050240024020020d004101210a0c010b20021037220a450d07200328022421080b024020082002490d00200a2003280220200210c908210b200328022422082002490d082003200820026b3602242003200328022020026a360220410421084200210c2002450d03200b4103710d00200941ffffffff0371220a0d02200b102c0c030b200a102c0b20034100360230200342013703282003410f36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341b4bcc3003602482003200341386a360258200341c4006a41dcb7c000200341c8006a103e1a200335023042208620033502288410000240200328022c450d002003280228102c0b2000410036020c0c020b2002ad421e86200aad84210c200b21080b2000200c3702102000200836020c2000200636020820002007360204200020053602000b2004450d002001102c0b200341e0006a24000f0b103b000b1039000b200220084194afc0001058000bbf0401057f230041e0006b22022400200241086a41e6dcc700410710c501200241186a41de92c100410910c50102400240410410322203450d002002420437023c20022003360238200241386a41004120102f2002280238200228024022046a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200441206a220336024020012802202104200241386a20034104102f20022802382201200228024022036a20043600002002200341046a2203360240200241c8006a2001200310c701200241dc006a200120036a360200200220013602582002200241c8006a41086a3602542002200241c8006a360250200241286a200241d0006a107e0240200228023c450d002001102c0b2002280230220341206a2201417f4c0d010240024020010d00410121040c010b200110322204450d010b2000200136020420002004360200200041086a2201410036020020004100411010c8012000280200200128020022046a220520022900083700002001200441106a2204360200200541086a200241086a41086a29000037000020002004411010c8012000280200200128020022046a220520022900183700002001200441106a2206360200200541086a200241186a41086a2900003700002002280228210420002006200310c8012000280200200128020022006a2004200310c9081a2001200020036a3602000240200228022c450d002004102c0b200241e0006a24000f0b1039000b103b000bac0401047f230041c0006b22022400200241106a41e6dcc700410710c501200241206a41d192c100410d10c501200241306a200010e402024002402002280238220041206a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b20024100360208200220033602042002200436020020024100411010c8012002280200200228020822036a22042002290010370000200441086a200241106a41086a2900003700002002200341106a220336020820022003411010c8012002280200200228020822036a22042002290020370000200441086a200241206a41086a2900003700002002200341106a22043602082002280230210320022004200010c80120022802002204200228020822056a2003200010c9081a2002200520006a220036020802402002280234450d002003102c0b200241003602282002420137032020012802002103200241206a41004104102f2002280220200228022822056a20033600002002200541046a220336022820012802042105200241206a20034104102f2002280220200228022822036a20053600002002200341046a220336022820012802082105200241206a20034104102f2002280220200228022822036a20053600002002200341046a360228200128020c200141146a280200200241206a10d5032004200020022802202201200228022810a70202402002280224450d002001102c0b02402002280204450d002004102c0b200241c0006a24000f0b103b000b1039000bd60201027f0240024002400240200141c000490d00200141808001490d012001418080808004490d022002200241086a22032802004101102f200228020020032802006a41033a00002003200328020041016a2204360200200220044104102f200228020020032802006a20013600002003200328020041046a22043602000c030b2002200241086a22032802004101102f200228020020032802006a20014102743a00002003200328020041016a22043602000c020b2002200241086a22032802004102102f200228020020032802006a20014102744101723b00002003200328020041026a22043602000c010b2002200241086a22032802004104102f200228020020032802006a20014102744102723600002003200328020041046a22043602000b2002200420014102742201102f2002280200200241086a22022802006a2000200110c9081a2002200228020020016a3602000b9d0501057f230041c0006b22012400200141106a41e6dcc700410710c501200141206a418893c700410a10c501200141306a200010e402024002402001280238220241206a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b20014100360208200120033602042001200436020020014100411010c8012001280200200128020822036a22042001290010370000200441086a200141106a41086a2900003700002001200341106a220336020820012003411010c8012001280200200128020822036a22042001290020370000200441086a200141206a41086a2900003700002001200341106a22043602082001280230210320012004200210c80120012802002204200128020822056a2003200210c9081a2001200520026a220236020802402001280234450d002003102c0b2004200210b40102402001280204450d002004102c0b200141106a41e6dcc700410710c501200141206a41b18ec100410a10c501200141306a200010e4022001280238220241206a2203417f4c0d000240024020030d00410121000c010b200310322200450d020b20014100360208200120033602042001200036020020014100411010c8012001280200200128020822036a22002001290010370000200041086a200141106a41086a2900003700002001200341106a220336020820012003411010c8012001280200200128020822036a22002001290020370000200041086a200141206a41086a2900003700002001200341106a22003602082001280230210320012000200210c80120012802002200200128020822046a2003200210c9081a2001200420026a220236020802402001280234450d002003102c0b2000200210b40102402001280204450d002000102c0b200141c0006a24000f0b103b000b1039000bea0906017f027e037f017e017f017e230041f0016b22022400200041086a290300210320002903002104200241d0016a41e6dcc700410710c501200241c8006a419099c100410610c501200241e0016a200110e4020240024020022802e801220041206a2201417f4c0d000240024020010d00410121050c010b200110322205450d020b200241003602c801200220013602c401200220053602c001200241c0016a4100411010c80120022802c00120022802c80122016a220520022900d001370000200541086a200241d0016a41086a2900003700002002200141106a22013602c801200241c0016a2001411010c80120022802c00120022802c80122016a22052002290048370000200541086a200241c8006a41086a22062900003700002002200141106a22053602c80120022802e0012101200241c0016a2005200010c80120022802c001220520022802c80122076a2001200010c9081a2002200720006a22003602c801024020022802e401450d002001102c0b200241e8006a2005200010c9012006200241f1006a290000370300200241c8006a41106a200241f9006a290000370300200241c8006a41186a220020024181016a29000037030020022002290069370348024002400240024020022d00684101470d00200241286a41186a2000290300370300200241286a41106a2200200241c8006a41106a290300370300200241286a41086a2201200241c8006a41086a29030037030020022002290348370328024020022802c401450d002005102c0b200241e8006a41186a200241286a41186a290300370300200241e8006a41106a2000290300370300200241e8006a41086a200129030037030020022002290328370368200241d0016a41e6dcc700410710c501200241c8006a418a99c100410610c501200241e0016a200241e8006a10d50220022802e801220041206a2201417f4c0d040240024020010d00410121050c010b200110322205450d060b200241003602c801200220013602c401200220053602c001200241c0016a4100411010c80120022802c00120022802c80122016a220520022900d001370000200541086a200241d0016a41086a2900003700002002200141106a22013602c801200241c0016a2001411010c80120022802c00120022802c80122016a22052002290048370000200541086a200241c8006a41086a2900003700002002200141106a22053602c80120022802e0012101200241c0016a2005200010c80120022802c001220520022802c80122066a2001200010c9081a2002200620006a22003602c801024020022802e401450d002001102c0b200241e8006a2005200010d80320022802c40121002002280288012207450d0120024180016a290300210820024198016a280200210620024194016a28020021092002290378210a200228028c01210102402000450d002005102c0b02402001450d00200141186c450d002007102c0b2006450d032009450d03200641ffffffff0371450d032009102c0c030b20022802c401450d012005102c0c010b2000450d002005102c0b4200210a420021080b200241186a20042003427f420010c808200241086a200a20082002290318220342012003420156200241186a41086a29030022034200522003501b22001b2003420020001b10c808200241086a41086a290300210320022903082104200241f0016a24002004427f2003501b0f0b103b000b1039000bd60b06057f057e027f017e017f037e230041b0026b220324002003200236026c20032001360268200341f0006a2001200210b30102400240200328027022040d00200041003602200c010b200328027421052003200341f8006a28020022063602a401200320043602a00141002101200341003a00e8012006417f6a210202400240024002400240024002400240034020062001460d01200341c8016a20016a200420016a22072d00003a00002003200741016a3602a0012003200141016a22073a00e801200320023602a4012002417f6a21022007210120074120470d000b20034190026a41186a2201200341c8016a41186a29030037030020034190026a41106a2202200341c8016a41106a29030037030020034190026a41086a2206200341c8016a41086a290300370300200320032903c80137039002200741ff01714120490d06200341a8016a41086a2006290300370300200341a8016a41106a2002290300370300200341a8016a41186a200129030037030020032003290390023703a801200341d0006a200341a0016a10f7032003290350a70d06200341d0006a41106a290300210820032903582109200341386a200341a0016a10f7032003290338a70d06200341c8006a290300210a2003290340210b200341306a200341a0016a10870220032802300d062003280234220720032802a40141186e2201200120074b1bad42187e220c422088a70d03200ca72202417f4c0d0320020d014108210d0c020b200141ff0171450d05200341003a00e8010c050b20021032220d450d020b41002101200341003602d0012003200d3602c8012003200241186e3602cc0102400240024002400240024002402007450d00200341286a210e0340200341186a200341a0016a10f7032003290318a70d02200e290300210c2003290320210f200341106a200341a0016a10870220032802100d02200328021421060240200120032802cc01470d00200341c8016a200110ad0420032802d001210120032802c801210d0b200d200141186c6a220220063602102002200c3703082002200f3703002003200141016a22013602d0012007417f6a22070d000b20032802c801210d0b200d450d0920032902cc01210c200341086a200341a0016a10870220032802080d0320032802a4012202200328020c22064102742201490d032001417f4c0d0620010d01410121070c020b20032802cc012201450d08200141186c450d08200d102c0c080b200110372207450d0520032802a40121020b024020022001490d00200720032802a001200110c908210e20032802a40122022001490d062003200220016b3602a401200320032802a00120016a3602a0014100210241042110024020010d00410021010c040b200e4103710d00200641ffffffff037122070d02200e102c410021010c030b2007102c0b200ca72201450d05200141186c450d05200d102c0c050b200641ffffffff03712101200e2110200721020b20034180016a41186a200341a8016a41186a290300220f37030020034180016a41106a200341a8016a41106a290300221137030020034180016a41086a200341a8016a41086a2903002212370300200320032903a801221337038001200041186a200a3703002000200b3703102000200837030820002009370300200041346a2001360200200041306a20023602002000412c6a20103602002000200c3702242000200d360220200041386a2013370300200041c0006a2012370300200041c8006a2011370300200041d0006a200f3703000c040b103b000b1039000b200120024194afc0001058000b200341003602980220034201370390022003410f3602f4012003200341e8006a3602f001200320034190026a3602a801200341dc016a4101360200200342013702cc01200341b4bcc3003602c8012003200341f0016a3602d801200341a8016a41dcb7c000200341c8016a103e1a2003350298024220862003350290028410000240200328029402450d00200328029002102c0b200041003602200b2005450d002004102c0b200341b0026a24000b3c02017f017e230041106b22022400200029030021032002200041086a290300370308200220033703002002200110d7032103200241106a240020030be70301057f230041d0006b22032400200341086a41e6dcc700410710c501200341186a419699c100410b10c50120032001360234200341386a200341346a410410c701200341cc006a200341346a41046a3602002003200341c0006a3602442003200341346a3602482003200341386a360240200341286a200341c0006a107e200341c0006a200210e4020240024020032802302201200328024822046a41206a2202417f4c0d000240024020020d00410121050c010b200210322205450d020b2000200236020420002005360200200041086a2202410036020020004100411010c8012000280200200228020022056a220620032900083700002002200541106a2205360200200641086a200341086a41086a29000037000020002005411010c8012000280200200228020022056a220620032900183700002002200541106a2207360200200641086a200341186a41086a2900003700002003280228210520002007200110c8012000280200200228020022066a2005200110c9081a2002200620016a22063602002003280240210120002006200410c8012000280200200228020022006a2001200410c9081a2002200020046a36020002402003280244450d002001102c0b0240200328022c450d002005102c0b200341d0006a24000f0b103b000b1039000b130020004118360204200041a499c1003602000b3400200041e6dcc70036020420004100360200200041146a4123360200200041106a41989fc200360200200041086a42073702000b3b01017f20004201370200200041086a22024100360200200041004101102f2000280200200228020022006a41033a00002002200041016a3602000b3b01017f20004201370200200041086a22024100360200200041004101102f2000280200200228020022006a41003a00002002200041016a3602000b2201017f230041106b22022400200241003602002000200210e003200241106a24000bc90202047f047e0240024002400240200128020022020d00410121030c010b200141086a2802004105744105722203417f4c0d010b200310322204450d012000200336020420002004360200200041086a22034100360200200041004101102f2000280200200328020022046a2105024020020d00200541003a00002003200441016a3602000f0b200541013a00002003200441016a3602002000200141086a2802002201108f0102402001450d0020014105742103200041086a220428020021050340200020054120102f200241186a2900002106200241106a2900002107200241086a29000021082002290000210920042004280200220141206a2205360200200120002802006a22012009370000200141086a2008370000200141106a2007370000200141186a2006370000200241206a2102200341606a22030d000b0b0f0b103b000b1039000b7301037f20004201370200200041086a22024100360200200041004110102f2000280200200228020022036a22044200370008200442003700002002200341106a2203360200200020034110102f2000280200200228020022006a22034200370008200342003700002002200041106a3602000b0b0020004108410010e3030bdd0503037f027e027f02400240200241d8006c4104722203417f4c0d00200310322204450d012000200336020420002004360200200041086a2203410036020020002002108f0102402002450d002001200241d8006c6a2105200328020021020340200020024120102f2000280200200328020022046a22022001290038370000200241186a200141d0006a290000370000200241106a200141c8006a290000370000200241086a200141c0006a2900003700002003200441206a2202360200200141086a290300210620012903002107200020024110102f2000280200200328020022026a22042006370008200420073700002003200241106a36020020012802202102200020012802282204108f0102402004450d002002200441306c6a2108200328020021040340200020044120102f200028020020032802006a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a2900003700002003200328020041206a2204360200200241206a2903002106200241286a2903002107200020044110102f200028020020032802006a22042007370008200420063700002003200328020041106a22043602002008200241306a2202470d000b0b200141d8006a2109200128022c21022000200141346a2802002204108f010240024020040d00200328020021040c010b20044105742108200328020021040340200020044120102f200028020020032802006a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a2900003700002003200328020041206a2204360200200241206a2102200841606a22080d000b0b200141186a290300210620012903102107200020044110102f200028020020032802006a22022006370008200220073700002003200328020041106a22023602002009210120092005470d000b0b0f0b103b000b1039000b5201027f02404110103222020d001039000b2000421037020420002002360200200041004110102f2000280200200041086a220028020022026a22034200370008200342003700002000200241106a3602000b6d01037f230041106b22022400200042013702002002410c6a4100360200200041086a2203410036020020024200370300200041004104102f2000280200200328020022046a41003600002003200441046a36020020002002410472220310e603200310cf03200241106a24000b9c0403047f017e037f230041206b220224002000200141086a2802002203108f0102400240200128020022040d004100210441002101410021030c010b20012802042205ad422086210620042101034020042f013221072005450d0120064280808080707c21062005417f6a2105200420074102746a4194036a280200210420012802940321010c000b0b200241146a2007360200200241106a20043602002002200336021820022006370308200220013602042002200536020002402003450d00200041086a2107034020022003417f6a3602182002410020011b220828020021050240024020082802082203200828020422042f01324f0d00200421010c010b03400240200428020022010d00410021010c020b200541016a210520042f0130210320012104200320012f01324f0d000b0b200341016a21090240024020050d00200121040c010b200120094102746a4194036a280200210402402005417f6a2205450d00034020042802940321042005417f6a22050d000b0b410021090b200820043602042008410036020020082009360208200020072802004120102f200028020020072802006a200120034105746a41346a412010c9081a2007200728020041206a2204360200200120034102746a41046a2802002101200020044104102f200028020020072802006a20013600002007200728020041046a36020020022802182203450d01200228020421010c000b0b200241206a24000b2501017f230041106b220224002002410036020c20002002410c6a109401200241106a24000bee0202057f047e230041c0006b2202240020004201370200200241086a41186a4200370300200241086a41106a22034200370300200241086a41086a4200370300200241086a41286a22044100360200200041086a2205410036020020024200370308200242083703282002200241086a36023c2002413c6a200010e9032002200336023c2002413c6a200010e90320022802282103200020042802002204108f0102402004450d00200441306c21060340200020052802004120102f200341286a2900002107200341206a2900002108200341186a2900002109200341106a290000210a20052005280200220441206a360200200420002802006a2204200a370000200441086a2009370000200441106a2008370000200441186a20073700002002200336023c2002413c6a200010e903200341306a2103200641506a22060d000b0b024020022802284100200228022c22031b2204450d00200341306c450d002004102c0b200241c0006a24000ba30503027f027e037f230041e0006b220224000240024020002802002203290300220442c000544100200341086a29030022055022001b0d0002400240024020044280800154410020001b0d00200442808080800454410020001b0d01411020057920047942c0007c20054200521ba741037622066b4104490d022001200141086a22002802004101102f200128020020002802006a413320064102746b3a00002000200028020041016a2207360200200329030021042002200341086a290300220537030820022004370300200641706a21030340200120074101102f200128020020002802006a20043c00002000200028020041016a22073602002004420888200542388684210420054208882105200341016a22062003492108200621032008450d000b20022004370300200220053703082004200584500d04200241286a41146a4109360200200241346a4119360200200241106a41146a410336020020022002360240200241d8bdc400360244200241c8006a41146a410036020020024203370214200241c0bbc4003602102002411936022c200241c4b5c8003602582002420137024c200241b8bbc4003602482002200241286a3602202002200241c8006a3602382002200241c4006a3602302002200241c0006a360228200241106a41e8bdc4001046000b2001200141086a22002802004102102f200128020020002802006a2004a74102744101723b00002000200028020041026a3602000c030b2001200141086a22002802004104102f200128020020002802006a2004a74102744102723600002000200028020041046a3602000c020b41efbac400413641c8bdc400103c000b2001200141086a22002802004101102f200128020020002802006a2004a74102743a00002000200028020041016a3602000b200241e0006a24000bb40101027f230041e0006b22022400200241003602280240410110322203450d002000420137020420002003360200200041004101102f2000280200200041086a220028020022036a41003a00002000200341016a360200024020022802282200450d0002402002412c6a2802002203450d00200341186c450d002000102c0b20022802344100200241386a28020022001b2203450d00200041ffffffff0371450d002003102c0b200241e0006a24000f0b1039000b2901017f230041106b2202240020024100360208200242013703002000200210ec03200241106a24000bec0102047f047e02400240200128020822024105744104722203417f4c0d0020012802002101200310322204450d012000200336020420002004360200200041086a2203410036020020002002108f0102402002450d0020024105742104200328020021050340200020054120102f200141186a2900002106200141106a2900002107200141086a29000021082001290000210920032003280200220241206a2205360200200220002802006a22022009370000200241086a2008370000200241106a2007370000200241186a2006370000200141206a2101200441606a22040d000b0b0f0b103b000b1039000b4a01017f02404104103222020d001039000b2000420437020420002002360200200041004104102f2000280200200041086a220028020022026a41d4003600002000200241046a3602000b130020004107360204200041f4e7c2003602000b4a01017f02404104103222020d001039000b2000420437020420002002360200200041004104102f2000280200200041086a220028020022026a41c0003600002000200241046a3602000b4b01017f02404104103222020d001039000b2000420437020420002002360200200041004104102f2000280200200041086a220028020022026a41a0c21e3600002000200241046a3602000b4901017f02404104103222020d001039000b2000420437020420002002360200200041004104102f2000280200200041086a220028020022026a410a3600002000200241046a3602000b4a01017f02404104103222020d001039000b2000420437020420002002360200200041004104102f2000280200200041086a220028020022026a4196013600002000200241046a3602000b4901017f02404104103222020d001039000b2000420437020420002002360200200041004104102f2000280200200041086a220028020022026a411b3600002000200241046a3602000b4901017f02404104103222020d001039000b2000420437020420002002360200200041004104102f2000280200200041086a220028020022026a411c3600002000200241046a3602000b4901017f02404104103222020d001039000b2000420437020420002002360200200041004104102f2000280200200041086a220028020022026a41063600002000200241046a3602000bdb0706017f047e027f017e067f047e230041f0026b22022400200241c0006a200110f70302400240024002400240024002402002290340a70d00200241c0006a41106a290300210320022903482104200241286a200110f7032002290328a70d02200241286a41106a290300210520022903302106200241206a200110870220022802200d0420022802242207200128020441306e2208200820074b1bad42307e2209422088a7450d010c060b200041003602200c040b2009a72208417f4c0d0402400240024020080d004108210a0c010b20081032220a450d010b4100210b200241003602602002200a3602582002200841306e36025c02402007450d004100210c03404100210d200241003a00a802200c41016a210c2001280204417f6a21080240024003402008417f460d0120024188026a200d6a2001280200220e2d00003a0000200120083602042001200e41016a3602002002200d41016a220e3a00a8022008417f6a2108200e210d200e4120470d000b200241b0026a41086a220820024188026a41086a290300370300200241b0026a41106a220d20024188026a41106a290300370300200241b0026a41186a220f20024188026a41186a29030037030020022002290388023703b002200e41ff0171411f4b0d010c060b200d41ff0171450d05200241003a00a8020c050b200241c8016a41086a220e2008290300370300200241c8016a41106a2208200d290300370300200241c8016a41186a220d200f290300370300200220022903b0023703c801200241086a200110f7032002290308a70d04200241086a41106a29030021092002290310211020024188016a41086a200e290300221137030020024188016a41106a2008290300221237030020024188016a41186a200d2903002213370300200241e8006a41086a220d2011370300200241e8006a41106a220e2012370300200241e8006a41186a220f2013370300200220022903c801221137038801200220113703680240200b200228025c470d00200241d8006a200b410110e0012002280258210a2002280260210b0b200a200b41306c6a220820093703082008201037030020082002290368370310200841186a200d290300370300200841206a200e290300370300200841286a200f2903003703002002200b41016a220b360260200c2007470d000b0b200a450d03200229025c210920002004370300200020093702242000200a3602202000200637031020002003370308200041186a20053703000c040b1039000b200041003602200c020b200a4100200228025c22011b2208450d00200141306c450d002008102c0b200041003602200b200241f0026a24000f0b103b000be10506067f017e027f017e017f017e230041206b220224000240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200024002400240200541037122074103460d0002400240024020070e03000102000b2005410276ad21080c040b410121072006450d0220042d0001210620012003417e6a3602042001200441026a3602002006410874200572220141ffff0371418002490d02200141fcff0371410276ad21080c030b4101210720064103490d01200441036a2d0000210620042f0001210920012003417c6a3602042001200441046a3602002009200641107472410874200572220141808004490d012001410276ad21080c020b02400240024002402005410276220a0e0d00030303010303030303030302030b20064104490d052004350001210820012003417b6a3602042001200441056a36020020084280808080045421074200210b0c060b20064108490d04200429000121082001200341776a3602042001200441096a3602002008428080808080808080015421074200210b0c050b20064110490d03200441096a290000210b2004290001210820012003416f6a3602042001200441116a360200200b428080808080808080015421070c040b200541334b0d02200a41046a21092003417e6a2103200441026a21044100210541012107200241186a210c420021084200210b03402003417f460d012004417f6a310000210d2001200336020420012004360200200241106a200d4200200541037441f8007110cd082003417f6a2103200441016a2104200c290300200b84210b20022903102008842108200541016a22062105200641ff01712009490d000b2002427f427f41e800200a4103746b41f8007110c6082008200229030058200b200241086a290300220d58200b200d511b21070c030b0c020b4200210b410021070c010b410121070b20002008370308200041106a200b37030020002007ad370300200241206a24000be70101047f230041106b2202240020022000360204200241046a200110e9032002200041106a360208200241086a200110e903200028022021032001200041286a2802002200108f0102402000450d00200041306c210403402001200141086a22002802004120102f200128020020002802006a2205200341106a290000370000200541186a200341286a290000370000200541106a200341206a290000370000200541086a200341186a2900003700002000200028020041206a3602002002200336020c2002410c6a200110e903200341306a2103200441506a22040d000b0b200241106a24000ba4ae010b077f027e1a7f017e017f017e047f017e077f017e0f7f230041d0196b22022400200241f8116a20011087020240024020022802f8110d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022802fc11220320012802044103762204200420034b1b22054103742204417f4c0d0002400240024020050d00410421060c010b200410322206450d010b4100210420024100360298182002200536029418200220063602901802400240024002402003450d000340200241f0116a200110870220022802f0110d0220022802f4112105200241e8116a200110fa0320022f01e8110d0220022f01ea11210702402004200228029418470d0020024190186a200410bc03200228029818210420022802901821060b200620044103746a220820073b0104200820053602002002200441016a2204360298182003417f6a22030d000b20022802901821060b2006450d402002290294182209422088a741037422040d01200621040c020b2006410020022802941822041b2201450d3f200441ffffffff01710d3e0c3f0b200620046a210320062104034020042004290200220a3e0200200441046a200a4220883d0100200441086a22042003470d000b0b2009a7210b200241e0116a200110870220022802e0110d3a20022802e41122072001280204410c6e2203200320074b1bad420c7e220a422088a70d01200aa72205417f4c0d010240024020050d00410421080c010b200510322208450d010b410021032002410036029818200220083602901820022005410c6e3602941802400240024002402007450d000340200241d8116a200110870220022802d8110d0220022802dc11210c200241d0116a200110fa0320022f01d0110d0220022f01d211210d200241c8116a200110fa0320022f01c8110d0220022f01ca11210e200241c0116a200110fa0320022f01c0110d0220022f01c211210f02402003200228029418470d0020024190186a200310fb03200228029818210320022802901821080b20082003410c6c6a2205200f3b01082005200d3b01042005200c360200200541066a200e3b01002002200341016a2203360298182007417f6a22070d000b20022802901821080b2008450d3d200229029418220a422088a7410c6c22030d01200821030c020b2008410020022802941822041b2201450d3c2004410c6c0d3b0c3c0b200820036a21052008210303402003410c6a22032005470d000b0b200aa7210d200241b8116a2001108702200320086b410c6d211020022802b8110d374104210c20022802bc11220520012802044104762203200320054b1b22034104742207417f4c0d0102402003450d0020071032220c450d010b200241003602981820022003360294182002200c3602901802402005450d00410021030340200241b0116a200110870220022802b0110d3820022802b411210f200241003a00d818200241a8116a200110fa0320022f01a8110d3820022f01aa112107200241a0116a200110fa0320022f01a0110d3820022f01a211210e200241013a00d818200220073b01d0182002200e3b01d21820024198116a200110fa0320022f0198110d3720022f019a11210720024190116a200110fa0320022f0190110d3720022f019211210e200220073b01d4182002200e3b01d61820022903d018210a20024188116a200110fa0320022f0188110d3820022f018a11210e02402003200228029418470d0020024190186a200310ce012002280298182103200228029018210c0b200c20034104746a2207200e3b010c2007200a3702042007200f3602002002200341016a2203360298182005417f6a22050d000b200228029018210c0b200c450d3702400240200229029418220a422088a741047422030d00200c21030c010b200c20036a2105200c21030340200341106a22032005470d000b0b200aa7211120024180116a20011087022002280280110d33200228028411220e200128020441146e22052005200e4b1bad42147e220a422088a70d01200aa72205417f4c0d010240024020050d004104210f0c010b20051032220f450d010b20024100360298162002200f360290162002200541146e360294160240200e450d00200241d0186a41086a2112410021050340200241f8106a200110870220022802f8100d3420022802fc102113200241003a009c18200241f0106a200110fa0320022f01f0100d3420022f01f2102107200241e8106a200110fa0320022f01e8100d3420022f01ea102114200241013a009c18200220073b019018200220143b019218200241e0106a200110fa0320022f01e0100d3320022f01e2102107200241d8106a200110fa0320022f01d8100d3320022f01da102114200241023a009c18200220073b019418200220143b019618200241d0106a200110fa0320022f01d0100d3320022f01d2102107200241c8106a200110fa0320022f01c8100d3320022f01ca102114200220073b019818200220143b019a18201220022802981836020020022002290390183703d018200241c0106a200110fa0320022f01c0100d3420022f01c210211420024190176a41086a20122802002207360200200241d0166a41086a22152007360200200220022903d018220a370390172002200a3703d01602402005200228029416470d0020024190166a200510fc032002280298162105200228029016210f0b200f200541146c6a22072013360200200720022903d0163702042007410c6a2015280200360200200720143b01102002200541016a220536029816200e417f6a220e0d000b200228029016210f0b200f450d3302400240200229029416220a422088a741146c22050d00200f21050c010b200f20056a2107200f21050340200541146a22052007470d000b0b200aa72107200241b8106a20011087022005200f6b41146d211620022802b8100d2f20022802bc102212200128020441186e2205200520124b1bad42187e220a422088a70d01200aa72205417f4c0d010240024020050d00410421140c010b200510322214450d010b200241003602981620022014360290162002200541186e3602941602402012450d00410021050340200241b0106a200110870220022802b0100d3020022802b4102115200241003a00a018200241a8106a200110fa0320022f01a8100d3020022f01aa10210e200241a0106a200110fa0320022f01a0100d3020022f01a2102113200241013a00a0182002200e3b019018200220133b01921820024198106a200110fa0320022f0198100d2f20022f019a10210e20024190106a200110fa0320022f0190100d2f20022f0192102113200241023a00a0182002200e3b019418200220133b01961820024188106a200110fa0320022f0188100d2f20022f018a10210e20024180106a200110fa0320022f0180100d2f20022f0182102113200241033a00a0182002200e3b019818200220133b019a18200241f80f6a200110fa0320022f01f80f0d2f20022f01fa0f210e200241f00f6a200110fa0320022f01f00f0d2f20022f01f20f21132002200e3b019c18200220133b019e18200241d0186a41086a220e20024190186a41086a29030037030020022002290390183703d018200241e80f6a200110fa0320022f01e80f0d3020022f01ea0f211320024190176a41086a200e290300220a370300200241d0166a41086a2217200a370300200220022903d018220a370390172002200a3703d01602402005200228029416470d0020024190166a200510fd03200228029816210520022802901621140b2014200541186c6a220e2015360200200e20022903d0163702042017290300210a200e20133b0114200e410c6a200a3702002002200541016a2205360298162012417f6a22120d000b20022802901621140b2014450d2f02400240200229029416220a422088a741186c22050d00201421050c010b201420056a210e201421050340200541186a2205200e470d000b0b200aa7210e200241e00f6a2001108702200520146b41186d211820022802e00f0d2b20022802e40f22132001280204411c6e2205200520134b1bad421c7e220a422088a70d01200aa72205417f4c0d010240024020050d00410421150c010b200510322215450d010b2002410036029816200220153602901620022005411c6e3602941602402013450d00200241d0186a41106a2119410021050340200241d80f6a200110870220022802d80f0d2c20022802dc0f211a200241003a00a418200241d00f6a200110fa0320022f01d00f0d2c20022f01d20f2112200241c80f6a200110fa0320022f01c80f0d2c20022f01ca0f2117200241013a00a418200220123b019018200220173b019218200241c00f6a200110fa0320022f01c00f0d2b20022f01c20f2112200241b80f6a200110fa0320022f01b80f0d2b20022f01ba0f2117200241023a00a418200220123b019418200220173b019618200241b00f6a200110fa0320022f01b00f0d2b20022f01b20f2112200241a80f6a200110fa0320022f01a80f0d2b20022f01aa0f2117200241033a00a418200220123b019818200220173b019a18200241a00f6a200110fa0320022f01a00f0d2b20022f01a20f2112200241980f6a200110fa0320022f01980f0d2b20022f019a0f2117200241043a00a418200220123b019c18200220173b019e18200241900f6a200110fa0320022f01900f0d2b20022f01920f2112200241880f6a200110fa0320022f01880f0d2b20022f018a0f2117200241d0186a41086a221b20024190186a41086a290300370300200220123b01a018200220173b01a218201920022802a018360200200241053a00a41820022002290390183703d018200241800f6a200110fa0320022f01800f0d2c20022f01820f211720024190176a41086a201b290300220a37030020024190176a41106a20192802002212360200200241d0166a41086a221b200a370300200241d0166a41106a221c2012360200200220022903d018220a370390172002200a3703d01602402005200228029416470d0020024190166a2005109602200228029816210520022802901621150b20152005411c6c6a2212201a360200201220022903d016370204201c280200211a201b290300210a201220173b01182012410c6a200a370200201241146a201a3602002002200541016a2205360298162013417f6a22130d000b20022802901621150b2015450d2b02400240200229029416220a422088a7411c6c22050d00201521050c010b201520056a21122015210503402005411c6a22052012470d000b0b200aa72112200241f80e6a2001108702200520156b411c6d211b20022802f80e0d2720022802fc0e221720012802044105762205200520174b1b22054105742213417f4c0d010240024020050d00410421190c010b201310322219450d010b20024100360298162002200536029416200220193602901602402017450d00410021050340200241f00e6a200110870220022802f00e0d2820022802f40e211c200241003a00a818200241e80e6a200110fa0320022f01e80e0d2820022f01ea0e2113200241e00e6a200110fa0320022f01e00e0d2820022f01e20e211a200241013a00a818200220133b0190182002201a3b019218200241d80e6a200110fa0320022f01d80e0d2720022f01da0e2113200241d00e6a200110fa0320022f01d00e0d2720022f01d20e211a200241023a00a818200220133b0194182002201a3b019618200241c80e6a200110fa0320022f01c80e0d2720022f01ca0e2113200241c00e6a200110fa0320022f01c00e0d2720022f01c20e211a200241033a00a818200220133b0198182002201a3b019a18200241b80e6a200110fa0320022f01b80e0d2720022f01ba0e2113200241b00e6a200110fa0320022f01b00e0d2720022f01b20e211a200241043a00a818200220133b019c182002201a3b019e18200241a80e6a200110fa0320022f01a80e0d2720022f01aa0e2113200241a00e6a200110fa0320022f01a00e0d2720022f01a20e211a200241053a00a818200220133b01a0182002201a3b01a218200241980e6a200110fa0320022f01980e0d2720022f019a0e2113200241900e6a200110fa0320022f01900e0d2720022f01920e211a200241d0186a41086a221d20024190186a41086a290300370300200220133b01a4182002201a3b01a618200241d0186a41106a221320024190186a41106a290300370300200241063a00a81820022002290390183703d018200241880e6a200110fa0320022f01880e0d2820022f018a0e211a20024190176a41086a201d290300220a37030020024190176a41106a20132903002209370300200241d0166a41086a221d200a370300200241d0166a41106a221e2009370300200220022903d018220a370390172002200a3703d01602402005200228029416470d0020024190166a200510fe03200228029816210520022802901621190b201920054105746a2213201c360200201320022903d016370204201e290300210a201d29030021092013201a3b011c2013410c6a2009370200201341146a200a3702002002200541016a2205360298162017417f6a22170d000b20022802901621190b2019450d2702400240200229029416220a422088a741057422050d00201921050c010b201920056a2113201921050340200541206a22052013470d000b0b200aa72117200241800e6a200110870220022802800e0d2320022802840e221c200128020441246e22132013201c4b1bad42247e220a422088a70d01200aa72213417f4c0d010240024020130d004104211d0c010b20131032221d450d010b20024100360288162002201d360280162002201341246e360284160240201c450d00200241d0176a41186a211f4100211a0340200241f80d6a200110870220022802f80d0d2420022802fc0d2120200241003a00ac18200241f00d6a200110fa0320022f01f00d0d2420022f01f20d2113200241e80d6a200110fa0320022f01e80d0d2420022f01ea0d211e200241013a00ac18200220133b0190182002201e3b019218200241e00d6a200110fa0320022f01e00d0d2320022f01e20d2113200241d80d6a200110fa0320022f01d80d0d2320022f01da0d211e200241023a00ac18200220133b0194182002201e3b019618200241d00d6a200110fa0320022f01d00d0d2320022f01d20d2113200241c80d6a200110fa0320022f01c80d0d2320022f01ca0d211e200241033a00ac18200220133b0198182002201e3b019a18200241c00d6a200110fa0320022f01c00d0d2320022f01c20d2113200241b80d6a200110fa0320022f01b80d0d2320022f01ba0d211e200241043a00ac18200220133b019c182002201e3b019e18200241b00d6a200110fa0320022f01b00d0d2320022f01b20d2113200241a80d6a200110fa0320022f01a80d0d2320022f01aa0d211e200241053a00ac18200220133b01a0182002201e3b01a218200241a00d6a200110fa0320022f01a00d0d2320022f01a20d2113200241980d6a200110fa0320022f01980d0d2320022f019a0d211e200241063a00ac18200220133b01a4182002201e3b01a618200241900d6a200110fa0320022f01900d0d2320022f01920d2113200241880d6a200110fa0320022f01880d0d2320022f018a0d211e200241d0176a41106a222120024190186a41106a290300370300200241d0176a41086a222220024190186a41086a290300370300200220133b01a8182002201e3b01aa18201f20022802a818360200200241073a00ac182002200229039018220a3703d0182002200a3703d017200241800d6a200110fa0320022f01800d0d2420022f01820d211e200241d0166a41086a2022290300220a370300200241d0166a41106a20212903002209370300200241d0166a41186a201f280200221336020020024190166a41086a2221200a37030020024190166a41106a2222200937030020024190166a41186a22232013360200200220022903d017220a3703d0162002200a370390160240201a200228028416470d0020024180166a201a10ff03200228028816211a200228028016211d0b201d201a41246c6a221320203602002013200229039016370204202328020021202022290300210a202129030021092013201e3b01202013410c6a2009370200201341146a200a3702002013411c6a20203602002002201a41016a221a36028816201c417f6a221c0d000b200228028016211d0b201d450d2302400240200229028416220a422088a741246c22130d00201d21130c010b201d20136a211a201d21130340201341246a2213201a470d000b0b200aa7211a200241f80c6a20011087022013201d6b41246d212020022802f80c0d1f20022802fc0c221c200128020441286e22132013201c4b1bad42287e220a422088a70d01200aa72213417f4c0d010240024020130d004104211f0c010b20131032221f450d010b20024100360288162002201f360280162002201341286e360284160240201c450d004100211e0340200241f00c6a200110870220022802f00c0d2020022802f40c2122200241003a00b018200241e80c6a200110fa0320022f01e80c0d2020022f01ea0c2113200241e00c6a200110fa0320022f01e00c0d2020022f01e20c2121200241013a00b018200220133b019018200220213b019218200241d80c6a200110fa0320022f01d80c0d1f20022f01da0c2113200241d00c6a200110fa0320022f01d00c0d1f20022f01d20c2121200241023a00b018200220133b019418200220213b019618200241c80c6a200110fa0320022f01c80c0d1f20022f01ca0c2113200241c00c6a200110fa0320022f01c00c0d1f20022f01c20c2121200241033a00b018200220133b019818200220213b019a18200241b80c6a200110fa0320022f01b80c0d1f20022f01ba0c2113200241b00c6a200110fa0320022f01b00c0d1f20022f01b20c2121200241043a00b018200220133b019c18200220213b019e18200241a80c6a200110fa0320022f01a80c0d1f20022f01aa0c2113200241a00c6a200110fa0320022f01a00c0d1f20022f01a20c2121200241053a00b018200220133b01a018200220213b01a218200241980c6a200110fa0320022f01980c0d1f20022f019a0c2113200241900c6a200110fa0320022f01900c0d1f20022f01920c2121200241063a00b018200220133b01a418200220213b01a618200241880c6a200110fa0320022f01880c0d1f20022f018a0c2113200241800c6a200110fa0320022f01800c0d1f20022f01820c2121200241073a00b018200220133b01a818200220213b01aa18200241f80b6a200110fa0320022f01f80b0d1f20022f01fa0b2113200241f00b6a200110fa0320022f01f00b0d1f20022f01f20b2121200241d0176a41106a222320024190186a41106a290300370300200220133b01ac18200220213b01ae18200241d0176a41186a221320024190186a41186a290300370300200241083a00b018200241d0176a41086a222120024190186a41086a2903003703002002200229039018220a3703d0182002200a3703d017200241e80b6a200110fa0320022f01e80b0d2020022f01ea0b2124200241d0166a41086a2021290300220a370300200241d0166a41106a20232903002209370300200241d0166a41186a2013290300222537030020024190166a41086a2221200a37030020024190166a41106a2223200937030020024190166a41186a22262025370300200220022903d017220a3703d0162002200a370390160240201e200228028416470d0020024180166a201e108004200228028816211e200228028016211f0b201f201e41286c6a2213202236020020132002290390163702042026290300210a2023290300210920212903002125201320243b01242013410c6a2025370200201341146a20093702002013411c6a200a3702002002201e41016a221e36028816201c417f6a221c0d000b200228028016211f0b201f450d1f02400240200229028416220a422088a741286c22130d00201f21130c010b201f20136a211c201f21130340201341286a2213201c470d000b0b200aa7211c200241e00b6a20011087022013201f6b41286d212320022802e00b0d1b20022802e40b221e2001280204412c6e22132013201e4b1bad422c7e220a422088a70d01200aa72213417f4c0d010240024020130d00410421210c010b201310322221450d010b2002410036028816200220213602801620022013412c6e360284160240201e450d00410021220340200241d80b6a200110870220022802d80b0d1c20022802dc0b2126200241003a00b418200241d00b6a200110fa0320022f01d00b0d1c20022f01d20b2113200241c80b6a200110fa0320022f01c80b0d1c20022f01ca0b2124200241013a00b418200220133b019018200220243b019218200241c00b6a200110fa0320022f01c00b0d1b20022f01c20b2113200241b80b6a200110fa0320022f01b80b0d1b20022f01ba0b2124200241023a00b418200220133b019418200220243b019618200241b00b6a200110fa0320022f01b00b0d1b20022f01b20b2113200241a80b6a200110fa0320022f01a80b0d1b20022f01aa0b2124200241033a00b418200220133b019818200220243b019a18200241a00b6a200110fa0320022f01a00b0d1b20022f01a20b2113200241980b6a200110fa0320022f01980b0d1b20022f019a0b2124200241043a00b418200220133b019c18200220243b019e18200241900b6a200110fa0320022f01900b0d1b20022f01920b2113200241880b6a200110fa0320022f01880b0d1b20022f018a0b2124200241053a00b418200220133b01a018200220243b01a218200241800b6a200110fa0320022f01800b0d1b20022f01820b2113200241f80a6a200110fa0320022f01f80a0d1b20022f01fa0a2124200241063a00b418200220133b01a418200220243b01a618200241f00a6a200110fa0320022f01f00a0d1b20022f01f20a2113200241e80a6a200110fa0320022f01e80a0d1b20022f01ea0a2124200241073a00b418200220133b01a818200220243b01aa18200241e00a6a200110fa0320022f01e00a0d1b20022f01e20a2113200241d80a6a200110fa0320022f01d80a0d1b20022f01da0a2124200241083a00b418200220133b01ac18200220243b01ae18200241d00a6a200110fa0320022f01d00a0d1b20022f01d20a2113200241c80a6a200110fa0320022f01c80a0d1b20022f01ca0a2124200220133b01b018200220243b01b218200241093a00b418200241d0186a41086a20024190186a41086a290300220a370300200241d0186a41106a20024190186a41106a2903002209370300200241d0186a41186a20024190186a41186a2903002225370300200241d0186a41206a20022802b0182213360200200220022903901822273703d018200241d0176a41206a22242013360200200241d0176a41186a22282025370300200241d0176a41106a22292009370300200241d0176a41086a222a200a370300200220273703d017200241c00a6a200110fa0320022f01c00a0d1c20022f01c20a212b20024190176a41206a20242802002213360200200241d0166a41086a202a290300220a370300200241d0166a41106a20292903002209370300200241d0166a41186a20282903002225370300200241d0166a41206a201336020020024190166a41086a2224200a37030020024190166a41106a2228200937030020024190166a41186a2229202537030020024190166a41206a222a2013360200200220022903d017220a3703d0162002200a3703901602402022200228028416470d0020024180166a2022108104200228028816212220022802801621210b20212022412c6c6a221320263602002013200229039016370204202a28020021262029290300210a20282903002109202429030021252013202b3b01282013410c6a2025370200201341146a20093702002013411c6a200a370200201341246a20263602002002202241016a222236028816201e417f6a221e0d000b20022802801621210b2021450d1b02400240200229028416220a422088a7412c6c22130d00202121130c010b202120136a211e2021211303402013412c6a2213201e470d000b0b200aa7211e200241b80a6a2001108702201320216b412c6d212820022802b80a0d1720022802bc0a2213200128020441306e2222202220134b1bad42307e220a422088a70d01200aa72222417f4c0d010240024020220d00410421240c010b202210322224450d010b200241003602881620022024360280162002202241306e3602841602402013450d00410021260340200241b00a6a200110870220022802b00a0d1820022802b40a212a200241003a00b818200241a80a6a200110fa0320022f01a80a0d1820022f01aa0a2122200241a00a6a200110fa0320022f01a00a0d1820022f01a20a2129200241013a00b818200220223b019018200220293b019218200241980a6a200110fa0320022f01980a0d1720022f019a0a2122200241900a6a200110fa0320022f01900a0d1720022f01920a2129200241023a00b818200220223b019418200220293b019618200241880a6a200110fa0320022f01880a0d1720022f018a0a2122200241800a6a200110fa0320022f01800a0d1720022f01820a2129200241033a00b818200220223b019818200220293b019a18200241f8096a200110fa0320022f01f8090d1720022f01fa092122200241f0096a200110fa0320022f01f0090d1720022f01f2092129200241043a00b818200220223b019c18200220293b019e18200241e8096a200110fa0320022f01e8090d1720022f01ea092122200241e0096a200110fa0320022f01e0090d1720022f01e2092129200241053a00b818200220223b01a018200220293b01a218200241d8096a200110fa0320022f01d8090d1720022f01da092122200241d0096a200110fa0320022f01d0090d1720022f01d2092129200241063a00b818200220223b01a418200220293b01a618200241c8096a200110fa0320022f01c8090d1720022f01ca092122200241c0096a200110fa0320022f01c0090d1720022f01c2092129200241073a00b818200220223b01a818200220293b01aa18200241b8096a200110fa0320022f01b8090d1720022f01ba092122200241b0096a200110fa0320022f01b0090d1720022f01b2092129200241083a00b818200220223b01ac18200220293b01ae18200241a8096a200110fa0320022f01a8090d1720022f01aa092122200241a0096a200110fa0320022f01a0090d1720022f01a2092129200241093a00b818200220223b01b018200220293b01b21820024198096a200110fa0320022f0198090d1720022f019a09212220024190096a200110fa0320022f0190090d1720022f0192092129200220223b01b418200220293b01b6182002410a3a00b818200241d0186a41086a20024190186a41086a290300220a370300200241d0186a41106a20024190186a41106a2903002209370300200241d0186a41186a20024190186a41186a2903002225370300200241d0186a41206a20024190186a41206a29030022273703002002200229039018222c3703d018200241d0176a41206a22222027370300200241d0176a41186a22292025370300200241d0176a41106a222b2009370300200241d0176a41086a222d200a3703002002202c3703d01720024188096a200110fa0320022f0188090d1820022f018a09212e20024190176a41206a2022290300220a370300200241d0166a41086a202d2903002209370300200241d0166a41106a202b2903002225370300200241d0166a41186a20292903002227370300200241d0166a41206a200a37030020024190166a41086a2229200937030020024190166a41106a222b202537030020024190166a41186a222d202737030020024190166a41206a222f200a370300200220022903d017220a3703d0162002200a3703901602402026200228028416470d0020024180166a2026108204200228028816212620022802801621240b2024202641306c6a2222202a3602002022200229039016370204202f290300210a202d2903002109202b2903002125202929030021272022202e3b012c2022410c6a2027370200202241146a20253702002022411c6a2009370200202241246a200a3702002002202641016a2226360288162013417f6a22130d000b20022802801621240b2024450d1702400240200229028416220a422088a741306c22130d00202421130c010b202420136a2122202421130340201341306a22132022470d000b0b200aa7212220024180096a2001108702201320246b41306d212b2002280280090d132002280284092226200128020441346e2213201320264b1bad42347e220a422088a70d01200aa72213417f4c0d010240024020130d00410421290c010b201310322229450d010b200241003602881620022029360280162002201341346e3602841602402026450d004100212a0340200241f8086a200110870220022802f8080d1420022802fc08212e200241003a00bc18200241f0086a200110fa0320022f01f0080d1420022f01f2082113200241e8086a200110fa0320022f01e8080d1420022f01ea08212d200241013a00bc18200220133b0190182002202d3b019218200241e0086a200110fa0320022f01e0080d1320022f01e2082113200241d8086a200110fa0320022f01d8080d1320022f01da08212d200241023a00bc18200220133b0194182002202d3b019618200241d0086a200110fa0320022f01d0080d1320022f01d2082113200241c8086a200110fa0320022f01c8080d1320022f01ca08212d200241033a00bc18200220133b0198182002202d3b019a18200241c0086a200110fa0320022f01c0080d1320022f01c2082113200241b8086a200110fa0320022f01b8080d1320022f01ba08212d200241043a00bc18200220133b019c182002202d3b019e18200241b0086a200110fa0320022f01b0080d1320022f01b2082113200241a8086a200110fa0320022f01a8080d1320022f01aa08212d200241053a00bc18200220133b01a0182002202d3b01a218200241a0086a200110fa0320022f01a0080d1320022f01a208211320024198086a200110fa0320022f0198080d1320022f019a08212d200241063a00bc18200220133b01a4182002202d3b01a61820024190086a200110fa0320022f0190080d1320022f019208211320024188086a200110fa0320022f0188080d1320022f018a08212d200241073a00bc18200220133b01a8182002202d3b01aa1820024180086a200110fa0320022f0180080d1320022f0182082113200241f8076a200110fa0320022f01f8070d1320022f01fa07212d200241083a00bc18200220133b01ac182002202d3b01ae18200241f0076a200110fa0320022f01f0070d1320022f01f2072113200241e8076a200110fa0320022f01e8070d1320022f01ea07212d200241093a00bc18200220133b01b0182002202d3b01b218200241e0076a200110fa0320022f01e0070d1320022f01e2072113200241d8076a200110fa0320022f01d8070d1320022f01da07212d2002410a3a00bc18200220133b01b4182002202d3b01b618200241d0076a200110fa0320022f01d0070d1320022f01d2072113200241c8076a200110fa0320022f01c8070d1320022f01ca07212d200220133b01b8182002202d3b01ba182002410b3a00bc18200241d0186a41086a20024190186a41086a290300220a370300200241d0186a41106a20024190186a41106a2903002209370300200241d0186a41186a20024190186a41186a2903002225370300200241d0186a41206a20024190186a41206a2903002227370300200241d0186a41286a20022802b81822133602002002200229039018222c3703d018200241d0176a41286a222d2013360200200241d0176a41206a222f2027370300200241d0176a41186a22302025370300200241d0176a41106a22312009370300200241d0176a41086a2232200a3703002002202c3703d017200241c0076a200110fa0320022f01c0070d1420022f01c207213320024190176a41286a202d280200221336020020024190176a41206a202f290300220a370300200241d0166a41086a20322903002209370300200241d0166a41106a20312903002225370300200241d0166a41186a20302903002227370300200241d0166a41206a200a370300200241d0166a41286a2013360200200220022903d017222c3703d01620024190166a41286a222d201336020020024190166a41206a222f200a37030020024190166a41186a2230202737030020024190166a41106a2231202537030020024190166a41086a223220093703002002202c370390160240202a200228028416470d0020024180166a202a108304200228028816212a20022802801621290b2029202a41346c6a2213202e3602002013200229039016370204202d280200212d202f290300210a203029030021092031290300212520322903002127201320333b01302013410c6a2027370200201341146a20253702002013411c6a2009370200201341246a200a3702002013412c6a202d3602002002202a41016a222a360288162026417f6a22260d000b20022802801621290b2029450d1302400240200229028416220a422088a741346c22130d00202921130c010b202920136a2126202921130340201341346a22132026470d000b0b200aa72126200241b8076a2001108702201320296b41346d212f20022802b8070d0f20022802bc072213200128020441386e222a202a20134b1bad42387e220a422088a70d01200aa7222a417f4c0d0102400240202a0d004104212d0c010b202a1032222d450d010b20024100360288162002202d360280162002202a41386e3602841602402013450d004100212e0340200241b0076a200110870220022802b0070d1020022802b4072131200241003a00c018200241a8076a200110fa0320022f01a8070d1020022f01aa07212a200241a0076a200110fa0320022f01a0070d1020022f01a2072130200241013a00c0182002202a3b019018200220303b01921820024198076a200110fa0320022f0198070d0f20022f019a07212a20024190076a200110fa0320022f0190070d0f20022f0192072130200241023a00c0182002202a3b019418200220303b01961820024188076a200110fa0320022f0188070d0f20022f018a07212a20024180076a200110fa0320022f0180070d0f20022f0182072130200241033a00c0182002202a3b019818200220303b019a18200241f8066a200110fa0320022f01f8060d0f20022f01fa06212a200241f0066a200110fa0320022f01f0060d0f20022f01f2062130200241043a00c0182002202a3b019c18200220303b019e18200241e8066a200110fa0320022f01e8060d0f20022f01ea06212a200241e0066a200110fa0320022f01e0060d0f20022f01e2062130200241053a00c0182002202a3b01a018200220303b01a218200241d8066a200110fa0320022f01d8060d0f20022f01da06212a200241d0066a200110fa0320022f01d0060d0f20022f01d2062130200241063a00c0182002202a3b01a418200220303b01a618200241c8066a200110fa0320022f01c8060d0f20022f01ca06212a200241c0066a200110fa0320022f01c0060d0f20022f01c2062130200241073a00c0182002202a3b01a818200220303b01aa18200241b8066a200110fa0320022f01b8060d0f20022f01ba06212a200241b0066a200110fa0320022f01b0060d0f20022f01b2062130200241083a00c0182002202a3b01ac18200220303b01ae18200241a8066a200110fa0320022f01a8060d0f20022f01aa06212a200241a0066a200110fa0320022f01a0060d0f20022f01a2062130200241093a00c0182002202a3b01b018200220303b01b21820024198066a200110fa0320022f0198060d0f20022f019a06212a20024190066a200110fa0320022f0190060d0f20022f01920621302002410a3a00c0182002202a3b01b418200220303b01b61820024188066a200110fa0320022f0188060d0f20022f018a06212a20024180066a200110fa0320022f0180060d0f20022f01820621302002410b3a00c0182002202a3b01b818200220303b01ba18200241f8056a200110fa0320022f01f8050d0f20022f01fa05212a200241f0056a200110fa0320022f01f0050d0f20022f01f20521302002202a3b01bc18200220303b01be182002410c3a00c018200241d0186a41086a20024190186a41086a290300220a370300200241d0186a41106a20024190186a41106a2903002209370300200241d0186a41186a20024190186a41186a2903002225370300200241d0186a41206a20024190186a41206a2903002227370300200241d0186a41286a20024190186a41286a290300222c370300200220022903901822343703d018200241d0176a41286a222a202c370300200241d0176a41206a22302027370300200241d0176a41186a22322025370300200241d0176a41106a22332009370300200241d0176a41086a2235200a370300200220343703d017200241e8056a200110fa0320022f01e8050d1020022f01ea05213620024190176a41286a202a290300220a37030020024190176a41206a20302903002209370300200241d0166a41086a20352903002225370300200241d0166a41106a20332903002227370300200241d0166a41186a2032290300222c370300200241d0166a41206a2009370300200241d0166a41286a200a370300200220022903d01722343703d01620024190166a41286a2230200a37030020024190166a41206a2232200937030020024190166a41186a2233202c37030020024190166a41106a2235202737030020024190166a41086a2237202537030020022034370390160240202e200228028416470d0020024180166a202e108404200228028816212e200228028016212d0b202d202e41386c6a222a2031360200202a2002290390163702042030290300210a2032290300210920332903002125203529030021272037290300212c202a20363b0134202a410c6a202c370200202a41146a2027370200202a411c6a2025370200202a41246a2009370200202a412c6a200a3702002002202e41016a222e360288162013417f6a22130d000b200228028016212d0b202d450d0f02400240200229028416220a422088a741386c22130d00202d21130c010b202d20136a212a202d21130340201341386a2213202a470d000b0b200aa7212a200241e0056a20011087022013202d6b41386d213220022802e0050d0b20022802e40522132001280204413c6e222e202e20134b1bad423c7e220a422088a70d01200aa7222e417f4c0d0102400240202e0d00410421300c010b202e10322230450d010b200241003602881620022030360280162002202e413c6e3602841602402013450d00410021310340200241d8056a200110870220022802d8050d0c20022802dc052135200241003a00c418200241d0056a200110fa0320022f01d0050d0c20022f01d205212e200241c8056a200110fa0320022f01c8050d0c20022f01ca052133200241013a00c4182002202e3b019018200220333b019218200241c0056a200110fa0320022f01c0050d0b20022f01c205212e200241b8056a200110fa0320022f01b8050d0b20022f01ba052133200241023a00c4182002202e3b019418200220333b019618200241b0056a200110fa0320022f01b0050d0b20022f01b205212e200241a8056a200110fa0320022f01a8050d0b20022f01aa052133200241033a00c4182002202e3b019818200220333b019a18200241a0056a200110fa0320022f01a0050d0b20022f01a205212e20024198056a200110fa0320022f0198050d0b20022f019a052133200241043a00c4182002202e3b019c18200220333b019e1820024190056a200110fa0320022f0190050d0b20022f019205212e20024188056a200110fa0320022f0188050d0b20022f018a052133200241053a00c4182002202e3b01a018200220333b01a21820024180056a200110fa0320022f0180050d0b20022f018205212e200241f8046a200110fa0320022f01f8040d0b20022f01fa042133200241063a00c4182002202e3b01a418200220333b01a618200241f0046a200110fa0320022f01f0040d0b20022f01f204212e200241e8046a200110fa0320022f01e8040d0b20022f01ea042133200241073a00c4182002202e3b01a818200220333b01aa18200241e0046a200110fa0320022f01e0040d0b20022f01e204212e200241d8046a200110fa0320022f01d8040d0b20022f01da042133200241083a00c4182002202e3b01ac18200220333b01ae18200241d0046a200110fa0320022f01d0040d0b20022f01d204212e200241c8046a200110fa0320022f01c8040d0b20022f01ca042133200241093a00c4182002202e3b01b018200220333b01b218200241c0046a200110fa0320022f01c0040d0b20022f01c204212e200241b8046a200110fa0320022f01b8040d0b20022f01ba0421332002410a3a00c4182002202e3b01b418200220333b01b618200241b0046a200110fa0320022f01b0040d0b20022f01b204212e200241a8046a200110fa0320022f01a8040d0b20022f01aa0421332002410b3a00c4182002202e3b01b818200220333b01ba18200241a0046a200110fa0320022f01a0040d0b20022f01a204212e20024198046a200110fa0320022f0198040d0b20022f019a0421332002410c3a00c4182002202e3b01bc18200220333b01be1820024190046a200110fa0320022f0190040d0b20022f019204212e20024188046a200110fa0320022f0188040d0b20022f018a0421332002202e3b01c018200220333b01c2182002410d3a00c418200241d0186a41086a222e20024190186a41086a290300370300200241d0186a41106a223320024190186a41106a290300370300200241d0186a41186a223620024190186a41186a290300370300200241d0186a41206a223720024190186a41206a290300370300200241d0186a41286a223820024190186a41286a290300370300200241d0186a41306a223920022802c01836020020022002290390183703d018200241d0176a41306a223a2039280200360200200241d0176a41286a22392038290300370300200241d0176a41206a22382037290300370300200241d0176a41186a22372036290300370300200241d0176a41106a22362033290300370300200241d0176a41086a2233202e290300370300200220022903d0183703d01720024180046a200110fa0320022f0180040d0c20022f018204213b20024190176a41306a203a280200222e36020020024190176a41286a2039290300220a37030020024190176a41206a20382903002209370300200241d0166a41086a22382033290300370300200241d0166a41106a22332036290300370300200241d0166a41186a22362037290300370300200241d0166a41206a22372009370300200241d0166a41286a2239200a370300200241d0166a41306a223a202e360200200220022903d0173703d01620024190166a41306a223c203a28020036020020024190166a41286a223a203929030037030020024190166a41206a2239203729030037030020024190166a41186a2237203629030037030020024190166a41106a2236203329030037030020024190166a41086a22332038290300370300200220022903d0163703901602402031200228028416470d0020024180166a2031108504200228028816213120022802801621300b20302031413c6c6a222e2035360200202e200229039016370204203c2802002135203a290300210a2039290300210920372903002125203629030021272033290300212c202e203b3b0138202e410c6a202c370200202e41146a2027370200202e411c6a2025370200202e41246a2009370200202e412c6a200a370200202e41346a20353602002002203141016a2231360288162013417f6a22130d000b20022802801621300b2030450d0b02400240200229028416220a422088a7413c6c22130d00203021130c010b203020136a212e2030211303402013413c6a2213202e470d000b0b200aa7212e200241f8036a2001108702201320306b413c6d213520022802f8030d0720022802fc03221320012802044106762231203120134b1b22314106742233417f4c0d010240024020310d00410421330c010b203310322233450d010b20024100360288162002203136028416200220333602801602402013450d00410021360340200241f0036a200110870220022802f0030d0820022802f4032138200241003a00c818200241e8036a200110fa0320022f01e8030d0820022f01ea032131200241e0036a200110fa0320022f01e0030d0820022f01e2032137200241013a00c818200220313b019018200220373b019218200241d8036a200110fa0320022f01d8030d0720022f01da032131200241d0036a200110fa0320022f01d0030d0720022f01d2032137200241023a00c818200220313b019418200220373b019618200241c8036a200110fa0320022f01c8030d0720022f01ca032131200241c0036a200110fa0320022f01c0030d0720022f01c2032137200241033a00c818200220313b019818200220373b019a18200241b8036a200110fa0320022f01b8030d0720022f01ba032131200241b0036a200110fa0320022f01b0030d0720022f01b2032137200241043a00c818200220313b019c18200220373b019e18200241a8036a200110fa0320022f01a8030d0720022f01aa032131200241a0036a200110fa0320022f01a0030d0720022f01a2032137200241053a00c818200220313b01a018200220373b01a21820024198036a200110fa0320022f0198030d0720022f019a03213120024190036a200110fa0320022f0190030d0720022f0192032137200241063a00c818200220313b01a418200220373b01a61820024188036a200110fa0320022f0188030d0720022f018a03213120024180036a200110fa0320022f0180030d0720022f0182032137200241073a00c818200220313b01a818200220373b01aa18200241f8026a200110fa0320022f01f8020d0720022f01fa022131200241f0026a200110fa0320022f01f0020d0720022f01f2022137200241083a00c818200220313b01ac18200220373b01ae18200241e8026a200110fa0320022f01e8020d0720022f01ea022131200241e0026a200110fa0320022f01e0020d0720022f01e2022137200241093a00c818200220313b01b018200220373b01b218200241d8026a200110fa0320022f01d8020d0720022f01da022131200241d0026a200110fa0320022f01d0020d0720022f01d20221372002410a3a00c818200220313b01b418200220373b01b618200241c8026a200110fa0320022f01c8020d0720022f01ca022131200241c0026a200110fa0320022f01c0020d0720022f01c20221372002410b3a00c818200220313b01b818200220373b01ba18200241b8026a200110fa0320022f01b8020d0720022f01ba022131200241b0026a200110fa0320022f01b0020d0720022f01b20221372002410c3a00c818200220313b01bc18200220373b01be18200241a8026a200110fa0320022f01a8020d0720022f01aa022131200241a0026a200110fa0320022f01a0020d0720022f01a20221372002410d3a00c818200220313b01c018200220373b01c21820024198026a200110fa0320022f0198020d0720022f019a02213120024190026a200110fa0320022f0190020d0720022f0192022137200220313b01c418200220373b01c6182002410e3a00c818200241d0186a41086a223120024190186a41086a290300370300200241d0186a41106a223720024190186a41106a290300370300200241d0186a41186a223920024190186a41186a290300370300200241d0186a41206a223a20024190186a41206a290300370300200241d0186a41286a223b20024190186a41286a290300370300200241d0186a41306a223c20024190186a41306a29030037030020022002290390183703d018200241d0176a41306a223d203c290300370300200241d0176a41286a223c203b290300370300200241d0176a41206a223b203a290300370300200241d0176a41186a223a2039290300370300200241d0176a41106a22392037290300370300200241d0176a41086a22372031290300370300200220022903d0183703d01720024188026a200110fa0320022f0188020d0820022f018a02213e20024190176a41306a203d290300220a37030020024190176a41286a203c290300220937030020024190176a41206a203b2903002225370300200241d0166a41086a22312037290300370300200241d0166a41106a22372039290300370300200241d0166a41186a2239203a290300370300200241d0166a41206a223a2025370300200241d0166a41286a223b2009370300200241d0166a41306a223c200a370300200220022903d0173703d01620024190166a41306a223d203c29030037030020024190166a41286a223c203b29030037030020024190166a41206a223b203a29030037030020024190166a41186a223a203929030037030020024190166a41106a2239203729030037030020024190166a41086a22372031290300370300200220022903d0163703901602402036200228028416470d0020024180166a2036108604200228028816213620022802801621330b203320364106746a223120383602002031200229039016370204203d290300210a203c2903002109203b2903002125203a29030021272039290300212c203729030021342031203e3b013c2031410c6a2034370200203141146a202c3702002031411c6a2027370200203141246a20253702002031412c6a2009370200203141346a200a3702002002203641016a2236360288162013417f6a22130d000b20022802801621330b2033450d0702400240200229028416220a422088a741067422130d00203321130c010b203320136a2131203321130340201341c0006a22132031470d000b0b200aa7213120024180026a20011087022002280280020d042002280284022237200128020441c4006e2236203620374b1bad42c4007e220a422088a70d01200aa72238417f4c0d010240024020380d00410421360c010b203810322236450d010b200241003602881620022036360280162002203841c4006e3602841602402037450d00410021390340200241f8016a200110870220022802f8010d0520022802fc01213b200241003a00cc18200241f0016a200110fa0320022f01f0010d0520022f01f2012138200241e8016a200110fa0320022f01e8010d0520022f01ea01213a200241013a00cc18200220383b0190182002203a3b019218200241e0016a200110fa0320022f01e0010d0420022f01e2012138200241d8016a200110fa0320022f01d8010d0420022f01da01213a200241023a00cc18200220383b0194182002203a3b019618200241d0016a200110fa0320022f01d0010d0420022f01d2012138200241c8016a200110fa0320022f01c8010d0420022f01ca01213a200241033a00cc18200220383b0198182002203a3b019a18200241c0016a200110fa0320022f01c0010d0420022f01c2012138200241b8016a200110fa0320022f01b8010d0420022f01ba01213a200241043a00cc18200220383b019c182002203a3b019e18200241b0016a200110fa0320022f01b0010d0420022f01b2012138200241a8016a200110fa0320022f01a8010d0420022f01aa01213a200241053a00cc18200220383b01a0182002203a3b01a218200241a0016a200110fa0320022f01a0010d0420022f01a201213820024198016a200110fa0320022f0198010d0420022f019a01213a200241063a00cc18200220383b01a4182002203a3b01a61820024190016a200110fa0320022f0190010d0420022f019201213820024188016a200110fa0320022f0188010d0420022f018a01213a200241073a00cc18200220383b01a8182002203a3b01aa1820024180016a200110fa0320022f0180010d0420022f0182012138200241f8006a200110fa0320022f01780d0420022f017a213a200241083a00cc18200220383b01ac182002203a3b01ae18200241f0006a200110fa0320022f01700d0420022f01722138200241e8006a200110fa0320022f01680d0420022f016a213a200241093a00cc18200220383b01b0182002203a3b01b218200241e0006a200110fa0320022f01600d0420022f01622138200241d8006a200110fa0320022f01580d0420022f015a213a2002410a3a00cc18200220383b01b4182002203a3b01b618200241d0006a200110fa0320022f01500d0420022f01522138200241c8006a200110fa0320022f01480d0420022f014a213a2002410b3a00cc18200220383b01b8182002203a3b01ba18200241c0006a200110fa0320022f01400d0420022f01422138200241386a200110fa0320022f01380d0420022f013a213a2002410c3a00cc18200220383b01bc182002203a3b01be18200241306a200110fa0320022f01300d0420022f01322138200241286a200110fa0320022f01280d0420022f012a213a2002410d3a00cc18200220383b01c0182002203a3b01c218200241206a200110fa0320022f01200d0420022f01222138200241186a200110fa0320022f01180d0420022f011a213a2002410e3a00cc18200220383b01c4182002203a3b01c618200241106a200110fa0320022f01100d0420022f01122138200241086a200110fa0320022f01080d0420022f010a213a200220383b01c8182002203a3b01ca182002410f3a00cc18200241d0186a41086a223820024190186a41086a290300370300200241d0186a41106a223a20024190186a41106a290300370300200241d0186a41186a223c20024190186a41186a290300370300200241d0186a41206a223d20024190186a41206a290300370300200241d0186a41286a223e20024190186a41286a290300370300200241d0186a41306a223f20024190186a41306a290300370300200241d0186a41386a224020022802c81836020020022002290390183703d018200241d0176a41086a22412038290300370300200241d0176a41106a2238203a290300370300200241d0176a41186a223a203c290300370300200241d0176a41206a223c203d290300370300200241d0176a41286a223d203e290300370300200241d0176a41306a223e203f290300370300200241d0176a41386a223f2040280200360200200220022903d0183703d0172002200110fa0320022f01000d0520022f0102214020024190176a41386a203f280200223f36020020024190176a41306a203e290300220a37030020024190176a41286a203d290300220937030020024190176a41206a203c2903002225370300200241d0166a41086a223c2041290300370300200241d0166a41106a223d2038290300370300200241d0166a41186a2238203a290300370300200241d0166a41206a223a2025370300200241d0166a41286a223e2009370300200241d0166a41306a2241200a370300200241d0166a41386a2242203f360200200220022903d0173703d01620024190166a41386a223f204228020036020020024190166a41306a2242204129030037030020024190166a41286a2241203e29030037030020024190166a41206a223e203a29030037030020024190166a41186a223a203829030037030020024190166a41106a2243203d29030037030020024190166a41086a223d203c290300370300200220022903d0163703901602402039200228028416470d0020024180166a203910df02200228028816213920022802801621360b2036203941c4006c6a2238203b3602002038200229039016370204203f280200213b2042290300210a20412903002109203e2903002125203a29030021272043290300212c203d2903002134203820403b01402038410c6a2034370200203841146a202c3702002038411c6a2027370200203841246a20253702002038412c6a2009370200203841346a200a3702002038413c6a203b3602002002203941016a2239360288162037417f6a22370d000b20022802801621360b2036450d04200420066b41037521372003200c6b4104752103200520196b4105752105201320336b4106752113200229028416220aa7213802400240200a422088a741c4006c22040d00203621040c010b203620046a2101203621040340200441c4006a22042001470d000b0b2000200b36020420002006360200200041b8016a2038360200200041b4016a2036360200200041b0016a2013360200200041ac016a2031360200200041a8016a2033360200200041a4016a2035360200200041a0016a202e3602002000419c016a203036020020004198016a203236020020004194016a202a36020020004190016a202d3602002000418c016a202f36020020004188016a202636020020004184016a202936020020004180016a202b360200200041fc006a2022360200200041f8006a2024360200200041f4006a2028360200200041f0006a201e360200200041ec006a2021360200200041e8006a2023360200200041e4006a201c360200200041e0006a201f360200200041dc006a2020360200200041d8006a201a360200200041d4006a201d360200200041d0006a2005360200200041cc006a2017360200200041c8006a2019360200200041c4006a201b360200200041c0006a20123602002000413c6a2015360200200041386a2018360200200041346a200e360200200041306a20143602002000412c6a2016360200200041286a2007360200200041246a200f360200200041206a20033602002000411c6a2011360200200041186a200c360200200041146a2010360200200041106a200d3602002000410c6a2008360200200041086a2037360200200041bc016a200420366b41c4006d3602000c3e0b1039000b103b000b200241003a00cc180b200228028016410020022802841622041b2201450d00200441c4006c450d002001102c0b20004100360200203141ffffff1f71450d032033102c0c030b200241003a00c8180b200228028016410020022802841622041b2201450d00200441ffffff1f71450d002001102c0b200041003602000b202e450d03202e413c6c450d032030102c0c030b200241003a00c4180b200228028016410020022802841622041b2201450d002004413c6c450d002001102c0b200041003602000b202a450d03202a41386c450d03202d102c0c030b200241003a00c0180b200228028016410020022802841622041b2201450d00200441386c450d002001102c0b200041003602000b2026450d03202641346c450d032029102c0c030b200241003a00bc180b200228028016410020022802841622041b2201450d00200441346c450d002001102c0b200041003602000b2022450d03202241306c450d032024102c0c030b200241003a00b8180b200228028016410020022802841622041b2201450d00200441306c450d002001102c0b200041003602000b201e450d03201e412c6c450d032021102c0c030b200241003a00b4180b200228028016410020022802841622041b2201450d002004412c6c450d002001102c0b200041003602000b201c450d03201c41286c450d03201f102c0c030b200241003a00b0180b200228028016410020022802841622041b2201450d00200441286c450d002001102c0b200041003602000b201a450d03201a41246c450d03201d102c0c030b200241003a00ac180b200228028016410020022802841622041b2201450d00200441246c450d002001102c0b200041003602000b201741ffffff3f71450d032019102c0c030b200241003a00a8180b200228029016410020022802941622041b2201450d00200441ffffff3f71450d002001102c0b200041003602000b2012450d032012411c6c450d032015102c0c030b200241003a00a4180b200228029016410020022802941622041b2201450d002004411c6c450d002001102c0b200041003602000b200e450d03200e41186c450d032014102c0c030b200241003a00a0180b200228029016410020022802941622041b2201450d00200441186c450d002001102c0b200041003602000b2007450d03200741146c450d03200f102c0c030b200241003a009c180b200228029016410020022802941622041b2201450d00200441146c450d002001102c0b200041003602000b201141ffffffff0071450d03200c102c0c030b200241003a00d8180b200228029018410020022802941822041b2201450d00200441ffffffff0071450d002001102c0b200041003602000b200d450d02200d410c6c450d022008102c0c020b2001102c0b200041003602000b200b41ffffffff0171450d022006102c0c020b2001102c0b200041003602000b200241d0196a24000b8d0201067f024002400240200128020422020d00410121030c010b200128020022042d0000210520012002417f6a2206360204410121032001200441016a360200200541037122074103460d0002400240024020070e03020100020b20064103490d02200441036a2d0000210720042f0001210620012002417c6a3602042001200441046a360200200620074110747241087420057222024180807c6a41ffff0b4b0d0320024102762101410021030c030b2006450d0120042d0001210320012002417e6a3602042001200441026a360200200341087420057241ffff03712201418002492103200141027621010c020b20054102762101410021030c010b0b200020013b0102200020033b01000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad420c7e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b2001410c6c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a2002410c6e3602000b0f0b2005450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42147e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b200141146c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241146e3602000b0f0b2005450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42187e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b200141186c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241186e3602000b0f0b2005450d001039000b103b000bd20101037f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1b220241ffffff3f7122042002470d02200241057422034100480d0220042002464102742104024002400240024002402000280200410020011b22020d002003450d010c030b200141057422010d0120030d020b200421010c020b200220012003103522010d010c030b200310322201450d020b20002001360200200041046a20034105763602000b0f0b2004450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42247e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b200141246c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241246e3602000b0f0b2005450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42287e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b200141286c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241286e3602000b0f0b2005450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad422c7e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b2001412c6c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a2002412c6e3602000b0f0b2005450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42307e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b200141306c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241306e3602000b0f0b2005450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42347e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b200141346c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241346e3602000b0f0b2005450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42387e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b200141386c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241386e3602000b0f0b2005450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad423c7e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b2001413c6c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a2002413c6e3602000b0f0b2005450d001039000b103b000bd20101037f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1b220241ffffff1f7122042002470d02200241067422034100480d0220042002464102742104024002400240024002402000280200410020011b22020d002003450d010c030b200141067422010d0120030d020b200421010c020b200220012003103522010d010c030b200310322201450d020b20002001360200200041046a20034106763602000b0f0b2004450d001039000b103b000beab4010b077f027e1a7f017e017f017e047f017e077f017e0f7f230041d0196b22022400200241f8116a200110b00302400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022802f8110d0020022802fc11220320012802002802044103762204200420034b1b22044103742205417f4c0d040240024020040d00410421050c010b200510322205450d040b2001200128020441016a22063602042002410036029818200220043602941820022005360290180240200620012802084b0d00024002402003450d00410021040340200241f0116a200110b00320022802f0110d0220022802f4112106200241e8116a200110880420022f01e8110d0220022f01ea11210702402004200228029418470d0020024190186a200410bc03200228029818210420022802901821050b200520044103746a220820073b0104200820063602002002200441016a2204360298182003417f6a22030d000b2001280204210620022802901821050b20012006417f6a3602042005450d022002290294182209422088a741037422040d03200521040c040b20022802941821040b200228029018410020041b2201450d00200441ffffffff0171450d002001102c0b200041003602000c490b200520046a210320052104034020042004290200220a3e0200200441046a200a4220883d0100200441086a22042003470d000b0b2009a7210b200241e0116a200110b00302400240024020022802e0110d0020022802e41122072001280200280204410c6e2203200320074b1bad420c7e220a422088a70d04200aa72203417f4c0d040240024020030d00410421080c010b200310322208450d040b2001200128020441016a22063602042002410036029818200220083602901820022003410c6e2203360294180240200620012802084b0d00024002402007450d00410021030340200241d8116a200110b00320022802d8110d0220022802dc11210c200241d0116a200110880420022f01d0110d0220022f01d211210d200241c8116a200110880420022f01c8110d0220022f01ca11210e200241c0116a200110880420022f01c0110d0220022f01c211210f02402003200228029418470d0020024190186a200310fb03200228029818210320022802901821080b20082003410c6c6a2206200f3b01082006200d3b01042006200c360200200641066a200e3b01002002200341016a2203360298182007417f6a22070d000b2001280204210620022802901821080b20012006417f6a3602042008450d02200229029418220a422088a7410c6c22030d03200821030c040b20022802941821030b200228029018410020031b2204450d002003410c6c450d002004102c0b200041003602000c480b200820036a21062008210303402003410c6a22032006470d000b0b200aa72106200241b8116a200110b003200320086b410c6d211020022802b8110d444104210720022802bc11220c200128020028020441047622032003200c4b1b2203410474220d417f4c0d0102402003450d00200d10322207450d010b2001200128020441016a220d360204200241003602981820022003360294182002200736029018200d20012802084b0d430240200c450d00410021030340200241b0116a200110b0030240024020022802b0110d0020022802b411210f200241003a00d818200241a8116a200110880420022f01a8110d0020022f01aa11210d200241a0116a200110880420022f01a0110d0020022f01a211210e200241013a00d8182002200d3b01d0182002200e3b01d21820024198116a200110880420022f0198110d4620022f019a11210d20024190116a200110880420022f0190110d4620022f019211210e2002200d3b01d4182002200e3b01d61820022903d018210a20024188116a200110880420022f018811450d010b20022802941821030c460b20022f018a11210e02402003200228029418470d0020024190186a200310ce01200228029818210320022802901821070b200720034104746a220d200e3b010c200d200a370204200d200f3602002002200341016a220336029818200c417f6a220c0d000b2001280204210d20022802901821070b2001200d417f6a3602042007450d4402400240200229029418220a422088a741047422030d00200721030c010b200720036a210c200721030340200341106a2203200c470d000b0b200aa7210d20024180116a200110b0032002280280110d40200228028411220e200128020028020441146e220c200c200e4b1bad42147e220a422088a70d01200aa7220c417f4c0d0102400240200c0d004104210f0c010b200c1032220f450d010b2001200128020441016a221136020420024100360298162002200f360290162002200c41146e220c36029416201120012802084b0d3f0240200e450d00200241d0186a41086a21124100210c0340200241f8106a200110b00320022802f8100d4020022802fc102113200241003a009c18200241f0106a200110880420022f01f0100d4020022f01f2102111200241e8106a200110880420022f01e8100d4020022f01ea102114200241013a009c18200220113b019018200220143b019218200241e0106a200110880420022f01e0100d3f20022f01e2102111200241d8106a200110880420022f01d8100d3f20022f01da102114200241023a009c18200220113b019418200220143b019618200241d0106a200110880420022f01d0100d3f20022f01d2102111200241c8106a200110880420022f01c8100d3f20022f01ca102114200220113b019818200220143b019a18201220022802981836020020022002290390183703d018200241c0106a200110880420022f01c0100d4020022f01c210211420024190176a41086a20122802002211360200200241d0166a41086a22152011360200200220022903d018220a370390172002200a3703d0160240200c200228029416470d0020024190166a200c10fc03200228029816210c200228029016210f0b200f200c41146c6a22112013360200201120022903d0163702042011410c6a2015280200360200201120143b01102002200c41016a220c36029816200e417f6a220e0d000b20012802042111200228029016210f0b20012011417f6a360204200f450d4002400240200229029416220a422088a741146c220c0d00200f210c0c010b200f200c6a210e200f210c0340200c41146a220c200e470d000b0b200aa7210e200241b8106a200110b003200c200f6b41146d211320022802b8100d3b20022802bc102211200128020028020441186e220c200c20114b1bad42187e220a422088a70d01200aa7220c417f4c0d0102400240200c0d00410421120c010b200c10322212450d010b2001200128020441016a2214360204200241003602981620022012360290162002200c41186e220c36029416201420012802084b0d3a02402011450d004100210c0340200241b0106a200110b00320022802b0100d3b20022802b4102116200241003a00a018200241a8106a200110880420022f01a8100d3b20022f01aa102114200241a0106a200110880420022f01a0100d3b20022f01a2102115200241013a00a018200220143b019018200220153b01921820024198106a200110880420022f0198100d3a20022f019a10211420024190106a200110880420022f0190100d3a20022f0192102115200241023a00a018200220143b019418200220153b01961820024188106a200110880420022f0188100d3a20022f018a10211420024180106a200110880420022f0180100d3a20022f0182102115200241033a00a018200220143b019818200220153b019a18200241f80f6a200110880420022f01f80f0d3a20022f01fa0f2114200241f00f6a200110880420022f01f00f0d3a20022f01f20f2115200220143b019c18200220153b019e18200241d0186a41086a221420024190186a41086a29030037030020022002290390183703d018200241e80f6a200110880420022f01e80f0d3b20022f01ea0f211520024190176a41086a2014290300220a370300200241d0166a41086a2217200a370300200220022903d018220a370390172002200a3703d0160240200c200228029416470d0020024190166a200c10fd03200228029816210c20022802901621120b2012200c41186c6a22142016360200201420022903d0163702042017290300210a201420153b01142014410c6a200a3702002002200c41016a220c360298162011417f6a22110d000b2001280204211420022802901621120b20012014417f6a3602042012450d3b02400240200229029416220a422088a741186c220c0d002012210c0c010b2012200c6a21112012210c0340200c41186a220c2011470d000b0b200aa72111200241e00f6a200110b003200c20126b41186d211720022802e00f0d3620022802e40f220c2001280200280204411c6e22142014200c4b1bad421c7e220a422088a70d01200aa72214417f4c0d010240024020140d00410421150c010b201410322215450d010b2001200128020441016a22163602042002410036029816200220153602901620022014411c6e221436029416201620012802084b0d350240200c450d00200241d0186a41106a2118410021140340200241d80f6a200110b00320022802d80f0d3620022802dc0f2119200241003a00a418200241d00f6a200110880420022f01d00f0d3620022f01d20f2116200241c80f6a200110880420022f01c80f0d3620022f01ca0f211a200241013a00a418200220163b0190182002201a3b019218200241c00f6a200110880420022f01c00f0d3520022f01c20f2116200241b80f6a200110880420022f01b80f0d3520022f01ba0f211a200241023a00a418200220163b0194182002201a3b019618200241b00f6a200110880420022f01b00f0d3520022f01b20f2116200241a80f6a200110880420022f01a80f0d3520022f01aa0f211a200241033a00a418200220163b0198182002201a3b019a18200241a00f6a200110880420022f01a00f0d3520022f01a20f2116200241980f6a200110880420022f01980f0d3520022f019a0f211a200241043a00a418200220163b019c182002201a3b019e18200241900f6a200110880420022f01900f0d3520022f01920f2116200241880f6a200110880420022f01880f0d3520022f018a0f211a200241d0186a41086a221b20024190186a41086a290300370300200220163b01a0182002201a3b01a218201820022802a018360200200241053a00a41820022002290390183703d018200241800f6a200110880420022f01800f0d3620022f01820f211a20024190176a41086a201b290300220a37030020024190176a41106a20182802002216360200200241d0166a41086a221b200a370300200241d0166a41106a221c2016360200200220022903d018220a370390172002200a3703d01602402014200228029416470d0020024190166a2014109602200228029816211420022802901621150b20152014411c6c6a22162019360200201620022903d016370204201c2802002119201b290300210a2016201a3b01182016410c6a200a370200201641146a20193602002002201441016a221436029816200c417f6a220c0d000b2001280204211620022802901621150b20012016417f6a3602042015450d3602400240200229029416220a422088a7411c6c220c0d002015210c0c010b2015200c6a21142015210c0340200c411c6a220c2014470d000b0b200aa72114200241f80e6a200110b003200c20156b411c6d211820022802f80e0d3120022802fc0e22162001280200280204410576220c200c20164b1b220c410574221a417f4c0d0102400240200c0d004104211a0c010b201a1032221a450d010b2001200128020441016a221936020420024100360298162002200c360294162002201a36029016201920012802084b0d3002402016450d004100210c0340200241f00e6a200110b00320022802f00e0d3120022802f40e211c200241003a00a818200241e80e6a200110880420022f01e80e0d3120022f01ea0e2119200241e00e6a200110880420022f01e00e0d3120022f01e20e211b200241013a00a818200220193b0190182002201b3b019218200241d80e6a200110880420022f01d80e0d3020022f01da0e2119200241d00e6a200110880420022f01d00e0d3020022f01d20e211b200241023a00a818200220193b0194182002201b3b019618200241c80e6a200110880420022f01c80e0d3020022f01ca0e2119200241c00e6a200110880420022f01c00e0d3020022f01c20e211b200241033a00a818200220193b0198182002201b3b019a18200241b80e6a200110880420022f01b80e0d3020022f01ba0e2119200241b00e6a200110880420022f01b00e0d3020022f01b20e211b200241043a00a818200220193b019c182002201b3b019e18200241a80e6a200110880420022f01a80e0d3020022f01aa0e2119200241a00e6a200110880420022f01a00e0d3020022f01a20e211b200241053a00a818200220193b01a0182002201b3b01a218200241980e6a200110880420022f01980e0d3020022f019a0e2119200241900e6a200110880420022f01900e0d3020022f01920e211b200241d0186a41086a221d20024190186a41086a290300370300200220193b01a4182002201b3b01a618200241d0186a41106a221920024190186a41106a290300370300200241063a00a81820022002290390183703d018200241880e6a200110880420022f01880e0d3120022f018a0e211b20024190176a41086a201d290300220a37030020024190176a41106a20192903002209370300200241d0166a41086a221d200a370300200241d0166a41106a221e2009370300200220022903d018220a370390172002200a3703d0160240200c200228029416470d0020024190166a200c10fe03200228029816210c200228029016211a0b201a200c4105746a2219201c360200201920022903d016370204201e290300210a201d29030021092019201b3b011c2019410c6a2009370200201941146a200a3702002002200c41016a220c360298162016417f6a22160d000b20012802042119200228029016211a0b20012019417f6a360204201a450d3102400240200229029416220a422088a7410574220c0d00201a210c0c010b201a200c6a2116201a210c0340200c41206a220c2016470d000b0b200aa72116200241800e6a200110b00320022802800e0d2c20022802840e221b200128020028020441246e22192019201b4b1bad42247e220a422088a70d01200aa72219417f4c0d010240024020190d004104211c0c010b20191032221c450d010b2001200128020441016a221d36020420024100360288162002201c360280162002201941246e221936028416201d20012802084b0d2b0240201b450d00200241d0176a41186a211f4100211d0340200241f80d6a200110b00320022802f80d0d2c20022802fc0d2120200241003a00ac18200241f00d6a200110880420022f01f00d0d2c20022f01f20d2119200241e80d6a200110880420022f01e80d0d2c20022f01ea0d211e200241013a00ac18200220193b0190182002201e3b019218200241e00d6a200110880420022f01e00d0d2b20022f01e20d2119200241d80d6a200110880420022f01d80d0d2b20022f01da0d211e200241023a00ac18200220193b0194182002201e3b019618200241d00d6a200110880420022f01d00d0d2b20022f01d20d2119200241c80d6a200110880420022f01c80d0d2b20022f01ca0d211e200241033a00ac18200220193b0198182002201e3b019a18200241c00d6a200110880420022f01c00d0d2b20022f01c20d2119200241b80d6a200110880420022f01b80d0d2b20022f01ba0d211e200241043a00ac18200220193b019c182002201e3b019e18200241b00d6a200110880420022f01b00d0d2b20022f01b20d2119200241a80d6a200110880420022f01a80d0d2b20022f01aa0d211e200241053a00ac18200220193b01a0182002201e3b01a218200241a00d6a200110880420022f01a00d0d2b20022f01a20d2119200241980d6a200110880420022f01980d0d2b20022f019a0d211e200241063a00ac18200220193b01a4182002201e3b01a618200241900d6a200110880420022f01900d0d2b20022f01920d2119200241880d6a200110880420022f01880d0d2b20022f018a0d211e200241d0176a41106a222120024190186a41106a290300370300200241d0176a41086a222220024190186a41086a290300370300200220193b01a8182002201e3b01aa18201f20022802a818360200200241073a00ac182002200229039018220a3703d0182002200a3703d017200241800d6a200110880420022f01800d0d2c20022f01820d211e200241d0166a41086a2022290300220a370300200241d0166a41106a20212903002209370300200241d0166a41186a201f280200221936020020024190166a41086a2221200a37030020024190166a41106a2222200937030020024190166a41186a22232019360200200220022903d017220a3703d0162002200a370390160240201d200228028416470d0020024180166a201d10ff03200228028816211d200228028016211c0b201c201d41246c6a221920203602002019200229039016370204202328020021202022290300210a202129030021092019201e3b01202019410c6a2009370200201941146a200a3702002019411c6a20203602002002201d41016a221d36028816201b417f6a221b0d000b2001280204211d200228028016211c0b2001201d417f6a360204201c450d2c02400240200229028416220a422088a741246c22190d00201c21190c010b201c20196a211b201c21190340201941246a2219201b470d000b0b200aa7211b200241f80c6a200110b0032019201c6b41246d211f20022802f80c0d2720022802fc0c221d200128020028020441286e22192019201d4b1bad42287e220a422088a70d01200aa72219417f4c0d010240024020190d004104211e0c010b20191032221e450d010b2001200128020441016a222036020420024100360288162002201e360280162002201941286e221936028416202020012802084b0d260240201d450d00410021200340200241f00c6a200110b00320022802f00c0d2720022802f40c2122200241003a00b018200241e80c6a200110880420022f01e80c0d2720022f01ea0c2119200241e00c6a200110880420022f01e00c0d2720022f01e20c2121200241013a00b018200220193b019018200220213b019218200241d80c6a200110880420022f01d80c0d2620022f01da0c2119200241d00c6a200110880420022f01d00c0d2620022f01d20c2121200241023a00b018200220193b019418200220213b019618200241c80c6a200110880420022f01c80c0d2620022f01ca0c2119200241c00c6a200110880420022f01c00c0d2620022f01c20c2121200241033a00b018200220193b019818200220213b019a18200241b80c6a200110880420022f01b80c0d2620022f01ba0c2119200241b00c6a200110880420022f01b00c0d2620022f01b20c2121200241043a00b018200220193b019c18200220213b019e18200241a80c6a200110880420022f01a80c0d2620022f01aa0c2119200241a00c6a200110880420022f01a00c0d2620022f01a20c2121200241053a00b018200220193b01a018200220213b01a218200241980c6a200110880420022f01980c0d2620022f019a0c2119200241900c6a200110880420022f01900c0d2620022f01920c2121200241063a00b018200220193b01a418200220213b01a618200241880c6a200110880420022f01880c0d2620022f018a0c2119200241800c6a200110880420022f01800c0d2620022f01820c2121200241073a00b018200220193b01a818200220213b01aa18200241f80b6a200110880420022f01f80b0d2620022f01fa0b2119200241f00b6a200110880420022f01f00b0d2620022f01f20b2121200241d0176a41106a222320024190186a41106a290300370300200220193b01ac18200220213b01ae18200241d0176a41186a221920024190186a41186a290300370300200241083a00b018200241d0176a41086a222120024190186a41086a2903003703002002200229039018220a3703d0182002200a3703d017200241e80b6a200110880420022f01e80b0d2720022f01ea0b2124200241d0166a41086a2021290300220a370300200241d0166a41106a20232903002209370300200241d0166a41186a2019290300222537030020024190166a41086a2221200a37030020024190166a41106a2223200937030020024190166a41186a22262025370300200220022903d017220a3703d0162002200a3703901602402020200228028416470d0020024180166a20201080042002280288162120200228028016211e0b201e202041286c6a2219202236020020192002290390163702042026290300210a2023290300210920212903002125201920243b01242019410c6a2025370200201941146a20093702002019411c6a200a3702002002202041016a222036028816201d417f6a221d0d000b20012802042120200228028016211e0b20012020417f6a360204201e450d2702400240200229028416220a422088a741286c22190d00201e21190c010b201e20196a211d201e21190340201941286a2219201d470d000b0b200aa7211d200241e00b6a200110b0032019201e6b41286d212220022802e00b0d2220022802e40b22202001280200280204412c6e2219201920204b1bad422c7e220a422088a70d01200aa72219417f4c0d010240024020190d00410421210c010b201910322221450d010b2001200128020441016a22233602042002410036028816200220213602801620022019412c6e221936028416202320012802084b0d2102402020450d00410021230340200241d80b6a200110b00320022802d80b0d2220022802dc0b2126200241003a00b418200241d00b6a200110880420022f01d00b0d2220022f01d20b2119200241c80b6a200110880420022f01c80b0d2220022f01ca0b2124200241013a00b418200220193b019018200220243b019218200241c00b6a200110880420022f01c00b0d2120022f01c20b2119200241b80b6a200110880420022f01b80b0d2120022f01ba0b2124200241023a00b418200220193b019418200220243b019618200241b00b6a200110880420022f01b00b0d2120022f01b20b2119200241a80b6a200110880420022f01a80b0d2120022f01aa0b2124200241033a00b418200220193b019818200220243b019a18200241a00b6a200110880420022f01a00b0d2120022f01a20b2119200241980b6a200110880420022f01980b0d2120022f019a0b2124200241043a00b418200220193b019c18200220243b019e18200241900b6a200110880420022f01900b0d2120022f01920b2119200241880b6a200110880420022f01880b0d2120022f018a0b2124200241053a00b418200220193b01a018200220243b01a218200241800b6a200110880420022f01800b0d2120022f01820b2119200241f80a6a200110880420022f01f80a0d2120022f01fa0a2124200241063a00b418200220193b01a418200220243b01a618200241f00a6a200110880420022f01f00a0d2120022f01f20a2119200241e80a6a200110880420022f01e80a0d2120022f01ea0a2124200241073a00b418200220193b01a818200220243b01aa18200241e00a6a200110880420022f01e00a0d2120022f01e20a2119200241d80a6a200110880420022f01d80a0d2120022f01da0a2124200241083a00b418200220193b01ac18200220243b01ae18200241d00a6a200110880420022f01d00a0d2120022f01d20a2119200241c80a6a200110880420022f01c80a0d2120022f01ca0a2124200220193b01b018200220243b01b218200241093a00b418200241d0186a41086a20024190186a41086a290300220a370300200241d0186a41106a20024190186a41106a2903002209370300200241d0186a41186a20024190186a41186a2903002225370300200241d0186a41206a20022802b0182219360200200220022903901822273703d018200241d0176a41206a22242019360200200241d0176a41186a22282025370300200241d0176a41106a22292009370300200241d0176a41086a222a200a370300200220273703d017200241c00a6a200110880420022f01c00a0d2220022f01c20a212b20024190176a41206a20242802002219360200200241d0166a41086a202a290300220a370300200241d0166a41106a20292903002209370300200241d0166a41186a20282903002225370300200241d0166a41206a201936020020024190166a41086a2224200a37030020024190166a41106a2228200937030020024190166a41186a2229202537030020024190166a41206a222a2019360200200220022903d017220a3703d0162002200a3703901602402023200228028416470d0020024180166a2023108104200228028816212320022802801621210b20212023412c6c6a221920263602002019200229039016370204202a28020021262029290300210a20282903002109202429030021252019202b3b01282019410c6a2025370200201941146a20093702002019411c6a200a370200201941246a20263602002002202341016a2223360288162020417f6a22200d000b2001280204212320022802801621210b20012023417f6a3602042021450d2202400240200229028416220a422088a7412c6c22190d00202121190c010b202120196a21202021211903402019412c6a22192020470d000b0b200aa72120200241b80a6a200110b003201920216b412c6d212620022802b80a0d1d20022802bc0a2223200128020028020441306e2219201920234b1bad42307e220a422088a70d01200aa72219417f4c0d010240024020190d00410421240c010b201910322224450d010b2001200128020441016a2228360204200241003602881620022024360280162002201941306e221936028416202820012802084b0d1c02402023450d00410021280340200241b00a6a200110b00320022802b00a0d1d20022802b40a212a200241003a00b818200241a80a6a200110880420022f01a80a0d1d20022f01aa0a2119200241a00a6a200110880420022f01a00a0d1d20022f01a20a2129200241013a00b818200220193b019018200220293b019218200241980a6a200110880420022f01980a0d1c20022f019a0a2119200241900a6a200110880420022f01900a0d1c20022f01920a2129200241023a00b818200220193b019418200220293b019618200241880a6a200110880420022f01880a0d1c20022f018a0a2119200241800a6a200110880420022f01800a0d1c20022f01820a2129200241033a00b818200220193b019818200220293b019a18200241f8096a200110880420022f01f8090d1c20022f01fa092119200241f0096a200110880420022f01f0090d1c20022f01f2092129200241043a00b818200220193b019c18200220293b019e18200241e8096a200110880420022f01e8090d1c20022f01ea092119200241e0096a200110880420022f01e0090d1c20022f01e2092129200241053a00b818200220193b01a018200220293b01a218200241d8096a200110880420022f01d8090d1c20022f01da092119200241d0096a200110880420022f01d0090d1c20022f01d2092129200241063a00b818200220193b01a418200220293b01a618200241c8096a200110880420022f01c8090d1c20022f01ca092119200241c0096a200110880420022f01c0090d1c20022f01c2092129200241073a00b818200220193b01a818200220293b01aa18200241b8096a200110880420022f01b8090d1c20022f01ba092119200241b0096a200110880420022f01b0090d1c20022f01b2092129200241083a00b818200220193b01ac18200220293b01ae18200241a8096a200110880420022f01a8090d1c20022f01aa092119200241a0096a200110880420022f01a0090d1c20022f01a2092129200241093a00b818200220193b01b018200220293b01b21820024198096a200110880420022f0198090d1c20022f019a09211920024190096a200110880420022f0190090d1c20022f0192092129200220193b01b418200220293b01b6182002410a3a00b818200241d0186a41086a20024190186a41086a290300220a370300200241d0186a41106a20024190186a41106a2903002209370300200241d0186a41186a20024190186a41186a2903002225370300200241d0186a41206a20024190186a41206a29030022273703002002200229039018222c3703d018200241d0176a41206a22192027370300200241d0176a41186a22292025370300200241d0176a41106a222b2009370300200241d0176a41086a222d200a3703002002202c3703d01720024188096a200110880420022f0188090d1d20022f018a09212e20024190176a41206a2019290300220a370300200241d0166a41086a202d2903002209370300200241d0166a41106a202b2903002225370300200241d0166a41186a20292903002227370300200241d0166a41206a200a37030020024190166a41086a2229200937030020024190166a41106a222b202537030020024190166a41186a222d202737030020024190166a41206a222f200a370300200220022903d017220a3703d0162002200a3703901602402028200228028416470d0020024180166a2028108204200228028816212820022802801621240b2024202841306c6a2219202a3602002019200229039016370204202f290300210a202d2903002109202b2903002125202929030021272019202e3b012c2019410c6a2027370200201941146a20253702002019411c6a2009370200201941246a200a3702002002202841016a2228360288162023417f6a22230d000b2001280204212820022802801621240b20012028417f6a3602042024450d1d02400240200229028416220a422088a741306c22190d00202421190c010b202420196a2123202421190340201941306a22192023470d000b0b200aa7212320024180096a200110b003201920246b41306d212a2002280280090d182002280284092228200128020028020441346e2219201920284b1bad42347e220a422088a70d01200aa72219417f4c0d010240024020190d00410421290c010b201910322229450d010b2001200128020441016a222b360204200241003602881620022029360280162002201941346e221936028416202b20012802084b0d1702402028450d004100212b0340200241f8086a200110b00320022802f8080d1820022802fc08212e200241003a00bc18200241f0086a200110880420022f01f0080d1820022f01f2082119200241e8086a200110880420022f01e8080d1820022f01ea08212d200241013a00bc18200220193b0190182002202d3b019218200241e0086a200110880420022f01e0080d1720022f01e2082119200241d8086a200110880420022f01d8080d1720022f01da08212d200241023a00bc18200220193b0194182002202d3b019618200241d0086a200110880420022f01d0080d1720022f01d2082119200241c8086a200110880420022f01c8080d1720022f01ca08212d200241033a00bc18200220193b0198182002202d3b019a18200241c0086a200110880420022f01c0080d1720022f01c2082119200241b8086a200110880420022f01b8080d1720022f01ba08212d200241043a00bc18200220193b019c182002202d3b019e18200241b0086a200110880420022f01b0080d1720022f01b2082119200241a8086a200110880420022f01a8080d1720022f01aa08212d200241053a00bc18200220193b01a0182002202d3b01a218200241a0086a200110880420022f01a0080d1720022f01a208211920024198086a200110880420022f0198080d1720022f019a08212d200241063a00bc18200220193b01a4182002202d3b01a61820024190086a200110880420022f0190080d1720022f019208211920024188086a200110880420022f0188080d1720022f018a08212d200241073a00bc18200220193b01a8182002202d3b01aa1820024180086a200110880420022f0180080d1720022f0182082119200241f8076a200110880420022f01f8070d1720022f01fa07212d200241083a00bc18200220193b01ac182002202d3b01ae18200241f0076a200110880420022f01f0070d1720022f01f2072119200241e8076a200110880420022f01e8070d1720022f01ea07212d200241093a00bc18200220193b01b0182002202d3b01b218200241e0076a200110880420022f01e0070d1720022f01e2072119200241d8076a200110880420022f01d8070d1720022f01da07212d2002410a3a00bc18200220193b01b4182002202d3b01b618200241d0076a200110880420022f01d0070d1720022f01d2072119200241c8076a200110880420022f01c8070d1720022f01ca07212d200220193b01b8182002202d3b01ba182002410b3a00bc18200241d0186a41086a20024190186a41086a290300220a370300200241d0186a41106a20024190186a41106a2903002209370300200241d0186a41186a20024190186a41186a2903002225370300200241d0186a41206a20024190186a41206a2903002227370300200241d0186a41286a20022802b81822193602002002200229039018222c3703d018200241d0176a41286a222d2019360200200241d0176a41206a222f2027370300200241d0176a41186a22302025370300200241d0176a41106a22312009370300200241d0176a41086a2232200a3703002002202c3703d017200241c0076a200110880420022f01c0070d1820022f01c207213320024190176a41286a202d280200221936020020024190176a41206a202f290300220a370300200241d0166a41086a20322903002209370300200241d0166a41106a20312903002225370300200241d0166a41186a20302903002227370300200241d0166a41206a200a370300200241d0166a41286a2019360200200220022903d017222c3703d01620024190166a41286a222d201936020020024190166a41206a222f200a37030020024190166a41186a2230202737030020024190166a41106a2231202537030020024190166a41086a223220093703002002202c370390160240202b200228028416470d0020024180166a202b108304200228028816212b20022802801621290b2029202b41346c6a2219202e3602002019200229039016370204202d280200212d202f290300210a203029030021092031290300212520322903002127201920333b01302019410c6a2027370200201941146a20253702002019411c6a2009370200201941246a200a3702002019412c6a202d3602002002202b41016a222b360288162028417f6a22280d000b2001280204212b20022802801621290b2001202b417f6a3602042029450d1802400240200229028416220a422088a741346c22190d00202921190c010b202920196a2128202921190340201941346a22192028470d000b0b200aa72128200241b8076a200110b003201920296b41346d212e20022802b8070d1320022802bc07222b200128020028020441386e22192019202b4b1bad42387e220a422088a70d01200aa72219417f4c0d010240024020190d004104212d0c010b20191032222d450d010b2001200128020441016a222f36020420024100360288162002202d360280162002201941386e221936028416202f20012802084b0d120240202b450d004100212f0340200241b0076a200110b00320022802b0070d1320022802b4072131200241003a00c018200241a8076a200110880420022f01a8070d1320022f01aa072119200241a0076a200110880420022f01a0070d1320022f01a2072130200241013a00c018200220193b019018200220303b01921820024198076a200110880420022f0198070d1220022f019a07211920024190076a200110880420022f0190070d1220022f0192072130200241023a00c018200220193b019418200220303b01961820024188076a200110880420022f0188070d1220022f018a07211920024180076a200110880420022f0180070d1220022f0182072130200241033a00c018200220193b019818200220303b019a18200241f8066a200110880420022f01f8060d1220022f01fa062119200241f0066a200110880420022f01f0060d1220022f01f2062130200241043a00c018200220193b019c18200220303b019e18200241e8066a200110880420022f01e8060d1220022f01ea062119200241e0066a200110880420022f01e0060d1220022f01e2062130200241053a00c018200220193b01a018200220303b01a218200241d8066a200110880420022f01d8060d1220022f01da062119200241d0066a200110880420022f01d0060d1220022f01d2062130200241063a00c018200220193b01a418200220303b01a618200241c8066a200110880420022f01c8060d1220022f01ca062119200241c0066a200110880420022f01c0060d1220022f01c2062130200241073a00c018200220193b01a818200220303b01aa18200241b8066a200110880420022f01b8060d1220022f01ba062119200241b0066a200110880420022f01b0060d1220022f01b2062130200241083a00c018200220193b01ac18200220303b01ae18200241a8066a200110880420022f01a8060d1220022f01aa062119200241a0066a200110880420022f01a0060d1220022f01a2062130200241093a00c018200220193b01b018200220303b01b21820024198066a200110880420022f0198060d1220022f019a06211920024190066a200110880420022f0190060d1220022f01920621302002410a3a00c018200220193b01b418200220303b01b61820024188066a200110880420022f0188060d1220022f018a06211920024180066a200110880420022f0180060d1220022f01820621302002410b3a00c018200220193b01b818200220303b01ba18200241f8056a200110880420022f01f8050d1220022f01fa052119200241f0056a200110880420022f01f0050d1220022f01f2052130200220193b01bc18200220303b01be182002410c3a00c018200241d0186a41086a20024190186a41086a290300220a370300200241d0186a41106a20024190186a41106a2903002209370300200241d0186a41186a20024190186a41186a2903002225370300200241d0186a41206a20024190186a41206a2903002227370300200241d0186a41286a20024190186a41286a290300222c370300200220022903901822343703d018200241d0176a41286a2219202c370300200241d0176a41206a22302027370300200241d0176a41186a22322025370300200241d0176a41106a22332009370300200241d0176a41086a2235200a370300200220343703d017200241e8056a200110880420022f01e8050d1320022f01ea05213620024190176a41286a2019290300220a37030020024190176a41206a20302903002209370300200241d0166a41086a20352903002225370300200241d0166a41106a20332903002227370300200241d0166a41186a2032290300222c370300200241d0166a41206a2009370300200241d0166a41286a200a370300200220022903d01722343703d01620024190166a41286a2230200a37030020024190166a41206a2232200937030020024190166a41186a2233202c37030020024190166a41106a2235202737030020024190166a41086a2237202537030020022034370390160240202f200228028416470d0020024180166a202f108404200228028816212f200228028016212d0b202d202f41386c6a2219203136020020192002290390163702042030290300210a2032290300210920332903002125203529030021272037290300212c201920363b01342019410c6a202c370200201941146a20273702002019411c6a2025370200201941246a20093702002019412c6a200a3702002002202f41016a222f36028816202b417f6a222b0d000b2001280204212f200228028016212d0b2001202f417f6a360204202d450d1302400240200229028416220a422088a741386c22190d00202d21190c010b202d20196a212b202d21190340201941386a2219202b470d000b0b200aa7212b200241e0056a200110b0032019202d6b41386d213120022802e0050d0e20022802e405222f2001280200280204413c6e22192019202f4b1bad423c7e220a422088a70d01200aa72219417f4c0d010240024020190d00410421300c010b201910322230450d010b2001200128020441016a22323602042002410036028816200220303602801620022019413c6e221936028416203220012802084b0d0d0240202f450d00410021320340200241d8056a200110b00320022802d8050d0e20022802dc052135200241003a00c418200241d0056a200110880420022f01d0050d0e20022f01d2052119200241c8056a200110880420022f01c8050d0e20022f01ca052133200241013a00c418200220193b019018200220333b019218200241c0056a200110880420022f01c0050d0d20022f01c2052119200241b8056a200110880420022f01b8050d0d20022f01ba052133200241023a00c418200220193b019418200220333b019618200241b0056a200110880420022f01b0050d0d20022f01b2052119200241a8056a200110880420022f01a8050d0d20022f01aa052133200241033a00c418200220193b019818200220333b019a18200241a0056a200110880420022f01a0050d0d20022f01a205211920024198056a200110880420022f0198050d0d20022f019a052133200241043a00c418200220193b019c18200220333b019e1820024190056a200110880420022f0190050d0d20022f019205211920024188056a200110880420022f0188050d0d20022f018a052133200241053a00c418200220193b01a018200220333b01a21820024180056a200110880420022f0180050d0d20022f0182052119200241f8046a200110880420022f01f8040d0d20022f01fa042133200241063a00c418200220193b01a418200220333b01a618200241f0046a200110880420022f01f0040d0d20022f01f2042119200241e8046a200110880420022f01e8040d0d20022f01ea042133200241073a00c418200220193b01a818200220333b01aa18200241e0046a200110880420022f01e0040d0d20022f01e2042119200241d8046a200110880420022f01d8040d0d20022f01da042133200241083a00c418200220193b01ac18200220333b01ae18200241d0046a200110880420022f01d0040d0d20022f01d2042119200241c8046a200110880420022f01c8040d0d20022f01ca042133200241093a00c418200220193b01b018200220333b01b218200241c0046a200110880420022f01c0040d0d20022f01c2042119200241b8046a200110880420022f01b8040d0d20022f01ba0421332002410a3a00c418200220193b01b418200220333b01b618200241b0046a200110880420022f01b0040d0d20022f01b2042119200241a8046a200110880420022f01a8040d0d20022f01aa0421332002410b3a00c418200220193b01b818200220333b01ba18200241a0046a200110880420022f01a0040d0d20022f01a204211920024198046a200110880420022f0198040d0d20022f019a0421332002410c3a00c418200220193b01bc18200220333b01be1820024190046a200110880420022f0190040d0d20022f019204211920024188046a200110880420022f0188040d0d20022f018a042133200220193b01c018200220333b01c2182002410d3a00c418200241d0186a41086a223820024190186a41086a290300370300200241d0186a41106a223920024190186a41106a290300370300200241d0186a41186a223a20024190186a41186a290300370300200241d0186a41206a223720024190186a41206a290300370300200241d0186a41286a223620024190186a41286a290300370300200241d0186a41306a223320022802c01836020020022002290390183703d018200241d0176a41306a22192033280200360200200241d0176a41286a22332036290300370300200241d0176a41206a22362037290300370300200241d0176a41186a2237203a290300370300200241d0176a41106a223a2039290300370300200241d0176a41086a22392038290300370300200220022903d0183703d01720024180046a200110880420022f0180040d0e20022f018204213820024190176a41306a2019280200221936020020024190176a41286a2033290300220a37030020024190176a41206a20362903002209370300200241d0166a41086a22332039290300370300200241d0166a41106a2236203a290300370300200241d0166a41186a223a2037290300370300200241d0166a41206a22372009370300200241d0166a41286a2239200a370300200241d0166a41306a223b2019360200200220022903d0173703d01620024190166a41306a223c203b28020036020020024190166a41286a223b203929030037030020024190166a41206a2239203729030037030020024190166a41186a2237203a29030037030020024190166a41106a223a203629030037030020024190166a41086a22362033290300370300200220022903d0163703901602402032200228028416470d0020024180166a2032108504200228028816213220022802801621300b20302032413c6c6a221920353602002019200229039016370204203c2802002133203b290300210a2039290300210920372903002125203a29030021272036290300212c201920383b01382019410c6a202c370200201941146a20273702002019411c6a2025370200201941246a20093702002019412c6a200a370200201941346a20333602002002203241016a223236028816202f417f6a222f0d000b2001280204213220022802801621300b20012032417f6a3602042030450d0e02400240200229028416220a422088a7413c6c22190d00203021190c010b203020196a212f2030211903402019413c6a2219202f470d000b0b200aa72132200241f8036a200110b003201920306b413c6d213620022802f8030d0920022802fc03222f200128020028020441067622192019202f4b1b22194106742233417f4c0d010240024020190d00410421330c010b203310322233450d010b2001200128020441016a2235360204200241003602881620022019360284162002203336028016203520012802084b0d080240202f450d00410021350340200241f0036a200110b00320022802f0030d0920022802f4032137200241003a00c818200241e8036a200110880420022f01e8030d0920022f01ea032119200241e0036a200110880420022f01e0030d0920022f01e203213a200241013a00c818200220193b0190182002203a3b019218200241d8036a200110880420022f01d8030d0820022f01da032119200241d0036a200110880420022f01d0030d0820022f01d203213a200241023a00c818200220193b0194182002203a3b019618200241c8036a200110880420022f01c8030d0820022f01ca032119200241c0036a200110880420022f01c0030d0820022f01c203213a200241033a00c818200220193b0198182002203a3b019a18200241b8036a200110880420022f01b8030d0820022f01ba032119200241b0036a200110880420022f01b0030d0820022f01b203213a200241043a00c818200220193b019c182002203a3b019e18200241a8036a200110880420022f01a8030d0820022f01aa032119200241a0036a200110880420022f01a0030d0820022f01a203213a200241053a00c818200220193b01a0182002203a3b01a21820024198036a200110880420022f0198030d0820022f019a03211920024190036a200110880420022f0190030d0820022f019203213a200241063a00c818200220193b01a4182002203a3b01a61820024188036a200110880420022f0188030d0820022f018a03211920024180036a200110880420022f0180030d0820022f018203213a200241073a00c818200220193b01a8182002203a3b01aa18200241f8026a200110880420022f01f8020d0820022f01fa022119200241f0026a200110880420022f01f0020d0820022f01f202213a200241083a00c818200220193b01ac182002203a3b01ae18200241e8026a200110880420022f01e8020d0820022f01ea022119200241e0026a200110880420022f01e0020d0820022f01e202213a200241093a00c818200220193b01b0182002203a3b01b218200241d8026a200110880420022f01d8020d0820022f01da022119200241d0026a200110880420022f01d0020d0820022f01d202213a2002410a3a00c818200220193b01b4182002203a3b01b618200241c8026a200110880420022f01c8020d0820022f01ca022119200241c0026a200110880420022f01c0020d0820022f01c202213a2002410b3a00c818200220193b01b8182002203a3b01ba18200241b8026a200110880420022f01b8020d0820022f01ba022119200241b0026a200110880420022f01b0020d0820022f01b202213a2002410c3a00c818200220193b01bc182002203a3b01be18200241a8026a200110880420022f01a8020d0820022f01aa022119200241a0026a200110880420022f01a0020d0820022f01a202213a2002410d3a00c818200220193b01c0182002203a3b01c21820024198026a200110880420022f0198020d0820022f019a02211920024190026a200110880420022f0190020d0820022f019202213a200220193b01c4182002203a3b01c6182002410e3a00c818200241d0186a41086a223d20024190186a41086a290300370300200241d0186a41106a223c20024190186a41106a290300370300200241d0186a41186a223b20024190186a41186a290300370300200241d0186a41206a223820024190186a41206a290300370300200241d0186a41286a223920024190186a41286a290300370300200241d0186a41306a223a20024190186a41306a29030037030020022002290390183703d018200241d0176a41306a2219203a290300370300200241d0176a41286a223a2039290300370300200241d0176a41206a22392038290300370300200241d0176a41186a2238203b290300370300200241d0176a41106a223b203c290300370300200241d0176a41086a223c203d290300370300200220022903d0183703d01720024188026a200110880420022f0188020d0920022f018a02213d20024190176a41306a2019290300220a37030020024190176a41286a203a290300220937030020024190176a41206a20392903002225370300200241d0166a41086a2219203c290300370300200241d0166a41106a223a203b290300370300200241d0166a41186a22392038290300370300200241d0166a41206a22382025370300200241d0166a41286a223b2009370300200241d0166a41306a223c200a370300200220022903d0173703d01620024190166a41306a223e203c29030037030020024190166a41286a223c203b29030037030020024190166a41206a223b203829030037030020024190166a41186a2238203929030037030020024190166a41106a2239203a29030037030020024190166a41086a223a2019290300370300200220022903d0163703901602402035200228028416470d0020024180166a2035108604200228028816213520022802801621330b203320354106746a221920373602002019200229039016370204203e290300210a203c2903002109203b2903002125203829030021272039290300212c203a29030021342019203d3b013c2019410c6a2034370200201941146a202c3702002019411c6a2027370200201941246a20253702002019412c6a2009370200201941346a200a3702002002203541016a223536028816202f417f6a222f0d000b2001280204213520022802801621330b20012035417f6a3602042033450d0902400240200229028416220a422088a741067422190d00203321190c010b203320196a212f203321190340201941c0006a2219202f470d000b0b200aa7213920024180026a200110b0032002280280020d05200228028402223a200128020028020441c4006e222f202f203a4b1bad42c4007e220a422088a70d01200aa72235417f4c0d010240024020350d004104212f0c010b20351032222f450d010b2001200128020441016a223736020420024100360288162002202f360280162002203541c4006e223536028416203720012802084b0d040240203a450d00410021370340200241f8016a200110b00320022802f8010d0520022802fc012138200241003a00cc18200241f0016a200110880420022f01f0010d0520022f01f2012135200241e8016a200110880420022f01e8010d0520022f01ea01213b200241013a00cc18200220353b0190182002203b3b019218200241e0016a200110880420022f01e0010d0420022f01e2012135200241d8016a200110880420022f01d8010d0420022f01da01213b200241023a00cc18200220353b0194182002203b3b019618200241d0016a200110880420022f01d0010d0420022f01d2012135200241c8016a200110880420022f01c8010d0420022f01ca01213b200241033a00cc18200220353b0198182002203b3b019a18200241c0016a200110880420022f01c0010d0420022f01c2012135200241b8016a200110880420022f01b8010d0420022f01ba01213b200241043a00cc18200220353b019c182002203b3b019e18200241b0016a200110880420022f01b0010d0420022f01b2012135200241a8016a200110880420022f01a8010d0420022f01aa01213b200241053a00cc18200220353b01a0182002203b3b01a218200241a0016a200110880420022f01a0010d0420022f01a201213520024198016a200110880420022f0198010d0420022f019a01213b200241063a00cc18200220353b01a4182002203b3b01a61820024190016a200110880420022f0190010d0420022f019201213520024188016a200110880420022f0188010d0420022f018a01213b200241073a00cc18200220353b01a8182002203b3b01aa1820024180016a200110880420022f0180010d0420022f0182012135200241f8006a200110880420022f01780d0420022f017a213b200241083a00cc18200220353b01ac182002203b3b01ae18200241f0006a200110880420022f01700d0420022f01722135200241e8006a200110880420022f01680d0420022f016a213b200241093a00cc18200220353b01b0182002203b3b01b218200241e0006a200110880420022f01600d0420022f01622135200241d8006a200110880420022f01580d0420022f015a213b2002410a3a00cc18200220353b01b4182002203b3b01b618200241d0006a200110880420022f01500d0420022f01522135200241c8006a200110880420022f01480d0420022f014a213b2002410b3a00cc18200220353b01b8182002203b3b01ba18200241c0006a200110880420022f01400d0420022f01422135200241386a200110880420022f01380d0420022f013a213b2002410c3a00cc18200220353b01bc182002203b3b01be18200241306a200110880420022f01300d0420022f01322135200241286a200110880420022f01280d0420022f012a213b2002410d3a00cc18200220353b01c0182002203b3b01c218200241206a200110880420022f01200d0420022f01222135200241186a200110880420022f01180d0420022f011a213b2002410e3a00cc18200220353b01c4182002203b3b01c618200241106a200110880420022f01100d0420022f01122135200241086a200110880420022f01080d0420022f010a213b200220353b01c8182002203b3b01ca182002410f3a00cc18200241d0186a41086a223b20024190186a41086a290300370300200241d0186a41106a223c20024190186a41106a290300370300200241d0186a41186a223d20024190186a41186a290300370300200241d0186a41206a223e20024190186a41206a290300370300200241d0186a41286a223f20024190186a41286a290300370300200241d0186a41306a224020024190186a41306a290300370300200241d0186a41386a224120022802c81836020020022002290390183703d018200241d0176a41086a2235203b290300370300200241d0176a41106a223b203c290300370300200241d0176a41186a223c203d290300370300200241d0176a41206a223d203e290300370300200241d0176a41286a223e203f290300370300200241d0176a41306a223f2040290300370300200241d0176a41386a22402041280200360200200220022903d0183703d0172002200110880420022f01000d0520022f0102214120024190176a41386a2040280200224036020020024190176a41306a203f290300220a37030020024190176a41286a203e290300220937030020024190176a41206a203d2903002225370300200241d0166a41086a223d2035290300370300200241d0166a41106a2235203b290300370300200241d0166a41186a223b203c290300370300200241d0166a41206a223c2025370300200241d0166a41286a223e2009370300200241d0166a41306a223f200a370300200241d0166a41386a22422040360200200220022903d0173703d01620024190166a41386a2240204228020036020020024190166a41306a2242203f29030037030020024190166a41286a223f203e29030037030020024190166a41206a223e203c29030037030020024190166a41186a223c203b29030037030020024190166a41106a223b203529030037030020024190166a41086a2243203d290300370300200220022903d0163703901602402037200228028416470d0020024180166a203710df022002280288162137200228028016212f0b202f203741c4006c6a223520383602002035200229039016370204204028020021382042290300210a203f2903002109203e2903002125203c2903002127203b290300212c20432903002134203520413b01402035410c6a2034370200203541146a202c3702002035411c6a2027370200203541246a20253702002035412c6a2009370200203541346a200a3702002035413c6a20383602002002203741016a223736028816203a417f6a223a0d000b20012802042137200228028016212f0b20012037417f6a360204202f450d05200420056b4103752135200320076b4104752103200c201a6b410575210c201920336b4106752119200229028416220aa7213702400240200a422088a741c4006c22040d00202f21040c010b202f20046a2101202f21040340200441c4006a22042001470d000b0b2000200b36020420002005360200200041b8016a2037360200200041b4016a202f360200200041b0016a2019360200200041ac016a2039360200200041a8016a2033360200200041a4016a2036360200200041a0016a20323602002000419c016a203036020020004198016a203136020020004194016a202b36020020004190016a202d3602002000418c016a202e36020020004188016a202836020020004184016a202936020020004180016a202a360200200041fc006a2023360200200041f8006a2024360200200041f4006a2026360200200041f0006a2020360200200041ec006a2021360200200041e8006a2022360200200041e4006a201d360200200041e0006a201e360200200041dc006a201f360200200041d8006a201b360200200041d4006a201c360200200041d0006a200c360200200041cc006a2016360200200041c8006a201a360200200041c4006a2018360200200041c0006a20143602002000413c6a2015360200200041386a2017360200200041346a2011360200200041306a20123602002000412c6a2013360200200041286a200e360200200041246a200f360200200041206a20033602002000411c6a200d360200200041186a2007360200200041146a2010360200200041106a20063602002000410c6a2008360200200041086a2035360200200041bc016a2004202f6b41c4006d3602000c470b1039000b103b000b200241003a00cc180b20022802841621350b200228028016410020351b2204450d00203541c4006c450d002004102c0b20004100360200203941ffffff1f71450d042033102c0c040b200241003a00c8180b20022802841621190b200228028016410020191b2204450d00201941ffffff1f71450d002004102c0b200041003602000b2032450d042032413c6c450d042030102c0c040b200241003a00c4180b20022802841621190b200228028016410020191b2204450d002019413c6c450d002004102c0b200041003602000b202b450d04202b41386c450d04202d102c0c040b200241003a00c0180b20022802841621190b200228028016410020191b2204450d00201941386c450d002004102c0b200041003602000b2028450d04202841346c450d042029102c0c040b200241003a00bc180b20022802841621190b200228028016410020191b2204450d00201941346c450d002004102c0b200041003602000b2023450d04202341306c450d042024102c0c040b200241003a00b8180b20022802841621190b200228028016410020191b2204450d00201941306c450d002004102c0b200041003602000b2020450d042020412c6c450d042021102c0c040b200241003a00b4180b20022802841621190b200228028016410020191b2204450d002019412c6c450d002004102c0b200041003602000b201d450d04201d41286c450d04201e102c0c040b200241003a00b0180b20022802841621190b200228028016410020191b2204450d00201941286c450d002004102c0b200041003602000b201b450d04201b41246c450d04201c102c0c040b200241003a00ac180b20022802841621190b200228028016410020191b2204450d00201941246c450d002004102c0b200041003602000b201641ffffff3f71450d04201a102c0c040b200241003a00a8180b200228029416210c0b2002280290164100200c1b2204450d00200c41ffffff3f71450d002004102c0b200041003602000b2014450d042014411c6c450d042015102c0c040b200241003a00a4180b20022802941621140b200228029016410020141b2204450d002014411c6c450d002004102c0b200041003602000b2011450d04201141186c450d042012102c0c040b200241003a00a0180b200228029416210c0b2002280290164100200c1b2204450d00200c41186c450d002004102c0b200041003602000b200e450d04200e41146c450d04200f102c0c040b200241003a009c180b200228029416210c0b2002280290164100200c1b2204450d00200c41146c450d002004102c0b200041003602000b200d41ffffffff0071450d032007102c0c030b200241003a00d81820022802941821030b200228029018410020031b2204450d00200341ffffffff0071450d002004102c0b200041003602000b2006450d002006410c6c450d002008102c0b200b41ffffffff0171450d002005102c0b200241d0196a24000bae0201067f0240024002402001280200220228020422030d00410121030c010b200228020022042d0000210520022003417f6a360204410121032002200441016a360200200541037122024103460d0002400240024020020e03020100020b2001280200220228020422014103490d022002280200220441026a2d0000210620042f000021072002200441036a36020020022001417d6a360204200720064110747241087420057222014180807c6a41ffff0b4b0d0320014102762102410021030c030b200128020022022802042201450d01200228020022032d0000210420022001417f6a3602042002200341016a360200200441087420057241ffff03712202418002492103200241027621020c020b20054102762102410021030c010b0b200020023b0102200020033b01000ba20201057f230041d0006b220224002002412036020420022001360200200241086a2001412010b30102400240200228020822030d00410221010c010b200228020c210402400240200241106a2802002205450d0041002101024020032d00000e020200010b2005417f6a4104490d0020032800012106410121010c010b20024100360220200242013703182002410f36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c200241b4bcc3003602382002200241286a360248200241346a41dcb7c000200241386a103e1a200235022042208620023502188410000240200228021c450d002002280218102c0b410221010b2004450d002003102c0b2000200636020420002001360200200241d0006a24000bd50401097f230041e0006b220224002002412036020c20022001360208200241106a2001412010b3010240024002400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360224200220033602202002200241206a1087020240024020022802000d002002280204220520022802244103762201200120054b1b22064103742201417f4c0d030240024020060d00410421070c010b200110322207450d050b41002101200241003602502002200636024c20022007360248024002402005450d000340200228022422084104490d022002280220220628000021092002200641046a36022020022008417c6a220a360224200a4104490d022006280004210a2002200841786a3602242002200641086a36022002402001200228024c470d00200241c8006a200110bc0320022802502101200228024821070b200720014103746a2206200a360204200620093602002002200141016a22013602502005417f6a22050d000b200228024821070b2007450d012000200229024c370204200020073602000c020b200228024c41ffffffff0171450d002002280248102c0b20024100360230200242013703282002410f36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241b4bcc3003602482002200241386a360258200241c4006a41dcb7c000200241c8006a103e1a200235023042208620023502288410000240200228022c450d002002280228102c0b200041003602000b2004450d002003102c0b200241e0006a24000f0b103b000b1039000bc40101057f2001280208210302402001410c6a280200220420024b0d002000410036020820002004ad4220862003ad843702000f0b02402001411c6a28020022050d00200041023602080f0b200141146a2802002101200541027421052003417f6a21030240034002402004200128020022066b220720024b0d00200420024b0d020b200141046a21012003417f6a2103200721042005417c6a22050d000b200041023602080f0b2000200636020c20002007ad4220862003ad84370200200041013602080b890f08017f017e047f017e047f017e027f017e23004190016b2201240042002102200141c0006a22034200370300200141386a22044200370300200141286a41086a420037030020014200370328200141286a41ffdcc700410710c501200141e8006a418893c700410a10c5012003200141e8006a41086a29000037030020042001290068370300200141e8006a200141286a10e10120012802682203410120031b2105410221060240024002400240200129026c420020031b2207422088a72203450d00200341057441606a41057641016a210841002104200521030240034020002003460d0120032000412010cc08450d01200242017c2102200341206a21032008200441016a2204470d000c020b0b200141c0006a22034200370300200141386a22094200370300200141286a41086a2200420037030020014200370328200141e8006a41ffdcc700410710c5012000200141e8006a41086a220829000037030020012001290068370328200141e8006a41ccb4c300411210c5012003200829000037030020092001290068370300200141d8006a200141286a10da04024002400240200128025822080d004100210a2001410036022020014204370318410421084100210b410021060c010b2001200129025c220c37021c20012008360218200ca7210a410021064100210302400240200c422088a7220b0e020201000b41002103200b2100034020032000410176220d20036a220e20042008200e4102746a280200491b21032000200d6b220041014b0d000b0b0240200820034102746a28020022002004470d004101210d0c020b2003200420004b6a21060b200141c0006a4200370300200141386a4200370300200141286a41086a2203420037030020014200370328200141e8006a41ffdcc700410710c5012003200141e8006a41086a220029000037030020012001290068370328200141e8006a418893c700410a10c501200941086a20002900003700002009200129006837000041002103200141dc006a41003a000020014100360258200141106a200141286a4120200141d8006a4105410010b70402402001280210450d00200120012802142203410520034105491b36026c2001200141d8006a360268200141086a200141e8006a10870202402001280208450d00410021030c010b200128020c21030b2003418094ebdc0370ad4280fd87d1007e220c428094ebdc0382210f200c428094ebdc0380210c2003418094ebdc036e2103200b2006490d0220034180fd87d1006c200ca7200f4280cab5ee01566a6a21000240200b200a470d00200141186a200a4101109502200128021821080b200820064102746a220341046a2003200b20066b41027410ca081a200320043602002001200b41016a220b360220200b20004b21064100210d200128021c210a200128021821080b200141c0006a4200370300200141386a4200370300200141286a41086a2203420037030020014200370328200141e8006a41ffdcc700410710c5012003200141e8006a41086a220029000037030020012001290068370328200141e8006a41ccb4c300411210c501200941086a2000290000370000200920012900683700000240024020080d00200141286a412010b4010c010b200b410274220341046a2200417f4c0d030240024020000d004101210e0c010b20001032220e450d050b200141003602702001200036026c2001200e3602680240024002400240200b41c000490d00200b41808001490d01200b418080808004490d02200141e8006a41004101102f2001280268200128027022006a41033a00002001200041016a2200360270200141e8006a20004104102f2001280268200128027022006a200b3600002001200041046a2200360270200141e8006a210e0c030b200141e8006a41004101102f2001280268200128027022006a200b4102743a00002001200041016a2200360270200141e8006a210e0c020b200141e8006a41004102102f2001280268200128027022006a200b4102744101723b00002001200041026a2200360270200141e8006a210e0c010b200141e8006a41004104102f2001280268200128027022006a20034102723600002001200041046a2200360270200141e8006a210e0b200e20002003102f200128026822002001280270220e6a2008200310c9081a2001200e20036a2203360270200141286a41202000200310a7020240200128026c450d002000102c0b200a41ffffffff0371450d002008102c0b200d0d00200141e8006a41086a2203200237030020014102360268200141286a200141e8006a10a903200141e3006a2200200141286a41086a2802003600002001200129032837005b200141286a410c6a200141df006a2208290000370000200141c6a4b9da04360029200141023a00282001200129005837002d200141286a109a06200141013602282001200436022c200141e8006a200141286a102e200020032802003600002001200129036837005b200141e8006a410c6a2008290000370000200141c28289aa04360069200141023a00682001200129005837006d200141e8006a109a060b02402007a72203450d00200341ffffff3f71450d002005102c0b20014190016a240020060f0b2006200b1044000b103b000b1039000b970201037f230041d0006b220124002001412036020420012000360200200141086a2000412010b30102400240200128020822020d00410421000c010b200128020c210302400240200141106a280200450d004100210002400240024020022d00000e0404000102030b410121000c030b410221000c020b410321000c010b20014100360220200142013703182001410f36022c200120013602282001200141186a360234200141cc006a41013602002001420137023c200141b4bcc3003602382001200141286a360248200141346a41dcb7c000200141386a103e1a200135022042208620013502188410000240200128021c450d002001280218102c0b410421000b2003450d002002102c0b200141d0006a240020000bf10101027f230041106b22022400200241003602082002420137030002400240024002400240200141ff01710e0400010203000b200241004101102f20022802002203200228020822016a41003a0000200141016a21010c030b200241004101102f20022802002203200228020822016a41013a0000200141016a21010c020b200241004101102f20022802002203200228020822016a41023a0000200141016a21010c010b200241004101102f20022802002203200228020822016a41033a0000200141016a21010b20022001360208200041202003200110a70202402002280204450d002003102c0b200241106a24000bb303010a7f230041c0006b22012400024020002d002c450d00200041086a21022000411c6a28020022034102742104200041146a280200210520002802002106417f21072000410c6a2802002208210902400240024003402004450d012004417c6a2104200741016a2107200920064b210a200920052802006b2109200541046a2105200a0d000b2003200a20076a22044f0d01200020082006200820064b1b36020c0c020b200020082006200820064b1b36020c0c010b200228020021092000411c6a2004360200200020082006200820064b1b36020c200920036b22052009200a6b20076b4f0d002003200a6b20076b21090340200141086a41086a2000280204220441086a290000370300200141086a41106a200441106a290000370300200141086a41186a200441186a2900003703002001200429000037030820012005360228200141306a200141086a10d30320012802302204200128023810b40102402001280234450d002004102c0b200541016a21052009417f6a22090d000b0b2000280204200210d4030b0240200041186a28020041ffffffff0371450d00200041146a280200102c0b200141c0006a24000b800d04047f017e027f067e230041d0026b22052400200541c8016a20012002108b0402400240024002400240024020052802d0014102460d0020052802c8012106200541c8016a41086a2001280204220741086a290000370300200541c8016a41106a200741106a290000370300200541c8016a41186a200741186a290000370300200520063602e801200520072900003703c801200541f0016a200541c8016a10d30320052802f0012108200520052802f801220736028402200520083602800220054188026a2008200710b3010240024020052802880222070d00420021090c010b200528028c02210a02400240024020054188026a41086a280200220b4110490d00200b4170714110470d010b200541003602c802200542013703c0022005410f36029c02200520054180026a360298022005200541c0026a3602a402200541bc026a4101360200200542013702ac02200541b4bcc3003602a802200520054198026a3602b802200541a4026a41dcb7c000200541a8026a103e1a20053502c80242208620053502c002841000024020052802c402450d0020052802c002102c0b420021090c010b200741186a290000210c200741086a290000210d2007290010210e2007290000210f420121090b200a450d002007102c0b200d4200200942005222071b210d200f420020071b210f024020052802f401450d002008102c0b200c420020071b210c200e420020071b210e200f200354200d200454200d2004511b0d01200f200385200d2004858450450d04200541b8016a20032004428094ebdc03420010c708200541a8016a20032004428094ebdc03420010c80820054198016a20052903a801200541a8016a41086a2903002001350228220d420010ce0820054188016a4200200529039801220f200d20052903b8017e220d428094ebdc0380a7417f200d428080808080c0b2cd3b541b200d428094ebdc03824280cab5ee01566aad7c220d200e7d22092009200d5620054198016a41086a290300200d200f54ad7c220f200c7d200d200e54ad7d220d200f56200d200f511b22021b220f4200200d20021b220d428094ebdc03420010c708200541f8006a200f200d428094ebdc03420010c808200541e8006a2005290378200541f8006a41086a2903004280cab5ee01420010ce082005290368220f200529038801220d420188a7200d4280cab5ee017e428094ebdc03824280cab5ee01566aad7c220d200541e8006a41086a290300200d200f54ad7c220f84500d040c020b410021010c040b200541d8006a20032004428094ebdc03420010c708200541c8006a20032004428094ebdc03420010c808200541386a2005290348200541c8006a41086a29030020013502282209420010ce08200541286a420020052903382210200920052903587e2209428094ebdc0380a7417f2009428080808080c0b2cd3b541b2009428094ebdc03824280cab5ee01566aad7c2209200e7d22112011200956200541386a41086a2903002009201054ad7c2210200c7d2009200e54ad7d220920105620092010511b22071b22104200200920071b2209428094ebdc03420010c708200541186a20102009428094ebdc03420010c808200541086a2005290318200541186a41086a2903004280cab5ee01420010ce08200128022422072003200f7d220920072903007c2210370300200741086a22072004200d7d2003200f54ad7d20072903007c2010200954ad7c370300200141106a2207200728020022072002200720024b1b3602002005290308220f2005290328220d420188a7200d4280cab5ee017e428094ebdc03824280cab5ee01566aad7c220d200541086a41086a290300200d200f54ad7c220f8450450d00200e210d0c010b2001280220220220022903002209200d7c2210370300200241086a22022002290300200f7c2010200954ad7c370300200c200f7c200e200d7c220d200e54ad7c210c0b200141013a002c200541c0026a200541c8016a10d30320052802c802210720052802c0022101200541003602b002200542013703a802200541a8026a41004110102f20052802a80220052802b00222026a22082004370008200820033700002005200241106a22023602b002200541a8026a20024110102f20052802a802220220052802b00222086a220a200c370008200a200d3700002005200841106a22083602b002200120072002200810a702024020052802ac02450d002002102c0b20052802c402450d002001102c0b410121010b2000200636020420002001360200200541d0026a24000bc61106047f017e0f7f027e057f047e230041c0036b220324002003200236021c20032001360218200341206a2001200210b30102400240200328022022040d00200041003602000c010b200328022421052003200341286a28020036023420032004360230200341106a200341306a1087020240024020032802100d0002400240024020032802142206200328023441d8006e2201200120064b1bad42d8007e2207422088a70d002007a72201417f4c0d000240024020010d00410821080c010b200110322208450d020b20034100360240200320083602382003200141d8006e36023c02402006450d00410021094100210a034041002101200341003a00f802200a41016a210a2003280234210b417f2102024002400340200b2001460d01200341d8026a20016a2003280230220c2d00003a00002003200b20026a3602342003200c41016a3602302003200141016a220d3a00f8022002417f6a2102200d2101200d4120470d000b200341a0036a41186a220e200341d8026a41186a220f290300370300200341a0036a41106a2210200341d8026a41106a2211290300370300200341a0036a41086a2212200341d8026a41086a2213290300370300200320032903d8023703a003200d41ff017141204f0d010c060b200141ff0171450d05200341003a00f8020c050b200341a8016a41086a22142012290300370300200341a8016a41106a22152010290300370300200341a8016a41186a2216200e290300370300200320032903a00322073703c801200320073703a801200b200d6b22014110490d042003200c41116a3602302003200141706a360234200c41096a2900002117200c2900012118200341086a200341306a10870220032802080d04200328020c2219200328023441306e2201200120194b1bad42307e2207422088a70d022007a72201417f4c0d020240024020010d004108211a0c010b20011032221a450d040b200341003602f0012003201a3602e8012003200141306e3602ec01024002400240024002402019450d004100211b4100211c0340200341003a00f802201c41016a211c417f21022003280234210b410021010340200b2001460d03200341d8026a20016a2003280230220c2d00003a00002003200b20026a3602342003200c41016a3602302003200141016a220d3a00f8022002417f6a2102200d2101200d4120470d000b200e200f2903003703002010201129030037030020122013290300370300200320032903d8023703a003200d41ff01714120490d03200341c8016a41086a22012012290300370300200341c8016a41106a22022010290300370300200341c8016a41186a221d200e290300370300200320032903a0033703c801200b200d6b220d4110490d0320034198026a41086a2001290300220737030020034198026a41106a2002290300221e37030020034198026a41186a201d290300221f370300200341f8016a41086a22022007370300200341f8016a41106a220b201e370300200341f8016a41186a221d201f3703002003200c41116a3602302003200d41706a360234200320032903c801220737039802200320073703f801200c41096a2900002107200c290001211e0240201b20032802ec01470d00200341e8016a201b410110e00120032802e801211a20032802f001211b0b201a201b41306c6a220120032903f8013703002002290300211f200b2903002120201d29030021212001201e370320200141286a2007370300200141186a2021370300200141106a2020370300200141086a201f3703002003201b41016a221b3602f001201c2019470d000b0b201a450d0820032902ec012107200341d8026a200341306a10ca0320032802d802220d450d0220032802dc0221022003280234220141104f0d0302402002450d00200241ffffff3f71450d00200d102c0b2007a72201450d08200141306c450d08201a102c0c080b200141ff0171450d00200341003a00f8020b20032802ec012201450d06200141306c450d06201a102c0c060b2007a72201450d05200141306c450d05201a102c0c050b20032802e002210b200341e8006a41086a2014290300221e370300200341e8006a41106a2015290300221f370300200341e8006a41186a20162903002220370300200341c8006a41186a220c2020370300200341c8006a41106a2219201f370300200341c8006a41086a221c201e3703002003200141706a36023420032003280230220141106a360230200320032903a801221e3703682003201e370348200141086a290000211e2001290000211f02402009200328023c470d00200341386a200910920420032802402109200328023821080b2008200941d8006c6a2201201f37031020012017370308200120183703002001201a360220200141186a201e370300200141346a200b360200200141306a20023602002001412c6a200d360200200141246a2007370200200141386a2003290348370200200141c0006a201c290300370200200141c8006a2019290300370200200141d0006a200c2903003702002003200328024041016a2209360240200a2006470d000b200328023821080b2008450d032000200329023c370204200020083602000c040b103b000b1039000b200341e8006a41186a20034188016a41186a2903003703002003280238210b02402009450d00200941d8006c2102200b41306a210103400240200141746a280200220d450d00200d41306c450d00200141706a280200102c0b0240200128020041ffffff3f71450d002001417c6a280200102c0b200141d8006a2101200241a87f6a22020d000b0b200328023c2201450d00200141d8006c450d00200b102c0b200341003602a803200342013703a0032003410f360284032003200341186a360280032003200341a0036a3602b802200341ec026a4101360200200342013702dc02200341b4bcc3003602d802200320034180036a3602e802200341b8026a41dcb7c000200341d8026a103e1a20033502a80342208620033502a003841000024020032802a403450d0020032802a003102c0b200041003602000b2005450d002004102c0b200341c0036a24000bd40103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42d8007e2204422088a722030d022004a722024100480d022003454103742105024002400240024002402000280200410020011b22030d002002450d010c030b200141d8006c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241d8006e3602000b0f0b2005450d001039000b103b000be5780a0f7f037e047f017e017f017e0c7f017e0a7f047e23004190066b22022400200241c0036a22034200370300200241b8036a22044200370300200241a8036a41086a22054200370300200242003703a803200241e8026a41e6dcc700410710c5012005200241e8026a41086a2206290000370300200220022900e8023703a803200241b8016a41ccbac200410a10c5012003200241b8016a41086a2207290000370300200420022900b80137030020024198016a200241a8036a412010c6012002280298012108200228029c012109200342003703002004420037030020054200370300200242003703a803200241e8026a41e6dcc700410710c50120052006290000370300200220022900e8023703a803200241b8016a41ccbac200410a10c50120032007290000370300200420022900b801370300410121072002200941016a410020081b22033602f801200241a8036a4120200241f8016a410410a702200241e8026a41e6dcc700410710c501200241b8016a41d0bbc200411510c501200220033602e005200241b8026a200241e0056a410410c701200241b4036a200241e0056a41046a3602002002200241b8026a41086a3602ac032002200241e0056a3602b0032002200241b8026a3602a803200241f8016a200241a8036a107e02400240200228028002220541206a2206417f4c0d0002402006450d00200610322207450d020b200241003602b003200220063602ac03200220073602a803200241a8036a4100411010c80120022802a80320022802b00322066a220720022900e802370000200741086a200241e8026a41086a2900003700002002200641106a22063602b003200241a8036a2006411010c80120022802a80320022802b00322066a220720022900b801370000200741086a200241b8016a41086a2900003700002002200641106a22073602b00320022802f8012106200241a8036a2007200510c80120022802a803220720022802b00322086a2006200510c9081a2002200820056a22053602b003024020022802fc01450d002006102c0b200220013602f80120072005200241f8016a410410a702024020022802ac03450d002007102c0b200241c0036a22064200370300200241b8036a220a4200370300200241a8036a41086a22054200370300200242003703a803200241e8026a41e6dcc700410710c5012005200241e8026a41086a2207290000370300200220022900e8023703a803200241b8016a41a0b7c200410c10c501200441086a200241b8016a41086a2201290000370000200420022900b80137000020024190016a200241a8036a412010c6010240200320022802940141016a41d5002002280290011b6b220420034b0d0020041094040b200220033602a00120064200370300200a420037030020054200370300200242003703a803200241e8026a41e6dcc700410710c50120052007290000370300200220022900e8023703a803200241b8016a41f8c4c200410d10c50120062001290000370300200a20022900b801370300200241203602c4052002200241a8036a3602c005200241e8026a200241a8036a412010b30102400240024002400240024020022802e8022201450d0020022802ec0221082002200241e8026a41086a2802003602bc02200220013602b802200241f8016a200241b8026a10ca030240024020022802f801220b450d00200241f8016a41086a280200210c20022802fc01210d200241f8016a200241b8026a10950402400240024020022802f801220e450d0020024180026a280200210720022802fc01210f20022802bc022204450d0120022802b80222032d0000210520022004417f6a3602bc022002200341016a3602b80241002104410021060240024020050e03060001030b41002104410121060c050b41022106410021040c040b200d450d02200d41ffffff3f710d010c020b02402007450d00200741d0006c2103200e41c0006a210403400240200441046a2802002205450d00200541306c450d002004280200102c0b200441d0006a2104200341b07f6a22030d000b0b0240200f450d00200f41d0006c450d00200e102c0b200d450d01200d41ffffff3f71450d010b200b102c0b200241003602c001200242013703b8012002410f3602e4052002200241c0056a3602e0052002200241b8016a36028006410121042002418c026a4101360200200242013702fc01200241b4bcc3003602f8012002200241e0056a3602880220024180066a41dcb7c000200241f8016a103e1a20023502c00142208620023502b801841000024020022802bc01450d0020022802b801102c0b410321060b02402008450d002001102c0b2004450d010b200241d8056a22044200370300200241c0056a41106a22104200370300200241c0056a41086a22034200370300200242003703c005200241b8016a41d4dcc700410810c5012003200241b8016a41086a290000370300200220022900b8013703c005200241f8016a41bba8c700410d10c5012004200241f8016a41086a290000370300201020022900f801370300200241f8006a200241c0056a412010d301200241f8006a41106a2903002111200229038001211220022903782113411010322204450d062004201242002013a722031b37030020042011420020031b370308200241f497c1003602ac01200220043602a801200241003602a003200242083703980320024100360288062002420137038006200241e8026a41e6dcc700410710c501200241b8016a418893c700410a10c501412010322204450d06200242203702fc01200220043602f801200241f8016a4100411010c80120022802f80120022802800222046a220320022900e802370000200341086a200241e8026a41086a2900003700002002200441106a220436028002200241f8016a2004411010c80120022802f801220520022802800222046a220320022900b801370000200341086a200241b8016a41086a2900003700002002200441106a2204360280022004417f4c0d054101210302402004450d00200410322203450d070b41002114200241003602b003200220043602ac03200220033602a803200241a8036a4100200410c80120022802a80320022802b00322066a2005200410c9081a200241bc036a200241f8016a41086a2215280200360200200241003a00c403200241103602c003200241e0056a41186a220520022903c003370300200220022903f8013702b403200241e0056a41106a200241a8036a41106a220329030022113703002002200620046a3602b003200241e0056a41086a20022903b0032212370300200220022903a80322133703e005200241b8026a41106a2011370300200241b8026a41086a2012370300200241b8026a41186a2005290300370300200220133703b802200241a8036a200241b8026a10b60141002116024020022802a8034101470d00200241a8036a410472210141002116410821170340200241f8016a41206a200141206a280200360200200241f8016a41186a2204200141186a2902002211370300200241f8016a41106a2206200141106a29020022123703002015200141086a29020022133703002002200129020022183703f801200241e8026a41186a22082011370300200241e8026a41106a22092012370300200241e8026a41086a22192013370300200220183703e802200241a8036a41186a2205200429030037030020032006290300370300200241a8036a41086a22062015290300370300200220022903f8013703a80320022802a801200241e8026a20022802ac0128020c1105002111412010322207450d08200720022903e802370000200741186a2008290300370000200741106a2009290300370000200741086a2019290300370000200241b8016a41086a20062903002212370300200241b8016a41106a20032903002213370300200241b8016a41186a20052903002218370300200220022903a803221a3703b8012005201837030020032013370300200620123703002002201a3703a80302402016200228029c03470d0020024198036a201610d50120022802a003211620022802980321170b2017201641386c6a2204201137030020062903002111200329030021122005290300211320022903a80321182004412c6a4281808080103702002004200736022820042018370308200441206a2013370300200441186a2012370300200441106a2011370300200220022802a00341016a22163602a003200520082903003703002003200929030037030020062019290300370300200220022903e8023703a80302402002280288062204200228028406470d0020024180066a2004410110d60120022802880621040b20022802800620044105746a220720022903a803370000200741086a2006290300370000200741106a2003290300370000200741186a20052903003700002002200441016a221436028806200241a8036a200241b8026a10b60120022802a8034101460d000b0b024020022802bc02450d0020022802b802102c0b0240200241c8026a280200450d0020022802c402102c0b200241e8026a41e6dcc700410710c501200241b8016a41b18ec100410a10c501412010322204450d06200242203702fc01200220043602f801200241f8016a4100411010c80120022802f80120022802800222046a220320022900e802370000200341086a200241e8026a41086a2900003700002002200441106a220436028002200241f8016a2004411010c80120022802f801220320022802800222046a220520022900b801370000200541086a200241b8016a41086a2900003700002002200441106a2204360280022004417f4c0d050240024020040d00410121050c010b200410322205450d070b200241003602b003200220043602ac03200220053602a803200241a8036a4100200410c80120022802a80320022802b00322056a2003200410c9081a200241bc036a200241f8016a41086a2203280200360200200241003a00c403200241113602c003200241e0056a41186a220620022903c003370300200220022903f8013702b403200241e0056a41106a200241a8036a41106a221b29030022113703002002200520046a3602b003200241e0056a41086a20022903b0032212370300200220022903a80322133703e005200241f8016a41106a201137030020032012370300200241f8016a41186a2006290300370300200220133703f8012002200241a8016a36029802200241a8036a200241f8016a10b801024020022d00d8034102460d000340200241b8016a41186a221c200241a8036a41186a221d290300370300200241b8016a41106a221e201b290300370300200241b8016a41086a221f200241a8036a41086a2220290300370300200220022903a8033703b80120022802c8032121024020022902cc032218422088a72207450d0020022802d40321222007417f6a2109410021052021210441002103034002400240024020072003460d002002200436028c06200241c0056a2002418c066a10d80102400240024020022802cc052206450d0020022802c8052101024020022802d0052208450d00200841ffffffff0371450d002006102c0b200120224b0d010b02402005450d00200320056b220620074f0d02200241c0056a41186a2201200420054105746b220641186a2208290000370300200241c0056a41106a2219200641106a2215290000370300200241c0056a41086a2217200641086a2223290000370300200220062900003703c005200441086a22242900002111200441106a22252900002112200441186a2226290000211320062004290000370000200820133700002015201237000020232011370000202620012903003700002025201929030037000020242017290300370000200420022903c0053700000c040b4100210520092003470d040c060b200541016a21050c020b2006200741e48ac500103f000b2007200741f48ac500103f000b20092003470d002005417f6a20074f0d02201842ffffffff0f83200720056bad4220868421180c020b200341016a2103200441206a21040c000b0b200241e8026a41186a201c2903002211370300200241e8026a41106a201e2903002212370300200241e8026a41086a201f2903002213370300200220022903b801221a3703e802201d2011370300201b2012370300202020133703002002201a3703a8032002280298022204280200200241a8036a200428020428020c1105002111200241b8026a41186a201d2903002212370300200241b8026a41106a201b2903002213370300200241b8026a41086a2020290300221a370300200220022903a80322273703b802201d2012370300201b20133703002020201a370300200220273703a80302402016200228029c03470d0020024198036a201610d5010b200228029803201641386c6a22042011370300200420022903a80337030820042021360228200441106a2020290300370300200441186a201b290300370300200441206a201d2903003703002004412c6a20183702002002201641016a22163602a003200241a8036a200241f8016a10b80120022d00d8034102470d000b0b024020022802fc01450d0020022802f801102c0b0240200241f8016a41106a280200450d00200228028402102c0b200241c0036a22034200370300200241a8036a41106a4200370300200241a8036a41086a22044200370300200242003703a803200241e8026a41e6dcc700410710c5012004200241e8026a41086a2205290000370300200220022900e8023703a803200241b8016a419cb8c200411510c501200a41086a2201200241b8016a41086a2206290000370000200a20022900b801370000200241f0006a200241a8036a412010c601024020142002280274410020022802701b22074101200741014b1b4f0d00024041002802d8d248450d00200241c0036a4200370300200241b8036a22034200370300200241a8036a41086a22044200370300200242003703a803200241e8026a41e6dcc700410710c5012004200241e8026a41086a290000370300200220022900e8023703a803200241b8016a41ccbac200410a10c501200a41086a200241b8016a41086a290000370000200a20022900b801370000200241e0006a200241a8036a412010c601200241123602bc01200220022903603703f8012002200241f8016a3602b80141002802d4d248210541002802d0d248210641002802dcd2482107200241e8036a41f316360200200241e0036a42de80808010370300200241dc036a41acc5c300360200200241d4036a420e370200200241d0036a41e28fc100360200200241a8036a41206a42013703002003420237030020044107360200200241c4036a200241b8016a3602002002419498c1003602b403200241db8fc1003602ac03200241013602a803200641f8a3c000200741024622041b200241a8036a200541e0a3c00020041b2802101103000b024020022802840641ffffff3f71450d00200228028006102c0b2002280298032105024020022802a0032204450d00200441386c2103200541286a210403400240200441046a28020041ffffff3f71450d002004280200102c0b200441386a2104200341486a22030d000b0b41002128200228029c032203450d03200341386c450d042005102c0c020b20034200370300200241a8036a41106a2207420037030020044200370300200242003703a803200241e8026a41e6dcc700410710c50120042005290000370300200220022900e8023703a803200241b8016a41f4b7c200410e10c50120012006290000370000200a20022900b801370000200241e8006a200241a8036a412010c601200228026c210420022802682101200520024180066a41086a28020036020020022002290380063703e802200620024198036a41086a28020036020020022002290398033703b8012003420037030020074200370300200242013703a803200241003602b003200241f8016a2004410020011b200241e8026a200241b8016a200241a8036a109604024020022802f8014101470d00200220022902fc013703e80241002802d8d248450d02200241043602bc012002200241e8026a3602b80141002802d4d248210441002802d0d248210341002802dcd2482105200241e8036a41fc16360200200241e0036a42de80808010370300200241dc036a41acc5c300360200200241d4036a420e370200200241d0036a41e28fc100360200200241c8036a4201370300200241b8036a4201370300200241b0036a4107360200200241c4036a200241b8016a3602002002418c98c1003602b403200241db8fc1003602ac03200241013602a803200341f8a3c000200541024622051b200241a8036a200441e0a3c00020051b2802101103000c020b20024190026a28020021072002418c026a2802002129200241f8016a41106a280200212a20024184026a280200210420024180026a280200212b20022802fc0121280c030b200241a8036a412010b4010c030b410021280b0b20022802a80120022802ac01280200110200024020022802ac01280204450d0020022802a801102c0b024002402028450d00200241003602a003200242013703980320024198036a4100200410d60120022802a00321050240200441306c2204450d00202820046a210620022802980320054105746a210420282103034020042003290000370000200441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a290000370000200541016a2105200441206a21042006200341306a2203470d000b0b200220053602a003200241d8056a4200370300200241c0056a41106a4200370300200241c0056a41086a22044200370300200242003703c005200241b8016a41d4dcc700410810c5012004200241b8016a41086a290000370300200220022900b8013703c005200241f8016a41bba8c700410d10c501201041086a200241f8016a41086a290000370000201020022900f801370000200241c8006a200241c0056a412010d301200241c8006a41106a29030021112002290350211220022903482113411010322214450d042014201242002013a722041b37030020142011420020041b370308202a2007412c6c6a212c0240024020070d00202a2109202a21080c010b200241a8036a410c6a2119200241a8036a4104722115200241f8016a41206a2126200241f8016a41186a2122200241f8016a41106a2116200241f8016a41086a211b202a210903402009220828020021232026200841246a221d29020037030020222008411c6a22202902003703002016200841146a2221290200370300201b2008410c6a290200370300200220082902043703f8012008412c6a21092023450d01201520022903f801370200201541086a201b290300370200201541106a2016290300370200201541186a2022290300370200201541206a2026290300370200200220233602a8032014201910d7032118200241e0056a41086a221c201941086a290200370300200241e0056a41106a221e201941106a290200370300200241e0056a41186a221f201941186a290200370300200220192902003703e00520022802ac0321250240024020022802b0032204450d00200441246c22242105202321040340200441206a2802002103200441086a2900002111200441106a290000211220042900002113200241c0056a41186a2206200441186a290000370300200241c0056a41106a22072012370300200241c0056a41086a22012011370300200220133703c00502402003450d00200241b8016a41086a222d2001290300370300200241b8016a41106a222e2007290300370300200241b8016a41186a222f2006290300370300200220022903c00522113703b802200220113703b8012018428094ebdc03822112413010322217450d0a200241386a2018428094ebdc0380221842002003ad2211420010ce08201720022903b801370300201741186a202f290300370300201741106a202e290300370300201741086a202d290300370300201720022903382213201220117e2211428094ebdc0380a7417f2011428080808080c0b2cd3b541b2011428094ebdc03824280cab5ee01566aad7c2211370320201741286a200241386a41086a2903002011201354ad7c37030020024281808080103702840620022017360280060240024020054124470d00410121240c010b200441246a2130202320246a2205415c6a2131410121240340203021040340200441206a28020021032006200441186a2900003703002007200441106a2900003703002001200441086a290000370300200220042900003703c00502402003450d00200241286a201842002003ad2211420010ce08200241b8026a41086a20012903002213370300200241b8026a41106a2007290300221a370300200241b8026a41186a20062903002227370300200220022903c00522323703b802202f2027370300202e201a370300202d2013370300200220323703b801200241286a41086a29030020022903282213201220117e2211428094ebdc0380a7417f2011428080808080c0b2cd3b541b2011428094ebdc03824280cab5ee01566aad7c2211201354ad7c211302402024200228028406470d0020024180066a2024410110e00120022802800621170b200441246a21302017202441306c6a220320022903b801370300202d290300211a202e2903002127202f290300213220032011370320200341286a2013370300200341186a2032370300200341106a2027370300200341086a201a3703002002202441016a22243602880620312004470d020c030b2005200441246a2204470d000b0b0b02402025450d00202541246c450d002023102c0b20022802840621040c030b200441246a21042005415c6a22050d000b0b410021044108211702402025450d00202541246c450d002023102c0b410021240b200241b8016a41186a2203201f290300370300200241b8016a41106a2205201e290300370300200241b8016a41086a2206201c290300370300200220022903e0053703b801200820043602042008201736020020082024360208200820022903b80137020c2021200629030037020020202005290300370200201d20032903003702002009202c470d000b20092108202c21090b202c20096b2204412c6d210302402004450d002003412c6c210403400240200941046a2802002203450d00200341246c450d002009280200102c0b2009412c6a2109200441546a22040d000b0b2014102c200241f8016a200228029803220b20022802a003220c202a2008202a6b2204412c6d220310fc010240024020022d00f8014101470d00024041002802d8d248450d00200241d5003602bc01200241ff83c3003602b80141002802d4d248210541002802d0d248210641002802dcd2482107200241e8036a41ae16360200200241e0036a42de80808010370300200241dc036a41acc5c300360200200241d4036a420e370200200241d0036a41e28fc100360200200241c8036a4201370300200241b8036a4201370300200241b0036a4107360200200241c4036a200241e0056a360200200241b4b5c8003602b403200241db8fc1003602ac03200241013602a803200241043602e405200541e0a3c000200741024622071b28021021052002200241b8016a3602e005200641f8a3c00020071b200241a8036a20051103000b02402004450d002003412c6c2103202a210403400240200441046a2802002205450d00200541306c450d002004280200102c0b2004412c6a2104200341546a22030d000b0b02402029450d002029412c6c450d00202a102c0b0240200228029c0341ffffff3f71450d00200228029803102c0b41032106202b0d010c030b200241b8026a41086a220520024184026a280200360200200220022902fc013703b802200241c0056a41186a4200370300200241c0056a41106a4200370300200241c0056a41086a22064200370300200242003703c005200241b8016a41d4dcc700410810c5012006200241b8016a41086a290000370300200220022900b8013703c005200241f8016a41bba8c700410d10c501201041086a200241f8016a41086a2206290000370000201020022900f801370000200241106a200241c0056a412010d3012002200241106a41106a2903004200200228021022071b3703c00120022002290318420020071b3703b8012002200241b8016a3602e005200241a8036a41086a22072005280200360200200220022903b8023703a803200241f8016a200241a8036a10fe01200241a8036a41186a200241f8016a41186a280200360200200241a8036a41106a200241f8016a41106a29030037030020072006290300370300200220022903f8013703a8032002200241e0056a3602c403200241e8026a200241a8036a109704200228029c03210d20022802e802210e20022802ec02210f20022802f002210702402004450d002003412c6c2103202a210403400240200441046a2802002205450d00200541306c450d002004280200102c0b2004412c6a2104200341546a22030d000b0b02402029450d002029412c6c450d00202a102c0b41002106202b450d032028450d03202b41306c450d032028102c0c030b2028450d01202b41306c450d012028102c0c020b410321062028450d000240202b450d00202b41306c450d002028102c0b02402007450d002007412c6c2103202a210403400240200441046a2802002205450d00200541246c450d002004280200102c0b2004412c6a2104200341546a22030d000b0b2029450d00202a450d002029412c6c450d00202a102c0c010b0b42002133200241c0036a4200370300200241b8036a4200370300200241a8036a41086a22044200370300200242003703a803200241e8026a41e6dcc700410710c5012004200241e8026a41086a290000370300200220022900e8023703a803200241b8016a41d8c5c200410b10c501200a41086a200241b8016a41086a290000370000200a20022900b801370000200241a8036a412010b401024002400240024020064103460d00200220063a00a701200e200741d0006c6a212f109804024020070d00200e210a420021320c020b200241e8026a41106a211c200241b8026a41106a212e200241dc026a212a200241a8036a41206a212d4200213342002132200e210a0340200241b8016a41386a2203200a220441386a290300370300200241b8016a41306a2205200441306a290300370300200241b8016a41286a2206200441286a290300370300200241b8016a41206a2207200441206a290300370300200241b8016a41186a2201200441186a290300370300200241b8016a41106a2208200441106a290300370300200241b8016a41086a2209200441086a29030037030020042903002111200241a8016a41086a2219200441cc006a280200360200200220113703b8012002200441c4006a2902003703a801200441d0006a210a200441c0006a2802002204450d02200241f8016a41386a2003290300370300200241f8016a41306a2005290300370300200241f8016a41286a2006290300370300200241f8016a41206a2007290300370300200241f8016a41186a22152001290300370300200241f8016a41106a22172008290300370300200241f8016a41086a22232009290300370300200220022903b8013703f801200241a8036a41386a2003290300370300200241a8036a41306a2005290300370300200241a8036a41286a2006290300370300202d2007290300370300200241a8036a41186a2001290300370300200241a8036a41106a2008290300370300200241a8036a41086a2009290300370300200220022903b8013703a803200241c0056a41186a2015290300370300200241c0056a41106a2017290300370300200241c0056a41086a2023290300370300200220022903f8013703c005200241b8026a41186a2201202d41186a290300370300202e202d41106a290300370300200241b8026a41086a2208202d41086a2903002234370300200220043602d8022002202d29030022353703b802202a20022903a801370200202a41086a2019280200360200200241e0056a20022802a001200241c0056a10da0320022802e805210920022802e0052107200241003602f002200242013703e8022002200241b8026a3602800620024180066a200241e8026a10e9032002202e3602800620024180066a200241e8026a10e90320022802d8022104200241e8026a20022802e0022203108f0102402003450d00200341306c21050340200241e8026a20022802f0024120102f20022802e80220022802f00222066a2203200441106a290000370000200341086a200441186a290000370000200341106a200441206a290000370000200341186a200441286a2900003700002002200641206a3602f0022002200436028006200441306a210420024180066a200241e8026a10e903200541506a22050d000b0b2007200920022802e802220420022802f00210a702024020022802ec02450d002004102c0b024020022802e405450d002007102c0b200241e0056a41186a22302001290300370300200241e0056a41106a2228202e290300370300200241e0056a41086a22102008290300370300200220022903b8023703e00520022802e402212920022802dc02212b20022802d802211b024020022802e002221e41c100490d00201e410176ad42307e2211422088a70d062011a72231417f4c0d0620311032221f450d074100210320024100360288062002420437038006201b41506a2114201b41f07e6a212c41042105201e21160240024003400240024020162219417f6a22070d0041012109410021160c010b024002400240024002400240201b200741306c6a2204290300201941306c2221201b6a41a07f6a2206290300221256200441086a2903002213200641086a29030022115620132011511b0d002019417e6a2109202c20216a210441002116410021060340024020092006470d00201921090c080b2012200429030022185821072011200441086a290300221351210120112013582108200441506a2104200641016a210620182112201321112007200820011b0d000b200641016a21092006417f7320196a21070c010b202c20216a210402400340024020074101470d00410021070c020b2012200429030022185621062011200441086a290300221351210120112013562108200441506a21042007417f6a210720182112201321112006200820011b0d000b0b20192007490d022019201e4b0d01201920076b22094101762201450d00201420216a2104201b200741306c6a21060340200241e8026a41186a2208200641186a2215290300370300201c200641106a2217290300370300200241e8026a41086a2223200641086a2224290300370300200220062903003703e802200641206a22252903002111200441286a22262903002112200441086a22222903002113200441106a22162903002118200441186a221d290300211a200429030021272025200441206a22202903003703002015201a370300201720183703002024201337030020062027370300200641286a22152903002113201520123703002016201c290300370300201d200829030037030020222023290300370300200420022903e8023703002026201337030020202011370300200441506a2104200641306a21062001417f6a22010d000b0b024020070d00200721160c050b0240200941094d0d00200721160c050b2019201e4b0d02201920076b2101201b200741306c6a2115201420216a2125034020192007417f6a2216490d040240201920166b22094102490d00201b200741306c6a2204290300201b201641306c6a2206290300221358200441086a22072903002212200641086a220829030022115820122011511b0d00200620042903003703002008200729030037030020062903102112200641106a200441106a290300370300200241e8026a41186a2223200641286a2207290300370300201c200641206a2208290300370300200241e8026a41086a2224200641186a22062903003703002006200441186a2903003703002008200441206a2903003703002007200441286a290300370300200220123703e802024020094103490d002001417f6a2117410021062015210402400340200441306a2207290300201356200441386a2208290300221220115620122011511b450d0220012006460d01200441286a200441d8006a290300370300200441206a200441d0006a290300370300200441186a200441c8006a290300370300200441106a200441c0006a290300370300200441086a200829030037030020042007290300370300200721042017200641016a2206470d000b202521040c010b200641016a2009419ca5c800103f000b2004201337030020042011370308200420022903e802370310200441186a2024290300370300200441206a201c290300370300200441286a20232903003703000b2016450d05200141016a2101201541506a2115201621072009410a4f0d050c000b0b2019201e41b8a3c800104f000b2007201941b8a3c8001059000b20192007417f6a2216490d002019201e41c8a3c800104f000b2016201941c8a3c8001059000b02402003200228028406470d0020024180066a10ae01200228028806210320022802800621050b200520034103746a22042009360204200420163602002002200341016a2203360288060240024020034102490d00200228028006210503400240024002400240024020052003417f6a4103746a2204280200450d00200341037420056a220141746a2802002207200428020422064b0d010b20034103490d022004280204210620052003417d6a22254103746a28020421040c010b200341024d0d0420052003417d6a22254103746a2802042204200620076a4d0d00200341034d0d04200141646a280200200420076a4b0d040b20042006490d010b2003417e6a21250b02400240024002400240024002402003202541016a22264d0d00200320254d0d0120052025410374221d6a2204280204222020042802006a22042005202641037422216a22032802002222490d022004201e4b0d03201b202241306c6a22232003280204222441306c22036a2105200441306c2106200420226b220720246b220420244f0d04201f2005200441306c220310c908221520036a210920244101480d0520044101480d05201420066a2104200521032009211903402004200541506a2201201941506a22072007290300200129030056200741086a2903002211200141086a29030022125620112012511b22081b2206290300370300200441086a200641086a290300370300200441106a200641106a290300370300200441186a200641186a290300370300200441206a200641206a290300370300200441286a200641286a2903003703002001200320081b21032009200720081b210902402019200720081b221920154b0d00201521170c080b200441506a21042015211720232001200520081b2205490d000c070b0b2026200341d8a3c800103f000b2025200341e8a3c800103f000b2022200441f8a3c8001059000b2004201e41f8a3c800104f000b201f2023200310c908220420036a2109024020244101480d00200720244c0d00201b20066a21012004211720042104202321030340024002402005290300200429030056200541086a2903002211200441086a29030022125620112012511b0d00200441306a22172106200521070c010b200541306a210720042106200521040b20032004290300370300200341286a200441286a290300370300200341206a200441206a290300370300200341186a200441186a290300370300200341106a200441106a290300370300200341086a200441086a290300370300200341306a2103200620094f0d03200621042007210520072001490d000c030b0b20042117202321030c010b20152117200521030b20032017200920176b220420044130706b10c9081a200228028806220420254d0d022002280280062205201d6a2203202020246a36020420032022360200200420264d0d04200520216a2203200341086a20042026417f736a41037410ca081a20022004417f6a220336028806200341014b0d000b0b2016450d030c010b0b202520044188a4c800103f000b202620041047000b02402002280284062204450d00200441ffffffff0171450d00200228028006102c0b024020314130490d00201f102c0b201e41c000201e41c000491b211e0b203220347c2111203320357c22122033542201ad2113200241e8026a41186a2030290300370300201c2028290300370300200241e8026a41086a2010290300370300200220022903e0053703e80220022029360294032002201e360290032002202b36028c032002201b3602880320024198036a20022802a001200241c0056a10990420022802a00321082002280298032107200241003602880620024201370380062002200241e8026a36028c062002418c066a20024180066a10e9032002201c36028c062002418c066a20024180066a10e903200228028803210420024180066a2002280290032203108f0102402003450d00200341306c2105034020024180066a2002280288064120102f20022802800620022802880622066a2203200441106a290000370000200341086a200441186a290000370000200341106a200441206a290000370000200341186a200441286a2900003700002002200641206a360288062002200436028c06200441306a21042002418c066a20024180066a10e903200541506a22050d000b0b201120137c211120072008200228028006220420022802880610a7020240200228028406450d002004102c0b20112032512104201120325421030240200228029c03450d002007102c0b2001200320041b21040240200228028c032203450d00200341306c450d00200228028803102c0b427f201120041b2132427f201220041b2133200a202f470d000c030b0b200041003602000c020b202f200a460d000340200a220441d0006a210a0240200441c4006a2802002203450d00200341306c450d00200441c0006a280200102c0b202f200a470d000b0b0240200f450d00200e450d00200f41d0006c450d00200e102c0b200241b8016a41e6dcc700410710c501200241f8016a41a8bfc200410e10c501200220022802a0013602e005200241b8026a200241e0056a410410c701200241b4036a200241e0056a41046a3602002002200241c0026a3602ac032002200241e0056a3602b0032002200241b8026a3602a803200241e8026a200241a8036a107e20022802f002220441206a2203417f4c0d010240024020030d00410121050c010b200310322205450d030b200241003602c002200220033602bc02200220053602b802200241b8026a4100411010c80120022802b80220022802c00222036a220520022900b801370000200541086a200241b8016a41086a2900003700002002200341106a22033602c002200241b8026a2003411010c80120022802b80220022802c00222036a220520022900f801370000200541086a200241f8016a41086a2900003700002002200341106a22053602c00220022802e8022103200241b8026a2005200410c80120022802b802220520022802c00222066a2003200410c9081a2002200620046a22043602c002024020022802ec02450d002003102c0b200220323703b003200220333703a80320052004200241a8036a411010a702024020022802bc02450d002005102c0b0240200c450d00200c4105742107200b21040340200241b8016a41e6dcc700410710c501200241f8016a418893c700410a10c501200241a8036a200410e40220022802b003220341206a2205417f4c0d030240024020050d00410121060c010b200510322206450d050b200241003602f002200220053602ec02200220063602e802200241e8026a4100411010c80120022802e80220022802f00222056a220620022900b801370000200641086a200241b8016a41086a2900003700002002200541106a22053602f002200241e8026a2005411010c80120022802e80220022802f00222056a220620022900f801370000200641086a200241f8016a41086a2900003700002002200541106a22063602f00220022802a8032105200241e8026a2006200310c80120022802e802220620022802f00222016a2005200310c9081a2002200120036a22033602f002024020022802ac03450d002005102c0b200241086a20062003109a04200228020c410020022802081b2103024020022802ec02450d002006102c0b200241a8036a20022802a0012004109b0420022802b003210620022802a8032105200241003a00fd010240024002400240200341c000490d00200341808001490d012003418080808004490d0241052101200241053a00fd01200241033a00f801200220033600f9010c030b41012101200241013a00fd01200220034102743a00f8010c020b41022101200241023a00fd01200220034102744101723b01f8010c010b41042101200241043a00fd01200220034102744102723602f8010b20052006200241f8016a200110a702024020022d00fd01450d00200241003a00fd010b024020022802ac03450d002005102c0b200441206a2104200741606a22070d000b0b20022d00a7012104200241a8036a41086a220341043a0000200220043a00b103200241033602a803200241a8036a10c802024041002802d8d2484103490d002002418c026a411336020020024184026a411a360200200241133602fc012002200c3602b8012002200241a0016a360288022002200241a7016a360280022002200241b8016a3602f80141002802d4d248210441002802d0d248210541002802dcd2482106200241e8036a41f615360200200241e0036a42de80808010370300200241dc036a41acc5c300360200200241d4036a420e370200200241d0036a41e28fc100360200200241c8036a4203370300200241b8036a420337030020034107360200200241c4036a200241f8016a360200200241d484c3003602b403200241db8fc1003602ac03200241033602a803200541f8a3c000200641024622031b200241a8036a200441e0a3c00020031b2802101103000b2000200d3602042000200b360200200041086a200c3602000b20024190066a24000f0b103b000b1039000b931601067f230041d0006b22012400200141086a41e6dcc700410710c501200141186a419699c100410b10c50120012000360234200141386a200141346a410410c701200141cc006a200141346a41046a3602002001200141c0006a22023602442001200141346a3602482001200141386a360240200141286a200141c0006a107e024002402001280230220341206a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b200141003602482001200436024420012005360240200141c0006a4100411010c8012001280240200128024822046a22052001290008370000200541086a200141086a41086a2900003700002001200441106a2204360248200141c0006a2004411010c8012001280240200128024822046a22052001290018370000200541086a200141186a41086a2900003700002001200441106a220536024820012802282104200141c0006a2005200310c80120012802402205200128024822066a2004200310c9081a2001200620036a22033602480240200128022c450d002004102c0b20052003109d0402402001280244450d002005102c0b200141086a41e6dcc700410710c501200141186a41e4bcc200411210c50120012000360234200141386a200141346a410410c701200141cc006a200141346a41046a360200200120023602442001200141346a3602482001200141386a360240200141286a200141c0006a107e2001280230220341206a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b200141003602482001200436024420012005360240200141c0006a4100411010c8012001280240200128024822046a22052001290008370000200541086a200141086a41086a2900003700002001200441106a2204360248200141c0006a2004411010c8012001280240200128024822046a22052001290018370000200541086a200141186a41086a2900003700002001200441106a220536024820012802282104200141c0006a2005200310c80120012802402205200128024822066a2004200310c9081a2001200620036a22033602480240200128022c450d002004102c0b20052003109d0402402001280244450d002005102c0b200141086a41e6dcc700410710c501200141186a41e0bdc200411210c50120012000360234200141386a200141346a410410c701200141cc006a200141346a41046a360200200120023602442001200141346a3602482001200141386a360240200141286a200141c0006a107e2001280230220341206a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b200141003602482001200436024420012005360240200141c0006a4100411010c8012001280240200128024822046a22052001290008370000200541086a200141086a41086a2900003700002001200441106a2204360248200141c0006a2004411010c8012001280240200128024822046a22052001290018370000200541086a200141186a41086a2900003700002001200441106a220536024820012802282104200141c0006a2005200310c80120012802402205200128024822066a2004200310c9081a2001200620036a22033602480240200128022c450d002004102c0b20052003109d0402402001280244450d002005102c0b200141086a41e6dcc700410710c501200141186a41acbec200411310c50120012000360234200141386a200141346a410410c701200141cc006a200141346a41046a360200200120023602442001200141346a3602482001200141386a360240200141286a200141c0006a107e2001280230220341206a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b200141003602482001200436024420012005360240200141c0006a4100411010c8012001280240200128024822046a22052001290008370000200541086a200141086a41086a2900003700002001200441106a2204360248200141c0006a2004411010c8012001280240200128024822046a22052001290018370000200541086a200141186a41086a2900003700002001200441106a220536024820012802282104200141c0006a2005200310c80120012802402205200128024822066a2004200310c9081a2001200620036a22033602480240200128022c450d002004102c0b2005200310b40102402001280244450d002005102c0b200141086a41e6dcc700410710c501200141186a419b92c100411010c50120012000360234200141386a200141346a410410c701200141cc006a200141346a41046a3602002001200141c0006a3602442001200141346a3602482001200141386a360240200141286a200141c0006a107e2001280230220341206a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b200141003602482001200436024420012005360240200141c0006a4100411010c8012001280240200128024822046a22052001290008370000200541086a200141086a41086a2900003700002001200441106a2204360248200141c0006a2004411010c8012001280240200128024822046a22052001290018370000200541086a200141186a41086a2900003700002001200441106a220536024820012802282104200141c0006a2005200310c80120012802402205200128024822066a2004200310c9081a2001200620036a22033602480240200128022c450d002004102c0b2005200310b40102402001280244450d002005102c0b200141086a41e6dcc700410710c501200141186a41a8bfc200410e10c50120012000360234200141386a200141346a410410c701200141cc006a200141346a41046a360200200120023602442001200141346a3602482001200141386a360240200141286a200141c0006a107e2001280230220241206a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b200141003602482001200336024420012004360240200141c0006a4100411010c8012001280240200128024822036a22042001290008370000200441086a200141086a41086a2900003700002001200341106a2203360248200141c0006a2003411010c8012001280240200128024822036a22042001290018370000200441086a200141186a41086a2900003700002001200341106a220436024820012802282103200141c0006a2004200210c80120012802402204200128024822056a2003200210c9081a2001200520026a22023602480240200128022c450d002003102c0b2004200210b40102402001280244450d002004102c0b200141086a41e6dcc700410710c501200141186a41d0bbc200411510c50120012000360234200141386a200141346a410410c701200141cc006a200141346a41046a3602002001200141c0006a3602442001200141346a3602482001200141386a360240200141286a200141c0006a107e2001280230220041206a2202417f4c0d000240024020020d00410121030c010b200210322203450d020b200141003602482001200236024420012003360240200141c0006a4100411010c8012001280240200128024822026a22032001290008370000200341086a200141086a41086a2900003700002001200241106a2202360248200141c0006a2002411010c8012001280240200128024822026a22032001290018370000200341086a200141186a41086a2900003700002001200241106a220336024820012802282102200141c0006a2003200010c80120012802402203200128024822046a2002200010c9081a2001200420006a22003602480240200128022c450d002002102c0b2003200010b40102402001280244450d002003102c0b200141d0006a24000f0b103b000b1039000bd70c04037f017e0f7f067e230041d0036b22022400200241086a2001108702024002402002280208450d00200041003602000c010b024002400240200228020c2203200128020441d0006e2204200420034b1bad42d0007e2205422088a70d002005a72204417f4c0d000240024020040d00410821060c010b200410322206450d020b20024100360218200220063602102002200441d0006e36021402402003450d0020024184036a210720024180026a41206a2108410021094100210a03404100210b200241003a00e001200a41016a210a2001280204417f6a210402400240024003402004417f460d01200241c0016a200b6a2001280200220c2d00003a0000200120043602042001200c41016a3602002002200b41016a220c3a00e0012004417f6a2104200c210b200c4120470d000b200241e0026a41086a2204200241c0016a41086a220d290300370300200241e0026a41106a220e200241c0016a41106a220f290300370300200241e0026a41186a2210200241c0016a41186a2211290300370300200220022903c0013703e002200c41ff0171411f4b0d014100210b0c020b0240200b41ff0171450d00200241003a00e0010b4100210b0c010b200241c0026a41086a220c2004290300370300200241c0026a41106a2212200e290300370300200241c0026a41186a22132010290300370300200220022903e0023703c002200241e0026a200110f6030240200228028003220b0d004100210b0c010b200820022903e00237030020024180026a41186a2214201329030037030020024180026a41106a2213201229030037030020024180026a41086a2212200c290300370300200841086a2004290300370300200841106a200e290300370300200841186a201029030037030020024190036a41086a200741086a280200360200200220022903c002370380022002200729020037039003200241c0016a41386a20024180026a41386a290300370300200241c0016a41306a20024180026a41306a290300370300200241c0016a41286a20024180026a41286a290300370300200241c0016a41206a200829030037030020112014290300370300200f2013290300370300200d201229030037030020022002290380023703c0010b20024180016a41386a2204200241c0016a41386a29030037030020024180016a41306a220c200241c0016a41306a29030037030020024180016a41286a220e200241c0016a41286a29030037030020024180016a41206a2210200241c0016a41206a29030037030020024180016a41186a220d200241c0016a41186a29030037030020024180016a41106a220f200241c0016a41106a29030037030020024180016a41086a2211200241c0016a41086a290300370300200241f0006a41086a221220024190036a41086a280200360200200220022903c001370380012002200229039003370370200b450d04200241306a41386a22132004290300370300200241306a41306a2214200c290300370300200241306a41286a220c200e290300370300200241306a41206a220e2010290300370300200241306a41186a2210200d290300370300200241306a41106a220d200f290300370300200241306a41086a220f2011290300370300200241206a41086a22112012280200360200200220022903800137033020022002290370370320024020092002280214470d00200241106a2009410110d60420022802182109200228021021060b2006200941d0006c6a22042002290330370300200d290300210520102903002115200e2903002116200c29030021172014290300211820132903002119200f290300211a2004200b360240200441086a201a37030020042002290320370244200441cc006a2011280200360200200441386a2019370300200441306a2018370300200441286a2017370300200441206a2016370300200441186a2015370300200441106a20053703002002200228021841016a2209360218200a2003470d000b0b20002002290310370200200041086a200241106a41086a2802003602000c030b103b000b1039000b200041003602002002280210210c02402009450d00200941d0006c2101200c41c0006a210403400240200441046a280200220b450d00200b41306c450d002004280200102c0b200441d0006a2104200141b07f6a22010d000b0b20022802142204450d00200441d0006c450d00200c102c0b200241d0036a24000bb9630d037f017e017f017e137f017e077f017e017f027e067f017e097f230041a0036b2205240020054190026a41086a2206200241086a2802003602002005200229020037039002200541e0016a41086a2202200341086a280200360200200520032902003703e001200541c0026a20054190026a200541e0016a10da01200541086a41086a200541c0026a41086a22032802002207360200200520052903c0022208370308200541186a41086a200541d4026a2802002209360200200520052902cc02220a370318200620073602002005200837039002200220093602002005200a3703e001200541c0026a200120054190026a200541e0016a10db01200541386a41086a2202200541d8026a2802003602002005200541d0026a2903003703382003280200210b20052802c402210c0240024002400240024020052802c0024101460d00200541cc026a2802002103200541286a41086a200228020036020020052005290338370328024020042903004201520d00200541286a2004280208200441106a290300200441186a29030010ab010b200c20034102746a210920010d010c020b2000200c36020420004101360200200041086a200b3602000c030b2009200c460d0020034102742106200c2103200c2104024003402003220241046a210320022802002202450d032002280208220741016a41004c0d012002200736020802400240200241f4006a2d00000d0020022002280200417f6a220736020020070d01200241046a22072007280200417f6a220736020020070d012002102c0c010b20042002360200200441046a21042001417f6a2201450d040b2006417c6a22060d000b200921030c020b41fcaec8004118200541e0016a41948bc50041a48bc5001040000b200c2103200c21040b0240200920036b2202450d00200241027541027421020340200328020022012001280200417f6a3602000240200328020022012802000d00200141046a22012001280200417f6a3602002003280200220141046a2802000d002001102c0b200341046a21032002417c6a22020d000b0b024002400240024002400240024002402004200c6b220d410275220e4115490d00200e410176220341ffffffff03712003470d072003410274220f417f4c0d07200f10322210450d06200541003602c802200542043703c002200c417c6a2111200c41746a2112200e211302400240034020132109410021134101210102402009417f6a2204450d00024002400240024002400240024002400240024002400240200c20044102746a2802002203280208220241016a41004c0d0020032002360208200c2009417e6a22074102746a2802002202280208220141016a41004c0d01200328025021032002200136020820032002280250490d04201220094102746a210341002113410021020340024020072002470d00200921010c0e0b200341046a2802002201280208220441016a41004c0d032001200436020820032802002204280208220641016a41004c0d0420012802502101200420063602082003417c6a2103200241016a2102200120042802504f0d000b200241016a21012002417f7320096a21040c050b41fcaec8004118200541e0016a41a0bec00041b0bec0001040000b41fcaec8004118200541e0016a41a0bec00041b0bec0001040000b41fcaec8004118200541e0016a41a0bec00041b0bec0001040000b41fcaec8004118200541e0016a41a0bec00041b0bec0001040000b2012200941027422076a210302400340024020044101470d00410021040c020b200341046a2802002202280208220141016a41004c0d032002200136020820032802002201280208220641016a41004c0d0420022802502102200120063602082003417c6a21032004417f6a210420022001280250490d000b0b20092004490d032009200e4b0d04200920046b22014101762206450d00201120076a2103200c20044102746a21020340200228020021072002200328020036020020032007360200200241046a21022003417c6a21032006417f6a22060d000b0b024020040d00200421130c070b0240200141094d0d00200421130c070b2009200e4b0d04200920046b21012004417f6a2103201120044102746a2102034020092003490d092002200141016a220110bd012003417f6a220420034f0d062002417c6a2102200421032001410a490d000c060b0b41fcaec8004118200541e0016a41a0bec00041b0bec0001040000b41fcaec8004118200541e0016a41a0bec00041b0bec0001040000b2004200941b8a3c8001059000b2009200e41b8a3c800104f000b20092004417f6a2203490d032009200e41c8a3c800104f000b200441016a21130b024020052802c802220320052802c402470d00200541c0026a10ae0120052802c80221030b20052802c002220220034103746a22042001360204200420133602002005200341016a22033602c802024020034102490d000240024002400340024002400240024020022003417f6a4103746a2201280200450d00200341037420026a220741746a2802002206200128020422044d0d00200341024d0d0820022003417d6a22144103746a2802042201200420066a4d0d01200341034d0d08200741646a280200200120066a4d0d010c080b20034103490d012001280204210420022003417d6a22144103746a28020421010b20012004490d010b2003417e6a21140b0240024002400240024002400240024002402003201441016a22154d0d00200320144d0d012002201441037422166a2203280204221720032802006a22032002201541037422186a22022802002219490d022003200e4b0d03200c20194102746a221a2002280204221b41027422026a210120034102742106200320196b2207201b6b2203201b4f0d06201020012003410274220210c908221c20026a210402400240201b4101480d00200341014e0d010b201c2103200121020c080b201120066a21092001210203402004417c6a22032802002201280208220641016a41004c0d05200120063602082002417c6a22062802002207280208221d41016a41004c0d06200128025021012007201d360208200920062003200120072802504922011b2802003602002004200320011b21040240201a2006200220011b2202490d00201c21030c090b2009417c6a2109201c21032004201c4b0d000c080b0b2015200341d8a3c800103f000b2014200341e8a3c800103f000b2019200341f8a3c8001059000b2003200e41f8a3c800104f000b41fcaec8004118200541e0016a41a0bec00041b0bec0001040000b41fcaec8004118200541e0016a41a0bec00041b0bec0001040000b2010201a200210c908220320026a210402400240201b4101480d002007201b4a0d010b20032103201a21020c010b200c20066a211c20032103201a2102034020012802002206280208220741016a41004c0d022006200736020820032802002207280208220941016a41004c0d042006280250210620072009360208200220012003200620072802504922061b2802003602002003200341046a20061b2103200241046a2102200141046a200120061b2201201c4f0d01200420034b0d000b0b20022003200420036b417c7110c9081a20052802c802220320144d0d0320052802c002220220166a22012017201b6a36020420012019360200200320154d0d04200220186a2201200141086a20032015417f736a41037410ca081a20052003417f6a22033602c802200341014d0d050c010b0b41fcaec8004118200541e0016a41a0bec00041b0bec0001040000b41fcaec8004118200541e0016a41a0bec00041b0bec0001040000b201420034188a4c800103f000b201520031047000b2013450d020c000b0b2003200941c8a3c8001059000b024020052802c40241ffffffff0171450d002002102c0b200f450d012010102c0c010b200e4102490d00200e417e6a210341022102200e410274200c6a41786a21010340200e2003490d022001200210bd012001417c6a2101200241016a21022003417f6a2203417f470d000b0b200528022822172005280230221041e0006c22026a2106200528022c2118201721032010450d0220054190026a4104722113200241a07f6a2104200541c0026a41346a21022017210302400340200541e0016a41286a2207200341286a290300370300200541e0016a41206a2209200341206a290300370300200541e0016a41186a221c200341186a290300370300200541e0016a41106a221d200341106a290300370300200541e0016a41086a221a200341086a290300370300200520032903003703e001200341306a2802002101200541386a41086a221b2003413c6a290200370300200541386a41106a2214200341c4006a290200370300200541386a41186a2215200341cc006a290200370300200541386a41206a2219200341d4006a290200370300200541386a41286a2216200341dc006a2802003602002005200341346a290200370338024020010d00200341e0006a21030c050b200541c0026a41286a2007290300370300200541c0026a41206a2009290300370300200541c0026a41186a201c290300370300200541c0026a41106a201d290300370300200541c0026a41086a201a29030037030020022005290338370200200241086a201b290300370200200241106a2014290300370200200241186a2015290300370200200241206a2019290300370200200241286a2016280200360200200520052903e0013703c002200520013602f00220054190026a200541c0026a10e30620052802900222010d01200441a07f6a2104200341e0006a22032006470d000b200621030c030b200541b8016a41086a201341086a2902002208370300200541b8016a41106a201341106a290200220a370300200541b8016a41186a201341186a290200221e37030020054190016a41206a2202201341206a29020037030020054190016a41186a2207201e37030020054190016a41106a2209200a37030020054190016a41086a221c20083703002005201329020022083703b8012005200837039001412c1032221f450d04201f2001360200201f200529039001370204201f410c6a201c290300370200201f41146a2009290300370200201f411c6a2007290300370200201f41246a2002290300370200024020040d004101212041012121200621030c020b200341e0006a211d200541c0026a41346a210220054190026a4104722116201041e0006c20176a41a07f6a2113410121204101212102400340201d210302400340200541e0016a41286a2204200341286a290300370300200541e0016a41206a2207200341206a290300370300200541e0016a41186a2209200341186a290300370300200541e0016a41106a221c200341106a290300370300200541e0016a41086a221d200341086a290300370300200520032903003703e001200341306a2802002101200541386a41086a221a2003413c6a290200370300200541386a41106a221b200341c4006a290200370300200541386a41186a2214200341cc006a290200370300200541386a41206a2215200341d4006a290200370300200541386a41286a2219200341dc006a2802003602002005200341346a290200370338024020010d00200341e0006a21030c060b200541c0026a41286a2004290300370300200541c0026a41206a22042007290300370300200541c0026a41186a22072009290300370300200541c0026a41106a2209201c290300370300200541c0026a41086a221c201d29030037030020022005290338370200200241086a201a290300370200200241106a201b290300370200200241186a2014290300370200200241206a2015290300370200200241286a2019280200360200200520052903e0013703c002200520013602f00220054190026a200541c0026a10e30620052802900222010d01200341e0006a22032006470d000b200621030c040b200541b8016a41086a201641086a2902002208370300200541b8016a41106a201641106a290200220a370300200541b8016a41186a201641186a290200221e37030020054190016a41206a221d201641206a29020037030020054190016a41186a221a201e37030020054190016a41106a221b200a37030020054190016a41086a221420083703002005201629020022083703b80120052008370390012004201d2903003703002007201a2903003703002009201b290300370300201c201429030037030020052005290390013703c002024020212020470d00202041016a221d2020490d082020410174221a201d201a201d4b1b221d4104201d41044b1bad422c7e2208422088a7221a0d082008a7221d4100480d08201a45410274211b2020412c6c201020201b211002400240024002400240201f410020201b221a0d00201d450d010c030b20100d01201d0d020b201b211f0c020b201a2010201d1035221f0d010c040b201d1032221f450d030b201d412c6e21200b200341e0006a211d201f2021412c6c6a221a2001360200201a20052903c002370204201a410c6a201c290300370200201a41146a2009290300370200201a411c6a2007290300370200201a41246a2004290300370200202141016a212120132003470d000b200621030c020b201b0d040c050b2003200e41a8a3c8001058000b024020062003460d00034002402003220441386a2802002203450d00200341d8006c2102200428023041306a21030340200328020022012001280200417f6a3602000240200328020022012802000d00200141046a22012001280200417f6a3602002003280200220141046a2802000d002001102c0b200341d8006a2103200241a87f6a22020d000b0b200441e0006a21030240200441346a2802002202450d0020042802302201450d00200241d8006c450d002001102c0b20032006470d000b0b2018450d01201841e0006c450d012017102c0c010b024020062003460d00034002402003220441386a2802002203450d00200341d8006c2102200428023041306a21030340200328020022012001280200417f6a3602000240200328020022012802000d00200141046a22012001280200417f6a3602002003280200220141046a2802000d002001102c0b200341d8006a2103200241a87f6a22020d000b0b200441e0006a21030240200441346a2802002202450d0020042802302201450d00200241d8006c450d002001102c0b20032006470d000b0b4104211f4100212102402018450d00201841e0006c450d002017102c0b410021200b2005410036029001201f2021412c6c6a2122201f212302400340024002400240024002400240024002400240202322242022460d002024280200210120242802082102200541003602c001200542043703b801200541b8016a4100200210950220052802c001210420052802b80121030240200241246c2206450d00200141206a2102200320044102746a2101034020012002280200360200200241246a2102200441016a2104200141046a21012006415c6a22060d000b0b200520043602c0012005410036024020054208370338200541386a41002004109c05200528024021182005280238210602402004450d0020044102742101200620184103746a2102034020022003350200370300201841016a2118200241086a2102200341046a21032001417c6a22010d000b0b2024412c6a21232005201836024042002108201841037422042103200621020340024020030d00024020180d004100210741082109410021010c0a0b428094ebdc0320082008428094ebdc035422251b2008428094ebdc0320251b7d2226500d03410021272005410036029802200542083703900220054190026a4100201810ac0120262018ad222882211e202620288021292005280290022210200528029802222a4104746a220241706a21030340200341186a2006290300370300200341106a220320273602002002220141106a2102202741016a2127200641086a2106200441786a22040d000b2005202a20276a220f36029802200f4115490d06200f410176220341ffffffff00712003470d0e2003410474222b417f4c0d0e202b1032222c450d0d41002103200541003602e801200542043703e001201041706a212d201041586a212e200f211703400240024020172207417f6a22020d0041012106410021170c010b024002400240024002400240201020024104746a41086a2903002007410474221b20106a41686a2903002208540d002007417e6a2106202e201b6a210141002117410021020340024020062002470d00200721060c080b200241016a210220082001290300220a5a2104200141706a2101200a210820040d000b200241016a21062002417f7320076a21020c010b202e201b6a210102400340024020024101470d00410021020c020b2002417f6a210220082001290300220a542104200141706a2101200a210820040d000b0b20072002490d022007200f4b0d01200720026b22064101762209450d00201020024104746a2101202d201b6a21040340200541c0026a41086a221c200141086a221d290300370300200520012903003703c002200441086a221a290300210820012004290300370300201d2008370300201a201c290300370300200420052903c002370300200141106a2101200441706a21042009417f6a22090d000b0b024020020d00200221170c050b0240200641094d0d00200221170c050b2007200f4b0d02200720026b2101201020024104746a2109202d201b6a211a034020072002417f6a2217490d0b0240200720176b22064102490d00201020024104746a220341086a2204290300201020174104746a220241086a221c29030022085a0d002002280200211d20022003290300370300201c2004290300370300024020064103490d002001417f6a211c410021022009210302400340200341186a220429030020085a0d0220012002460d01200341086a20042903003703002003200341106a220429030037030020042103201c200241016a2202470d000b201a21030c010b200241016a2006419ca5c800103f000b200320083703082003201d3602000b2017450d04200141016a2101200941706a2109201721022006410a490d000c040b0b2007202a20276a41b8a3c800104f000b2002200741b8a3c8001059000b20072002417f6a2217490d072007202a20276a41c8a3c800104f000b20052802e80121030b0240200320052802e401470d00200541e0016a10ae0120052802e80121030b20052802e001220220034103746a22012006360204200120173602002005200341016a22033602e801024020034102490d0002400340024002400240024020022003417f6a4103746a2201280200450d00200341037420026a220741746a2802002206200128020422044d0d00200341024d0d0620022003417d6a22154103746a2802042201200420066a4d0d01200341034d0d06200741646a280200200120066a4b0d060c010b20034103490d012001280204210420022003417d6a22154103746a28020421010b20012004490d010b2003417e6a21150b0240024002400240024002402003201541016a22194d0d00200320154d0d012002201541037422136a2203280204221120032802006a22012002201941037422126a22032802002216490d022001200f4b0d03201020164104746a221b2003280204221441047422026a210320014104742104200120166b220620146b220120144f0d04202c20032001410474220210c908221d20026a21070240024020144101480d00200141014e0d010b201d2109200321020c060b202d20046a2106200321022007210403402006200341706a221c200441706a2209200441786a290300200341786a2903005422011b221a290300370300200641086a201a41086a290300370300201c200220011b21022007200920011b210702402004200920011b2204201d4b0d00201d21090c070b200641706a2106201d2109201b201c200320011b2203490d000c060b0b2019200341d8a3c800103f000b2015200341e8a3c800103f000b2016200141f8a3c8001059000b2001202a20276a41f8a3c800104f000b202c201b200210c908220120026a21070240024020144101480d00200620144a0d010b20012109201b21020c010b201020046a211c2001210920012101201b2102034002400240200341086a290300200141086a290300540d00200141106a22092104200321060c010b200341106a210620012104200321010b20022001290300370300200241086a200141086a290300370300200241106a2102200420074f0d0120042101200621032006201c490d000b0b20022009200720096b41707110c9081a024020052802e801220320154d0d0020052802e001220220136a2201201120146a36020420012016360200200320194d0d02200220126a2201200141086a20032019417f736a41037410ca081a20052003417f6a22033602e801200341014d0d030c010b0b201520034188a4c800103f000b201920031047000b2017450d060c000b0b200341786a2103200820022903007c220a2008542101200241086a2102200a21082001450d000b200528023c2203410374202f20031b212f02402005280238410020031b2203450d00202f450d002003102c0b411e21074186a7c80021020c080b02402005280290012202450d0020052802940121070c0a0b2005410036029802200542083703900220054190026a4100200e10e00120052802980221060240024002400240200e41027422030d00200c21020c010b200c20036a2115200e4102742107200528029002200641306c6a2101200541c0026a41086a2109200541c0026a41106a211c200541c0026a41186a211d200c2102024003402002220341046a210220032802002203450d012003280208220441016a221a41004c0d032003201a3602082009200341dc006a290000370300201c200341e4006a290000370300201d200341ec006a2900003703002005200341d4006a2900003703c002200441026a41004c0d0420032004360208200541e0016a41086a22042009290300370300200541e0016a41106a221a201c290300370300200541e0016a41186a221b201d290300370300200520052903c0023703e001200341c8006a29030021082003290340210a20032003280200417f6a2214360200024020140d00200341046a22142014280200417f6a221436020020140d002003102c0b200120052903e0013703002004290300211e201a2903002129201b2903002130200141286a2008370300200141206a200a370300200141186a2030370300200141106a2029370300200141086a201e370300200141306a2101200641016a21062007417c6a22070d000b201521020b201520026b2203410275210e0b200520063602980202402003450d00200e41027421030340200228020022012001280200417f6a3602000240200228020022012802000d00200141046a22012001280200417f6a3602002002280200220141046a2802000d002001102c0b200241046a21022003417c6a22030d000b0b0240200c4100200b1b2203450d00200b41ffffffff0371450d002003102c0b200020052903900237020420004100360200200041186a2021360200200041146a2020360200200041106a201f3602002000410c6a20054198026a2802003602000c0e0b41fcaec8004118200541e0016a41a0a4c70041b0a4c7001040000b41fcaec8004118200541e0016a41a0a4c70041c0a4c7001040000b201841ffffffff01712018470d0a20184103742203417f4c0d0a200310322202450d09200541003602c802200520023602c002200520034103763602c402200541c0026a41002018109c0520052802c002220920052802c80222024103746a2006200310c9081a200220186a21010c040b2017200741c8a3c8001059000b20052802e4012203410374203120031b213102402003450d002031450d002002102c0b202b2032202b1b2132202b450d012032450d01202c102c0c010b200f4102490d00200f417f6a2106410021070340024002400240200f20062202417f6a2206490d00200f20066b221d4102490d02201020024104746a220241086a2209290300201020064104746a220441086a221c29030022085a0d022004280200211a20042002290300370300201c2009290300370300201d4103490d012007417f6a211c410021042001210202400340200241186a220929030020085a0d03201c2004460d01200241086a20092903003703002002200241106a22092903003703002009210220072004417f6a2204470d000b200321020c020b410120046b201d419ca5c800103f000b2006202a20276a41a8a3c8001058000b200220083703082002201a3602000b2007417f6a2107200141706a210120060d000b0b024002400240024002400240024002400240024002400240024002402025450d00428094ebdc03202880213041002103024020262028540d00410021032005280298022104201821020340200420034d0d0320052802900220034104746a2201290308220a20297c2208200a540d04200141086a2008370300024020082030540d00200341016a20187021030b2002417f6a22020d000b0b201e4200520d06200528029802211220052802900221100c070b02402005280298022212450d00200528029002221029030821302018417f6a22012103024020262028540d000340201220034d0d05201020034104746a220242002002290308220820297d220a200a20085622021b200a20021b220a370308200320012003417f6a2204200420034b1b200a2030561b2103201e202920087d420020021b7c211e2018417f6a22180d000b0b201e500d070340201220034d0d05024002402010200341047422026a22042903082208427f7c220a2008580d0020012003417f6a2202200220034b1b21030c010b200441086a200a370300200528029802221220034d0d07200320012003417f6a2204200420034b1b200528029002221020026a2903082030561b2103201e427f7c211e0b201e4200520d000c080b0b41a4a7c800413f41e4a7c800105c000b2003200441f4a7c800103f000b4184a8c800412641aca8c800105c000b2003201241dca8c800103f000b2003201241fca8c800103f000b20032012418ca9c800103f000b20052802980221120340201220034d0d03200528029002221020034104746a2202290308220a42017c2208200a540d02200241086a2008370300024020082030540d00200341016a20187021030b201e427f7c221e50450d000b0b20124115490d042012410176220341ffffffff00712003470d0c2003410474222d417f4c0d0c202d1032220f450d0b41002103200541003602e801200542043703e001201041706a2127201041506a212c2012211703400240024020172209417f6a22020d0041012107410021170c010b024002400240024002400240201020024104746a2802002009410474221b20106a41606a2802002201490d002009417e6a211c202c201b6a2104410021174100210203400240201c2002470d00200921070c080b200241016a21022001200428020022064f2107200441706a21042006210120070d000b200241016a21072002417f7320096a21020c010b202c201b6a210402400340024020024101470d00410021020c020b2002417f6a2102200120042802002206492107200441706a21042006210120070d000b0b20092002490d02200920124b0d01200920026b22074101762206450d00201020024104746a21012027201b6a21040340200541c0026a41086a221c200141086a221d290300370300200520012903003703c002200441086a221a290300210820012004290300370300201d2008370300201a201c290300370300200420052903c002370300200141106a2101200441706a21042006417f6a22060d000b0b024020020d00200221170c050b0240200741094d0d00200221170c050b200920124b0d02200920026b2104201020024104746a211c2027201b6a211a034020092002417f6a2217490d090240200920176b22074102490d00201020024104746a2203280200201020174104746a220228020022064f0d002002200329030037030020022903082108200241086a200341086a290300370300024020074103490d002004417f6a211d41002102201c210302400340200341106a220128020020064f0d0220042002460d01200341086a200341186a2903003703002003200129030037030020012103201d200241016a2202470d000b201a21030c010b200241016a2007419ca5c800103f000b20032008370308200320063602000b2017450d04200441016a2104201c41706a211c201721022007410a490d000c040b0b2009201241b8a3c800104f000b2002200941b8a3c8001059000b20092002417f6a2217490d052009201241c8a3c800104f000b20052802e80121030b0240200320052802e401470d00200541e0016a10ae0120052802e80121030b20052802e001220220034103746a22012007360204200120173602002005200341016a22033602e801024020034102490d0002400340024002400240024020022003417f6a4103746a2201280200450d00200341037420026a220741746a2802002206200128020422044d0d00200341024d0d0620022003417d6a22154103746a2802042201200420066a4d0d01200341034d0d06200741646a280200200120066a4b0d060c010b20034103490d012001280204210420022003417d6a22154103746a28020421010b20012004490d010b2003417e6a21150b0240024002400240024002402003201541016a22194d0d00200320154d0d012002201541037422186a2203280204221320032802006a22012002201941037422116a22032802002216490d02200120124b0d03201020164104746a221b2003280204221441047422026a210320014104742104200120166b220620146b220120144f0d04200f20032001410474220210c908221d20026a21090240024020144101480d00200141014e0d010b201d211a200321020c060b202720046a2104200321022009211c03402004200341706a2207201c41706a2206200628020020072802004922011b221a290300370300200441086a201a41086a2903003703002007200220011b21022009200620011b21090240201c200620011b221c201d4b0d00201d211a0c070b200441706a2104201d211a201b2007200320011b2203490d000c060b0b2019200341d8a3c800103f000b2015200341e8a3c800103f000b2016200141f8a3c8001059000b2001201241f8a3c800104f000b200f201b200210c908220120026a21090240024020144101480d00200620144a0d010b2001211a201b21020c010b201020046a21072001211a20012101201b210203400240024020032802002001280200490d00200141106a221a2104200321060c010b200341106a210620012104200321010b20022001290300370300200241086a200141086a290300370300200241106a2102200420094f0d01200421012006210320062007490d000b0b2002201a2009201a6b41707110c9081a024020052802e801220320154d0d0020052802e001220220186a2201201320146a36020420012016360200200320194d0d02200220116a2201200141086a20032019417f736a41037410ca081a20052003417f6a22033602e801200341014d0d030c010b0b201520034188a4c800103f000b201920031047000b2017450d040c000b0b4184a8c800412641cca8c800105c000b2003201241bca8c800103f000b2017200941c8a3c8001059000b20052802e4012203410374203320031b213302402003450d002033450d002002102c0b202d2034202d1b2134202d450d012034450d01200f102c0c010b20124102490d002012417f6a210441002106201020124104746a41706a221a21090340024002400240201220042203417f6a2204490d00201220046b221d4102490d02201020034104746a2203280200201020044104746a220228020022074f0d022002200329030037030020022903082108200241086a200341086a290300370300201d4103490d012006417f6a211c410021022009210302400340200341106a220128020020074f0d03201c2002460d01200341086a200341186a290300370300200320012903003703002001210320062002417f6a2202470d000b201a21030c020b410120026b201d419ca5c800103f000b2004201241a8a3c8001058000b20032008370308200320073602000b2006417f6a2106200941706a210920040d000b0b200541003602c802200542083703c00220052802900221072005280294022106200541c0026a41002005280298022203109c0520052802c802210120052802c002210902402003450d0020034104742104200741086a2103200920014103746a2102034020022003290300370300200341106a2103200141016a2101200241086a2102200441706a22040d000b0b200520013602c8022006410474203520061b21352006450d002035450d002007102c0b20052802c40221070b200541003602c802200542043703c002200541c0026a41002001410374220341037510950220052802c802210120052802c002211c02402003450d00200920036a2106201c20014102746a2103200921020340200320022903002208a7417f2008428080808010541b2204418094ebdc032004418094ebdc03491b360200200141016a2101200341046a21032006200241086a2202470d000b0b200520013602c8022007410374203620071b213602402007450d002036450d002009102c0b200528023c2203410374203720031b213720052802c402210402402005280238410020031b2203450d002037450d002003102c0b0240200120242802082203200320014b1b2201450d00202428020041206a2103201c2102034020032002280200360200200241046a2102200341246a21032001417f6a22010d000b0b2004410274203820041b2138410021022004450d002038450d00201c102c0b20052802bc012203410274203920031b2139024020052802b801410020031b2203450d002039450d002003102c0b2002450d000b0b2000200236020420004101360200200041086a200736020002402021450d002021412c6c2102201f210303400240200341046a2802002201450d00200141246c450d002003280200102c0b2003412c6a2103200241546a22020d000b0b02402020450d002020412c6c450d00201f102c0b0240200d450d00200e4102742102200c21030340200328020022012001280200417f6a3602000240200328020022012802000d00200141046a22012001280200417f6a3602002003280200220141046a2802000d002001102c0b200341046a21032002417c6a22020d000b0b200c4100200b1b2203450d02200b41ffffffff0371450d022003102c0c020b1039000b103b000b200541a0036a24000bbe0703027f017e037f230041b0026b22022400200241186a200141186a290200370300200241106a200141106a290200370300200241086a200141086a29020037030020022001290200370300200241f0016a200210c10702400240024020022802a0020d00200241e0016a41003602000c010b200241d0006a41386a200241f0016a41386a290300370300200241d0006a41306a200241f0016a41306a290300370300200241d0006a41286a200241f0016a41286a290300370300200241d0006a41206a200241f0016a41206a290300370300200241d0006a41186a200241f0016a41186a290300370300200241d0006a41106a200241f0016a41106a290300370300200241d0006a41086a200241f0016a41086a290300370300200220022903f001370350200241a0016a2002411c6a200241d0006a10a504200241e0016a280200450d0002400240417f2002280218220141016a220320032001491bad42d0007e2204422088a70d002004a72201417f4c0d00200110322205450d012005200241a0016a41d00010c9082103200241013602282002200141d0006e36022420022003360220200241306a41186a200241186a290300370300200241306a41106a200241106a290300370300200241306a41086a200241086a29030037030020022002290300370330200241f0016a200241306a10c1070240024020022802a002450d00200241cc006a210641d0002103410121010340200241a0016a41386a200241f0016a41386a290300370300200241a0016a41306a200241f0016a41306a290300370300200241a0016a41286a200241f0016a41286a290300370300200241a0016a41206a200241f0016a41206a290300370300200241a0016a41186a200241f0016a41186a290300370300200241a0016a41106a200241f0016a41106a290300370300200241a0016a41086a200241f0016a41086a290300370300200220022903f0013703a001200241d0006a2006200241a0016a10a504200228029001450d02200241a0016a200241d0006a41d00010c9081a024020012002280224470d00200241206a2001417f2002280248220541016a220720072005491b10d604200228022021050b200520036a200241a0016a41d00010c9081a2002200141016a2201360228200341d0006a2103200241f0016a200241306a10c10720022802a0020d000b0b20024100360290010b200241306a10ff01200041086a200241206a41086a280200360200200020022903203702000c030b103b000b1039000b2000410036020820004208370200200210ff010b200241b0026a24000bdf0301057f230041306b22002400200041186a22014200370300200041106a22024200370300200041086a2203420037030020004200370300200041206a41e6dcc700410710c5012003200041206a41086a220429000037030020002000290020370300200041206a41a08ec100411110c5012001200429000037030020022000290020370300200041002000109c0420014200370300200242003703002003420037030020004200370300200041206a41e6dcc700410710c5012003200429000037030020002000290020370300200041206a41ec8ec100411210c50120012004290000370300200220002900203703002000412010b40120014200370300200242003703002003420037030020004200370300200041206a41e6dcc700410710c5012003200429000037030020002000290020370300200041206a41fe8ec100411210c50120012004290000370300200220002900203703002000412010b40120014200370300200242003703002003420037030020004200370300200041206a41e6dcc700410710c5012003200429000037030020002000290020370300200041206a41bcc6c200411510c5012001200429000037030020022000290020370300200041003a002020004120200041206a410110a702200041306a24000be70301057f230041d0006b22032400200341086a41e6dcc700410710c501200341186a41e4bcc200411210c50120032001360234200341386a200341346a410410c701200341cc006a200341346a41046a3602002003200341c0006a3602442003200341346a3602482003200341386a360240200341286a200341c0006a107e200341c0006a200210e4020240024020032802302201200328024822046a41206a2202417f4c0d000240024020020d00410121050c010b200210322205450d020b2000200236020420002005360200200041086a2202410036020020004100411010c8012000280200200228020022056a220620032900083700002002200541106a2205360200200641086a200341086a41086a29000037000020002005411010c8012000280200200228020022056a220620032900183700002002200541106a2207360200200641086a200341186a41086a2900003700002003280228210520002007200110c8012000280200200228020022066a2005200110c9081a2002200620016a22063602002003280240210120002006200410c8012000280200200228020022006a2001200410c9081a2002200020046a36020002402003280244450d002001102c0b0240200328022c450d002005102c0b200341d0006a24000f0b103b000b1039000bce0201037f230041e0006b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00410021020c010b200328021421042003200341186a280200360224200320013602202003200341206a1087020240024020032802000d00200328020421022003418094ebdc0336024c20032002360248200341c8006a2002418094ebdc034b4102746a2802002105410121020c010b4100210220034100360230200342013703282003410f36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341b4bcc3003602482003200341386a360258200341c4006a41dcb7c000200341c8006a103e1a200335023042208620033502288410000240200328022c450d002003280228102c0b0b2004450d002001102c0b2000200536020420002002360200200341e0006a24000be70301057f230041d0006b22032400200341086a41e6dcc700410710c501200341186a41e0bdc200411210c50120032001360234200341386a200341346a410410c701200341cc006a200341346a41046a3602002003200341c0006a3602442003200341346a3602482003200341386a360240200341286a200341c0006a107e200341c0006a200210e4020240024020032802302201200328024822046a41206a2202417f4c0d000240024020020d00410121050c010b200210322205450d020b2000200236020420002005360200200041086a2202410036020020004100411010c8012000280200200228020022056a220620032900083700002002200541106a2205360200200641086a200341086a41086a29000037000020002005411010c8012000280200200228020022056a220620032900183700002002200541106a2207360200200641086a200341186a41086a2900003700002003280228210520002007200110c8012000280200200228020022066a2005200110c9081a2002200620016a22063602002003280240210120002006200410c8012000280200200228020022006a2001200410c9081a2002200020046a36020002402003280244450d002001102c0b0240200328022c450d002005102c0b200341d0006a24000f0b103b000b1039000baf0101047f230041106b220324002003410036020820034201370300200341004101102f20032802002204200328020822056a21060240024020014101460d00200641003a0000200541016a21010c010b200641013a00002003200541016a2204360208200320044104102f20032802002204200328020822016a2002360000200141046a21010b20032001360208200041202004200110a70202402003280204450d002004102c0b200341106a24000b0e002001ad4220862000ad8410200bb52903057f017e157f230041f0016b2201240020014198016a2202420037030020014180016a41106a2203420037030020014180016a41086a220442003703002001420037038001200141e0006a41e6dcc700410710c5012004200141e0006a41086a22052900003703002001200129006037038001200141e0006a4188bbc200410910c5012002200529000037030020032001290060370300200141086a20014180016a10cb032001411c6a2802002102200129031021060240024020012903084202510d00200141086a41106a28020041016a21070c010b410021070b200141086a41106a20073602002001200236021c200120063703102001420037030820014198016a2205420037030020014180016a41106a2208420037030020014180016a41086a220242003703002001420037038001200141e0006a41e6dcc700410710c5012002200141e0006a41086a22042900003703002001200129006037038001200141e0006a4188bbc200410910c501200341086a22092004290000370000200320012900603700002001410036026820014201370360200141e0006a41004104102f20012802602001280268220a6a20073600002001200a41046a360268200141e0006a200141086a109f0420014180016a41202001280260220a200128026810a70202402001280264450d00200a102c0b2005420037030020084200370300200242003703002001420037038001200141e0006a41e6dcc700410710c501200220042900003703002001200129006037038001200141e0006a41c8c1c200410a10c5012009200429000037000020032001290060370000200141086a20014180016a108a04024002400240200128020822040d0041002102200141003602e001200142043703d8010c010b2001200129020c22063702dc01200120043602d8012006422088a722022006a7470d010b200141d8016a200210bc0320012802e001210220012802d80121040b200420024103746a2202200036020420022007360200200120012802e001220241016a220b3602e001024002400240024002402007411c4b0d0020012802d801210c0c010b20012802d801210c02400240200b0d004100210d200141003602e001200c210e200c21020c010b200741646a2104200241ffffffff017141016a21004100210d200c210202400340200228020020044f0d01200241086a21022000200d41016a220d470d000b2000210d0b02400240200b200d490d00200141003602e001200c200d41037422096a210e0240200d0d00200c21020c020b200141ec016a41046a210a200141e4016a41086a210f200c2102034020022802002105200141e0006a41e6dcc700410710c501200141086a41be92c100411310c501200120053602ec01200141e4016a200141ec016a410410c7012001200a36028c012001200f360284012001200141ec016a360288012001200141e4016a36028001200141c0006a20014180016a107e2001280248220441206a2200417f4c0d060240024020000d00410121080c010b200010322208450d060b20014100360288012001200036028401200120083602800120014180016a4100411010c80120012802800120012802880122006a22082001290060370000200841086a200141e0006a41086a22102900003700002001200041106a22003602880120014180016a2000411010c80120012802800120012802880122006a22082001290008370000200841086a200141086a41086a22112900003700002001200041106a2208360288012001280240210020014180016a2008200410c801200128028001220820012802880122126a2000200410c9081a2001201220046a22043602880102402001280244450d002000102c0b20082004109d040240200128028401450d002008102c0b200141e0006a41e6dcc700410710c501200141086a41ab92c100411310c501200120053602ec01200141e4016a200141ec016a410410c7012001200a36028c012001200f360284012001200141ec016a360288012001200141e4016a36028001200141c0006a20014180016a107e2001280248220441206a2200417f4c0d060240024020000d00410121050c010b200010322205450d060b20014100360288012001200036028401200120053602800120014180016a4100411010c80120012802800120012802880122006a22052001290060370000200541086a20102900003700002001200041106a22003602880120014180016a2000411010c80120012802800120012802880122006a22052001290008370000200541086a20112900003700002001200041106a2205360288012001280240210020014180016a2005200410c801200128028001220520012802880122086a2000200410c9081a2001200820046a22043602880102402001280244450d002000102c0b200241086a210220052004109d040240200128028401450d002005102c0b200941786a2209450d020c000b0b200d200b41d089c500104f000b200b200d6b210b2002200e460d000340200e200241086a2202470d000b0b200e20026b2102024003402002450d01200241786a21020c000b0b0240200b0d004100210b0c010b0240200d450d00200c200c200d4103746a200b41037410ca081a0b2001200b3602e001200c280204211120014198016a2202420037030020014190016a2210420037030020014180016a41086a220442003703002001420037038001200141086a41ffdcc700410710c5012004200141086a41086a22002900003703002001200129000837038001200141086a41afaec000410b10c5012002200029000037030020102001290008370300200141086a20014180016a412010a004200129020c210641002102024020012802084101470d0002402006422088a722122011201120124b1b22092006a722024f0d00410121020c010b0240200920024d0d00200141ec016a41046a210a200141e4016a41086a210f0340200141e0006a41ffdcc700410710c501200141086a41ddecc400411210c501200120023602ec01200141e4016a200141ec016a410410c7012001200a36028c012001200f360284012001200141ec016a360288012001200141e4016a36028001200141c0006a20014180016a107e2001280248220441206a2200417f4c0d050240024020000d00410121050c010b200010322205450d050b20014100360288012001200036028401200120053602800120014180016a4100411010c80120012802800120012802880122006a22052001290060370000200541086a200141e0006a41086a2900003700002001200041106a22003602880120014180016a2000411010c80120012802800120012802880122006a22052001290008370000200541086a200141086a41086a2900003700002001200041106a2205360288012001280240210020014180016a2005200410c801200128028001220520012802880122086a2000200410c9081a2001200820046a22043602880102402001280244450d002000102c0b200241016a21022005200410b4010240200128028401450d002005102c0b20092002470d000b0b201120124921022006428080808070832009ad8421060b2001200637026420012002360260024020020d0020014198016a420037030020014190016a420037030020014180016a41086a220242003703002001420037038001200141086a41ffdcc700410710c5012002200141086a41086a22042900003703002001200129000837038001200141086a41afaec000410b10c501201041086a20042900003700002010200129000837000020014180016a412010b4010c010b20014198016a420037030020014190016a420037030020014180016a41086a220242003703002001420037038001200141086a41ffdcc700410710c5012002200141086a41086a22042900003703002001200129000837038001200141086a41afaec000410b10c501201041086a20042900003700002010200129000837000020014180016a4120200141e0006a41047210a1040b20012802dc01210920014198016a420037030020014190016a420037030020014180016a41086a220242003703002001420037038001200141e0006a41e6dcc700410710c5012002200141e0006a41086a22042900003703002001200129006037038001200141e0006a41c8c1c200410a10c501200341086a20042900003700002003200129006037000002400240200c0d0020014180016a412010b4010c010b200b4103744104722202417f4c0d02200210322204450d01200141003602102001200236020c20012004360208024002400240200b41c000490d00024002400240200b41808001490d00200b418080808004490d01200141086a41004101102f2001280208200128021022026a41033a00002001200241016a2202360210200141086a20024104102f2001280208200128021022026a200b360000200241046a21040c020b200141086a41004102102f2001280208200128021022026a200b4102744101723b0000200241026a21040c010b200141086a41004104102f2001280208200128021022026a200b410274410272360000200241046a21040b20012004360210200c200b4103746a21080c010b200141086a41004101102f20012802082205200128021022026a200b4102743a00002001200241016a2204360210200b450d01200c200b4103746a21080b200c2102034020022802002100200141086a20044104102f2001280208200128021022046a20003600002001200441046a2204360210200241046a2802002100200141086a20044104102f20012802082205200128021022046a20003600002001200441046a2204360210200241086a22022008470d000b0b20014180016a41202005200410a7020240200128020c450d002005102c0b2009450d00200941ffffffff0171450d00200c102c0b20014198016a420037030020014190016a420037030020014180016a41086a220242003703002001420037038001200141e0006a41e6dcc700410710c5012002200141e0006a41086a22042900003703002001200129006037038001200141e0006a4188c4c200411610c501200341086a200429000037000020032001290060370000200120014180016a412010c60120012802042113024020012802004101460d00410021020c030b024020134100200741656a2202200220074b1b22144f0d00200141e4016a41046a2115200141d8016a41086a211620014180016a41246a210420014180016a41286a2111201321170340200141e0006a41e6dcc700410710c501200141086a41f0c0c200411010c501200120173602e401200141d8016a200141e4016a410410c7012001201536028c0120012016360284012001200141e4016a360288012001200141d8016a36028001200141c0006a20014180016a107e2001280248220241206a2200417f4c0d030240024020000d00410121050c010b200010322205450d030b200141003602e001200120003602dc01200120053602d801200141d8016a4100411010c80120012802d80120012802e00122006a22052001290060370000200541086a200141e0006a41086a220f2900003700002001200041106a22003602e001200141d8016a2000411010c80120012802d80120012802e00122006a22052001290008370000200541086a200141086a41086a22102900003700002001200041106a22003602e00120012802402105200141d8016a2000200210c80120012802d801220020012802e00122086a2005200210c9081a2001200820026a22023602e00102402001280244450d002005102c0b20014180016a200020021091040240024020012802800122180d0041082118420021060c010b2000200210b40120012902840121060b024020012802dc01450d002000102c0b20182006422088a7220241d8006c6a21080240024020020d00201821000c010b201821020340200141e0006a41186a2212200241186a290300370300200141e0006a41106a220d200241106a290300370300200f200241086a29030037030020012002290300370360200241206a280200210020014180016a41086a22052002412c6a29020037030020014180016a41106a2209200241346a29020037030020014180016a41186a220a2002413c6a29020037030020014180016a41206a220e200241c4006a2902003703002011200241cc006a29020037030020014180016a41306a220b200241d4006a2802003602002001200241246a29020037038001024020000d00200241d8006a21000c020b200141c0006a41186a22072012290300370300200141c0006a41106a2212200d290300370300200141c0006a41086a220d200f29030037030020102005290300370300200141086a41106a220c2009290300370300200141086a41186a2219200a290300370300200141086a41206a221a200e290300370300200141086a41286a220e2011290300370300200141086a41306a221b200b280200360200200120012903603703402001200129038001370308200a2007290300370300200920122903003703002005200d29030037030020042001290308370200200441086a2010290300370200200441106a200c290300370200200441186a2019290300370200200441206a201a290300370200200441286a200e290300370200200441306a201b2802003602002001200129034037038001200120003602a00120014180016a10a204200241d8006a22022008470d000b200821000b2006a72109024020082000460d00034002402000220241246a2802002200450d00200041306c450d00200241206a280200102c0b200241d8006a21000240200241306a2802002205450d00200541ffffff3f71450d002002412c6a280200102c0b20082000470d000b0b201741016a211702402009450d00200941d8006c450d002018102c0b20172014470d000b0b20132014201320144b1b2113410121020c020b1039000b103b000b200120023602082001201336020c20014198016a420037030020014190016a420037030020014180016a41086a220442003703002001420037038001200141e0006a41e6dcc700410710c5012004200141e0006a41086a22002900003703002001200129006037038001200141e0006a4188c4c200411610c501200341086a2000290000370000200320012900603700000240024020020d0020014180016a412010b4010c010b2001201336026020014180016a4120200141e0006a410410a7020b200141f0016a24000b9c0102027f017e024020012903004201510d002000200041086a22022802004101102f200028020020022802006a41003a00002002200228020041016a3602000f0b2000200041086a22022802004101102f200028020020022802006a41013a00002002200228020041016a220336020020012903082104200020034108102f200028020020022802006a20043700002002200228020041086a3602000b920201027f230041d0006b220324002003200236020420032001360200200341086a2001200210b30102400240200328020822010d00200041003602000c010b200328020c2102024002400240200341106a28020022044104490d002004417c714104470d010b4100210420034100360220200342013703182003410f36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c200341b4bcc3003602382003200341286a360248200341346a41dcb7c000200341386a103e1a20033502204220862003350218841000200328021c450d012003280218102c0c010b20002001290000370204410121040b200020043602002002450d002001102c0b200341d0006a24000ba80101037f230041106b220324000240410810322204450d00200342083702042003200436020020022802002104200341004104102f2003280200200328020822056a20043600002003200541046a220436020820022802042105200320044104102f20032802002202200328020822046a20053600002003200441046a2204360208200020012002200410a70202402003280204450d002002102c0b200341106a24000f0b1039000bf30f05057f087e017f027e027f230041c0016b2201240020014200370378200142003703702001200041186a290300370388012001200029031037038001200041386a2000290300200041086a29030020014180016a200141f0006a10a508200028022021020240200041286a2802002203450d00200341306c21042002210303402003200341206a290300200341286a29030020014180016a200141f0006a10a508200341306a2103200441506a22040d000b0b200028022c2105200141f0006a41086a2903002106200129037021070240024002400240200129038001220820014180016a41086a290300220984500d00200041346a2802002203450d00200141e0006a200720082007200854200620095420062009511b22041b220a2006200920041b220b2003ad420010c80820034105742104200141e8006a290300210c2001290360210d200a2109200b21082005210303402003200d20092009200d562008200c562008200c511b220e1b220f200c2008200e1b221010d006200820107d2009200f54ad7d21082009200f7d2109200341206a2103200441606a22040d000b427f2006200b7d2007200a54ad7d220c20087c2007200a7d220f20097c2210200f542203ad7c220d2003200d200c54200d200c511b22031b2107427f201020031b210d200f200984200c200884844200520d01200141a8016a2203420037030020014190016a41106a2204420037030020014190016a41086a220e42003703002001420037039001200141b0016a41d4dcc700410810c501200e200141b0016a41086a2211290000370300200120012900b00137039001200141b0016a41bba8c700410d10c50120032011290000370300200420012900b001370300200141306a20014190016a412010d301200141306a41106a290300210920012903382108200128023021122003420037030020044200370300200e42003703002001420037039001200141b0016a41d4dcc700410810c501200e2011290000370300200120012900b00137039001200141b0016a41bba8c700410d10c50120032011290000370300200420012900b001370300200142002009420020121b220920077d2008420020121b2208200d54ad7d220c2008200d7d220f200856200c200956200c2009511b22031b3703b80120014200200f20031b3703b00120014190016a4120200141b0016a411010a7020c030b20072006844200520d01200141a8016a2203420037030020014190016a41106a2204420037030020014190016a41086a220e42003703002001420037039001200141b0016a41d4dcc700410810c501200e200141b0016a41086a2211290000370300200120012900b00137039001200141b0016a41bba8c700410d10c50120032011290000370300200420012900b001370300200120014190016a412010d301200141106a290300210920012903082108200128020021122003420037030020044200370300200e42003703002001420037039001200141b0016a41d4dcc700410810c501200e2011290000370300200120012900b00137039001200141b0016a41bba8c700410d10c50120032011290000370300200420012900b00137030020012009420020121b3703b80120012008420020121b3703b00120014190016a4120200141b0016a411010a7020c020b200141a8016a2203420037030020014190016a41106a2204420037030020014190016a41086a220e42003703002001420037039001200141b0016a41d4dcc700410810c501200e200141b0016a41086a2211290000370300200120012900b00137039001200141b0016a41bba8c700410d10c50120032011290000370300200420012900b001370300200141c8006a20014190016a412010d301200141c8006a41106a290300210920012903502108200128024821122003420037030020044200370300200e42003703002001420037039001200141b0016a41d4dcc700410810c501200e2011290000370300200120012900b00137039001200141b0016a41bba8c700410d10c50120032011290000370300200420012900b001370300200142002009420020121b220920077d2008420020121b2208200d54ad7d220c2008200d7d220f200856200c200956200c2009511b22031b3703b80120014200200f20031b3703b00120014190016a4120200141b0016a411010a7020c010b200141a8016a2203420037030020014190016a41106a2204420037030020014190016a41086a220e42003703002001420037039001200141b0016a41d4dcc700410810c501200e200141b0016a41086a2211290000370300200120012900b00137039001200141b0016a41bba8c700410d10c50120032011290000370300200420012900b001370300200141186a20014190016a412010d301200141186a41106a290300210920012903202108200128021821122003420037030020044200370300200e42003703002001420037039001200141b0016a41d4dcc700410810c501200e2011290000370300200120012900b00137039001200141b0016a41bba8c700410d10c50120032011290000370300200420012900b001370300200142002009420020121b220920067d2008420020121b2208200754ad7d220c200820077d220f200856200c200956200c2009511b22031b3703b80120014200200f20031b3703b00120014190016a4120200141b0016a411010a7020b0240200041246a2802002203450d00200341306c450d002002102c0b0240200041306a28020041ffffff3f71450d002005102c0b200141c0016a24000bff0302057f017e23004180016b22022400200241206a41186a22034200370300200241206a41106a22044200370300200241206a41086a2205420037030020024200370320200241206a41e6dcc700410710c50120024188bbc200410910c5012003200241086a29000037030020042002290000370300200241e0006a200241206a10cb030240024020022903604202520d00200041003602200c010b200241d0006a200241e0006a41106a2206280200200110da03200241206a20022802502201200228025810a404200241e0006a41186a200329030037030020062004290300370300200241e0006a41086a200529030037030020022002290320370360200241cc006a280200210402400240200228024022030d0042002107200241186a4200370300200241106a420037030041082103200241086a4200370300200242003703000c010b200241086a200241e0006a41086a290300370300200241106a200241e0006a41106a290300370300200241186a200241e0006a41186a29030037030020022002290360370300200229024421070b02402002280254450d002001102c0b2000200229030037030020002007370224200020033602202000412c6a2004360200200041186a200241186a290300370300200041106a200241106a290300370300200041086a200241086a2903003703000b20024180016a24000bfe0201017f230041f0006b220324002003200236020420032001360200200341086a2001200210b30102400240200328020822010d00200041003602200c010b200328020c21022003200341086a41086a28020036024c20032001360248200341186a200341c8006a10f6030240024020032802380d0020034100360258200342013703502003410f360264200320033602602003200341d0006a36026c2003412c6a41013602002003420137021c200341b4bcc3003602182003200341e0006a360228200341ec006a41dcb7c000200341186a103e1a2003350258422086200335025084100002402003280254450d002003280250102c0b200041003602200c010b20002003290318370300200041286a200341186a41286a290300370300200041206a200341186a41206a290300370300200041186a200341186a41186a290300370300200041106a200341186a41106a290300370300200041086a200341186a41086a2903003703000b2002450d002001102c0b200341f0006a24000b860a07047f017e027f017e027f087e037f230041f0016b22032400200241346a2802002104200241306a2802002105200241386a2802002106200341c0006a41186a200241186a290000370300200341c0006a41106a200241106a290000370300200341c0006a41086a200241086a29000037030020032002290000370340024002402006ad42307e2207422088a70d002007a72202417f4c0d000240024020020d00410821080c010b200210322208450d020b4100210920034100360268200320083602602003200241306e3602644200210a2003420037037820034200370370200342003703880120034200370380010240024020060d00420021070c010b200641306c210b2001280200210c4200210a42002107200521020340200241206a290300210d200241286a290300210e20034190016a41186a200241186a290300220f37030020034190016a41106a200241106a290300221037030020034190016a41086a200241086a290300221137030020032002290300221237039001200341306a200c2802002206290300200641086a290300427f420010c808200341106a200e42002003290330221342012013420156200341306a41086a29030022134200522013501b22061b2214420010ce0820032013420020061b22134200200d420010ce08200341206a200d42002014420010ce08200341b0016a41186a2201200f370300200341b0016a41106a22152010370300200341b0016a41086a22162011370300200320123703b001427f200341206a41086a290300220d200329031020032903007c7c220f200e420052201342005271200329031842005272200329030842005272200f200d547222061b210d427f200329032020061b210e02400240200341b0016a200341c0006a412010cc08450d00200341d0016a41186a22172001290300370300200341d0016a41106a22012015290300370300200341d0016a41086a22152016290300370300200320032903b0013703d001024020092003280264470d00200341e0006a2009410110e00120032802682109200328026021080b2008200941306c6a2206200d3703082006200e370300200620032903d001370310200641186a2015290300370300200641206a2001290300370300200641286a20172903003703002003200941016a2209360268427f20034180016a41086a2903002207200d7c200329038001220d200e7c220e200d542206ad7c220d2006200d200754200d2007511b22061b2107427f200e20061b210a0c010b200341f0006a41086a2206427f20062903002213200d7c2003290370220f200e7c2210200f542206ad7c220f2006200f201354200f2013511b22061b3703002003427f201020061b370370427f2007200d7c200a200e7c220e200a542206ad7c220d2006200d200754200d2007511b22061b2107427f200e20061b210a0b200241306a21022003200a370380012003200737038801200b41506a220b0d000b0b02402005410020041b2202450d00200441306c450d002002102c0b2000200a37032020002003290340370000200041306a2003290370370300200041286a2007370300200041c0006a2003290360370200200041386a200341f0006a41086a290300370300200041086a200341c0006a41086a290300370000200041106a200341c0006a41106a290300370000200041186a200341c0006a41186a290300370000200041c8006a200341e0006a41086a280200360200200341f0016a24000f0b103b000b1039000b13002000411f360204200041ec85c3003602000bf01b04057f067e027f037e230041d0036b22032400200341d8016a41186a22044200370300200341d8016a41106a22054200370300200341d8016a41086a22064200370300200342003703d801200341f0026a41e6dcc700410710c5012006200341f0026a41086a2207290000370300200320032900f0023703d801200341f0026a41a08ec100411110c50120042007290000370300200520032900f002370300200341a0016a200341d8016a10890402400240024020032802a001417d71450d00200442003703002005420037030020064200370300200342003703d801200341f0026a41e6dcc700410710c50120062007290000370300200320032900f0023703d801200341f0026a41ccbac200410a10c501200541086a2007290000370000200520032900f00237000020034198016a200341d8016a412010c6012003280298014101470d01200328029c012002460d01200341f8016a411010a804200341f0026a410f6a200341f8016a41086a2802002205360000200341a8026a410f6a22072005360000200320032903f8013700f702200341a8026a41086a2205200341f0026a41086a290000370300200320032900f00222083703a802200041186a41003a0000200041106a4280e1eb173703002000420137030820002008370019200041216a2005290300370000200041286a2007280000360000200042013703000c020b200341f8016a411010a804200341f0026a410f6a200341f8016a41086a2802002205360000200341a8026a410f6a22062005360000200320032903f8013700f702200341a8026a41086a22052007290000370300200320032900f00222083703a802200041186a41003a0000200041106a42c0f0f50b3703002000420137030820002008370019200041216a2005290300370000200041286a2006280000360000200042013703000c010b42002108200341f0016a4200370300200341e8016a4200370300200341d8016a41086a22074200370300200342003703d801200341f0026a41e6dcc700410710c5012007200341f0026a41086a2206290000370300200320032900f0023703d801200341f0026a41d8c5c200410b10c501200541086a2006290000370000200520032900f002370000200341203602dc022003200341d8016a3602d802200341e0026a200341d8016a412010b3010240024020032802e00222070d00200341a8026a21050c010b20032802e40221062003200341e0026a41086a2802003602ac03200320073602a803200341f0026a200341a8036a10a904420121080240024020032903f0024201520d00200341003602b803200342013703b0032003410f3602c4032003200341d8026a3602c0032003200341b0036a3602cc0320034184036a4101360200200342013702f402200341b4bcc3003602f0022003200341c0036a36028003200341cc036a41dcb7c000200341f0026a103e1a20033502b80342208620033502b003841000024020032802b403450d0020032802b003102c0b420021080c010b200341a8026a41286a200341a0036a2903002209370300200341a8026a41206a200341f0026a41286a290300220a370300200341a8026a41186a200341f0026a41206a290300220b370300200341a8026a41106a200341f0026a41186a290300220c370300200341a8026a41086a200341f0026a41106a290300220d370300200341f8016a41086a200d370300200341f8016a41106a200c370300200341f8016a41186a200b370300200341f8016a41206a200a370300200341f8016a41286a2009370300200320032903f80222093703a802200320093703f8010b200341a8026a21052006450d002007102c0b200541286a2207200341f8016a41286a290300370300200541206a2206200341f8016a41206a290300370300200541186a2204200341f8016a41186a290300370300200541106a2202200341f8016a41106a290300370300200541086a220e200341f8016a41086a290300370300200520032903f801370300024020084200510d00200341a8016a41286a220f2007290300370300200341a8016a41206a22072006290300370300200341a8016a41186a22062004290300370300200341a8016a41106a22042002290300370300200341a8016a41086a2202200e290300370300200320052903003703a801200341a8026a41286a200141286a290300370300200341a8026a41206a200141206a290300370300200341a8026a41186a200141186a290300370300200341a8026a41106a200141106a290300370300200341a8026a41086a200141086a290300370300200320012903003703a802200341f0026a41286a200f290300370300200341f0026a41206a2007290300370300200341f0026a41186a2006290300370300200341f0026a41106a2004290300370300200341f0026a41086a2002290300370300200320032903a8013703f0020240024002400240410810322205450d0020034188016a20032903f0022209200341f0026a41086a2903002208428094ebdc03420010c708200341f8006a20092008428094ebdc03420010c808200341e8006a2003290378200341f8006a41086a29030042a0c21e420010ce08200341a8026a41086a290300210a20032903a802210b2003290368220d200329038801220c42d00f80a7200c42a0c21e7e428094ebdc03824200526aad7c220c200341e8006a41086a290300200c200d54ad7c220d84500d01427f2009200c7c2210201020095422072008200d7c2007ad7c221020085420102008511b22071b221142002009200c7d221220122009562008200d7d2009200c54ad7d220d200856200d2008511b22061b221256427f201020071b220c4200200d20061b220d56200c200d511b450d0241002107417f200b201185200a200c8584420052200b201154200a200c54200a200c511b1b417f200b201285200a200d8584420052200b201254200a200d54200a200d511b22061b2204470d03417f200441014620061b21070c030b1039000b417f200b200985200a20088584420052200b200954200a200854200a2008511b1b21070c010b417f200b200985200a20088584420052200b200954200a200854200a2008511b1b21070b200520073a00012005200b20095a200a20085a200a2008511b3a0000200341386a2003290380032209200341f0026a41186a2903002208428094ebdc03420010c708200341d8006a20092008428094ebdc03420010c808200341c8006a2003290358200341d8006a41086a29030042a0c21e420010ce08200341a8026a41186a290300210a20032903b802210b024002402003290348220d2003290338220c42d00f80a7200c42a0c21e7e428094ebdc03824200526aad7c220c200341c8006a41086a290300200c200d54ad7c220d8450450d00417f200b200985200a20088584420052200b200954200a200854200a2008511b1b21070c010b0240427f2009200c7c2210201020095422072008200d7c2007ad7c221020085420102008511b22071b221142002009200c7d221220122009562008200d7d2009200c54ad7d220d200856200d2008511b22061b221256427f201020071b220c4200200d20061b220d56200c200d511b0d00417f200b200985200a20088584420052200b200954200a200854200a2008511b1b21070c010b41002107417f200b201185200a200c8584420052200b201154200a200c54200a200c511b1b417f200b201285200a200d8584420052200b201254200a200d54200a200d511b22061b2204470d00417f200441014620061b21070b200520073a00032005200b20095a200a20085a200a2008511b3a0002200341086a2003290390032209200341f0026a41286a2903002208428094ebdc03420010c708200341286a20092008428094ebdc03420010c808200341186a2003290328200341286a41086a29030042a0c21e420010ce08200341a8026a41286a290300210a20032903c802210b024002402003290318220d2003290308220c42d00f80a7200c42a0c21e7e428094ebdc03824200526aad7c220c200341186a41086a290300200c200d54ad7c220d84500d000240427f2009200c7c2210201020095422072008200d7c2007ad7c221020085420102008511b22071b221142002009200c7d221220122009562008200d7d2009200c54ad7d220d200856200d2008511b22061b221256427f201020071b220c4200200d20061b220d56200c200d511b0d00417f200b200985200a20088584420052200b200954200a200854200a2008511b1b21070c020b41002107417f200b201185200a200c8584420052200b201154200a200c54200a200c511b1b417f200b201285200a200d8584420052200b201254200a200d54200a200d511b22061b2204470d01417f200441014620061b21070c010b417f200b200985200a20088584420052200b200954200a200854200a2008511b1b21070b200520073a00052005200b20095a200a20085a200a2008511b3a0004024002400240024020052c00010e020003010b20052d0000450d00024020052c00030e020003010b20052d0002450d0020052d000521072005102c200741ff01470d010c030b2005102c0b200341f8016a411110a804200341f0026a410f6a200341f8016a41086a2802002205360000200341a8026a410f6a22072005360000200320032903f8013700f702200341a8026a41086a2205200341f0026a41086a290000370300200320032900f00222083703a802200041186a41003a0000200041106a42c0d1e1233703002000420137030820002008370019200041216a2005290300370000200041286a2007280000360000200042013703000c020b2005102c0b2000420037030020004200370308200041186a41003a00000b200341d0036a24000b930601047f230041c0006b2202240041dc97c100210341162104411e210502400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141ff01710e20000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f000b2002413c6a41013602002002420137022c200241eccdc80036022820024104360224200241c0fcc7003602202002200241206a360238200241286a419cc5c3001046000b41cf97c1002103410d2104410021050c1d0b41c797c100210341082104410121050c1c0b41ba97c1002103410d2104410221050c1b0b41ad97c1002103410d2104410321050c1a0b41a197c1002103410c2104410421050c190b419397c1002103410e2104410521050c180b418297c100210341112104410621050c170b41f196c100210341112104410721050c160b41e596c1002103410c2104410821050c150b41d896c1002103410d2104410921050c140b41cc96c1002103410c2104410a21050c130b41ba96c100210341122104410b21050c120b41a096c1002103411a2104410c21050c110b418e96c100210341122104410d21050c100b418096c1002103410e2105410e21040c0f0b41e195c1002103411f2104410f21050c0e0b41c395c1002103411e2104411021050c0d0b41b095c100210341132104411121050c0c0b419095c100210341202104411221050c0b0b41f594c1002103411b2104411321050c0a0b41d994c1002103411c2104411421050c090b41bb94c1002103411e2104411521050c080b419c94c1002103411f2104411621050c070b41fb93c100210341212104411721050c060b41de93c1002103411d2104411821050c050b41c593c100210341192105411921040c040b41ab93c1002103411a2105411a21040c030b418a93c100210341212104411b21050c020b41fc92c1002103410e2104411c21050c010b41e792c100210341152104411d21050b200041830e3b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000bea0304037f027e017f047e230041a0016b22022400200241003a00380240024002400240200128020422034110490d002001280200220441086a2900002105200429000021062001200441106a3602002001200341706a2204360204200241013a00382002200637030820022005370310200441104f0d01200042013703000c020b200042013703000c020b2001280200220441086a2900002105200429000021062001200441106a360200200241086a41186a220720053703002001200341606a2204360204200241023a003820022006370318024020044110490d002001280200220441086a2900002105200429000021062001200441106a360200200241086a41286a20053703002001200341506a360204200241033a003820022006370328200241c0006a41086a200241086a41086a2903002208370300200241c0006a41106a200241086a41106a2903002209370300200241c0006a41186a2007290300220a370300200241c0006a41206a2006370300200241c0006a41286a200537030020022002290308220b370340200041306a2005370300200041286a2006370300200041206a200a370300200041186a2009370300200041106a20083703002000200b370308200042003703000c020b200042013703000b200241003a00380b200241a0016a24000bcb0201047f230041106b2203240020034100360208200342013703000240024002400240024020022d00000e0400010203000b200341004101102f20032802002204200328020822026a41003a0000200241016a21020c030b200341004101102f20032802002204200328020822026a41013a0000200241016a21020c020b200341004101102f20032802002204200328020822026a41023a0000200241016a21020c010b200341004101102f2003280200200328020822046a41033a00002003200441016a2204360208200320044120102f20032802002204200328020822056a22062002290001370000200641086a200241096a290000370000200641106a200241116a290000370000200641186a200241196a290000370000200541206a21020b20032002360208200020012004200210a70202402003280204450d002004102c0b200341106a24000bc908020c7f027e230022042105200441a0016b416071220424000240024002402002200384500d0020042002370300200441023a00182004200337030820042000290000370310200441e0006a41d4dcc700410810c50120044180016a41bfa9c700410510c501200441c8006a200110d5022004280250220641206a2207417f4c0d010240024020070d00410121080c010b200710322208450d030b200441003602402004200736023c20042008360238200441386a4100411010c8012004280238200428024022076a22082004290060370000200841086a200441e0006a41086a2900003700002004200741106a2207360240200441386a2007411010c8012004280238200428024022076a2208200429008001370000200841086a20044180016a41086a2900003700002004200741106a220836024020042802482107200441386a2008200610c80120042802382208200428024022096a2007200610c9081a2004200920066a22063602400240200428024c450d002007102c0b20044180016a2008200610ec04200429028401420020042802800122061b21020240200428023c450d002008102c0b2006410820061b210a2002a7210b024002402002422088a722060d0041002108200a21070c010b200a20064105746a210c200441e0006a41106a2109200441e0006a41196a210d200a2106200a210702400340200441c8006a41106a220e200641106a290300370300200441c8006a41086a220f200641086a29030037030020042006290300370348200641186a2d000021082004200641196a28000036023820042006411c6a28000036003b20084103460d01200d2004280238360000200d41036a200428003b3600002009200e29030037030020042004290348370360200420083a00782004200f2903003703680240024020092000460d0020092900002000290000510d00200441e0006a41186a2903002202a721082004290370210320042903682110200429036021110c010b200441033a0098012004290310210320042004290390013703102004290308211020042004290388013703082004290300211120042004290380013703002004290318210220042004290398013703182002a721080b0240200841ff01714103460d00200720113703002007201037030820072003370310200741186a2002370300200741206a21070b200641206a2206200c470d000b0b20042d001841034621080b2004200b360284012004200a3602800120042007200a6b410575220636028801024020080d002004290318210220042903102103200429030821102004290300211102402006200b470d0020044180016a200b10ed04200428028401210b200428028001210a20042802880121060b200a20064105746a220720033703102007201037030820072011370300200741186a20023703002004200641016a2206360288010b2001200a2006108808200b41ffffff3f71450d00200a102c0b200524000f0b103b000b1039000be10101037f230041106b220324002003410036020820034201370300200341004120102f2003280200200328020822046a22052002290038370000200541086a200241c0006a290000370000200541106a200241c8006a290000370000200541186a200241d0006a2900003700002003200441206a3602082003200236020c2003410c6a200310e9032003200241106a36020c2003410c6a200310e9032003200241206a10b004200228022c200241346a280200200310d5032000200120032802002202200328020810a70202402003280204450d002002102c0b200341106a24000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42187e2204422088a722030d022004a722024100480d022003454103742105024002400240024002402000280200410020011b22030d002002450d010c030b200141186c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241186e3602000b0f0b2005450d001039000b103b000bed1b03067f017e027f230041e0016b2203240020034198016a41e6dcc700410710c501200341f8006a419099c100410610c501200341a8016a200110e40202400240024020032802b001220441206a2205417f4c0d000240024020050d00410121060c010b200510322206450d020b200341003602702003200536026c20032006360268200341e8006a4100411010c8012003280268200328027022056a2206200329009801370000200641086a20034198016a41086a2900003700002003200541106a2205360270200341e8006a2005411010c8012003280268200328027022056a22062003290078370000200641086a200341f8006a41086a22072900003700002003200541106a220636027020032802a8012105200341e8006a2006200410c80120032802682206200328027022086a2005200410c9081a2003200820046a2204360270024020032802ac01450d002005102c0b200341b8016a2006200410c9012007200341c2016a290100370300200341f8006a41106a200341ca016a290100370300200341f8006a41176a2204200341d1016a290000370000200320032901ba0137037802400240024002400240024020032d00b8014101470d0020032d00b9012105200341c8006a41176a2004290000370000200341c8006a41106a2204200341f8006a41106a290300370300200341c8006a41086a2207200341f8006a41086a290300370300200320032903783703480240200328026c450d002006102c0b200341286a41176a2206200341c8006a41176a290000370000200341286a41106a22082004290300370300200341116a2007290300370000200341196a2008290300370000200341206a2006290000370000200320053a000820032003290348370009200341f8006a41e6dcc700410710c501200341b8016a41d192c100410d10c501200341c8006a200110e4022003280250220441206a2205417f4c0d060240024020050d00410121060c010b200510322206450d080b200341003602302003200536022c20032006360228200341286a4100411010c8012003280228200328023022056a22062003290078370000200641086a200341f8006a41086a2900003700002003200541106a2205360230200341286a2005411010c8012003280228200328023022056a220620032900b801370000200641086a200341b8016a41086a2900003700002003200541106a220636023020032802482105200341286a2006200410c80120032802282206200328023022076a2005200410c9081a2003200720046a22043602300240200328024c450d002005102c0b200341b8016a2006200410d20320032903c801210920032802c401210a20032802b80121080240200328022c450d002006102c0b200a450d012009a7210b2009422088a74102742204417c6a41027641026a410120041b20024b0d0220034198016a41e6dcc700410710c501200341f8006a41d192c100410d10c501200341b8016a200110e40220032802c001220541206a2206417f4c0d060240024020060d00410121070c010b200610322207450d080b200341003602502003200636024c20032007360248200341c8006a4100411010c8012003280248200328025022066a2207200329009801370000200741086a20034198016a41086a2900003700002003200641106a2206360250200341c8006a2006411010c8012003280248200328025022066a22072003290078370000200741086a200341f8006a41086a2900003700002003200641106a220736025020032802b8012106200341c8006a2007200510c80120032802482207200328025022026a2006200510c9081a2003200220056a2205360250024020032802bc01450d002006102c0b2007200510b4010240200328024c450d002007102c0b200a20046a21024100210420082107200a2106024003402004417e712105410221040240024020054102460d00200821050c010b2006450d0220022006460d02200641046a2106410321042007417f6a220721050b200341b8016a41186a200141186a290000370300200341b8016a41106a200141106a290000370300200341b8016a41086a200141086a290000370300200320053602d801200320012900003703b801200341f8006a200341b8016a10d3032003280278220520032802800110b401200328027c450d002005102c0c000b0b200341043a00a8010240200b0d00200320032900a9013703682003200341b0016a28000036006f0c060b200b41ffffffff03710d03200320032900a9013703682003200341b0016a28000036006f0c050b0240200328026c450d002006102c0b2000410210a8040c070b200320032900a9013703682003200341b0016a28000036006f0c030b200341a8016a411f10a804200b450d01200b41ffffffff0371450d010b200a102c0b200320032900a9013703682003200341a8016a41086a28000036006f20032d00a80122044104460d00200020043a000020002003290368370001200041086a200328006f3600000c030b20034198016a41e6dcc700410710c501200341f8006a419099c100410610c501200341b8016a200110e40220032802c001220441206a2205417f4c0d000240024020050d00410121060c010b200510322206450d020b200341003602502003200536024c20032006360248200341c8006a4100411010c8012003280248200328025022056a2206200329009801370000200641086a20034198016a41086a2900003700002003200541106a2205360250200341c8006a2005411010c8012003280248200328025022056a22062003290078370000200641086a200341f8006a41086a2900003700002003200541106a220636025020032802b8012105200341c8006a2006200410c80120032802482206200328025022076a2005200410c9081a2003200720046a2204360250024020032802bc01450d002005102c0b2006200410b4010240200328024c450d002006102c0b20034198016a41e6dcc700410710c501200341f8006a418a99c100410610c501200341b8016a200341086a10d50220032802c001220441206a2205417f4c0d000240024020050d00410121060c010b200510322206450d020b200341003602502003200536024c20032006360248200341c8006a4100411010c8012003280248200328025022056a2206200329009801370000200641086a20034198016a41086a2900003700002003200541106a2205360250200341c8006a2005411010c8012003280248200328025022056a22062003290078370000200641086a200341f8006a41086a2900003700002003200541106a220636025020032802b8012105200341c8006a2006200410c80120032802482206200328025022076a2005200410c9081a2003200720046a2204360250024020032802bc01450d002005102c0b2006200410b4010240200328024c450d002006102c0b20034198016a41e6dcc700410710c501200341f8006a41e0b9c200410510c501200341b8016a200110e40220032802c001220441206a2205417f4c0d000240024020050d00410121060c010b200510322206450d020b200341003602502003200536024c20032006360248200341c8006a4100411010c8012003280248200328025022056a2206200329009801370000200641086a20034198016a41086a2900003700002003200541106a2205360250200341c8006a2005411010c8012003280248200328025022056a22062003290078370000200641086a200341f8006a41086a2900003700002003200541106a220636025020032802b8012105200341c8006a2006200410c80120032802482206200328025022076a2005200410c9081a2003200720046a2204360250024020032802bc01450d002005102c0b2006200410b4010240200328024c450d002006102c0b20034198016a41e6dcc700410710c501200341f8006a418893c700410a10c501200341b8016a200110e40220032802c001220441206a2205417f4c0d000240024020050d00410121060c010b200510322206450d020b200341003602502003200536024c20032006360248200341c8006a4100411010c8012003280248200328025022056a2206200329009801370000200641086a20034198016a41086a2900003700002003200541106a2205360250200341c8006a2005411010c8012003280248200328025022056a22062003290078370000200641086a200341f8006a41086a2900003700002003200541106a220636025020032802b8012105200341c8006a2006200410c80120032802482206200328025022076a2005200410c9081a2003200720046a2204360250024020032802bc01450d002005102c0b2006200410b4010240200328024c450d002006102c0b20034198016a41e6dcc700410710c501200341f8006a41b18ec100410a10c501200341b8016a200110e40220032802c001220441206a2205417f4c0d000240024020050d00410121060c010b200510322206450d020b200341003602502003200536024c20032006360248200341c8006a4100411010c8012003280248200328025022056a2206200329009801370000200641086a20034198016a41086a2900003700002003200541106a2205360250200341c8006a2005411010c8012003280248200328025022056a22062003290078370000200641086a200341f8006a41086a2900003700002003200541106a220636025020032802b8012105200341c8006a2006200410c80120032802482206200328025022076a2005200410c9081a2003200720046a2204360250024020032802bc01450d002005102c0b2006200410b4010240200328024c450d002006102c0b200110e802200041043a00000c020b103b000b1039000b200341e0016a24000bbc0606057f017e0c7f027e017f017e230041d0006b22022400200241106a41d4dcc700410810c501200241306a41bfa9c700410510c501200241206a200110d50202402002280228220341206a2204417f4c0d0002400240024020040d00410121050c010b200410322205450d010b20024100360208200220043602042002200536020020024100411010c8012002280200200228020822046a22052002290010370000200541086a200241106a41086a2900003700002002200441106a220436020820022004411010c8012002280200200228020822046a22052002290030370000200541086a200241306a41086a2900003700002002200441106a22053602082002280220210420022005200310c80120022802002205200228020822066a2004200310c9081a2002200620036a220336020802402002280224450d002004102c0b200241306a2005200310ec0420022902344200200228023022031b210702402002280204450d002005102c0b2003410820031b210802402007422088a72206450d002006417f6a2109200041706a210a410021052008210341002104034002400240024020062004460d0002400240200a2003460d00200341106a220b2900002000290000510d0002402005450d00200420056b220c20064f0d02200241306a41186a220d200320054105746b220c41186a220e290300370300200241306a41106a220f200c41106a2210290300370300200241306a41086a2211200c41086a22122903003703002002200c290300370330200341086a22132903002114200b2903002115200341186a22162903002117200c2003290300370300200e201737030020102015370300201220143703002016200d290300370300200b200f29030037030020132011290300370300200320022903303703000c040b4100210520092004470d040c060b200541016a21050c020b200c200641e48ac500103f000b2006200641f48ac500103f000b20092004470d002005417f6a20064f0d02200742ffffffff0f832107200620056b21060c020b200441016a2104200341206a21030c000b0b20012008200610880802402007a72203450d00200341ffffff3f71450d002008102c0b200241d0006a24000f0b1039000b103b000bf60201057f230041106b2202240020012802002103200020012802082201108f0102402001450d00200141186c2104200041086a210103402002200336020c2002410c6a200010e9030240024002400240200341106a2205280200220641c000490d00200641808001490d012006418080808004490d02200020012802004101102f200028020020012802006a41033a00002001200128020041016a220636020020052802002105200020064104102f200028020020012802006a20053600002001200128020041046a3602000c030b200020012802004101102f200028020020012802006a20064102743a00002001200128020041016a3602000c020b200020012802004102102f200028020020012802006a20064102744101723b00002001200128020041026a3602000c010b200020012802004104102f200028020020012802006a20064102744102723600002001200128020041046a3602000b200341186a2103200441686a22040d000b0b200241106a24000b930201057f230041106b2202240002400240200128020822034105744104722204417f4c0d0020012802002101200410322205450d0120024100360208200220043602042002200536020020022003108f010240024020030d0020022802002106200228020821030c010b20034105742104200228020821030340200220034120102f20022802002206200228020822056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a2203360208200141206a2101200441606a22040d000b0b200041202006200310a70202402002280204450d002006102c0b200241106a24000f0b103b000b1039000bc15006087f017e027f017e107f017e230041e0046b22082400200820033a005f200841f8016a41286a200441286a290300370300200841f8016a41206a200441206a290300370300200841f8016a41186a200441186a290300370300200841f8016a41106a200441106a290300370300200841f8016a41086a200441086a290300370300200820042903003703f801200841c8016a200841f8016a200510a704200841e0006a41086a2205200841c8016a41106a290300370300200841e0006a41106a2203200841c8016a41186a290300370300200841e0006a41186a2209200841c8016a41206a290300370300200841e0006a41206a220a200841c8016a41286a290300370300200820082903d001370360024002400240024002400240024002400240024002400240024020082903c8014201510d00200841f8016a2002109301200141086a28020021032008280280022105024020082802fc0141808080807872418080808078460d0020082802f801102c0b024020052003470d00200841f8006a22094200370300200841f0006a22034200370300200841e0006a41086a220a420037030020084200370360200841a0046a41e6dcc700410710c501200a200841a0046a41086a290000370300200820082900a004370360200841c0046a41ec8ec100411210c5012009200841c0046a41086a290200370300200320082902c004370300200841cc016a41003a0000200841003602c801200841d0006a200841e0006a4120200841c8016a4105410010b70402402008280250450d00200820082802542209410520094105491b3602fc012008200841c8016a3602f801200841c8006a200841f8016a10870220082802480d000240200828024c2209200741ffff0371470d00200841e0006a41186a220b4200370300200841f0006a220c4200370300200841e0006a41086a220a420037030020084200370360200841a0046a41e6dcc700410710c501200a200841a0046a41086a220d290000370300200820082900a004370360200841c0046a41f4b7c200410e10c501200341086a220e200841c0046a41086a220f290200370000200320082902c004370000200841c0006a200841e0006a412010c6010240200520092008280244410020082802401b2207200720094b1b470d00200b4200370300200c4200370300200a420037030020084200370360200841a0046a41e6dcc700410710c501200a200d290000370300200820082900a004370360200841c0046a41fe8ec100411210c501200e200f290200370000200320082902c004370000200841cc016a41003a0000200841003602c801200841386a200841e0006a4120200841c8016a4105410010b70402402008280238450d002008200828023c2209410520094105491b3602fc012008200841c8016a3602f801200841306a200841f8016a10870220082802300d00024020082802342006470d00200841e0006a41186a4200370300200841f0006a4200370300200841e0006a41086a2209420037030020084200370360200841a0046a41e6dcc700410710c5012009200841a0046a41086a290000370300200820082900a004370360200841c0046a41ec8ec100411210c501200341086a200841c0046a41086a290200370000200320082902c004370000200841f8016a200841e0006a10e10120082802f8012209450d07200820082902fc01221037028c01200820093602880120012802002111200128020421122005450d09024002402010422088a720112f010022014b0d00410021014114210e0c010b200841c8046a200920014105746a220141096a290000370300200841d0046a200141116a290000370300200841d7046a200141186a290000370000200820012900013703c00420012d00002109410121014120210e0b200841a0046a41176a220a200841c0046a41176a290000370000200841a0046a41106a2207200841c0046a41106a290300370300200841e0006a41086a200841c0046a41086a2903002210370300200841e0006a41106a22062007290300370300200841e0006a41176a2207200a290000370000200820082903c0042213370360200820093a00f801200841f8016a41186a2209200729000037000020084189026a200629030037000020084181026a2010370000200820133700f9012001450d0a200841c8016a41186a2009290000370300200841c8016a41106a200841f8016a41106a290000370300200841c8016a41086a200841f8016a41086a290000370300200820082900f8013703c801412010322209450d0d200920082903c801370000200941186a200841c8016a41186a290300370000200941106a200841c8016a41106a290300370000200941086a200841c8016a41086a29030037000020084281808080103702940420082009360290040240024020054101460d00200841f9016a21140240024020082802900120112f010222014b0d00410021014114210e0c010b200841c8046a20082802880120014105746a220141096a290000370300200841d0046a200141116a290000370300200841d7046a200141186a290000370000200820012900013703c00420012d0000210a410121010b200841a0046a41176a220f200841c0046a41176a2215290000370000200841a0046a41106a2216200841c0046a41106a2217290300370300200841e0006a41086a2218200841c0046a41086a22192903002210370300200841e0006a41106a221a2016290300370300200841e0006a41176a221b200f290000370000200820082903c004221337036020142013370000201441086a221c2010370000201441106a221d201a290300370000201441176a221e201b2900003700002008200a3a00f80120010d010b4101210b0c0c0b201141046a210d200841c8016a41186a221f200841f8016a41186a220a290000370300200841c8016a41106a2220200841f8016a41106a2207290000370300200841c8016a41086a2221200841f8016a41086a2206290000370300200820082900f8013703c8012005410174417c6a210b4120210c41012101410121050340200a201f2903003703002007202029030037030020062021290300370300200820082903c8013703f801024020052001470d0020084190046a2001410110d60120082802900421090b2009200c6a220120082903f801370000200141186a200a290300370000200141106a2007290300370000200141086a20062903003700002008200541016a22223602980402400240200b450d0002400240200828029001200d2f010022014b0d00410021014114210e0c010b201920082802880120014105746a220141096a2900003703002017200141116a2900003703002015200141186a290000370000200820012900013703c00420012d00002123410121010b200f201529000037000020162017290300370300201820192903002210370300201a2016290300370300201b200f290000370000200820082903c004221337036020142013370000201c2010370000201d201a290300370000201e201b290000370000200820233a00f80120010d010b200541016a210b0c0d0b200d41026a210d201f200a2900003703002020200729000037030020212006290000370300200820082900f8013703c801200b417e6a210b200c41206a210c2008280294042101202221050c000b0b200841c8016a411c10a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000c070b200841c8016a411210a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000c060b200841c8016a411310a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000c050b200841c8016a411c10a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000c040b200841c8016a411210a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000c030b200841c8016a411310a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000c020b2000200829036037030820004201370300200041286a200a290300370300200041206a2009290300370300200041186a2003290300370300200041106a20052903003703000c010b200841c8016a411210a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000b200210e901200128020441808080807872418080808078460d092001280200102c0c090b4120210e0b41002107410121090240201241808080807872418080808078460d002011102c0b4100210b0c010b0240201241808080807872418080808078460d002011102c0b20082802940421070b0240200e41ff01714120460d0002402007450d002009450d00200741ffffff3f71450d002009102c0b200841c8016a200e10a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a200436000020004201370300200828028c0141ffffff3f71450d03200828028801102c200210e9010c060b200841e0006a41186a4200370300200841f0006a4200370300200841e0006a41086a2201420037030020084200370360200841a0046a41e6dcc700410710c5012001200841a0046a41086a290000370300200820082900a004370360200841c0046a41fe8ec100411210c501200341086a200841c0046a41086a290200370000200320082902c004370000200841f8016a200841e0006a10e10120082802f8012201450d01200820082902fc0137029c012008200136029801200841f8016a200241c00110c9081a200841c8016a200841f8016a20084198016a20084188016a10fa01024020082802c8014101470d00200841e0006a41086a200841d4016a280200360200200820082902cc01370360024041002802d8d2484102490d002008411b3602c4042008200841e0006a3602c00441002802d4d248210441002802d0d248210141002802dcd2482102200841b8026a41e613360200200841b0026a42de80808010370300200841ac026a41acc5c300360200200841a4026a420e370200200841a0026a41e28fc10036020020084198026a420137030020084188026a4201370300200841f8016a41086a410736020020084194026a200841c0046a360200200841dc9fc30036028402200841db8fc1003602fc01200841023602f801200141f8a3c000200241024622021b200841f8016a200441e0a3c00020021b2802101103000b200841c8016a411510a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000c050b20082802cc01211f200841c8016a41086a28020021230240200841c8016a410c6a2802002222450d00201f2022412c6c6a2117201f210602400340200841a0046a41e6dcc700410710c501200841c0046a418893c700410a10c501200841f8016a2006410c6a220e10e402200828028002220141206a2202417f4c0d060240024020020d00410121050c010b200210322205450d040b200841003602d001200820023602cc01200820053602c801200841c8016a4100411010c80120082802c80120082802d00122026a220520082900a004370000200541086a200841a0046a41086a22202900003700002008200241106a22023602d001200841c8016a2002411010c80120082802c80120082802d00122026a220520082902c004370000200541086a200841c0046a41086a22212902003700002008200241106a22053602d00120082802f8012102200841c8016a2005200110c80120082802c801220520082802d001220a6a2002200110c9081a2008200a20016a22013602d001024020082802fc01450d002002102c0b2005200110ce02210a024020082802cc01450d002005102c0b200841a0046a41e6dcc700410710c501200841c0046a41b18ec100410a10c501200841f8016a200e10e402200828028002220141206a2202417f4c0d060240024020020d00410121050c010b200210322205450d040b20084100360298042008200236029404200820053602900420084190046a4100411010c80120082802900420082802980422026a220520082900a004370000200541086a20202900003700002008200241106a22023602980420084190046a2002411010c80120082802900420082802980422026a220520082902c004370000200541086a20212902003700002008200241106a22023602980420082802f801210520084190046a2002200110c801200828029004220220082802980422206a2005200110c9081a2008202020016a220136029804024020082802fc01450d002005102c0b200820013602bc01200820023602b801200841e0006a2002200110b30102400240200828026022200d00410221050c010b20082802642115200820082802683602a404200820203602a004200841f8016a200841a0046a10ca030240024020082802f8012221450d0020082802fc01210102400240024020082802a40422054104490d00200828028002211120082802a0042219280000211420082005417c6a22123602a4042008201941046a22193602a0042012450d0120192d0000211220082005417b6a3602a4042008201941016a3602a00441002105024020120e020500020b410121050c040b2001450d02200141ffffff3f710d010c020b2001450d01200141ffffff3f71450d010b2021102c0b200841003602d001200842013703c8012008410f3602c4042008200841b8016a3602c0042008200841c8016a3602a8012008410136028c02200842013702fc01200841b4bcc3003602f8012008200841c0046a36028802200841a8016a41dcb7c000200841f8016a103e1a20083502d00142208620083502c801841000024020082802cc01450d0020082802c801102c0b41022105200f211420162121201a2101201b21110b02402015450d002020102c0b2014210f202121162001211a2011211b0b2008200f3602cc042008201b3602c8042005410246210120082902c80421130240200828029404450d002002102c0b200c201620011b210c200d201a20011b210d02400240024002400240024002400240024002400240200a20054102472202460d002010201320011b2110200a450d01200641086a2802004101470d03024020062802002202200e460d002002200e412010cc080d030b20022f012041ffff03460d05200841c8016a411910a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000c040b024041002802d8d248450d002008413b3602cc01200841e49fc3003602c80141002802d4d248210441002802d0d248210141002802dcd2482102200841b8026a41f513360200200841b0026a42de80808010370300200841ac026a41acc5c300360200200841a4026a420e370200200841a0026a41e28fc10036020020084198026a420137030020084188026a420137030020084180026a410736020020084194026a200841c0046a360200200841b4b5c80036028402200841db8fc1003602fc01200841013602f801200841043602c404200441e0a3c000200241024622021b28021021042008200841c8016a3602c004200141f8a3c00020021b200841f8016a20041103000b200841c8016a411610a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a20043600002000420137030020054102460d0b200d450d0b200c450d0b200d41ffffff3f71450d0b0c090b2002450d0402400240024020062802082201450d002006280200220e200141226c6a21212010422088a721112010a7410574212003402008200e2205360260200541226a210e20202102200c210103402002450d03024020052001460d00200241606a210220012005412010cc08210a200141206a2101200a0d010b0b200841f8016a200841e0006a10d80102402008280284022201450d00200828028002210202402008280288022205450d00200541ffffffff0371450d002001102c0b200220114b0d040b200e2021470d000b0b200d450d09200c450d09200d41ffffff3f71450d090c080b200841c8016a411710a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000c060b200841c8016a411810a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000c050b200841c8016a411910a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000c010b200841c8016a411910a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000b20054102460d07200d450d07200c450d07200d41ffffff3f710d050c070b20010d03200d450d03200c450d03200d41ffffff3f710d020c030b419fa0c30041fd00419ca1c300105c000b200d450d04200c450d04200d41ffffff3f710d020c040b200c102c0b2006412c6a22062017470d010c030b0b200c102c0b2022412c6c2100201f210403400240200441046a2802002201450d00200141226c450d002004280200102c0b2004412c6a2104200041546a22000d000b2023450d05201f450d052023412c6c450d05201f102c0c050b200820223602d001200820233602cc012008201f3602c80120084190026a22014200370300200841f8016a41106a22024200370300200841f8016a41086a22054200370300200842003703f801200841e0006a41d4dcc700410810c5012005200841e0006a41086a220a290000370300200820082900603703f801200841e0006a41bba8c700410d10c5012001200a29000037030020022008290060370300200841186a200841f8016a412010d301200841186a41106a29030021102008290320211320082903182124411010322201450d002001201342002024a722051b37030020012010420020051b370308200841a8016a200841c8016a200110e201200841f8016a2009200b20082802a801220520082802b001220110fc0102400240024020082d00f8014101460d00200841c8016a410a6a20084184026a280200360100200820082902fc013701ca012008200841ce016a290100370166200841b8016a41086a220a200841e0006a410a6a280100360200200820082901c801370360200820082901623703b801200841c8016a200841b8016a10fd01200841c8016a2004460d02200841c8016a2004413010cc08450d02200841e0006a411b10a80420084187026a200841e0006a41086a2802002204360000200820082903603700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a200436000020004201370300200841c8016a41086a200841b8016a41086a280200360200200820082903b8013703c801200841f8016a200841c8016a10fe01200841f8016a10ff010c010b200841c8016a411a10a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a2004360000200042013703000b02402001450d002001412c6c21002005210403400240200441046a2802002201450d00200141306c450d002004280200102c0b2004412c6a2104200041546a22000d000b0b20082802ac012204450d052004412c6c450d052005102c0c050b200841f8016a41186a22064200370300200841f8016a41106a22054200370300200841f8016a41086a22044200370300200842003703f801200841e0006a41d4dcc700410810c5012004200841e0006a41086a2201290000370300200820082900603703f801200841e0006a41bba8c700410d10c501200241086a2001290000370000200220082900603700002008200841f8016a412010d3012008200841106a2903004200200828020022021b3703c80420082008290308420020021b3703c0042008200841c0046a3602a0042004200a280200360200200820082903b8013703f801200841e0006a200841f8016a10fe012006200841e0006a41186a22022802003602002005200841e0006a41106a220d29030037030020042001290300370300200820082903603703f8012008200841a0046a3602940220084190046a200841f8016a109704024041002802d8d2484103490d00200841ec006a41153602002008411a3602642008200841c8016a3602682008200841df006a36026041002802d4d248210441002802d0d248210141002802dcd248210a200841b8026a41b114360200200841b0026a42de80808010370300200841ac026a41acc5c300360200200841a4026a420e370200200841a0026a41e28fc100360200200841f8016a41206a42023703002005420337030020084180026a410736020020084194026a200841e0006a360200200841aca1c30036028402200841db8fc1003602fc01200841033602f801200141f8a3c000200a41024622051b200841f8016a200441e0a3c00020051b2802101103000b200828029804210a200828029404210c200828029004210620082d005f210e20024200370300200d4200370300200841e0006a41086a2204420037030020084200370360200841a0046a41e6dcc700410710c5012004200841a0046a41086a290000370300200820082900a004370360200841c0046a41f8c4c200410d10c501200341086a200841c0046a41086a290200370000200320082902c0043700002008410036028002200842013703f801200841f8016a200b108f010240200b450d00200b41057421022008280280022101200921040340200841f8016a20014120102f20082802f80120082802800222056a22012004290000370000200141086a200441086a290000370000200141106a200441106a290000370000200141186a200441186a2900003700002008200541206a220136028002200441206a2104200241606a22020d000b0b200841f8016a200a108f010240200a450d002006200a41d0006c6a2105200621040340200841f8016a2008280280024120102f20082802f80120082802800222026a22012004290000370000200141086a200441086a290000370000200141106a200441106a290000370000200141186a200441186a2900003700002008200241206a36028002200441206a200841f8016a10f8032005200441d0006a2204470d000b0b200841f8016a200e1031200841e0006a412020082802f801220420082802800210a702024020082802fc01450d002004102c0b02402007450d002009450d00200741ffffff3f71450d002009102c0b0240200a450d00200a41d0006c2101200641c0006a210403400240200441046a2802002202450d00200241306c450d002004280200102c0b200441d0006a2104200141b07f6a22010d000b0b0240200c450d002006450d00200c41d0006c450d002006102c0b200841f8016a41286a2202200841c8016a41286a290300370300200841f8016a41206a2205200841c8016a41206a290300370300200841f8016a41186a2209200841c8016a41186a290300370300200841f8016a41106a220a200841c8016a41106a290300370300200841f8016a41086a2207200841c8016a41086a290300370300200820082903c8013703f801200841e0006a41186a4200370300200841e0006a41106a4200370300200841e0006a41086a2204420037030020084200370360200841a0046a41e6dcc700410710c5012004200841a0046a41086a290000370300200820082900a004370360200841c0046a41d8c5c200410b10c501200341086a200841c0046a41086a290200370000200320082902c004370000413010322204450d00200842303702c404200820043602c004200841c0046a41004130102f20082802c004220120082802c80422036a220420082903f801370000200441086a2007290300370000200441106a200a290300370000200441186a2009290300370000200441206a2005290300370000200441286a20022903003700002008200341306a22043602c804200841e0006a41202001200410a702024020082802c404450d002001102c0b20082d005f210420084180026a41053a0000200820043a008102200841033602f801200841f8016a10c80220004200370300200041186a41003a00002000420037030820082802a8012102024020082802b0012204450d002004412c6c21002002210403400240200441046a2802002201450d00200141306c450d002004280200102c0b2004412c6a2104200041546a22000d000b0b024020082802ac012204450d002004412c6c450d002002102c0b0240200828029c0141ffffff3f71450d00200828029801102c0b200828028c0141ffffff3f71450d05200828028801102c0c050b1039000b200841c8016a411210a80420084187026a200841c8016a41086a2802002204360000200820082903c8013700ff01200041186a41003a000020004200370308200020082900f801370019200041216a200841f8016a41086a290000370000200041286a20043600002000420137030002402007450d002009450d00200741ffffff3f71450d002009102c0b200828028c0141ffffff3f71450d00200828028801102c0b200210e9010c020b103b000b0240200828029c0141ffffff3f71450d00200828029801102c0b02402007450d002009450d00200741ffffff3f71450d002009102c0b200828028c0141ffffff3f71450d00200828028801102c0b200841e0046a24000bb10302027f037e230041d0006b22042400200441386a20024201200242015620034200522003501b22051b22022003420020051b2203428094ebdc03420010c808200441286a20022003428094ebdc03420010c708200441186a20022003200429033822062004290328200441286a41086a29030084420052ad7c220742012007420156200441386a41086a2903002007200654ad7c22074200522007501b22051b22062007420020051b220810c80802400240024020042903182207428080808010544100200441186a41086a290300501b450d00200441086a200220002002200054200320015420032001511b22051b2003200120051b2006200810c80820042903082203428080808010544100200441086a41086a290300501b450d012007a70d0241f0bcc300411941f8acc800103c000b2004411136024c20044194aac80036024841a5aac80041de00200441c8006a418cbdc30041f8acc8001040000b2004411136024c20044194aac80036024841a5aac80041de00200441c8006a418cbdc30041f8acc8001040000b200441d0006a2400200342ffffffff0f83428094ebdc037e200742ffffffff0f8380a70bf13004067f017e077f077e230041a0056b22042400200441c8026a41e6dcc700410710c501200441d8026a41e0b9c200410510c50120044188036a200110e4020240024002400240200428029003220541206a2206417f4c0d000240024020060d00410121070c010b200610322207450d020b200441003602c001200420063602bc01200420073602b801200441b8016a4100411010c80120042802b80120042802c00122066a220720042900c802370000200741086a200441c8026a41086a2900003700002004200641106a22063602c001200441b8016a2006411010c80120042802b80120042802c00122066a220720042900d802370000200741086a200441d8026a41086a2900003700002004200641106a22063602c0012004280288032107200441b8016a2006200510c80120042802b801220620042802c00122086a2007200510c9081a2004200820056a22053602c0010240200428028c03450d002007102c0b2004200536029c012004200636029801200441a8026a2006200510b30141042105024020042802a8022207450d0020042802ac02210802400240200441b0026a2802002209450d004100210502400240024002400240024020072d00000e0404020001060b410221050c030b200441003a00a80320094101460d0420072d00012105200441013a00a803200420053a00880320094102470d010c030b410121050c010b20072d00022105200441023a00a803200420053a00890320094103460d0120072d00032105200441033a00a803200420053a008a0320094104460d0120072d00042105200441043a00a803200420053a008b0320094105460d0120072d00052105200441053a00a803200420053a008c0320094106460d0120072d00062105200441063a00a803200420053a008d0320094107460d0120072d00072105200441073a00a803200420053a008e0320094108460d0120072d00082105200441083a00a803200420053a008f0320094109460d0120072d00092105200441093a00a803200420053a0090032009410a460d0120072d000a21052004410a3a00a803200420053a0091032009410b460d0120072d000b21052004410b3a00a803200420053a0092032009410c460d0120072d000c21052004410c3a00a803200420053a0093032009410d460d0120072d000d21052004410d3a00a803200420053a0094032009410e460d0120072d000e21052004410e3a00a803200420053a0095032009410f460d0120072d000f21052004410f3a00a803200420053a00960320094110460d0120072d00102105200441103a00a803200420053a00970320094111460d0120072d00112105200441113a00a803200420053a00980320094112460d0120072d00122105200441123a00a803200420053a00990320094113460d0120072d00132105200441133a00a803200420053a009a0320094114460d0120072d00142105200441143a00a803200420053a009b0320094115460d0120072d00152105200441153a00a803200420053a009c0320094116460d0120072d00162105200441163a00a803200420053a009d0320094117460d0120072d00172105200441173a00a803200420053a009e0320094118460d0120072d00182105200441183a00a803200420053a009f0320094119460d0120072d00192105200441193a00a803200420053a00a0032009411a460d0120072d001a21052004411a3a00a803200420053a00a1032009411b460d0120072d001b21052004411b3a00a803200420053a00a2032009411c460d0120072d001c21052004411c3a00a803200420053a00a3032009411d460d0120072d001d21052004411d3a00a803200420053a00a4032009411e460d0120072d001e21052004411e3a00a803200420053a00a5032009411f460d0120072d001f21052004411f3a00a803200420053a00a60320094120460d01200441d8006a41106a20044188036a41106a290300370300200441d8006a41086a20044188036a41086a290300370300200420072d00203a00a703200441d8006a41186a20044188036a41186a290300370300200441203a00a8032004200429038803220a3703e8012004200a370358410321050b200441206a41186a200441d8006a41186a290300370300200441206a41106a200441d8006a41106a290300370300200441206a41086a200441d8006a41086a290300370300200420042903583703200c020b200441003a00a8030b200441003602f001200442013703e8012004410f36025c200420044198016a3602582004200441e8016a3602002004419c036a41013602002004420137028c03200441b4bcc300360288032004200441d8006a36029803200441dcb7c00020044188036a103e1a20043502f00142208620043502e801841000024020042802ec01450d0020042802e801102c0b410421050b2008450d002007102c0b200441e8016a41186a2207200441206a41186a290300370300200441e8016a41106a2208200441206a41106a290300370300200441e8016a41086a2209200441206a41086a290300370300200420042903203703e8010240024020054104470d0020042802bc01450d012006102c0c010b200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903e801370300024020042802bc01450d002006102c0b02400240024020050e0403020100030b200441d8006a41186a200441186a290300370300200441d8006a41106a200441106a290300370300200441d8006a41086a200441086a2903003703002004200429030037035820042002370320200420033703280240200220038450450d0042002102420021034201210a0c070b2004200441d8006a3602a802200441e8016a200441d8006a200441206a200441a8026a10b504024020042903e8014201520d00200441f8016a290300210320042903f00121024201210a0c070b20044190026a290300210320044188026a2903002102024020042903f0014201520d00200441e8016a41106a290300210a200441c0036a200441e8016a41186a290300370300200441b8036a200a37030020044188036a41086a41003a000020044199036a200441d8006a41086a290300370000200441a1036a200441d8006a41106a290300370000200441a9036a200441d8006a41186a2903003700002004410236028803200420042903583700910320044188036a10c8020b4201210a0c060b200441c8026a41e6dcc700410710c501200441d8026a419099c100410610c501200441e8016a200110e40220042802f001220541206a2206417f4c0d020240024020060d00410121010c010b200610322201450d040b200441003602602004200636025c20042001360258200441d8006a4100411010c8012004280258200428026022066a220120042900c802370000200141086a200441c8026a41086a2900003700002004200641106a2206360260200441d8006a2006411010c8012004280258200428026022066a220120042900d802370000200141086a200441d8026a41086a2900003700002004200641106a220136026020042802e8012106200441d8006a2001200510c80120042802582201200428026022076a2006200510c9081a2004200720056a2205360260024020042802ec01450d002006102c0b20044188036a2001200510c901200441e8016a41086a20044191036a290000370300200441e8016a41106a20044199036a290000370300200441e8016a41186a2205200441a1036a29000037030020042004290089033703e801024020042d0088034101470d00200441206a41186a2005290300370300200441206a41106a2205200441e8016a41106a290300370300200441206a41086a2206200441e8016a41086a290300370300200420042903e8013703200240200428025c450d002001102c0b200441d8006a41186a200441206a41186a290300370300200441d8006a41106a2005290300370300200441d8006a41086a200629030037030020042004290320370358200420023703a802200420033703b0020240200220038450450d0042002102420021034201210a0c070b2004200441d8006a3602b801200441e8016a200441d8006a200441a8026a200441b8016a10b504024020042903e8014201520d00200441f8016a290300210320042903f00121024201210a0c070b20044190026a290300210320044188026a2903002102024020042903f0014201520d00200441e8016a41106a290300210a200441c0036a200441e8016a41186a290300370300200441b8036a200a37030020044188036a41086a41003a000020044199036a200441d8006a41086a290300370000200441a1036a200441d8006a41106a290300370000200441a9036a200441d8006a41186a2903003700002004410236028803200420042903583700910320044188036a10c8020b4201210a0c060b200428025c450d042001102c0c040b20044188036a20012002200310b604200435028803420185210a20044198036a290300210320044190036a29030021020c040b200441c8026a41e6dcc700410710c501200441d8026a419099c100410610c501200441e8016a200110e40220042802f001220541206a2206417f4c0d000240024020060d00410121070c010b200610322207450d020b200441003602602004200636025c20042007360258200441d8006a4100411010c8012004280258200428026022066a220720042900c802370000200741086a200441c8026a41086a2900003700002004200641106a2206360260200441d8006a2006411010c8012004280258200428026022066a220720042900d802370000200741086a200441d8026a41086a2900003700002004200641106a220736026020042802e8012106200441d8006a2007200510c80120042802582207200428026022086a2006200510c9081a2004200820056a2205360260024020042802ec01450d002006102c0b20044188036a2007200510c901200441e8016a41086a20044191036a290000370300200441e8016a41106a20044199036a290000370300200441e8016a41186a2205200441a1036a29000037030020042004290089033703e80102400240024020042d0088034101470d0020044198016a41186a200529030037030020044198016a41106a2205200441e8016a41106a29030037030020044198016a41086a2206200441e8016a41086a290300370300200420042903e801370398010240200428025c450d002007102c0b200441b8016a41186a20044198016a41186a290300370300200441b8016a41106a2005290300370300200441b8016a41086a200629030037030020042004290398013703b801200441c8026a41e6dcc700410710c501200441d8026a418a99c100410610c501200441e8016a200441b8016a10d50220042802f001220541206a2206417f4c0d030240024020060d00410121070c010b200610322207450d050b200441003602e001200420063602dc01200420073602d801200441d8016a4100411010c80120042802d80120042802e00122066a220720042900c802370000200741086a200441c8026a41086a2900003700002004200641106a22063602e001200441d8016a2006411010c80120042802d80120042802e00122066a220720042900d802370000200741086a200441d8026a41086a2900003700002004200641106a22073602e00120042802e8012106200441d8016a2007200510c80120042802d801220720042802e00122086a2006200510c9081a2004200820056a22053602e001024020042802ec01450d002006102c0b20044188036a2007200510d803200441d8006a41086a20044188036a41086a290300370300200441d8006a41106a20044188036a41106a290300370300200441d8006a41186a220620044188036a41186a290300370300200441e8016a41086a200441b4036a290200370300200441e8016a41106a200441bc036a290200370300200441e8016a41186a2208200441c4036a290200370300200441e8016a41206a2209200441cc036a290200370300200441e8016a41286a220b200441d4036a290200370300200441e8016a41306a220c200441dc036a2802003602002004200429038803370358200420042902ac033703e80120042802a8032205450d01200441a8026a41186a2006290300370300200441a8026a41106a2206200441d8006a41106a220d290300370300200441a8026a41086a220e200441d8006a41086a220f290300370300200441206a41086a200441e8016a41086a2210290300370300200441206a41106a200441e8016a41106a2211290300370300200441206a41186a2008290300370300200441206a41206a2009290300370300200441206a41286a200b290300370300200441206a41306a200c280200360200200420042903583703a802200420042903e801370320024020042802dc01450d002007102c0b200441e8016a41186a200441b8016a41186a290300220a3703002011200441b8016a41106a29030022123703002010200441b8016a41086a2903002213370300200420042903b80122143703e80120044188036a41186a200a37030020044188036a41106a201237030020044188036a41086a201337030020044188036a41286a200e290300221537030020044188036a41306a2006290300221637030020044188036a41386a200441a8026a41186a29030022173703002004201437038803200420042903a80222183703a803200441d8006a41386a2017370300200441d8006a41306a2016370300200441d8006a41286a2015370300200441f8006a2018370300200441d8006a41186a200a370300200d2012370300200f2013370300200420143703580c020b200428025c450d042007102c4200210a0c050b024020042802dc01450d002007102c0b200441e8016a41186a200441b8016a41186a290300370300200441e8016a41106a200441b8016a41106a290300370300200441e8016a41086a200441b8016a41086a290300370300200420042903b8013703e8010b2005450d02200441e8016a41386a2207200441d8006a41386a290300370300200441e8016a41306a2208200441d8006a41306a290300370300200441e8016a41286a2209200441d8006a41286a290300370300200441e8016a41206a220b200441d8006a41206a290300370300200441e8016a41186a200441d8006a41186a2206290300370300200441e8016a41106a200441d8006a41106a220c290300370300200441e8016a41086a200441d8006a41086a220d290300370300200420042903583703e801200441a8026a41186a2006290300370300200441a8026a41106a200c290300370300200441a8026a41086a200d290300370300200420042903583703a80220044188036a41186a2206200729030037030020044188036a41106a2207200829030037030020044188036a41086a22082009290300370300200420053602a8032004200b29030037038803200441ac036a2004290320370200200441b4036a200441206a41086a290300370200200441bc036a200441206a41106a290300370200200441c4036a200441206a41186a290300370200200441cc036a200441206a41206a290300370200200441d4036a200441206a41286a290300370200200441dc036a200441206a41306a2802003602002006290300210a20072007290300221220027c22133703002006200a20037c2013201254ad7c3703002008200829030020037c200429038803221220027c220a201254ad7c22123703002004200a37038803200441b8016a20012002200310b604200441b8016a41106a2903002103200441b8016a41086a290300210220043502b8012113200442f3e885db96cddbb3203703d801200441d8016a20044188036a41386a200a201210ab04200441c8026a41e6dcc700410710c501200441d8026a418a99c100410610c501200441b8016a200441a8026a10d50220042802c001220541206a2206417f4c0d000240024020060d00410121010c010b200610322201450d020b200441003602a0012004200636029c01200420013602980120044198016a4100411010c80120042802980120042802a00122066a220120042900c802370000200141086a200441c8026a41086a2900003700002004200641106a22063602a00120044198016a2006411010c80120042802980120042802a00122066a220120042900d802370000200141086a200441d8026a41086a2900003700002004200641106a22013602a00120042802b801210620044198016a2001200510c801200428029801220120042802a00122076a2006200510c9081a2004200720056a22053602a001024020042802bc01450d002006102c0b2001200520044188036a10ac040240200428029c01450d002001102c0b024020042802ac032205450d00200541186c450d0020042802a803102c0b0240200441b8036a28020041ffffffff0371450d0020042802b403102c0b2013420185210a0c030b103b000b1039000b4200210a0b200020023703082000200a370300200041106a2003370300200441a0056a24000bfc0e0a057f027e027f0a7e017f047e017f017e017f027e230041f0036b2204240020032802002105200441286a41c1dcc700410610c501200441c8016a41acc8c700410710c50120044190016a200110d50202400240024002400240200428029801220341206a2206417f4c0d000240024020060d00410121070c010b200610322207450d020b200441003602202004200636021c20042007360218200441186a4100411010c8012004280218200428022022066a22072004290028370000200741086a200441286a41086a2900003700002004200641106a2206360220200441186a2006411010c8012004280218200428022022066a220720042900c801370000200741086a200441c8016a41086a2900003700002004200641106a22063602202004280290012107200441186a2006200310c80120042802182206200428022022086a2007200310c9081a2004200820036a22083602200240200428029401450d002007102c0b200441286a2006200810d602200429032821094200210a20044200370328200441f4006a280200210b200441f0006a280200210c0240024002400240024020094201520d00200441c0006a290300210d2004290338210e2004290330210a200441e0006a290300210f200441d8006a2903002110200441d0006a2903002111200441c8006a290300211220042903682113200241086a29030021142002290300211542002116410121170c010b41002117200229030022154280c8afa025544100200241086a2903002214501b0d0142808080808080c00021164200210e4200210d420021134200211242002111420021104200210f0b42002118200a20157c2219200a542203200e20147c2003ad7c220a200e54200a200e511b4101470d010b42002116410121024100210342002118410021070c010b200441b0016a2011370300200441b8016a2010370300200441c0016a200f370300200420123703a80120042019370390012004200d3703a0012004200a3703980102400240427f2019200d7c220e200e2019542203200a20127c2003ad7c220e200a54200e200a511b22031b221a4280c8afa025544100427f200e20031b220e501b0d00200441a0016a290300210e200429039801210d200429039001211a4201211b0c010b024002402019200d84200a2012848450450d004200211b0c010b4200211b200441c8016a41186a22024200370300200441c8016a41106a22074200370300200441c8016a41086a22034200370300200442003703c801200441e0036a41d4dcc700410810c5012003200441e0036a41086a221c290000370300200420042900e0033703c801200441e0036a41bba8c700410d10c5012002201c290000370300200720042900e0033703002004200441c8016a412010d301200441106a290300210d2004290308211d2004280200211e200242003703002007420037030020034200370300200442003703c801200441e0036a41d4dcc700410810c5012003201c290000370300200420042900e0033703c801200441e0036a41bba8c700410d10c5012002201c290000370300200720042900e00337030020044200200d4200201e1b220d200e7d201d4200201e1b221d201a54ad7d221f201d201a7d2220201d56201f200d56201f200d511b22021b3703e80320044200202020021b3703e003200441c8016a4120200441e0036a411010a70220044180026a200e370300200441f8016a201a370300200341013a0000200441d9016a200541086a290000370000200441e1016a200541106a290000370000200441e9016a200541186a290000370000200441023602c801200420052900003700d101200441c8016a10c8020b0b20094201512107200441f8006a41106a200a370300200441d0006a2011370300200441c8006a2012370300200441d8006a2010370300200441286a41106a200d370300200441e0006a200f370300200441c0006a200e3703002004201937038001200420133703682004201a370330410021032004200b410020171b3602742004200c410020171b3602702004201b4201512202ad370328024020020d002006200810b401410021020c010b20062008200441306a10d80241002102410121030b0240200428021c450d002006102c0b02402002450d0020004201370300200041106a201842108620164230888442ffffffffffff3f8337030020002003ad4208862016421086842007ad843703080c050b2016423088201842108684210e20032007452206710d0220032006720d03200441c8016a41086a41043a0000200441d9016a200141086a290000370000200441e1016a200141106a290000370000200441e9016a200141186a290000370000200441003602c801200420012900003700d101200441c8016a10c8020c030b103b000b1039000b200441c8016a41086a41033a0000200441d9016a200141086a290000370000200441e1016a200141106a290000370000200441e9016a200141186a290000370000200441003602c801200420012900003700d101200441c8016a10c8020b2000200e37030820004200370300200041286a2014370300200041206a2015370300200041186a200a370300200041106a20193703000b200441f0036a24000bbf0d04057f077e047f017e230041e0036b2204240002400240024002400240024002402002200384500d00200441306a41c1dcc700410610c501200441b8016a41acc8c700410710c50120044180016a200110d502200428028801220541206a2206417f4c0d010240024020060d00410121070c010b200610322207450d030b200441003602282004200636022420042007360220200441206a4100411010c8012004280220200428022822066a22072004290030370000200741086a200441306a41086a2900003700002004200641106a2206360228200441206a2006411010c8012004280220200428022822066a220720042900b801370000200741086a200441b8016a41086a2900003700002004200641106a22063602282004280280012107200441206a2006200510c80120042802202206200428022822086a2007200510c9081a2004200820056a22053602280240200428028401450d002007102c0b200441306a2006200510d602200429033021092004420037033020094201520d0302402004290338220a20027c220b200a5422072004290340220c20037c2007ad7c220a200c54200a200c511b450d00200441b8016a410310d7020c050b200441e8006a290300210d200441e0006a290300210e200441d0006a290300210c200441c8006a290300210f200441fc006a2802002108200441a0016a200441d8006a290300370300200441a8016a200e370300200441b0016a200d3703002004200c370398012004200b370380012004200a370388012004200f3703900102400240427f200b200f7c220d200d200b542207200a200c7c2007ad7c220d200a54200d200a511b22071b220e4280c8afa025544100427f200d20071b220d501b0d0020044190016a290300210a200429038801210c200429038001210b4201210f0c010b02400240200b200f84200a200c848450450d004200210f0c010b4200210f200441b8016a41186a22104200370300200441b8016a41106a22114200370300200441b8016a41086a22074200370300200442003703b801200441d0036a41d4dcc700410810c5012007200441d0036a41086a2212290000370300200420042900d0033703b801200441d0036a41bba8c700410d10c50120102012290000370300201120042900d003370300200441086a200441b8016a412010d301200441086a41106a290300210a2004290310210c20042802082113201042003703002011420037030020074200370300200442003703b801200441d0036a41d4dcc700410810c50120072012290000370300200420042900d0033703b801200441d0036a41bba8c700410d10c50120102012290000370300201120042900d00337030020044200200a420020131b220a200d7d200c420020131b220c200e54ad7d220b200c200e7d2214200c56200b200a56200b200a511b22101b3703d80320044200201420101b3703d003200441b8016a4120200441d0036a411010a702200441f0016a200d370300200441e8016a200e370300200741013a0000200441c9016a200141086a290000370000200441d1016a200141106a290000370000200441d9016a200141186a290000370000200441023602b801200420012900003700c101200441b8016a10c8020b0b20094201512107200441c0006a200c370300200441c8006a200a3703002004200836027c2004200b3703382004200f4201512208ad370330024020080d002006200510b4014200210a41002105410021080c060b20062005200441386a10d8024200210a41002108410121050c050b20004100360200200041106a4200370300200041086a42003703000c050b103b000b1039000b200441b8016a410810d7020b20042802b801211020042902bc0122094280807c83210a2009420888a721052009a72107410121080b02402004280224450d002006102c0b02400240024020080d000240200741ff017122060d00200541ff01710d020b2006450d02200541ff01710d02200441b8016a41086a41043a0000200441c9016a200141086a290000370000200441d1016a200141106a290000370000200441d9016a200141186a290000370000200441003602b801200420012900003700c101200441b8016a10c8020c020b2000201036020420004101360200200041086a2005ad42ff01834208862007ad42ff018384200a843702000c020b200441b8016a41086a41033a0000200441c9016a200141086a290000370000200441d1016a200141106a290000370000200441d9016a200141186a290000370000200441003602b801200420012900003700c101200441b8016a10c8020b20004100360200200041106a2003370300200041086a20023703000b200441e0036a24000b940102017f017e230041106b2206240002402002ad4220862001ad842004ad4220862003ad84200510242207422088a72203450d0041002105024002402007a722022d00000e020100020b2003417f6a4104490d0120022800012101410121050b2002102c2000200136020420002005360200200641106a24000f0b41f2b3c800412e200641086a41a0b4c80041b0b4c8001040000bf00201027f230041106b220224000240024002400240024020002802000e0401020300010b2002200128021841e6b5c800410f2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41f8b5c80010661a20022d0008210120022802042203450d03200141ff0171210041012101024020000d00024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841fa9dc00041012000411c6a28020028020c1100000d010b2002280200220128021841c5c7c50041012001411c6a28020028020c11000021010b200220013a00080c030b20012802184188b6c80041142001411c6a28020028020c11000021010c020b2001280218419cb6c80041152001411c6a28020028020c11000021010c010b200128021841b1b6c80041132001411c6a28020028020c11000021010b200241106a2400200141ff01714100470bb508020a7f027e230041e0016b22022400024002400240200128020022032001280204460d00200128021021042001200341046a3602004102210520032f010021062001280208220720072f0100200341026a2f010022076a220341ffff03200341ffff03491b3b0100024002402001410c6a280200280200220128020820064b0d00410021030c010b200241a8016a200128020020064105746a2201410f6a290000370300200241b0016a200141176a290000370300200241b8016a2001411f6a2d00003a0000200220012f00003b01be01200220012900073703a0012001280003210820012d00022106410121030b200241c0016a41086a2209200241a0016a41086a290300370300200241c0016a41106a220a200241a0016a41106a290300370300200241c0016a41186a220b200241a0016a41186a2d00003a0000200220022f01be013b01de01200220022903a0013703c0014101210102402003450d0020024180016a41086a200929030037030020024180016a41106a200a29030037030020024180016a41186a200b2d00003a0000200220022f01de013b019e01200220022903c0013703800141002101200821050b200241e0006a41086a20024180016a41086a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41186a20024180016a41186a2d00003a0000200220022f019e013b017e20022002290380013703602001450d012002200536028001200220022d00603a00840120022002280061360240200220022800643600432004200228008101360001200420053a000020042002280240360005200441086a200228004336000020022f013e2101200241186a2203200241206a41186a2d00003a0000200241106a2204200241206a41106a290300370300200241086a2205200241206a41086a29030037030020022002290320370300200220013b01c00120024180016a41186a20032d00003a000020024180016a41106a200429030037030020024180016a41086a200529030037030020022002290300370380010b410021010c010b200241206a41086a200241e0006a41086a290300220c370300200241206a41106a200241e0006a41106a290300220d370300200241086a2201200c370300200241106a2203200d370300200241186a2204200241e0006a41186a2d00003a000020022002290360220c3703202002200c370300200220022f017e22083b01c00120024180016a41186a220920042d00003a000020024180016a41106a2204200329030037030020024180016a41086a220320012903003703002002200229030037038001200041056a2005360000200041046a20063a0000200020083b0102200041226a20073b01002000200229038001370009200041116a2003290300370000200041196a2004290300370000200041216a20092d00003a0000410121010b200020013b0100200241e0016a24000bab0402047f027e23004180026b220424000240024020012d000d450d0041f4a2c3002105413121010c010b4101210602400240200328020022074101460d00200128020022054521060c010b200110bb044100210520014100360208200141003602000b20042002290000220837031802400240024020060d00200128020421020c010b41e40110322205450d014100210220054100360200200541046a200441f8006a41860110c9081a200541003b018a012005418c016a200441206a41d80010c9081a20014100360204200120053602000b200441f8006a20022005200441186a10910202400240024020042802784101470d00200441086a41086a20044184016a28020022053602002004200429027c2209370308200441f8006a41086a20053602002004200937037820042008370388012004200136028401200441003602282004420137032020070d01200441206a41004101102f2004280220200428022822056a41003a00002004200541016a2205360228200341086a2903002108200441206a20054108102f2004280220200428022822056a20083700002004200541086a3602280c020b41c7a2c3002105412d21010c030b200441206a41004101102f2004280220200428022822056a41013a00002004200541016a360228200441206a200341046a1080030b200441f8006a200441206a10bc04200120073a000d41002105200141003a000c0c010b1039000b200020013602042000200536020020044180026a24000ba80201057f230041c0006b2201240002400240200028020022020d0041002103200141186a41003602002001410036020c0c010b2000280208210320002802042100200221040240034020022f018a0121052000450d012000417f6a2100200220054102746a41e4016a280200210220042802e40121040c000b0b2001411c6a2005360200200141186a200236020020012000360214200141003602102001200436020c200120003602080b20012003360220200141286a200141086a10a10803400240200128023022020d000240200128020c2200450d00200028020021022000102c2002450d000340200228020021002002102c2000210220000d000b0b200141c0006a24000f0b02402001280234450d002002102c0b200141286a200141086a10a1080c000b0bb51009017f017e087f017e027f017e017f017e067f230041a0026b2202240020002902102103200028020821042000280200210520002802042106200241086a2207200141086a280200360200200220012902003703000240024002400240024002400240024020062f018a012201410b490d00410521074100210802400240200441054f0d0041042107200421090c010b41052109024002402004417b6a0e020201000b200441796a210941012108410621070c010b41002109410121080b41e40110322201450d0320014100360200200141046a200241106a41860110c908210a200141003b018a012001418c016a20024198016a41d80010c908210b20062007410c6c6a220441086a290200210c200441046a280200210d200620074103746a220e418c016a290000210f200b200e4194016a20062f018a012007417f736a220e41037410c9081a200a200441106a200e410c6c10c9081a200620073b018a012001200e3b018a012001200620081b220420094103746a22074194016a2007418c016a220720042f018a0120096b41037410ca081a2007200337000020042009410c6c6a220741106a200741046a220e20042f018a0120096b410c6c10ca081a2007410c6a200241086a280200360200200e2002290300370200200420042f018a0141016a3b018a0102400240200628020022040d00410021050c010b410021070340200d2110200c2103200f211120012112200621012004210620052007470d0620012f018801210e02400240024020062f018a012201410b490d004100210b410421090240200e4105490d00200e210902400240200e417b6a0e020201000b200e41796a210e4101210b410621090c010b4100210e4101210b410521090b41940210322201450d08200541016a21054100210420014100360200200141046a200241106a41860110c9082113200141003b018a012001418c016a20024198016a41880110c9082114200641046a22152009410c6c6a2208290204210c2008280200210d2006418c016a220a20094103746a290000210f2014200a200941016a22164103746a20062f018a0122172009417f736a220741037410c908211420132008410c6a2007410c6c10c9082113200620093b018a01200120073b018a01200141e4016a200620164102746a41e4016a201720096b41027410c908210802400340200120044102746a41e4016a280200220920043b018801200920013602002004200420074922096a220420074b0d0120090d000b0b200b450d01200e41027420086a41086a2008200e41016a22044102746a220720012f018a01200e6b41027410ca081a20072012360200201420044103746a2014200e4103746a220720012f018a01200e6b41037410ca081a200720113700002013200e410c6c6a2207410c6a200720012f018a01200e6b410c6c10ca081a2007200337020420072010360200200120012f018a0141016a22073b018a012004200741ffff037122074b0d020340200120044102746a41e4016a280200220920043b01880120092001360200200420042007496a220920074b0d03200420074f210e20092104200e450d000c030b0b200e410274200641e4016a22076a41086a2007200e41016a22044102746a22072001200e6b220141027410ca081a200720123602002006418c016a220720044103746a2007200e4103746a2207200141037410ca081a200720113700002006200e410c6c6a220741106a200741046a22092001410c6c10ca081a200741086a200337020020092010360200200620062f018a0141016a22013b018a01200e200141ffff037122014f0d050340200620044102746a41e4016a280200220720043b01880120072006360200200420042001496a220720014b0d06200420014f2109200721042009450d000c060b0b200e410274200641e4016a22076a41086a2007200e41016a22044102746a220720062f018a01200e6b41027410ca081a20072012360200200a20044103746a200a200e4103746a220720062f018a01200e6b41037410ca081a200720113700002015200e410c6c6a2207410c6a200720062f018a01200e6b410c6c10ca081a2007200337020420072010360200200620062f018a0141016a22073b018a012004200741ffff037122074b0d000340200620044102746a41e4016a280200220920043b018801200920063602002004200420074922096a220420074b0d0120090d000b0b20052107200628020022040d000b0b200028020c2207280200450d0541940210322204450d0320044100360200200441046a200241106a41860110c9081a200441003b018a012004418c016a20024198016a41880110c9081a2004200728020022093602e4012007200436020020072007280204220641016a360204200941003b0188012009200436020020062005470d0620042f018a012209410a4b0d072004200941016a22063b018a01200420094103746a418c016a200f37000020042009410c6c6a220941086a200c370200200941046a200d360200200420064102746a41e4016a2001360200200120063b018801200120043602002007200728020841016a3602080c020b200620044103746a22094194016a2009418c016a2209200120046b41037410ca081a2009200337000020062004410c6c6a220141106a200141046a220920062f018a0120046b410c6c10ca081a2001410c6a200728020036020020092002290300370200200620062f018a0141016a3b018a010b200028020c2204200428020841016a3602080b200241a0026a24000f0b1039000b41a5d0c800413541dcd0c800103c000b41ecd0c800412b41bcd2c800103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000bd20202017f027e23004180026b220424000240024020012d000d450d0041f4a2c3002101413121020c010b200110bb042001410036020820014100360200200420022900002205370318024041e40110322202450d0020024100360200200241046a200441f8006a41860110c9081a200241003b018a012002418c016a200441206a41d80010c9081a2001410036020420012002360200200441f8006a41002002200441186a109102024020042802784101460d0041c7a2c3002101412d21020c020b200441086a41086a20044184016a28020022023602002004200429027c2206370308200441f8006a41086a20023602002004200637037820042005370388012004200136028401200441206a20032802002003280204109801200441f8006a200441206a10bc0420014180023b010c410021010c010b1039000b200020023602042000200136020020044180026a24000bb80d03057f017e017f230041f0076b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a36020020050d0b2006450d1120042d0001210520012003417e6a22063602042001200441026a36020020050e0a0102030405060708090a110b2000410a3a00000c120b20024190046a200110bf042002280290042203450d0f20024198046a22062802002105200228029404210420024190046a200110c0040240200228029004450d00200220022f01a8023b01a402200628020021012002290390042107200241d0006a20024180066a41d40110c9081a410021080c0c0b2003200510c3022004450d0f20044198026c450d0f2003102c0c0f0b20024190046a200110bf042002280290042203450d0e20024198046a22062802002105200228029404210420024190046a200110c0040240200228029004450d00200220022f01a8023b01a402200628020021012002290390042107200241d0006a20024180066a41d40110c9081a410121080c0b0b2003200510c3022004450d0e20044198026c450d0e2003102c0c0e0b20024190046a200110bf042002280290042203450d0d20024198046a22062802002105200228029404210420024190046a200110c0040240200228029004450d00200220022f01a8023b01a402200628020021012002290390042107200241d0006a20024180066a41d40110c9081a410221080c0a0b2003200510c3022004450d0d20044198026c450d0d2003102c0c0d0b200241086a200110c1042002290308a70d0c2002290310210720024190046a200110bf042002280290042203450d0c200220022f01a8023b01a40220024198046a28020021052002280294042104200241d0006a20024180066a41d40110c9081a410321080c080b2006450d0b20042d0002210520012003417d6a3602042001200441036a3602004100210602400240024020050e030200010e0b410121060c010b410221060b20024190046a2001108a022002280290042203450d0b200220022f01a8023b01a40220024198046a28020021052002280294042104200241d0006a20024180066a41d40110c9081a410421080c080b20024180066a2001109e012002290380064205510d0a200241a8026a20024180066a41e80110c9081a20024180066a200110be0420022d008006210120024190046a20024180066a41017241ef0110c9081a2001410a460d0820024180066a20024190046a41ef0110c9081a41f001103222030d050c0b0b20024180066a2001109e012002290380064205510d09200241a8026a20024180066a41e80110c9081a20024180066a200110be0420022d008006210120024190046a20024180066a41017241ef0110c9081a2001410a460d0820024180066a20024190046a41ef0110c9081a41f00110322203450d0a200320013a0000200341016a20024180066a41ef0110c9081a200241b8026a280200210120022802a802210420022802ac02210520022903b0022107200241d0006a200241bc026a41d40110c9081a200220022f01a6023b01a402410621080c050b200241286a200110870220022802280d08200228022c2103200241206a200110870220022802200d0820022802242104200241186a200110870220022802180d08200228021c2105200220022f0190043b01a402200241d0006a20024180066a41d40110c9081a410721080c040b200241306a200110870220022802300d0720022802342103200220022f0190043b01a402200241d0006a20024180066a41d40110c9081a410821080c030b200241c8006a200110870220022802480d06200228024c2103200241c0006a200110870220022802400d0620022802442104200241386a200110870220022802380d06200228023c2105200220022f0190043b01a402200241d0006a20024180066a41d40110c9081a410921080c020b2000410a3a00000c070b200320013a0000200341016a20024180066a41ef0110c9081a200241b8026a280200210120022802a802210420022802ac02210520022903b0022107200241d0006a200241bc026a41d40110c9081a200220022f01a6023b01a402410521080b0b200020063a0001200020083a0000200041186a2001360200200041106a20073703002000410c6a2005360200200041086a2004360200200041046a2003360200200041026a20022f01a4023b01002000411c6a200241d0006a41d40110c9081a0c040b200241a8026a10a2010c010b200241a8026a10a2010b2000410a3a00000c010b1039000b200241f0076a24000be21107037f017e0a7f037e027f027e017f230041f0096b22022400200241386a2001108702024002402002280238450d00200041003602000c010b024002400240200228023c220320012802044198026e2204200420034b1bad4298027e2205422088a70d002005a72204417f4c0d0002400240024020040d00410821060c010b200410322206450d010b410021072002410036024820022006360240200220044198026e36024402402003450d0020024188086a41186a2108200241b8046a41186a2109200241a0066a41106a210a200241a0066a41186a210b20024188086a41106a210c034020012802042204450d042001280200220d2d0000210e20012004417f6a3602042001200d41016a3602004100210d024002400240024002400240024002400240024002400240024002400240200e0e0c0b0a00010203040506070809130b4102210d0c0a0b4103210d0c090b20024188066a2001108a02200228028806220f450d10200229028c062105200241b8046a20024188086a41d00110c9081a200241a0046a41106a200a290300370300200241a0046a41086a200241a0066a41086a290300370300200220022903a0063703a0044104210d410021040c0a0b20024188066a2001108a02200228028806220f450d0f200229028c062105200241b8046a20024188086a41d00110c9081a200241a0046a41106a200a290300370300200241a0046a41086a200241a0066a41086a290300370300200220022903a0063703a0044105210d410021040c090b20024188086a2001109e0120022903880822054205510d0e200c29030021102002290390082111200241b8046a200841d00110c9081a200241a0046a41086a200241a0066a41086a290300370300200241a0046a41106a200a290300370300200220022903a0063703a0044106210d410021040c080b20024188086a2001109e0120022903880822054205510d0d200c29030021102002290390082111200241b8046a200841d00110c9081a200241a0046a41086a200241a0066a41086a290300370300200241a0046a41106a200a290300370300200220022903a0063703a0044107210d410021040c070b20024188066a2001108a02200228028806220e450d05200229028c062112200241086a200110f70302402002290308a70d00200241086a41106a290300211020022903102111200241b8046a20024188086a41d00110c9081a200241a0046a41106a200a2903003703004108210d200241a0046a41086a200241a0066a41086a290300370300200220022903a0063703a00441002104200e210f201221050c070b2012a72204201320041b21132004450d052013450d05200e102c0c050b200241a0066a2001108a0220022802a006220e450d0420022902a4062112200241a0066a200110bb07024020022d00a0064107460d00200241b8046a41086a200a41086a290300370300200241b8046a41106a200a41106a2903003703002002200a2903003703b804200241a0066a41086a290300211020022903a0062111200920024188086a41b80110c9081a200241a0046a41106a20024188066a41106a290300370300200241a0046a41086a20024188066a41086a29030037030020022002290388063703a0044109210d41002104200e210f201221050c060b2012a72204201420041b21142004450d042014450d04200e102c0c040b20024188086a2001109e012002290388084205510d03200241a0066a20024188086a41e80110c9081a200241206a200110f70302402002290320a70d00200241206a41106a290300211520022903282116200a290300211020022903a806211120022903a0062105200241b8046a200b41d00110c9081a200241a0046a41086a20024188066a41086a290300370300200241a0046a41106a20024188066a41106a29030037030020022002290388063703a004410a210d410021040c050b200241a0066a10a2010c030b20024188086a2001109e012002290388084205510d02200241a0066a20024188086a41e80110c9081a20024188086a200110bb07024020022d0088084107460d00200241a0046a41086a200c41086a290300370300200241a0046a41106a200c41106a2903003703002002200c2903003703a00420024188086a41086a29030021152002290388082116200a290300211020022903a806211120022903a0062105200241b8046a200b41d00110c9081a410b210d410021040c040b200241a0066a10a2010c020b4101210d0b200241d0026a200241b8046a41d00110c9081a200241b8026a41106a200241a0046a41106a290300370300200241b8026a41086a200241a0046a41086a290300370300200220022903a0043703b8020c020b410c210d410121040b200241d0026a200241b8046a41d00110c9081a200241b8026a41106a200241a0046a41106a290300370300200241b8026a41086a200241a0046a41086a290300370300200220022903a0043703b80220040d060b200241e8006a200241d0026a41d00110c9081a200241d0006a41106a220e200241b8026a41106a290300370300200241d0006a41086a2217200241b8026a41086a290300370300200220022903b802370350024020072002280244470d00200241c0006a2007410110930520022802482107200228024021060b200620074198026c6a2204200f3602042004200d360200200441186a2010370200200441106a2011370200200441086a2005370200200441206a200241e8006a41d00110c9081a200441f8016a2015370200200441f0016a201637020020044180026a200229035037020020044188026a201729030037020020044190026a200e2903003702002002200741016a22073602482003417f6a22030d000b0b20002002290340370200200041086a200241c0006a41086a2802003602000c040b1039000b103b000b200241d0026a200241b8046a41d00110c9081a200241b8026a41106a200241a0046a41106a290300370300200241b8026a41086a200241a0046a41086a290300370300200220022903a0043703b8020b2000410036020020022802402201200710c30220022802442204450d0020044198026c450d002001102c0b200241f0096a24000bc10d03037f017e0c7f230041b00b6b22022400200241186a2001108702024002402002280218450d00200041003602000c010b024002400240200228021c220320012802044188026e2204200420034b1bad4288027e2205422088a70d002005a72204417f4c0d000240024020040d00410821060c010b200410322206450d020b410021072002410036022820022006360220200220044188026e3602240240024002402003450d0020024184046a41dc016a2108200241f0056a410c6a2109200241f0056a41046a210a200241c8096a410472210b0340024002400240024002400240024002400240024020012802042204450d002001280200220c2d0000210d20012004417f6a3602042001200c41016a360200200d0e0701020304050607000b20024198026a20024184046a41ec0110c9081a0c0f0b20024198026a20024184046a41ec0110c9081a4100210c0c070b200241f0056a200110bf0420022802f005220e450d0a20022802f805210f20022802f4052110200241f0056a2001109e01024020022903f00522054205510d0020022802f805211120024184046a200941dc0110c9081a200841086a200241c8096a41086a290300370200200820022903c8093702004101210c0c060b200e200f10c3022010450d0a20104198026c450d0a200e102c0c0a0b200241c8096a200110bf0420022802c809220e450d0920022802d009210f20022802cc092110200241c8096a2001109e010240024020022903c8094205510d00200241e0076a200241c8096a41e80110c9081a200241c8096a200110c00420022802c809450d0120022802d009211120022903c8092105200a200241e0076a41e80110c9081a20024184046a200241f0056a41ec0110c9081a4102210c0c060b200e200f10c3022010450d0a20104198026c450d0a200e102c0c0a0b200241e0076a10a201200e200f10c3022010450d0920104198026c450d09200e102c0c090b200241c8096a200110bf0420022802c809220e450d0820022802d009210f20022802cc092110200241c8096a200110bf04024020022802c809450d0020022802d009211120022903c809210520024184046a200241f0056a41ec0110c9081a4103210c0c040b200e200f10c3022010450d0820104198026c450d08200e102c0c080b200241c8096a200110bf0420022802c809220e450d0720022802d009210f20022802cc092110200241c8096a2001109e010240024020022903c8094205510d00200241e0076a200241c8096a41e80110c9081a200241c8096a200110c00420022802c809450d0120022802d009211120022903c8092105200a200241e0076a41e80110c9081a20024184046a200241f0056a41ec0110c9081a4104210c0c040b200e200f10c3022010450d0820104198026c450d08200e102c0c080b200241e0076a10a201200e200f10c3022010450d0720104198026c450d07200e102c0c070b200241c8096a200110bf0420022802c809220e450d0620022802d009210f20022802cc092110200241c8096a2001109e010240024020022903c8094205510d00200241e0076a200241c8096a41e80110c9081a200241c8096a200110c00420022802c809450d0120022802d009211120022903c8092105200a200241e0076a41e80110c9081a20024184046a200241f0056a41ec0110c9081a4105210c0c030b200e200f10c3022010450d0720104198026c450d07200e102c0c070b200241e0076a10a201200e200f10c3022010450d0620104198026c450d06200e102c0c060b200241086a200110c1042002290308a70d0520022903102105200241f0056a2001109e0120022903f0054205510d05200241c8096a200241f0056a41e80110c9081a200241f0056a200110bf0420022802f005220e450d0420022802f805210f20022802f405211020022802c809211120024184046a200b41e40110c9081a4106210c0b20024198026a20024184046a41ec0110c9081a0b2002412c6a20024198026a41ec0110c9081a024020072002280224470d00200241206a200710950520022802282107200228022021060b200620074188026c6a2204200e3602042004200c360200200441186a2011360200200441106a20053702002004410c6a200f360200200441086a20103602002004411c6a2002412c6a41ec0110c9081a2002200741016a22073602282003417f6a22030d000b0b20002002290320370200200041086a200241206a41086a2802003602000c050b200241c8096a10a2010b20024198026a20024184046a41ec0110c9081a0c020b103b000b1039000b2000410036020020022802202204200710c40220022802242201450d0020014188026c450d002004102c0b200241b00b6a24000bb40404057f017e027f017e0240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a3602000240200441037122064103460d00024002400240024020060e03000102000b2004410276ad21070c020b41012106024020050d000c050b20032d0001210520012002417e6a3602042001200341026a3602002005410874200472220141ffff0371418002490d04200141fcff0371410276ad21070c010b410121060240200541034f0d000c040b200341036a2d0000210520032f0001210820012002417c6a3602042001200341046a3602002008200541107472410874200472220141808004490d032001410276ad21070b410021060c020b024002400240200441027622090e050002020201020b20054104490d022003350001210720012002417b6a3602042001200341056a36020020074280808080045421060c030b20054108490d01200329000121072001200241776a3602042001200341096a3602002007428080808080808080015421060c020b200441134b0d00200941046a21082002417e6a2102200341026a2103410021044200210741012106034002402002417f470d000c030b2003417f6a310000210a20012002360204200120033602002002417f6a2102200341016a2103200a2004410374413871ad862007842107200441016a22052104200541ff01712008490d000b2007427f412820094103746b413871ad885821060c010b410121060b2000200737030820002006ad3703000ba30e03057f017e017f230041f0076b220224000240024002400240024002400240024002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020020060d0b200128020022032802042204450d10200328020022052d0000210620032004417f6a3602042003200541016a36020020060e0a0102030405060708090a100b2000410a3a00000c110b20024190046a200110c3042002280290042203450d0e20024198046a22062802002105200228029404210420024190046a200110c4040240200228029004450d00200220022f01a8023b01a402200628020021012002290390042107200241d0006a20024180066a41d40110c9081a410021080c0c0b2003200510c3022004450d0e20044198026c450d0e2003102c0c0e0b20024190046a200110c3042002280290042203450d0d20024198046a22062802002105200228029404210420024190046a200110c4040240200228029004450d00200220022f01a8023b01a402200628020021012002290390042107200241d0006a20024180066a41d40110c9081a410121080c0b0b2003200510c3022004450d0d20044198026c450d0d2003102c0c0d0b20024190046a200110c3042002280290042203450d0c20024198046a22062802002105200228029404210420024190046a200110c4040240200228029004450d00200220022f01a8023b01a402200628020021012002290390042107200241d0006a20024180066a41d40110c9081a410221080c0a0b2003200510c3022004450d0c20044198026c450d0c2003102c0c0c0b200241086a200110c5042002290308a70d0b2002290310210720024190046a200110c3042002280290042203450d0b200220022f01a8023b01a40220024198046a28020021052002280294042104200241d0006a20024180066a41d40110c9081a410321080c080b200128020022032802042204450d0a200328020022052d0000210820032004417f6a3602042003200541016a3602004100210602400240024020080e030200010d0b410121060c010b410221060b20024190046a200110c6042002280290042203450d0a200220022f01a8023b01a40220024198046a28020021052002280294042104200241d0006a20024180066a41d40110c9081a410421080c080b20024180066a200110a0012002290380064205510d09200241a8026a20024180066a41e80110c9081a2001200128020441016a2203360204200320012802084b0d0820024180066a200110c20420022d008006210420024190046a20024180066a41017241ef0110c9081a2004410a460d0820024180066a20024190046a41ef0110c9081a41f001103222030d050c0a0b20024180066a200110a0012002290380064205510d08200241a8026a20024180066a41e80110c9081a2001200128020441016a22033602040240200320012802084b0d0020024180066a200110c20420022d008006210420024190046a20024180066a41017241ef0110c9081a2004410a460d0020024180066a20024190046a41ef0110c9081a41f00110322203450d0a200320043a0000200341016a20024180066a41ef0110c9081a20012001280204417f6a360204200241b8026a280200210120022802a802210420022802ac02210520022903b0022107200241d0006a200241bc026a41d40110c9081a200220022f01a6023b01a402410621080c060b200241a8026a10a2010c080b200241286a200110b00320022802280d07200228022c2103200241206a200110b00320022802200d0720022802242104200241186a200110b00320022802180d07200228021c2105200220022f0190043b01a402200241d0006a20024180066a41d40110c9081a410721080c040b200241306a200110b00320022802300d0620022802342103200220022f0190043b01a402200241d0006a20024180066a41d40110c9081a410821080c030b200241c8006a200110b00320022802480d05200228024c2103200241c0006a200110b00320022802400d0520022802442104200241386a200110b00320022802380d05200228023c2105200220022f0190043b01a402200241d0006a20024180066a41d40110c9081a410921080c020b2000410a3a00000c060b200320043a0000200341016a20024180066a41ef0110c9081a20012001280204417f6a360204200241b8026a280200210120022802a802210420022802ac02210520022903b0022107200241d0006a200241bc026a41d40110c9081a200220022f01a6023b01a402410521080b0b200020063a0001200020083a0000200041186a2001360200200041106a20073703002000410c6a2005360200200041086a2004360200200041046a2003360200200041026a20022f01a4023b01002000411c6a200241d0006a41d40110c9081a0c030b200241a8026a10a2010b2000410a3a00000c010b1039000b200241f0076a24000bba1206037f017e0b7f037e027f027e230041f0096b22022400200241386a200110b003024002402002280238450d00200041003602000c010b02400240024002400240200228023c220320012802002802044198026e2204200420034b1bad4298027e2205422088a70d002005a72204417f4c0d0002400240024020040d00410821060c010b200410322206450d010b2001200128020441016a2207360204410021082002410036024820022006360240200220044198026e2204360244200720012802084b0d042003450d0320024188086a41186a2109200241b8046a41186a210a200241a0066a41106a210b200241a0066a41186a210c20024188086a41106a210d41002108024003400240024002400240200128020022042802042207450d002004280200220e2d0000210f20042007417f6a3602042004200e41016a36020041002107024002400240024002400240024002400240024002400240200f0e0c0b0a000102030405060708090c0b410221070c0a0b410321070c090b20024188066a200110c6042002280288062210450d09200229028c062105200241b8046a20024188086a41d00110c9081a200241a0046a41106a200b290300370300200241a0046a41086a200241a0066a41086a290300370300200220022903a0063703a00441042107410021040c0b0b20024188066a200110c6042002280288062210450d08200229028c062105200241b8046a20024188086a41d00110c9081a200241a0046a41106a200b290300370300200241a0046a41086a200241a0066a41086a290300370300200220022903a0063703a00441052107410021040c0a0b20024188086a200110a00120022903880822054205510d07200d29030021112002290390082112200241b8046a200941d00110c9081a200241a0046a41086a200241a0066a41086a290300370300200241a0046a41106a200b290300370300200220022903a0063703a00441062107410021040c090b20024188086a200110a00120022903880822054205510d06200d29030021112002290390082112200241b8046a200941d00110c9081a200241a0046a41086a200241a0066a41086a290300370300200241a0046a41106a200b290300370300200220022903a0063703a00441072107410021040c080b20024188066a200110c604200228028806220e450d06200229028c062113200241086a200110b10302402002290308a70d00200241086a41106a290300211120022903102112200241b8046a20024188086a41d00110c9081a200241a0046a41106a200b29030037030041082107200241a0046a41086a200241a0066a41086a290300370300200220022903a0063703a00441002104200e2110201321050c080b2013a72204201420041b21142004450d062014450d06200e102c0c060b200241a0066a200110c60420022802a006220e450d0520022902a4062113200241a0066a200110bc07024020022d00a0064107460d00200241b8046a41086a200b41086a290300370300200241b8046a41106a200b41106a2903003703002002200b2903003703b804200241a0066a41086a290300211120022903a0062112200a20024188086a41b80110c9081a200241a0046a41106a20024188066a41106a290300370300200241a0046a41086a20024188066a41086a29030037030020022002290388063703a0044109210741002104200e2110201321050c070b2013a72204201520041b21152004450d052015450d05200e102c0c050b20024188086a200110a0012002290388084205510d04200241a0066a20024188086a41e80110c9081a200241206a200110b10302402002290320a70d00200241206a41106a290300211620022903282117200b290300211120022903a806211220022903a0062105200241b8046a200c41d00110c9081a200241a0046a41086a20024188066a41086a290300370300200241a0046a41106a20024188066a41106a29030037030020022002290388063703a004410a2107410021040c060b200241a0066a10a2010c040b20024188086a200110a0012002290388084205510d03200241a0066a20024188086a41e80110c9081a20024188086a200110bc07024020022d0088084107460d00200241a0046a41086a200d41086a290300370300200241a0046a41106a200d41106a2903003703002002200d2903003703a00420024188086a41086a29030021162002290388082117200b290300211120022903a806211220022903a0062105200241b8046a200c41d00110c9081a410b2107410021040c050b200241a0066a10a2010c030b410121070b200241d0026a200241b8046a41d00110c9081a200241b8026a41106a200241a0046a41106a290300370300200241b8026a41086a200241a0046a41086a290300370300200220022903a0043703b8020c030b200241d0026a200241b8046a41d00110c9081a200241b8026a41106a200241a0046a41106a290300370300200241b8026a41086a200241a0046a41086a290300370300200220022903a0043703b8020c040b410c2107410121040b200241d0026a200241b8046a41d00110c9081a200241b8026a41106a200241a0046a41106a290300370300200241b8026a41086a200241a0046a41086a290300370300200220022903a0043703b80220040d020b200241e8006a200241d0026a41d00110c9081a200241d0006a41106a220e200241b8026a41106a290300370300200241d0006a41086a220f200241b8026a41086a290300370300200220022903b802370350024020082002280244470d00200241c0006a2008410110930520022802482108200228024021060b200620084198026c6a2204201036020420042007360200200441186a2011370200200441106a2012370200200441086a2005370200200441206a200241e8006a41d00110c9081a200441f8016a2016370200200441f0016a201737020020044180026a200229035037020020044188026a200f29030037020020044190026a200e2903003702002002200841016a22083602482003417f6a2203450d040c000b0b2000410036020020022802402106200228024421040c050b1039000b103b000b200128020421070b2000200229034037020020012007417f6a360204200041086a200241c0006a41086a2802003602000c020b200041003602000b2006200810c3022006410020041b2201450d0020044198026c450d002001102c0b200241f0096a24000b970e03037f017e0d7f230041b00b6b22022400200241186a200110b003024002402002280218450d00200041003602000c010b024002400240024002400240200228021c220320012802002802044188026e2204200420034b1bad4288027e2205422088a70d002005a72204417f4c0d000240024020040d00410821060c010b200410322206450d020b2001200128020441016a2207360204410021082002410036022820022006360220200220044188026e2204360224200720012802084b0d042003450d0320024184046a41dc016a2109200241f0056a410c6a210a200241f0056a41046a210b200241c8096a410472210c410021080240024002400340200128020022042802042207450d022004280200220d2d0000210e20042007417f6a3602042004200d41016a3602000240024002400240024002400240024002400240200e0e07000102030405060c0b20024198026a20024184046a41ec0110c9081a410021070c070b200241f0056a200110c30420022802f005220f450d0920022802f805211020022802f4052111200241f0056a200110a001024020022903f00522054205510d0020022802f805211220024184046a200a41dc0110c9081a200941086a200241c8096a41086a290300370200200920022903c809370200410121070c060b200f201010c3022011450d0920114198026c450d09200f102c0c090b200241c8096a200110c30420022802c809220f450d0820022802d009211020022802cc092111200241c8096a200110a0010240024020022903c8094205510d00200241e0076a200241c8096a41e80110c9081a200241c8096a200110c40420022802c809450d0120022802d009211220022903c8092105200b200241e0076a41e80110c9081a20024184046a200241f0056a41ec0110c9081a410221070c060b200f201010c3022011450d0920114198026c450d09200f102c0c090b200241e0076a10a201200f201010c3022011450d0820114198026c450d08200f102c0c080b200241c8096a200110c30420022802c809220f450d0720022802d009211020022802cc092111200241c8096a200110c304024020022802c809450d0020022802d009211220022903c809210520024184046a200241f0056a41ec0110c9081a410321070c040b200f201010c3022011450d0720114198026c450d07200f102c0c070b200241c8096a200110c30420022802c809220f450d0620022802d009211020022802cc092111200241c8096a200110a0010240024020022903c8094205510d00200241e0076a200241c8096a41e80110c9081a200241c8096a200110c40420022802c809450d0120022802d009211220022903c8092105200b200241e0076a41e80110c9081a20024184046a200241f0056a41ec0110c9081a410421070c040b200f201010c3022011450d0720114198026c450d07200f102c0c070b200241e0076a10a201200f201010c3022011450d0620114198026c450d06200f102c0c060b200241c8096a200110c30420022802c809220f450d0520022802d009211020022802cc092111200241c8096a200110a0010240024020022903c8094205510d00200241e0076a200241c8096a41e80110c9081a200241c8096a200110c40420022802c809450d0120022802d009211220022903c8092105200b200241e0076a41e80110c9081a20024184046a200241f0056a41ec0110c9081a410521070c030b200f201010c3022011450d0620114198026c450d06200f102c0c060b200241e0076a10a201200f201010c3022011450d0520114198026c450d05200f102c0c050b200241086a200110c5042002290308a70d0420022903102105200241f0056a200110a00120022903f0054205510d04200241c8096a200241f0056a41e80110c9081a200241f0056a200110c30420022802f005220f450d0220022802f805211020022802f405211120022802c809211220024184046a200c41e40110c9081a410621070b20024198026a20024184046a41ec0110c9081a0b2002412c6a20024198026a41ec0110c9081a024020082002280224470d00200241206a200810950520022802282108200228022021060b200620084188026c6a2204200f36020420042007360200200441186a2012360200200441106a20053702002004410c6a2010360200200441086a20113602002004411c6a2002412c6a41ec0110c9081a2002200841016a22083602282003417f6a2203450d070c010b0b200241c8096a10a2010b20024198026a20024184046a41ec0110c9081a0c010b20024198026a20024184046a41ec0110c9081a0b2000410036020020022802202106200228022421040c050b103b000b1039000b200128020421070b2000200229032037020020012007417f6a360204200041086a200241206a41086a2802003602000c020b200041003602000b2006200810c4022006410020041b2201450d0020044188026c450d002001102c0b200241b00b6a24000be20404047f017e037f017e02400240200128020022022802042203450d00200228020022042d0000210520022003417f6a3602042002200441016a3602000240200541037122024103460d00024002400240024020020e03000102000b2005410276ad21060c020b200128020022012802042202450d03200128020022032d0000210420012002417f6a360204410121022001200341016a3602002004410874200572220141ffff0371418002490d04200141fcff0371410276ad21060c010b41012102024020012802002201280204220341034f0d000c040b2001280200220441026a2d0000210720042f000021082001200441036a36020020012003417d6a3602042008200741107472410874200572220141808004490d032001410276ad21060b410021020c020b024002400240200541027622090e050002020201020b2001280200220228020422014104490d0220022802002205350000210620022001417c6a3602042002200541046a36020020064280808080045421020c030b2001280200220228020422014108490d012002280200220529000021062002200141786a3602042002200541086a3602002006428080808080808080015421020c020b200541134b0d00200941046a2108410021034200210641012102034002402001280200220528020422040d000c030b20052802002207310000210a20052004417f6a3602042005200741016a360200200a2003410374413871ad862006842106200341016a22052103200541ff01712008490d000b2006427f412820094103746b413871ad885821020c010b410121020b2000200637030820002002ad3703000b8e0202057f017e230041106b22022400200241086a200110b003024002402002280208450d00200041003602000c010b0240200128020022032802042204200228020c2205490d00024002402005417f4c0d000240024020050d00410121060c010b200510372206450d022001280200220328020421040b0240024020042005490d0020062003280200200510c90821012003280204220420054f0d01200520044194afc0001058000b2006410020051b2201450d032005450d032001102c0c030b2003200420056b3602042003200328020020056a3602002001450d0220002005ad2207422086200784370204200020013602000c030b103b000b1039000b200041003602000b200241106a24000b8c0201047f230041206b2202240020024100360208200242013703002002200110c8040240412010322203450d002002422037021420022003360210200241106a41004120102f20022802102204200228021822056a220320012900e401370000200341086a200141ec016a290000370000200341106a200141f4016a290000370000200341186a200141fc016a2900003700002002200541206a2201360218200220022802082001102f200228020020022802086a2004200110c9081a2002200228020820016a220136020802402002280214450d002004102c200228020821010b200020022802002001109a0102402002280204450d002002280200102c0b200241206a24000f0b1039000bb30801057f230041106b22022400200128020021032000200041086a22042802004104102f200028020020042802006a20033600002004200428020041046a3602000240412010322203450d002002422037020420022003360200200241004120102f20022802002205200228020822066a22032001290004370000200341086a2001410c6a290000370000200341106a200141146a290000370000200341186a2001411c6a2900003700002002200641206a2203360208200020042802002003102f200028020020042802006a2005200310c9081a2004200428020020036a220336020002402002280204450d002005102c200041086a28020021030b200020034120102f2000280200200041086a22042802006a22032001290024370000200341186a2001413c6a290000370000200341106a200141346a290000370000200341086a2001412c6a2900003700002004200428020041206a360200412010322203450d002002422037020420022003360200200241004120102f20022802002205200228020822066a22032001290044370000200341086a200141cc006a290000370000200341106a200141d4006a290000370000200341186a200141dc006a2900003700002002200641206a2203360208200020042802002003102f200028020020042802006a2005200310c9081a2004200428020020036a36020002402002280204450d002005102c0b412010322204450d002002422037020420022004360200200241004120102f20022802002205200228020822036a22042001290064370000200441086a200141ec006a290000370000200441106a200141f4006a290000370000200441186a200141fc006a2900003700002002200341206a22043602082000200041086a22032802002004102f200028020020032802006a2005200410c9081a2003200328020020046a36020002402002280204450d002005102c0b412010322204450d002002422037020420022004360200200241004120102f20022802002205200228020822036a2204200129008401370000200441086a2001418c016a290000370000200441106a20014194016a290000370000200441186a2001419c016a2900003700002002200341206a22033602082000200041086a22042802002003102f200028020020042802006a2005200310c9081a2004200428020020036a220336020002402002280204450d002005102c200428020021030b2000200341c000102f200028020020042802006a220020012900a401370000200041386a200141dc016a290000370000200041306a200141d4016a290000370000200041286a200141cc016a290000370000200041206a200141c4016a290000370000200041186a200141bc016a290000370000200041106a200141b4016a290000370000200041086a200141ac016a2900003700002004200428020041c0006a360200200241106a24000f0b1039000b2c0020002002ad4220862001ad8410102201290000370000200041086a200141086a2900003700002001102c0bd10201027f0240024002400240200141c000490d00200141808001490d012001418080808004490d022002200241086a22032802004101102f200228020020032802006a41033a00002003200328020041016a2204360200200220044104102f200228020020032802006a20013600002003200328020041046a22043602000c030b2002200241086a22032802004101102f200228020020032802006a20014102743a00002003200328020041016a22043602000c020b2002200241086a22032802004102102f200228020020032802006a20014102744101723b00002003200328020041026a22043602000c010b2002200241086a22032802004104102f200228020020032802006a20014102744102723600002003200328020041046a22043602000b200220042001102f2002280200200241086a22022802006a2000200110c9081a2002200228020020016a3602000be90802057f027e230041c0006b220241003a001802400240024020012802042203450d00200128020022042d0000210520012003417f6a2206360204200241013a00182001200441016a360200200220053a000820060d01200041013a00000c020b200041013a00000f0b200128020022042d0000210520012003417e6a22063602042001200441016a360200200241023a0018200220053a0009024002400240024002400240024002400240024002400240024002402006450d00200128020022042d0000210520012003417d6a22063602042001200441016a360200200241033a0018200220053a000a2006450d01200128020022042d0000210520012003417c6a22063602042001200441016a360200200241043a0018200220053a000b2006450d02200128020022042d0000210520012003417b6a22063602042001200441016a360200200241053a0018200220053a000c2006450d03200128020022042d0000210520012003417a6a22063602042001200441016a360200200241063a0018200220053a000d2006450d04200128020022042d000021052001200341796a22063602042001200441016a360200200241073a0018200220053a000e2006450d05200128020022042d000021052001200341786a22063602042001200441016a360200200241083a0018200220053a000f2006450d06200128020022042d000021052001200341776a22063602042001200441016a360200200241093a0018200220053a00102006450d07200128020022042d000021052001200341766a22063602042001200441016a3602002002410a3a0018200220053a00112006450d08200128020022042d000021052001200341756a22063602042001200441016a3602002002410b3a0018200220053a00122006450d09200128020022042d000021052001200341746a22063602042001200441016a3602002002410c3a0018200220053a00132006450d0a200128020022042d000021052001200341736a22063602042001200441016a3602002002410d3a0018200220053a00142006450d0b200128020022042d000021052001200341726a22063602042001200441016a3602002002410e3a0018200220053a00152006450d0c200128020022042d000021052001200341716a22063602042001200441016a3602002002410f3a0018200220053a00162006450d0d200128020022042d000021052001200341706a3602042001200441016a360200200220053a0017200241103a0018200241206a41086a200241086a41086a2903002207370300200220022903082208370320200041096a200737000020002008370001200041003a00000f0b200041013a00000c0d0b200041013a00000c0c0b200041013a00000c0b0b200041013a00000c0a0b200041013a00000c090b200041013a00000c080b200041013a00000c070b200041013a00000c060b200041013a00000c050b200041013a00000c040b200041013a00000c030b200041013a00000c020b200041013a00000c010b200041013a00000b200241003a00180bc90c07047f027e067f027e077f017e017f230041f0016b220324002002412c6a2802002104200241306a28020021052002280228210620022903002107200341186a200241206a290000370300200341106a200241186a290000370300200341086a200241106a29000037030020032002290008370300024002402005ad42d8007e2208422088a70d002008a72202417f4c0d0002400240024020020d00410821090c010b200210322209450d010b200241d8006e210a024020050d004100210b0c030b200620054105746a210c20034188016a41046a210d4100210b2006210e0340200e41086a2900002108200e41106a290000210f200e2900002110200341206a41186a2211200e41186a290000370300200341206a41106a2212200f370300200341206a41086a2213200837030020032010370320200b41d8006c2102200e41206a210e200921050240024003402002450d01200541346a2214200341206a460d02200241a87f6a2102200541d8006a21052014200341206a412010cc080d000c020b0b200128020022022802002215450d00200228020421160340201541346a210520152f013221174100210202400240034020172002460d01200341206a2005412010cc082214450d02200541206a2105200241016a21022014417f4a0d000b2002417f6a21170b2016450d022016417f6a2116201520174102746a4194036a28020021150c010b0b02400240024002400240024002400240200128020422052802082217201520024102746a41046a220228020022144d0d00200528020020144102746a28020022142802080d012014417f3602082014427f2014290330220820077c220f200f2008542205201441386a221729030022102005ad7c2218201054200f20085a1b22051b3703302017427f201820051b370300200341e0006a41186a22152011290300370300200341e0006a41106a22162012290300370300200341e0006a41086a2211201329030037030020032003290320370360200128020422052802082217200228020022024d0d02200528020020024102746a280200221728020041016a220241014d0d0320172002360200200d410041e40010cb081a41f80010322205450d0a2005410036020820054281808080103703002005410c6a20034188016a41e80010c9081a200541003a0074200520032f0085013b0075200541f7006a20034185016a41026a2d00003a0000200341c0006a41086a22122011290300370300200341c0006a41106a22112016290300370300200341c0006a41186a2216201529030037030020032003290360370340200b200a470d06200b41016a2202200b490d0b200b41017422152002201520024b1b22024104200241044b1bad42d8007e2208422088a722150d0b2008a722024100480d0b2015454103742113200b41d8006c2019200b1b211902400240024020094100200b1b22150d002002450d010c070b20190d0120020d060b201321090c060b201520192002103522090d050c070b2014201741c8a4c300103f000b41d4afc800411020034188016a41a8a4c30041d8a4c3001040000b2002201741e8a4c300103f000b00000b200210322209450d020b200241d8006e210a0b2009200b41d8006c6a2202420037030020022017360230200241186a4200370300200241106a4200370300200241086a4200370300200241206a4200370300200241286a4200370300200220032903403702342002413c6a2012290300370200200241c4006a2011290300370200200241cc006a201629030037020020052005280200417f6a2202360200024020020d00200541046a22022002280200417f6a220236020020020d002005102c0b200b41016a210b2014201428020841016a3602080c010b20130d020c030b200e200c460d030c000b0b1039000b103b000b0240200441ffffff3f71450d002006102c0b02400240200b450d00200042013703202000420037031020004200370308200020073703002000200a36023420002009360230200041286a4200370300200041186a4200370300200041386a200b3602002000413c6a2003290300370000200041c4006a200341086a290300370000200041cc006a200341106a290300370000200041d4006a200341186a2903003700000c010b2000410036023020094100200a1b2202450d00200a41d8006c450d002002102c0b200341f0016a24000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42187e2204422088a722020d022004a722014100480d022002454103742105024002400240024002402000280200410020031b22020d002001450d010c030b200341186c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141186e3602000b0f0b2005450d001039000b103b000bd80101047f024002400240200041046a28020020002802082201470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1b220241ffffffff017122042002470d02200241037422034100480d0220042002464102742104024002400240024002402000280200410020011b22020d002003450d010c030b200141037422010d0120030d020b200421010c020b200220012003103522010d010c030b200310322201450d020b20002001360200200041046a20034103763602000b0f0b2004450d001039000b103b000bd80101027f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1b220141ffffffff007122042001470d02200141047422024100480d0220042001464103742104024002400240024002402000280200410020031b22010d002002450d010c030b200341047422030d0120020d020b200421010c020b200120032002103522010d010c030b200210322201450d020b20002001360200200041046a20024104763602000b0f0b2004450d001039000b103b000bbb0101037f024002400240200041046a280200220220014f0d00200241017422032001200320014b1b22014104200141044b1b220420046a22012004490d0220014100480d02200120044f4101742104024002400240024002402000280200410020021b22020d002001450d010c030b20030d0120010d020b200421020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a20014101763602000b0f0b2004450d001039000b103b000bf50101057f230041106b22032400024002402002280208220441027441046a2205417f4c0d00200228020021020240024020050d00410121060c010b200510322206450d020b20034100360208200320053602042003200636020020032004108f010240024020040d0020032802002107200328020821040c010b2004410274210520032802082104034020022802002106200320044104102f20032802002207200328020822046a20063600002003200441046a2204360208200241046a21022005417c6a22050d000b0b200020012007200410a70202402003280204450d002007102c0b200341106a24000f0b103b000b1039000bd30101037f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1b220241ffffffff037122042002470d02200241027422034100480d0220042002464102742104024002400240024002402000280200410020011b22020d002003450d010c030b200141027422010d0120030d020b200421010c020b200220012003103522010d010c030b200310322201450d020b20002001360200200041046a20034102763602000b0f0b2004450d001039000b103b000bc3e0010a017f027e047f017e057f017e117f017e057f067e230041b00f6b2201240010d4044200210242002103024002400240024020004101460d0042002103200141800b6a41186a22044200370300200141800b6a41106a22054200370300200141800b6a41086a22064200370300200142003703800b200141c0076a41c7dcc700410410c5012006200141c0076a41086a2207290000370300200120012900c0073703800b200141a0096a41e8d6c500410b10c5012004200141a0096a41086a290000370300200520012900a009370300200141e8046a200141800b6a10cf0220012903f004210820012802e8042109200141b8056a41186a22044200370300200141b8056a41106a220a4200370300200141b8056a41086a22064200370300200142003703b80520014188056a41c7dcc700410410c501200620014188056a41086a220b29000037030020012001290088053703b805200141c80c6a41ccd5c500410a10c5012004200141c80c6a41086a220c290000370300200a20012900c80c370300200141d8046a200141b8056a10cf0220012802d804210d20012903e004210e20044200370300200a420037030020064200370300200142003703b80520014188056a41c7dcc700410410c5012006200b29000037030020012001290088053703b805200141c80c6a41bcd6c500410b10c5012004200c290000370300200a20012900c80c370300200141c8046a200141b8056a10cf0242002008420020091b220820012903d004420020012802c8041b200e42d8047e4200200d1b7c7d220e200e2008561b42d804540d0020014198056a41186a2204420037030020014198056a41106a220f420037030020014198056a41086a220642003703002001420037039805200141880d6a41ffdcc700410710c5012006200141880d6a41086a2209290000370300200120012900880d37039805200141880d6a41b8b3c300410c10c50120042009290000370300200f20012900880d370300200141c0046a20014198056a412010c60120012802c404211020012802c004211120044200370300200f4200370300200642003703002001420037039805200141880d6a41ffdcc700410710c50120062009290000370300200120012900880d37039805200141880d6a41dcb3c300410d10c50120042009290000370300200f20012900880d37030020014198056a412010dc02211210d50420044200370300200f4200370300200642003703002001420037039805200141c0076a41ffdcc700410710c50120062007290000370300200120012900c00737039805200141c0076a418893c700410a10c50120042007290000370300200f20012900c007370300200141880d6a20014198056a10e10120012802880d2204410120041b2113200129028c0d420020041b2208a721140240024002402008422088a72204450d002013200441057422096a2115200141880d6a41206a2106201321040340200141b8056a41186a2207200441186a220b290000370300200141b8056a41106a220c200441106a220d290000370300200141b8056a41086a2216200441086a2217290000370300200120042900003703b80520172900002108200d29000021032004290000210e200141c80c6a41186a220d200b290000370300200141c80c6a41106a220b2003370300200141c80c6a41086a221720083703002001200e3703c80c200141880d6a41186a2007290300370300200141880d6a41106a200c290300370300200141880d6a41086a2016290300370300200120012903b8053703880d200141800b6a200141880d6a10a304200141e80c6a41186a220c200141800b6a41186a290300370300200141e80c6a41106a2216200141800b6a41106a290300370300200141e80c6a41086a2218200141800b6a41086a290300370300200120012903800b3703e80c20012802a00b210720012802a40b211920012802a80b211a20012802ac0b211b20014198056a41186a221c200d29030037030020014198056a41106a220d200b29030037030020014198056a41086a220b2017290300370300200120012903c80c3703980502402007450d00200620012903e80c370300200641186a200c290300370300200641106a2016290300370300200641086a2018290300370300200141a0096a41206a2006290300370300200141a0096a41186a201c290300370300200141a0096a41106a200d290300370300200141a0096a41086a200b290300370300200141a0096a41386a200141880d6a41386a290300370300200141a0096a41306a200141880d6a41306a290300370300200141a0096a41286a200141880d6a41286a29030037030020012001290398053703a0092019211d201a211e201b211f0b20070d02200441206a2104200941606a22090d000b0b02402014450d00201441ffffff3f71450d002013102c0b4100210d4108210b410421044100211f0c010b200141e0056a41386a200141a0096a41386a2903002208370300200141e0056a41306a200141a0096a41306a2903002203370300200141e0056a41286a200141a0096a41286a290300220e370300200141e0056a41206a200141a0096a41206a2903002220370300200141c0076a41086a220b200141a0096a41086a290300370300200141c0076a41106a220c200141a0096a41106a290300370300200141c0076a41186a220d200141a0096a41186a290300370300200141c0076a41206a22162020370300200141c0076a41286a2217200e370300200141c0076a41306a22182003370300200141c0076a41386a22192008370300200120012903a0093703c00741d00010322221450d02202120012903c0073703002021201f36024c2021201e3602482021201d36024420212007360240202141386a2019290300370300202141306a2018290300370300202141286a2017290300370300202141206a2016290300370300202141186a200d290300370300202141106a200c290300370300202141086a200b290300370300200142818080801037028c0520012021360288050240024020094120470d004101211f0c010b200441206a210b201541606a21224101211f0340200b21040340200141b8056a41186a2207200441186a2209290000370300200141b8056a41106a220b200441106a220c290000370300200141b8056a41086a220d200441086a2216290000370300200120042900003703b805200141c80c6a41186a22172009290000370300200141c80c6a41106a2209200c290000370300200141c80c6a41086a220c2016290000370300200120042900003703c80c200141880d6a41186a221c2007290300370300200141880d6a41106a221d200b290300370300200141880d6a41086a221e200d290300370300200120012903b8053703880d200141800b6a200141880d6a10a304200141e80c6a41186a220b200141800b6a41186a290300370300200141e80c6a41106a220d200141800b6a41106a290300370300200141e80c6a41086a2216200141800b6a41086a290300370300200120012903800b3703e80c20012802a00b210720012802a40b211820012802a80b211920012802ac0b211a20014198056a41186a221b201729030037030020014198056a41106a2217200929030037030020014198056a41086a2209200c290300370300200120012903c80c3703980502402007450d00200620012903e80c370300200641186a200b290300370300200641106a200d290300370300200641086a2016290300370300200141a0096a41206a200141880d6a41206a290300370300200141a0096a41186a201b290300370300200141a0096a41106a2017290300370300200141a0096a41086a2009290300370300200141a0096a41386a200141880d6a41386a290300370300200141a0096a41306a200141880d6a41306a290300370300200141a0096a41286a200141880d6a41286a29030037030020012001290398053703a0092018212320192124201a21250b024020070d002015200441206a2204470d010c030b0b200141e0056a41386a200141a0096a41386a2903002208370300200141e0056a41306a200141a0096a41306a2903002203370300200141e0056a41286a200141a0096a41286a290300220e370300200141e0056a41206a200141a0096a41206a2903002220370300200141c0076a41086a2209200141a0096a41086a290300370300200141c0076a41106a220b200141a0096a41106a290300370300200141c0076a41186a220c200141a0096a41186a290300370300200141c0076a41206a220d2020370300200141c0076a41286a2216200e370300200141c0076a41306a22172003370300200141c0076a41386a22182008370300200120012903a0093703c007200141880d6a41386a22192018290300370300200141880d6a41306a22182017290300370300200141880d6a41286a22172016290300370300200141880d6a41206a2216200d290300370300201c200c290300370300201d200b290300370300201e2009290300370300200120012903c0073703880d0240201f200128028c05470d0020014188056a201f410110d60420012802880521210b200441206a210b201e2903002108201d2903002103201c290300210e2016290300212020172903002126201829030021272019290300212820012903880d21292021201f41d0006c6a2209202536024c20092024360248200920233602442009200736024020092029370300200941386a2028370300200941306a2027370300200941286a2026370300200941206a2020370300200941186a200e370300200941106a2003370300200941086a20083703002001201f41016a221f3602900520222004470d000b0b02402014450d00201441ffffff3f71450d002013102c0b201f41d0006c4104722204417f4c0d03200128028c05210d200128028805210b0b200410322206450d012010410020111b210c200141003602a809200120043602a409200120063602a009200141a0096a201f108f010240201f450d00200b201f41d0006c6a2109200b21040340200141a0096a20012802a8094120102f20012802a00920012802a80922076a22062004290000370000200641086a200441086a290000370000200641106a200441106a290000370000200641186a200441186a2900003700002001200741206a3602a809200441206a200141a0096a10f8032009200441d0006a2204470d000b0b20012802a809210620012802a0092107200141003602900d200142013703880d2001200c3602c007200141880d6a4100411710c80120012802880d20012802900d22096a220441126a412f3a0000200441106a41e1d8013b00002004410c6a41efe4a59b06360000200441086a41e8d2cda307360000200441136a20012d00c0073a0000200441146a20012d00c1073a0000200441156a20012d00c2073a0000200441166a20012d00c3073a0000200442f3cacd9b97ed9bb7df003700002001200941176a22043602900d200128028c0d210920012802880d221620042007200610d70402402009450d002016102c0b024020012802a409450d0020012802a009102c0b0240201f450d00201f41d0006c2106200b41c0006a210403400240200441046a2802002207450d00200741306c450d002004280200102c0b200441d0006a2104200641b07f6a22060d000b0b0240200d450d00200b450d00200d41d0006c450d00200b102c0b200141800b6a41186a4200370300200141800b6a41106a4200370300200141800b6a41086a22044200370300200142003703800b200141880d6a41e6dcc700410710c5012004200141880d6a41086a2207290000370300200120012900880d3703800b200141880d6a4188bbc200410910c501200541086a2007290000370000200520012900880d370000200141880d6a200141800b6a10cb03024020012903880d22084202510d00200141880d6a41106a280200210920012903900d210320014188056a41e6dcc700410710c501200141c80c6a41d0bbc200411510c5014101210b2001200941016a3602c007200141800b6a200141c0076a410410c701200141940d6a200141c0076a41046a3602002001200436028c0d2001200141c0076a3602900d2001200141800b6a3602880d200141a0096a200141880d6a107e20012802a809220441206a2206417f4c0d0302402006450d0020061032220b450d030b200141003602900d2001200636028c0d2001200b3602880d200141880d6a4100411010c80120012802880d20012802900d22066a220b200129008805370000200b41086a20014188056a41086a2900003700002001200641106a22063602900d200141880d6a2006411010c80120012802880d20012802900d22066a220b20012900c80c370000200b41086a200141c80c6a41086a2900003700002001200641106a220b3602900d20012802a0092106200141880d6a200b200410c80120012802880d220b20012802900d220d6a2006200410c9081a2001200d20046a22043602900d024020012802a409450d002006102c0b200141b8046a200b200410c60120012802bc04210620012802b80421040240200128028c0d450d00200b102c0b20044101470d002006200c41016a470d0020084201520d00200141b0056a4200370300200141a8056a420037030020014198056a41086a22044200370300200142003703980520014188056a41cbdcc700410910c501200420014188056a41086a290000370300200120012900880537039805200141c80c6a41f8d7c300410310c501200f41086a200141c80c6a41086a290000370000200f20012900c80c370000200141a8046a20014198056a10cf0220014198046a20012903b004420020012802a8041b220842e80780420042e807420010ce0820014188056a41e6dcc700410710c501200141c80c6a41a8bfc200410e10c501200120093602c007200141800b6a200141c0076a410410c701200141940d6a200141c0076a41046a3602002001200141800b6a41086a36028c0d200842e80782210e200129039804210820014198046a41086a29030021202001200141c0076a3602900d2001200141800b6a3602880d200141a0096a200141880d6a107e20012802a809220441206a2206417f4c0d030240024020060d004101210b0c010b20061032220b450d030b2008200e7c220e427f2020200e200854ad7c501b2108200141003602900d2001200636028c0d2001200b3602880d200141880d6a4100411010c80120012802880d20012802900d22066a220b200129008805370000200b41086a20014188056a41086a2900003700002001200641106a22063602900d200141880d6a2006411010c80120012802880d20012802900d22066a220b20012900c80c370000200b41086a200141c80c6a41086a2900003700002001200641106a220b3602900d20012802a0092106200141880d6a200b200410c80120012802880d220b20012802900d220d6a2006200410c9081a2001200d20046a22043602900d024020012802a409450d002006102c0b200820037d212020014180046a200b200410d30120014180046a41106a290300420020012802800422041b2103200129038804420020041b21260240200128028c0d450d00200b102c0b200141b0056a420037030020014198056a41106a420037030020014198056a41086a22044200370300200142003703980520014188056a41d4dcc700410810c501200420014188056a41086a290000370300200120012900880537039805200141c80c6a41bba8c700410d10c501200f41086a200141c80c6a41086a290000370000200f20012900c80c370000200141e8036a20014198056a412010d301200141d8036a20012903f003420020012802e80322041b220e200141e8036a41106a290300420020041b2208428094ebdc03420010c708200141c8036a200e2008428094ebdc03420010c808200820032026200e56200320085620032008511b22041b2103200e202620041b21282020428086ebc7f5002020428086ebc7f500541b420588428094ebdc037e4298ac9fd603802129200141c8036a41086a290300212641002106419ce0c700210420012903c803212720012903d8032120024002400340200141b8036a2027202620043502002208420010ce08202820012903b803220e202020087e2208428094ebdc0380a7417f2008428080808080c0b2cd3b541b2008428094ebdc03824280cab5ee01566aad7c2208542003200141b8036a41086a2903002008200e54ad7c22085420032008511b0d01200441086a2104200641016a22064125470d000b200141a8036a2027202642e8aafa0b420010ce08200141b0036a29030020012903a8032203202042e8aafa0b7e2208428094ebdc0380a72008428094ebdc03824280cab5ee01566aad7c2208200354ad7c21030c010b02402006417f6a220b20064d0d00200141b8026a2027202642c0f0f50b420010ce08200141c0026a29030020012903b80222032020422880a7202042c0f0f50b7e428094ebdc03824280cab5ee01566aad7c2208200354ad7c21030c010b02400240200b41244b0d0020014198036a20272026200b410374220d419ce0c7006a280200220bad2208420010ce08200141f8026a2028200129039803220e202020087e2208428094ebdc0380a7417f2008428080808080c0b2cd3b541b220641016a20062008428094ebdc03824280cab5ee01561bad7c22082028200856200320014198036a41086a2903002008200e54ad7c220e562003200e511b22061b222a2008202820061b22087d22282003200e20061b200e200320061b7d202a200854ad7d220e410020042802002216200b6b220b200b20164b1b220b4101200b41014b1bad2208420010c808200141c8026a200141f8026a41086a2903004200200441046a280200220b200d41a0e0c7006a2802002204200b20044b220d1b2004200b200d1b6bad2203420010ce08200141d8026a20012903f80242002003420010ce08200141e8026a2028200e2008420010c70820014188036a202720262004ad2228420010ce08427f427f200141d8026a41086a290300220e20012903c8027c222a20012903d002420052202a200e5472220d1b222a427f20012903d802200d1b220e20012903e80220037e2008807c2208200e54220dad7c2203200d2003202a542008200e5a1b220d1b212a427f2008200d1b210e20014188036a41086a290300200129038803222b202020287e2208428094ebdc0380a7417f2008428080808080c0b2cd3b541b2008428094ebdc03824280cab5ee01566aad7c2203202b54ad7c21082006200b20044d730d0142002008202a7d2003200e54ad7d22282003200e7d220e200356202820085620282008511b22041b21034200200e20041b21080c020b200b412541e8ebc400103f000b427f2008202a7c2003200e7c220e2003542204ad7c22032004200320085420032008511b22041b2103427f200e20041b21080b200141a8026a20082003428094ebdc03420010c70820014198026a20082003428094ebdc03420010c80820014188026a20012903980220014198026a41086a2903002029420010ce08200141f8016a202720264280c2d72f420010ce08200141e8016a20012903f80122032020420a80a720204280c2d72f7e428094ebdc03824280cab5ee01566aad7c2208200141f8016a41086a2903002008200354ad7c2203428094ebdc03420010c708200141d8016a20082003428094ebdc03420010c808200141c8016a20012903d801200141d8016a41086a2903002029420010ce08200141940d6a22042009360200200141880d6a41086a41003a0000200141980d6a2001290388022203202920012903a8027e2208428094ebdc0380a72008428094ebdc03824280cab5ee01566aad7c2208370300200141a00d6a20014188026a41086a2903002008200354ad7c2203370300200141b00d6a4200200141c8016a41086a29030020012903c8012220202920012903e8017e220e428094ebdc0380a7200e428094ebdc03824280cab5ee01566aad7c220e202054ad7c222020037d200e200854ad7d2226200e20087d2227200e56202620205620262020511b22061b2226370300200141880d6a41206a4200202720061b2227370300200141033602880d200141880d6a10c80220014188056a41e6dcc700410710c501200141c80c6a41acbec200411310c501200120093602c007200141e80c6a200141c0076a410410c7012004200141c0076a41046a3602002001200141e80c6a41086a36028c0d2001200141c0076a3602900d2001200141e80c6a3602880d200141a0096a200141880d6a107e20012802a809220441206a2206417f4c0d030240024020060d00410121090c010b200610322209450d030b200141003602c807200120063602c407200120093602c007200141c0076a4100411010c80120012802c00720012802c80722066a2209200129008805370000200941086a20014188056a41086a2900003700002001200641106a22063602c807200141c0076a2006411010c80120012802c00720012802c80722066a220920012900c80c370000200941086a200141c80c6a41086a2900003700002001200641106a22093602c80720012802a0092106200141c0076a2009200410c80120012802c007220920012802c807220b6a2006200410c9081a2001200b20046a22043602c807024020012802a409450d002006102c0b200120033703900d200120083703880d20092004200141880d6a411010a702024020012802c407450d002009102c0b024002400240200e200856202020035620202003511b0d00200142003703a809200142003703a0090c010b20014198056a41186a2209420037030020014198056a41106a220b420037030020014198056a41086a22044200370300200142003703980520014188056a41d4dcc700410810c501200420014188056a41086a220d290000370300200120012900880537039805200141c80c6a41bba8c700410d10c501200f41086a2216200141c80c6a41086a2217290000370000200f20012900c80c370000200141b0016a20014198056a412010d301200141b0016a41106a290300210820012903b801210320012802b001210620094200370300200b420037030020044200370300200142003703980520014188056a41d4dcc700410810c5012004200d290000370300200120012900880537039805200141c80c6a41bba8c700410d10c50120162017290000370000200f20012900c80c3700002001427f2008420020061b220820267c2003420020061b220320277c22202003542204ad7c220e2004200e200854200e2008511b22041b3703900d2001427f202020041b3703880d20014198056a4120200141880d6a411010a70220012008427f85202620041b220e3703a80920012003427f85202720041b22083703a0092008200e844200520d010b200141e00c6a22044200370300200141c80c6a41106a22064200370300200141c80c6a41086a22094200370300200142003703c80c200141c0076a41d4dcc700410810c5012009200141c0076a41086a220b290000370300200120012900c0073703c80c200141c0076a41bba8c700410d10c5012004200b290000370300200620012900c00737030020014180016a200141c80c6a412010d30120014180016a41106a29030021082001290388012103200128028001210d200442003703002006420037030020094200370300200142003703c80c200141c0076a41d4dcc700410810c5012009200b290000370300200120012900c0073703c80c200141c0076a41bba8c700410d10c5012004200b290000370300200620012900c007370300200120084200200d1b3703900d200120034200200d1b3703880d200141c80c6a4120200141880d6a411010a7020c010b200141b8056a41186a22094200370300200141b8056a41106a220b4200370300200141b8056a41086a22044200370300200142003703b805200141c0076a41d4dcc700410810c5012004200141c0076a41086a220d290000370300200120012900c0073703b805200141a0096a41bba8c700410d10c501200a41086a2216200141a0096a41086a2217290000370000200a20012900a00937000020014198016a200141b8056a412010d30120014198016a41106a290300210320012903a0012120200128029801210620094200370300200b420037030020044200370300200142003703b805200141c0076a41d4dcc700410810c5012004200d290000370300200120012900c0073703b805200141a0096a41bba8c700410d10c50120162017290000370000200a20012900a009370000200142002003420020061b2203200e7d2020420020061b220e200854ad7d2220200e20087d2208200e56202020035620202003511b22041b3703900d20014200200820041b3703880d200141b8056a4120200141880d6a411010a7020b20014198056a41186a420037030020014198056a41106a420037030020014198056a41086a220442003703002001420037039805200141880d6a41ffdcc700410710c50120042007290000370300200120012900880d37039805200141880d6a4188a5c300410a10c501200f41086a2007290000370000200f20012900880d370000200141203602dc05200120014198056a3602d805200141a00f6a20014198056a412010b3010240024020012802a00f220b0d00410021090c010b20012802a40f210d2001200141a80f6a2802003602fc042001200b3602f804200141f8006a200141f8046a1087020240024020012802780d00200128027c221620012802fc0441e0016e2204200420164b1bad42e0017e2208422088a70d052008a72204417f4c0d050240024020040d00410121090c010b200410322209450d050b200141003602900520012009360288052001200441e0016e36028c050240024002402016450d00200141880d6a41206a2119200141800b6a410172211a4100211841002117034041002106200141003a00a00b20012802fc04417f6a2104201741016a21170340200141003a00e80c2004417f460d03200141800b6a20066a20012802f80422072d00003a00002001200741016a3602f8042001200641016a22073a00a00b200120043602fc042004417f6a21042007210620074120470d000b200141e80c6a41186a2204200141800b6a41186a290300370300200141e80c6a41106a2206200141800b6a41106a290300370300200141e80c6a41086a221b200141800b6a41086a290300370300200120012903800b3703e80c200741ff01714120490d03200141b8056a41086a2207201b290300370300200141b8056a41106a221b2006290300370300200141b8056a41186a22062004290300370300200120012903e80c3703b805200141800b6a200141f8046a10d80420012d00800b4101460d03200141880d6a41186a2006290300370300200141880d6a41106a201b290300370300200141880d6a41086a2007290300370300200120012903b8053703880d2019201a41c00110c9081a200141a0096a200141880d6a41e00110c9081a200141c0076a200141a0096a41e00110c9081a200141e0056a200141c0076a41e00110c9081a02402018200128028c05470d0020014188056a2018410110d904200128028805210920012802900521180b2009201841e0016c6a200141e0056a41e00110c9081a2001201841016a22183602900520172016470d000b0b200129028c0521082009450d020c030b200641ff0171450d00200141003a00a00b0b0240200128028c052204450d00200441e0016c450d002009102c0b0b41002109200141003602a809200142013703a0092001410f3602c4072001200141d8056a3602c0072001200141a0096a3602e0052001419c0d6a41013602002001420137028c0d200141b4bcc3003602880d2001200141c0076a3602980d200141e0056a41dcb7c000200141880d6a103e1a20013502a80942208620013502a00984100020012802a409450d0020012802a009102c0b200d450d00200b102c0b2001410036028005200142013703f804200141f8046a41002008420020091b2203422088a7222110d601202141e0016c21102009410120091b2115200128028005210720012802f804211302402021450d00201320074105746a21042010210920152106034020042006290000370000200441186a200641186a290000370000200441106a200641106a290000370000200441086a200641086a290000370000200741016a2107200441206a2104200641e0016a2106200941a07e6a22090d000b0b2001200736028005200141b0056a4200370300200141a8056a420037030020014198056a41086a220442003703002001420037039805200141880d6a41ffdcc700410710c5012004200141880d6a41086a2206290000370300200120012900880d37039805200141880d6a418893c700410a10c501200f41086a2006290000370000200f20012900880d37000020074105744104722204417f4c0d02200410322206450d01201241ff0171220d4102472116200141003602900d2001200436028c0d200120063602880d200141880d6a2007108f010240024020070d0020012802880d210b20012802900d21060c010b2007410574210720012802900d2106201321040340200141880d6a20064120102f20012802880d220b20012802900d22096a22062004290000370000200641086a200441086a290000370000200641106a200441106a290000370000200641186a200441186a2900003700002001200941206a22063602900d200441206a2104200741606a22070d000b0b200d201671212420014198056a4120200b200610a7020240200128028c0d450d00200b102c0b02402024450d00200141b0056a4200370300200141a8056a420037030020014198056a41086a220442003703002001420037039805200141880d6a41ffdcc700410710c5012004200141880d6a41086a2206290000370300200120012900880d37039805200141880d6a41ccb4c300411210c501200f41086a2006290000370000200f20012900880d370000200141880d6a20014198056a10da0420012802880d2204450d0020014198056a412010b401200128028c0d2206450d00200641ffffffff0371450d002004102c0b20014198056a41186a420037030020014198056a41106a420037030020014198056a41086a220442003703002001420037039805200141880d6a41ffdcc700410710c5012004200141880d6a41086a2206290000370300200120012900880d37039805200141880d6a41b8b3c300410c10c501200f41086a2006290000370000200f20012900880d3700002001200c41016a22233602880d20014198056a4120200141880d6a410410a702200141b8056a41186a4200370300200141b8056a41106a4200370300200141b8056a41086a22044200370300200142003703b805200141c0076a41e6dcc700410710c5012004200141c0076a41086a290000370300200120012900c0073703b805200141a0096a4188bbc200410910c501200a41086a200141a0096a41086a290000370000200a20012900a009370000200141880d6a200141b8056a10cb030240024020012903880d4202510d00200141880d6a41106a28020041016a21040c010b410021040b20014188056a41e6dcc700410710c501200141c80c6a41d0bbc200411510c501200120043602c007200141e80c6a200141c0076a410410c701200141940d6a200141c0076a41046a3602002001200141f00c6a221136028c0d2001200141c0076a3602900d2001200141e80c6a3602880d200141a0096a200141880d6a107e20012802a809220441206a2206417f4c0d020240024020060d00410121070c010b200610322207450d020b200141003602900d2001200636028c0d200120073602880d200141880d6a4100411010c80120012802880d20012802900d22066a2207200129008805370000200741086a20014188056a41086a2900003700002001200641106a22063602900d200141880d6a2006411010c80120012802880d20012802900d22066a220720012900c80c370000200741086a200141c80c6a41086a2900003700002001200641106a22073602900d20012802a0092106200141880d6a2007200410c80120012802880d220720012802900d22096a2006200410c9081a2001200920046a22043602900d024020012802a409450d002006102c0b200141f0006a2007200410c60120012802742106200128027021040240200128028c0d450d002007102c0b024020044101470d00024020062023460d00200620234f0d0141aa85c300ad428080808080068410000b2023109e040b200141980b6a4200370300200141900b6a4200370300200141800b6a41086a22044200370300200142003703800b200141880d6a41ffdcc700410710c5012004200141880d6a41086a2206290000370300200120012900880d3703800b200141880d6a41afaec000410b10c501200541086a2006290000370000200520012900880d370000200141a0096a200141800b6a412010a004200c41026a211f0240024020012802a0094101470d0020013502a40921080c010b201fad220842208620088421080b2001200842ffffffff0f83200c41036aad422086843702a409200141013602a009200141800b6a41186a4200370300200141800b6a41106a4200370300200141800b6a41086a22044200370300200142003703800b200141880d6a41ffdcc700410710c5012004200141880d6a41086a2206290000370300200120012900880d3703800b200141880d6a41afaec000410b10c501200541086a2006290000370000200520012900880d370000200141800b6a4120200141a0096a41047210a104200141b8056a41186a4200370300200141b8056a41106a4200370300200141b8056a41086a22044200370300200142003703b805200141c0076a41e6dcc700410710c5012004200141c0076a41086a2206290000370300200120012900c0073703b805200141a0096a41ccbac200410a10c501200a41086a200141a0096a41086a290000370000200a20012900a009370000200141e8006a200141b8056a412010c6010240024020012802684101460d0020014198056a201f1093040c010b200128026c210420014188056a41e6dcc700410710c501200141c80c6a41d0bbc200411510c501200120043602e005200141c0076a200141e0056a410410c701200141940d6a200141e0056a41046a3602002001200636028c0d2001200141e0056a3602900d2001200141c0076a3602880d200141a0096a200141880d6a107e20012802a809220441206a2206417f4c0d030240024020060d00410121070c010b200610322207450d030b200141003602900d2001200636028c0d200120073602880d200141880d6a4100411010c80120012802880d20012802900d22066a2207200129008805370000200741086a20014188056a41086a2900003700002001200641106a22063602900d200141880d6a2006411010c80120012802880d20012802900d22066a220720012900c80c370000200741086a200141c80c6a41086a2900003700002001200641106a22073602900d20012802a0092106200141880d6a2007200410c80120012802880d220720012802900d22096a2006200410c9081a2001200920046a22043602900d024020012802a409450d002006102c0b200141e0006a2007200410c60120012802642106200128026021040240200128028c0d450d002007102c0b024020040d0041c983c300ad4280808080e006841000410021060b200141d0056a22094200370300200141c8056a220b4200370300200141b8056a41086a22044200370300200142003703b805200141c0076a41e6dcc700410710c5012004200141c0076a41086a220c290000370300200120012900c0073703b805200141a0096a41d8bfc200410810c501200a41086a220d200141a0096a41086a2216290000370000200a20012900a0093700004100201f20066b22062006201f4b1b21070240024002400240024002404100200141b8056a108d042206200641ff01714104461b41ff01710e0400020103010b200741064f0d020b20074105460d0220074106490d031098040c030b20094200370300200b420037030020044200370300200142003703b805200141c0076a41e6dcc700410710c5012004200c290000370300200120012900c0073703b805200141a0096a41d8bfc200410810c501200d2016290000370000200a20012900a009370000200141b8056a412010b4010b20014198056a201f1093040c020b200141d0056a4200370300200141c8056a4200370300200141b8056a41086a22044200370300200142003703b805200141c0076a41e6dcc700410710c5012004200141c0076a41086a290000370300200120012900c0073703b805200141a0096a41bcc6c200411510c501200a41086a200141a0096a41086a290000370000200a20012900a009370000200141013a00e80c200141b8056a4120200141e80c6a410110a7020b20014100360298050b02400240024002400240024002400240024020012802980522140d00200141003602a00f0c010b200141b8056a41186a4200370300200141b8056a41106a4200370300200141b8056a41086a22044200370300200142003703b805200141c0076a41e6dcc700410710c5012004200141c0076a41086a221b290000370300200120012900c0073703b805200141a0096a41ccbac200410a10c501200a41086a200141a0096a41086a221d290000370000200a20012900a009370000200141d8006a200141b8056a412010c601200141a00f6a41086a22064100360200200142083703a00f200128025c210720012802582109200128029c052125200141a00f6a410020014198056a41086a280200220410d6042006280200210b02402004450d002007410020091b211e2004410574210c20012802a00f200b41d0006c6a2104200141880d6a41206a2107201421060340200141e0056a41186a220d200641186a290000370300200141e0056a41106a2216200641106a290000370300200141e0056a41086a2217200641086a290000370300200120062900003703e005200141800b6a201e200141e0056a10da03200141a0096a20012802800b221a20012802880b10a404200141e80c6a41186a2218200141a0096a41186a290300370300200141e80c6a41106a2219200141a0096a41106a290300370300200141e80c6a41086a2205201d290300370300200120012903a0093703e80c0240024020012802c00922090d00200141c0076a41186a4200370300200141c0076a41106a420037030041082109200141c0076a41086a4200370300200142003703c00741002118410021190c010b201b2005290300370300200141c0076a41106a2019290300370300200141c0076a41186a2018290300370300200120012903e80c3703c00720012802c409211820012802c809211920012802cc09211c0b024020012802840b450d00201a102c0b200641206a2106200720012903c007370300200141880d6a41086a221a2017290300370300200141880d6a41106a22172016290300370300200141880d6a41186a2216200d290300370300200741186a200141c0076a41186a290300370300200741106a200141c0076a41106a290300370300200741086a201b290300370300200120012903e0053703880d200441386a200141880d6a41386a290300370300200441306a200141880d6a41306a290300370300200441286a200141880d6a41286a290300370300200441206a2007290300370300200441186a2016290300370300200441106a2017290300370300200441086a201a290300370300200420012903880d370300200441cc006a201c360200200441c8006a2019360200200441c4006a2018360200200441c0006a2009360200200441d0006a2104200b41016a210b200c41606a220c0d000b0b2001200b3602a80f02402025450d00202541ffffff3f71450d002014102c0b20012802a00f22040d010b200141003602b80520014188056a41ffdcc700410710c501200141c80c6a41ddecc400411210c50120014100201f417f6a22042004201f4b1b3602e80c200141800b6a200141e80c6a410410c701200141ac096a200141e80c6a41046a3602002001200141880b6a3602a4092001200141e80c6a3602a8092001200141800b6a3602a009200141c0076a200141a0096a107e20012802c807220441206a22064100480d0920060d01410121070c020b200141b8056a41086a22064100360200200142013703b805200141b8056a4100200141a00f6a41086a280200220b10d6012006280200210720012802b805211e0240200b41d0006c2209450d00201e20074105746a2106034020062004290000370000200641186a200441186a290000370000200641106a200441106a290000370000200641086a200441086a290000370000200741016a2107200641206a2106200441d0006a2104200941b07f6a22090d000b0b200120073602c00520012903a00f21082001200b3602a809200120083703a009200141880d6a200141a0096a10db0420012802880d4101470d02200129028c0d2108419eedc400ad4280808080f006841000200810000c050b200610322207450d060b200141003602e805200120063602e405200120073602e005200141e0056a4100411010c80120012802e00520012802e80522066a2207200129008805370000200741086a20014188056a41086a2900003700002001200641106a22063602e805200141e0056a2006411010c80120012802e00520012802e80522066a220720012900c80c370000200741086a200141c80c6a41086a2900003700002001200641106a22073602e80520012802c0072106200141e0056a2007200410c80120012802e005220720012802e80522096a2006200410c9081a2001200920046a22043602e805024020012802c407450d002006102c0b200141880d6a2007200410dc04200141a0096a41086a200141940d6a290200370300200141a0096a41106a2001419c0d6a290200370300200141a0096a41186a2204200141a40d6a2902003703002001200129028c0d3703a00920012802880d4101470d01200141ac0d6a2802002109200141c0076a41186a2004290300370300200141c0076a41106a2204200141a0096a41106a290300370300200141c0076a41086a2206200141a0096a41086a290300370300200120012903a0093703c007024020012802e405450d002007102c0b200141880d6a41186a200141c0076a41186a290300370300200141880d6a41106a2004290300370300200141880d6a41086a2006290300370300200120012903c0073703880d20014188056a41ffdcc700410710c501200141c80c6a41ddecc400411210c5012001201f3602e80c200141800b6a200141e80c6a410410c701200141ac096a200141e80c6a41046a3602002001200141800b6a41086a3602a4092001200141e80c6a3602a8092001200141800b6a3602a009200141e0056a200141a0096a107e20012802e805220441206a2206417f4c0d060240024020060d00410121070c010b200610322207450d060b200141003602880b200120063602840b200120073602800b200141800b6a4100411010c80120012802800b20012802880b22066a2207200129008805370000200741086a20014188056a41086a2900003700002001200641106a22063602880b200141800b6a2006411010c80120012802800b20012802880b22066a220720012900c80c370000200741086a200141c80c6a41086a2900003700002001200641106a22073602880b20012802e0052106200141800b6a2007200410c80120012802800b220720012802880b220b6a2006200410c9081a2001200b20046a220b3602880b024020012802e405450d002006102c0b410410322204450d05200142043702e405200120043602e005412010322204450d05200142203702a409200120043602a009200141a0096a41004120102f20012802a009220620012802a809220c6a220420012903880d370000200441086a200141880d6a41086a290300370000200441106a200141880d6a41106a290300370000200441186a200141880d6a41186a2903003700002001200c41206a22043602a809200141e0056a41002004102f20012802e00520012802e805220c6a2006200410c9081a2001200c20046a22043602e805024020012802a409450d002006102c0b200141e0056a20044104102f20012802e005220420012802e80522066a20093600002001200641046a22063602e8052007200b2004200610a702024020012802e405450d002004102c0b20012802840b450d022007102c0c020b200141a0096a200141880d6a41086a41f00010c9081a200141d8076a200141880a6a290300370300200141d0076a200141800a6a290300370300200141c0076a41086a200141f8096a290300370300200120012903f0093703c00720014188056a41ffdcc700410710c501200141c80c6a41ddecc400411210c5012001201f36029805200141e80c6a20014198056a410410c701200141ec056a20014198056a41046a360200200120113602e405200120014198056a3602e8052001200141e80c6a3602e005200141800b6a200141e0056a107e20012802880b220441206a2206417f4c0d050240024020060d00410121090c010b200610322209450d050b200141003602f00c200120063602ec0c200120093602e80c200141e80c6a4100411010c80120012802e80c20012802f00c22066a2209200129008805370000200941086a20014188056a41086a2900003700002001200641106a22063602f00c200141e80c6a2006411010c80120012802e80c20012802f00c22066a220920012900c80c370000200941086a200141c80c6a41086a2900003700002001200641106a22093602f00c20012802800b2106200141e80c6a2009200410c80120012802e80c220920012802f00c220c6a2006200410c9081a2001200c20046a220c3602f00c024020012802840b450d002006102c0b410410322204450d04200142043702840b200120043602800b412010322204450d04200142203702e405200120043602e005200141e0056a41004120102f20012802e005220620012802e805220d6a220420012903c007370000200441086a200141c0076a41086a290300370000200441106a200141c0076a41106a290300370000200441186a200141c0076a41186a2903003700002001200d41206a22043602e805200141800b6a41002004102f20012802800b20012802880b220d6a2006200410c9081a2001200d20046a22043602880b024020012802e405450d002006102c0b200141800b6a20044104102f20012802800b220420012802880b22066a200b3600002001200641046a22063602880b2009200c2004200610a702024020012802840b450d002004102c0b024020012802ec0c450d002009102c0b200141a0096a10dd040c020b20012802e405450d002007102c0b200141c0056a28020021074100211e0b20012802bc05211402400240201e0d00200141d0056a4200370300200141c8056a4200370300200141b8056a41086a22044200370300200142003703b80520014188056a41ffdcc700410710c501200420014188056a41086a29000037030020012001290088053703b805200141c80c6a418893c700410a10c501200a41086a200141c80c6a41086a290000370000200a20012900c80c370000200141880d6a200141b8056a10e101200129028c0d420020012802880d22041b21082004410120041b2111410021250c010b2007ad4220862014ad84210841012125201e21110b200141003602a005200142013703980520014198056a41002008422088a72204410574220c41057510d90420012802a00521160240024020040d002025211b0c010b201520106a211d200128029805201641e0016c6a210d200141880d6a41206a211c200141800b6a41a0016a2122200141800b6a4180016a2112200141800b6a41e0006a2110200141800b6a41c0006a211f200141800b6a41206a210a200141a0096a41017221052025211b2015210620112104034020062109200141e80c6a41186a2217200441186a290000370300200141e80c6a41106a2218200441106a290000370300200141e80c6a41086a2219200441086a290000370300200120042900003703e80c20014188056a41ffdcc700410710c501200141c80c6a4190b5c300410810c501200141c0076a200141e80c6a10e40220012802c807220641206a2207417f4c0d040240024020070d004101210b0c010b20071032220b450d040b200141003602c005200120073602bc052001200b3602b805200141b8056a4100411010c80120012802b80520012802c00522076a220b200129008805370000200b41086a20014188056a41086a2900003700002001200741106a22073602c005200141b8056a2007411010c80120012802b80520012802c00522076a220b20012900c80c370000200b41086a200141c80c6a41086a2900003700002001200741106a220b3602c00520012802c0072107200141b8056a200b200610c80120012802b805220b20012802c005221a6a2007200610c9081a2001201a20066a22063602c005024020012802c407450d002007102c0b200141a0096a200b200610e50220012d00a0092107200141c0076a200541c00110c9081a41002106024020074101470d00200141e0056a200141c0076a41c00110c9081a410121060b024020012802bc05450d00200b102c0b0240024020060d00200141800b6a41186a4200370300200141800b6a41106a4200370300200141800b6a41086a4200370300200142003703800b200a410041a00110cb081a0c010b200141800b6a200141e0056a41c00110c9081a0b02400240201b41ff0171450d00200921060c010b4100211b02402009201d470d00200921060c010b200941e0016a210602400240200141800b6a200941206a2207460d002007200141800b6a412010cc080d010b0240200a200941c0006a2207460d002007200a412010cc080d010b0240201f200941e0006a2207460d002007201f412010cc080d010b0240201020094180016a2207460d0020072010412010cc080d010b02402012200941a0016a2207460d0020072012412010cc080d010b2022200941c0016a2207460d0120072022412010cc08450d010b4101211b0b200441206a2104200141880d6a41186a2017290300370300200141880d6a41106a2018290300370300200141880d6a41086a2019290300370300200120012903e80c3703880d201c200141800b6a41c00110c9081a201641016a2116200d200141880d6a41e00110c90841e0016a210d200c41606a220c0d000b0b200120163602a00502402008a72204450d00200441ffffff3f71450d002011102c0b2016ad42e0017e2208422088a70d022008a72204417f4c0d02200128029c052105200128029805211a0240024020040d00410121060c010b200410322206450d020b200141003602a809200120063602a0092001200441e0016e3602a409200141a0096a4100201610d90420012802a80921170240024020160d0020012802a009211c0c010b201a201641e0016c6a211920012802a009221c201741e0016c6a2118200141880d6a41c0016a2106200141880d6a41a0016a2107200141880d6a4180016a2109200141880d6a41e0006a210b200141880d6a41c0006a210c200141880d6a41206a210d201a21040340200141880d6a41186a200441186a290000370300200141880d6a41106a200441106a290000370300200141880d6a41086a200441086a290000370300200120042900003703880d200d41186a200441386a290000370000200d41106a200441306a290000370000200d41086a200441286a290000370000200d200441206a290000370000200c200441c0006a290000370000200c41086a200441c8006a290000370000200c41106a200441d0006a290000370000200c41186a200441d8006a290000370000200b200441e0006a290000370000200b41086a200441e8006a290000370000200b41106a200441f0006a290000370000200b41186a200441f8006a290000370000200920044180016a290000370000200941086a20044188016a290000370000200941106a20044190016a290000370000200941186a20044198016a2900003700002007200441a0016a290000370000200741086a200441a8016a290000370000200741106a200441b0016a290000370000200741186a200441b8016a2900003700002006200441c0016a290000370000200641086a200441c8016a290000370000200641186a200441d8016a290000370000200641106a200441d0016a290000370000201741016a21172018200141880d6a41e00110c90841e0016a2118200441e0016a22042019470d000b0b200120173602a809200141b0056a4200370300200141a8056a420037030020014198056a41086a220442003703002001420037039805200141880d6a41ffdcc700410710c5012004200141880d6a41086a2206290000370300200120012900880d37039805200141880d6a4188a5c300410a10c501200f41086a2006290000370000200f20012900880d370000201741e0016c4104722204417f4c0d02200410322206450d01200141003602900d2001200436028c0d200120063602880d200141880d6a2017108f010240024020170d0020012802880d210920012802900d21060c010b201c201741e0016c6a210b20012802900d2106201c21040340200141880d6a20064120102f20012802880d20012802900d22076a22062004290000370000200641086a200441086a290000370000200641106a200441106a290000370000200641186a200441186a2900003700002001200741206a22063602900d200141880d6a20064120102f20012802880d20012802900d22076a2206200441206a290000370000200641086a200441286a290000370000200641106a200441306a290000370000200641186a200441386a2900003700002001200741206a22063602900d200141880d6a20064120102f20012802880d20012802900d22076a2206200441c0006a290000370000200641086a200441c8006a290000370000200641106a200441d0006a290000370000200641186a200441d8006a2900003700002001200741206a22063602900d200141880d6a20064120102f20012802880d20012802900d22076a2206200441e0006a290000370000200641086a200441e8006a290000370000200641106a200441f0006a290000370000200641186a200441f8006a2900003700002001200741206a22063602900d200141880d6a20064120102f20012802880d20012802900d22076a220620044180016a290000370000200641086a20044188016a290000370000200641106a20044190016a290000370000200641186a20044198016a2900003700002001200741206a22063602900d200141880d6a20064120102f20012802880d20012802900d22076a2206200441a0016a290000370000200641086a200441a8016a290000370000200641106a200441b0016a290000370000200641186a200441b8016a2900003700002001200741206a22063602900d200141880d6a20064120102f20012802880d220920012802900d22076a2206200441c0016a290000370000200641086a200441c8016a290000370000200641106a200441d0016a290000370000200641186a200441d8016a2900003700002001200741206a22063602900d200441e0016a2204200b470d000b0b20014198056a41202009200610a7020240200128028c0d450d002009102c0b024020012802a4092204450d00200441e0016c450d00201c102c0b200141b0056a4200370300200141a8056a420037030020014198056a41086a220442003703002001420037039805200141880d6a41ffdcc700410710c5012004200141880d6a41086a2206290000370300200120012900880d37039805200141880d6a41dcb3c300410d10c501200f41086a2006290000370000200f20012900880d3700002001201b3a00e80c20014198056a4120200141e80c6a410110a7022001202336028c0d200141053602880d200141880d6a10c802202420152021201a201610de0402402005450d00200541e0016c450d00201a102c0b02402025201e45720d00201441ffffff3f71450d00201e102c0b024020012802fc0441ffffff3f71450d002013102c0b02402003a72204450d00200441e0016c450d002015102c0b200141880d6a109b0120012903900d21030b20014198056a41186a2204420037030020014198056a41106a2206420037030020014198056a41086a220742003703002001420037039805200141880d6a41e6dcc700410710c5012007200141880d6a41086a2209290000370300200120012900880d37039805200141880d6a41a08ec100411110c50120042009290000370300200620012900880d370300200141d0006a20014198056a10890402402001280250417d710d00200141880d6a109b0120012903900d2202428094ebdc038242808c8d9e027e2208428094ebdc0380210e2008428094ebdc038221082002428094ebdc03802102200141800b6a1092020240024020012802880b22070d00420021020c010b200242808c8d9e027e200e20084280cab5ee0156ad7c7c210820012802800b210c2007417f6a210d41002109420021024100210b024002400340200c200b411c6c6a2104200b210602400240034020072006460d0402400240200220085a0d00200141c0006a2004280200200441086a2802002004410c6a280200200441146a280200200441186a28020010a4022001290340a7450d010b02402009450d00200620096b220b20074f0d04200141880d6a41186a22162004200941646c6a220b41186a2217280200360200200141880d6a41106a2218200b41106a2219290200370300200141880d6a41086a221a200b41086a221b2902003703002001200b2902003703880d200441086a221c290200210e200441106a22052902002120200441186a220f280200210a200b20042902003702002017200a36020020192020370200201b200e370200200f201628020036020020052018290300370200201c201a290300370200200420012903880d3702000c030b2004411c6a2104410021092007200641016a2206470d010c070b0b200941016a2109200220012903487c21020b200641016a210b200d2006460d030c010b0b200b200741e48ac500103f000b2007200741f48ac500103f000b2009450d0020072009490d00200c2007411c6c6a210b2001200720096b22043602880b200c2004411c6c6a21090340024020092802082204450d00200441e0006c2106200928020041d4006a210403400240200441706a2802002207450d00200741306c450d002004416c6a280200102c0b024020042802002207450d00200741ffffff3f71450d002004417c6a280200102c0b200441e0006a2104200641a07f6a22060d000b0b024020092802042204450d00200441e0006c450d002009280200102c0b2009411c6a21040240200941106a28020041ffffffff0371450d00200928020c102c0b200421092004200b470d000b0b200141e0056a41086a2204200141800b6a41086a280200360200200120012903800b22083703e00502402008a722060d00200141a00d6a22044200370300200141880d6a41106a22064200370300200141880d6a41086a22074200370300200142003703880d200141c0076a41eddcc700410810c5012007200141c0076a41086a2209290000370300200120012900c0073703880d200141c0076a41f1cbc000411010c50120042009290000370300200620012900c007370300200141880d6a412010b4010c010b200141a00d6a22074200370300200141880d6a41106a22094200370300200141880d6a41086a220b4200370300200142003703880d200141c0076a41eddcc700410810c501200b200141c0076a41086a220c290000370300200120012900c0073703880d200141c0076a41f1cbc000411010c5012007200c290000370300200920012900c007370300200141a0096a20062004280200109e02200141880d6a412020012802a009220420012802a80910a702024020012802a409450d002004102c0b200141e0056a1097020b200120003602f804200141c80c6a41186a22064200370300200141c80c6a41106a22044200370300200141c80c6a41086a22074200370300200142003703c80c200141c0076a41e6dcc700410710c5012007200141c0076a41086a290000370300200120012900c0073703c80c200141a0096a41a08ec100411110c5012006200141a0096a41086a290000370300200420012900a009370300200141386a200141c80c6a1089044280c2d72f210802402001280238417d710d00200141e00c6a22094200370300200141d80c6a220b4200370300200141c80c6a41086a22064200370300200142003703c80c200141c0076a41e6dcc700410710c5012006200141c0076a41086a220c290000370300200120012900c0073703c80c200141a0096a41bcc6c200411510c501200441086a220d200141a0096a41086a2216290000370000200420012900a00937000002400240200141c80c6a412010dc0241ff017122074102460d0020074101710d010b20094200370300200b420037030020064200370300200142003703c80c200141c0076a41e6dcc700410710c5012006200c290000370300200120012900c0073703c80c200141a0096a41d8bfc200410810c501200d2016290000370000200420012900a0093700004100200141c80c6a108d042206200641ff01714104461b41ff01710e0401000100010b20012802f804210b42002108200141b8056a41186a22064200370300200141b8056a41106a22074200370300200141b8056a41086a22094200370300200142003703b80520014188056a41c7dcc700410410c501200920014188056a41086a220c29000037030020012001290088053703b805200141c80c6a41ccd5c500410a10c5012006200141c80c6a41086a220d290000370300200720012900c80c370300200141286a200141b8056a10cf02200128022821162001290330210e200642003703002007420037030020094200370300200142003703b80520014188056a41c7dcc700410410c5012009200c29000037030020012001290088053703b805200141c80c6a41bcd6c500410b10c5012006200d290000370300200720012900c80c370300200141186a200141b8056a10cf022001290320212020012802182106200141800b6a41186a22074200370300200141800b6a41106a22094200370300200141800b6a41086a220c4200370300200142003703800b200141880d6a41c7dcc700410410c501200c200141880d6a41086a220d290000370300200120012900880d3703800b200141880d6a41e8d6c500410b10c5012007200d290000370300200920012900880d370300200141086a200141800b6a10cf0202400240427f2020420020061b200e42d8047e420020161b7c220e42d8047c22202020200e541b220e2001290310420020012802081b7d2220200e560d00417f200b2020a7417f2020428080808010541b6a22062006200b491b2206200b6b220720064b0d012007417f6a4195014b0d01200141c0076a41e6dcc700410710c501200141a0096a418893c700410a10c501412010322206450d03200142203702840b200120063602800b200141800b6a4100411010c80120012802800b20012802880b22066a220720012900c007370000200741086a200141c0076a41086a2900003700002001200641106a22063602880b200141800b6a2006411010c80120012802800b220920012802880b22066a220720012900a009370000200741086a200141a0096a41086a2900003700002001200641106a22063602880b2006417f4c0d044101210702402006450d00200610322207450d040b200141003602900d2001200636028c0d200120073602880d200141880d6a4100200610c80120012802880d20012802900d22076a2009200610c9081a2001419c0d6a220b200141800b6a41086a280200360200200141003a00a40d200141103602a00d200141e0056a41186a220920012903a00d370300200120012903800b3702940d200141e0056a41106a200141880d6a41106a29030022083703002001200720066a3602900d200141e0056a41086a20012903900d220e370300200120012903880d22203703e005200141c0076a41106a2008370300200141c0076a41086a200e370300200141c0076a41186a2009290300370300200120203703c007200141880d6a200141c0076a10b6010240024020012802880d4101470d0020014198056a41186a200141a40d6a29020037030020014198056a41106a200b29020037030020014198056a41086a200141940d6a2902003703002001200129028c0d37039805412010322217450d052017200129039805370000201741186a20014198056a41186a290300370000201741106a20014198056a41106a290300370000201741086a20014198056a41086a29030037000020014281808080103702ec0c200120173602e80c200141a0096a41186a200141c0076a41186a290300370300200141a0096a41106a200141c0076a41106a290300370300200141a0096a41086a200141c0076a41086a290300370300200120012903c0073703a009200141880d6a200141a0096a10b601024020012802880d4101470d00200141880d6a41047221064120210b41012107410121090340200141800b6a41186a200641186a2902002208370300200141800b6a41106a200641106a290200220e370300200141800b6a41086a200641086a29020022203703002001200629020022263703800b200141b8056a41186a220c2008370300200141b8056a41106a220d200e370300200141b8056a41086a22162020370300200120263703b805024020092007470d00200141e80c6a2007410110d60120012802e80c21170b2017200b6a220720012903b805370000200741186a200c290300370000200741106a200d290300370000200741086a20162903003700002001200941016a22093602f00c200141880d6a200141a0096a10b60120012802880d4101470d01200b41206a210b20012802ec0c21070c000b0b024020012802a409450d0020012802a009102c0b0240200141b0096a280200450d0020012802ac09102c0b200141a00f6a41086a200141e80c6a41086a280200360200200120012903e80c3703a00f0c010b200141003602a80f200142013703a00f024020012802c407450d0020012802c007102c0b200141d0076a280200450d0020012802cc07102c0b200141c0076a41e6dcc700410710c501200141a0096a41b18ec100410a10c501412010322206450d03200142203702840b200120063602800b200141800b6a4100411010c80120012802800b20012802880b22066a220720012900c007370000200741086a200141c0076a41086a2900003700002001200641106a22063602880b200141800b6a2006411010c80120012802800b220720012802880b22066a220920012900a009370000200941086a200141a0096a41086a2900003700002001200641106a22063602880b2006417f4c0d040240024020060d00410121090c010b200610322209450d040b200141003602900d2001200636028c0d200120093602880d200141880d6a4100200610c80120012802880d20012802900d22096a2007200610c9081a2001419c0d6a200141800b6a41086a280200360200200141003a00a40d200141113602a00d200141e0056a41186a220720012903a00d370300200120012903800b3702940d200141e0056a41106a200141880d6a41106a220b29030022083703002001200920066a3602900d200141e0056a41086a20012903900d220e370300200120012903880d22203703e005200141c0076a41106a2008370300200141c0076a41086a200e370300200141c0076a41186a2007290300370300200120203703c007200141880d6a200141c0076a10b8010240024020012d00b80d4102460d0020014198056a41186a200141880d6a41186a29030037030020014198056a41106a200b29030037030020014198056a41086a200141880d6a41086a290300370300200120012903880d37039805024020012802ac0d2206450d0020012802a80d2207450d00200641ffffff3f71450d002007102c0b412010322217450d052017200129039805370000201741186a20014198056a41186a290300370000201741106a20014198056a41106a290300370000201741086a20014198056a41086a29030037000020014281808080103702ec0c200120173602e80c200141a0096a41186a200141c0076a41186a290300370300200141a0096a41106a200141c0076a41106a290300370300200141a0096a41086a200141c0076a41086a290300370300200120012903c0073703a009200141880d6a200141a0096a10b801024020012d00b80d4102460d0041202109410121070340200141800b6a41186a2206200141880d6a41186a290300370300200141800b6a41106a220b200141880d6a41106a290300370300200141800b6a41086a220c200141880d6a41086a290300370300200120012903880d3703800b024020012802ac0d220d450d0020012802a80d2216450d00200d41ffffff3f71450d002016102c0b200141b8056a41186a220d2006290300370300200141b8056a41106a2216200b290300370300200141b8056a41086a220b200c290300370300200120012903800b3703b8050240200720012802ec0c470d00200141e80c6a2007410110d60120012802e80c21170b201720096a220620012903b805370000200641186a200d290300370000200641106a2016290300370000200641086a200b2903003700002001200741016a22073602f00c200941206a2109200141880d6a200141a0096a10b80120012d00b80d4102470d000b0b024020012802a409450d0020012802a009102c0b0240200141b0096a280200450d0020012802ac09102c0b20014188056a41086a200141e80c6a41086a2802002206360200200120012903e80c370388050c010b20014100360290052001420137038805024020012802c407450d0020012802c007102c0b41002106200141d0076a280200450d0020012802cc07102c0b200120012802a80f22073602800b200120063602e005200620076aad42c0f0f50b7e21080240200741808004490d00024041002802d8d2484102490d00200141a0096a411c6a4102360200200141b4096a4102360200200141ac096a4102360200200141c08ec1003602b809200141bc8ec1003602a809200141023602a4092001200141e0056a3602b0092001200141800b6a3602a00941002802d4d248210441002802d0d248210641002802dcd2482107200141c80d6a41a411360200200141c00d6a42de80808010370300200141bc0d6a41acc5c300360200200141b40d6a420e370200200141b00d6a41e28fc100360200200141a80d6a4204370300200141980d6a4205370300200141900d6a4107360200200141880d6a411c6a200141a0096a360200200141c48ec1003602940d200141db8fc10036028c0d200141023602880d200641f8a3c000200741024622071b200141880d6a200441e0a3c00020071b2802101103000b0240200128028c0541ffffff3f71450d00200128028805102c0b024020012802a40f41ffffff3f71450d0020012802a00f102c0b41002802d8d2484102490d02200141133602a4092001200141f8046a3602a00941002802d4d248210441002802d0d248210641002802dcd2482107200141c80d6a41940a360200200141c00d6a42de80808010370300200141bc0d6a41acc5c300360200200141b40d6a420e370200200141b00d6a41e28fc100360200200141a80d6a4201370300200141980d6a4202370300200141900d6a4107360200200141a40d6a200141a0096a360200200141a08fc1003602940d200141db8fc10036028c0d200141023602880d200641f8a3c000200741024622071b200141880d6a200441e0a3c00020071b2802101103000c020b200141880d6a200141a00f6a10a602200128028c0d210920012802880d210b20014188056a200620012802900d220710d60120012802880520012802900522064105746a200b200741057410c9081a2001200620076a3602900502402009450d00200941ffffff3f71450d00200b102c0b200141880d6a41086a2207200141a00f6a41086a280200360200200120012903a00f3703880d200141e00c6a22094200370300200141d80c6a220b4200370300200141c80c6a41086a22064200370300200142003703c80c200141c0076a41e6dcc700410710c5012006200141c0076a41086a220c290000370300200120012900c0073703c80c200141a0096a41ec8ec100411210c501200441086a220d200141a0096a41086a2216290000370000200420012900a009370000200141c80c6a200141880d6a10b1040240200128028c0d41ffffff3f71450d0020012802880d102c0b200720014188056a41086a28020036020020012001290388053703880d20094200370300200b420037030020064200370300200142003703c80c200141c0076a41e6dcc700410710c5012006200c290000370300200120012900c0073703c80c200141a0096a41fe8ec100411210c501200d2016290000370000200420012900a009370000200141c80c6a200141880d6a10b1040240200128028c0d41ffffff3f71450d0020012802880d102c0b20012802f8042106200141e00c6a4200370300200141c80c6a41106a4200370300200141c80c6a41086a22074200370300200142003703c80c200141c0076a41e6dcc700410710c5012007200141c0076a41086a290000370300200120012900c0073703c80c200141a0096a41a08ec100411110c501200441086a200141a0096a41086a290000370000200420012900a009370000200141c80c6a41012006109c0420084280c6868f017c210841002802d8d2484103490d01200141133602a4092001200141f8046a3602a00941002802d4d248210441002802d0d248210641002802dcd2482107200141c80d6a41920a360200200141c00d6a42de80808010370300200141bc0d6a41acc5c300360200200141b40d6a420e370200200141b00d6a41e28fc100360200200141a80d6a4201370300200141880d6a41106a4202370300200141880d6a41086a4107360200200141a40d6a200141a0096a360200200141908fc1003602940d200141db8fc10036028c0d200141033602880d200641f8a3c000200741024622071b200141880d6a200441e0a3c00020071b2802101103000c010b41002802d8d2484102490d002001412b3602a409200141b08fc1003602a00941002802d4d248210441002802d0d248210641002802dcd2482107200141c80d6a41990a360200200141c00d6a42de80808010370300200141bc0d6a41acc5c300360200200141b40d6a420e370200200141b00d6a41e28fc100360200200141a80d6a4201370300200141980d6a4201370300200141900d6a4107360200200141a40d6a200141c0076a360200200141b4b5c8003602940d200141db8fc10036028c0d200141043602c407200141023602880d200441e0a3c000200741024622071b28021021042001200141a0096a3602c007200641f8a3c00020071b200141880d6a20041103000b200842c093b9d3007c21080b200141a0096a10de0220012802a009210c0240024020012802a8092207450d00200741c4006c21062007410274417c6a41027641016a210b41002109200c210402400340024020042d00004101460d00200441046a28020020004f0d020b200441c4006a2104200941016a2109200641bc7f6a22060d000b200b21090b200720094f0d012009200741d089c500104f000b410021090b200120093602880d200141940d6a200c200941c4006c22066a22163602002001200c3602900d200141003602a8092001200720096b220d36028c0d200c200941ffffffff037141c4006c6a21172001200141a0096a3602980d200c210702400340024020060d00201721040c020b200641bc7f6a210620072d0000210b200741c4006a22042107200b4102470d000b0b200120043602900d200c200941c4006c6a210702400340024020072004470d002016210b0c020b20042d00002106200441c4006a220b210420064102470d000b0b2001200b3602900d02400240200d0d004100210d0c010b02402009450d00200c200c200941c4006c6a200d41c4006c10ca081a20012802a009210c0b2001200d3602a8090b20012802a4092106200141980b6a22074200370300200141900b6a22044200370300200141800b6a41086a22094200370300200142003703800b20014188056a41dcdcc700410a10c501200920014188056a41086a29000037030020012001290088053703800b200141c80c6a41d3dec400410610c5012007200141c80c6a41086a290000370300200420012900c80c370300200141880d6a200c200d10fd02200141800b6a412020012802880d220720012802900d10a7020240200128028c0d450d002007102c0b02402006450d00200c450d00200641c4006c450d00200c102c0b200141800b6a41186a4200370300200141800b6a41106a4200370300200141800b6a41086a22064200370300200142003703800b20014188056a41dcdcc700410a10c501200620014188056a41086a29000037030020012001290088053703800b200141c80c6a41b0e4c400410c10c501200441086a200141c80c6a41086a290000370000200420012900c80c370000200141003a00e80c200141800b6a4120200141e80c6a410110a702200141a0096a10cd02200141b8056a41186a2206200141a0096a41186a2207290300370300200141b8056a41106a2209200141a0096a41106a220b290300370300200141b8056a41086a220c200141a0096a41086a220d290300370300200120012903a0093703b8054124103222040d020b1039000b103b000b200420012903b80537000020044114360220200441186a2006290300370000200441106a2009290300370000200441086a200c290300370000200142818080801037028c0d200120043602880d200141880d6a10e002200141880d6a41186a2007290300370300200141880d6a41106a200b290300370300200141880d6a41086a200d290300370300200120012903a0093703880d200141880d6a10e10210d404200141b00f6a2400427f2003427f200820027c42a8e397037c220820082002541b7c220220022003541b0bf41e07057f017e027f017e027f067e017f230041a00e6b22002400200041a8026a22014200370300200041a0026a2202420037030020004190026a41086a220342003703002000420037039002200041c8036a41c7dcc700410410c5012003200041c8036a41086a2204290000370300200020002900c80337039002200041c8036a4198dac500410b10c50120012004290000370300200220002900c803370300200041c8096a20004190026a10fa04024020002d00c8094102470d00200041d00c6a10890742032105024020002802d80c2203450d0020002802d00c2101200341246c210302400340024020012d00004101470d00200141016a2800002104200141086a28020021062000200141106a28020036028c0820002006360288080240200441c28289aa04470d00200041c8096a20004188086a102920002903c80922054203520d030b200041c8036a4180efc50041f00010c9081a0b200141246a21012003415c6a22030d000b420321050c010b200041c8036a200041d0096a41f00010c9081a200041306a200041c8036a41f00010c9081a0b200041d00c6a102b200041a0016a200041306a41f00010c9081a41002104024020054203510d00200020053703b002200041b0026a41086a200041a0016a41f00010c9082107200041a8036a41186a22064200370300200041a8036a41106a22014200370300200041a8036a41086a22044200370300200042003703a803200041c8036a41c7dcc700410410c5012004200041c8036a41086a2203290000370300200020002900c8033703a803200041c8036a41bcd6c500410b10c50120062003290000370300200120002900c803370300200041206a200041a8036a10cf0220002903b8022108024002402000280220450d0020002903284200520d010b200642003703002001420037030020044200370300200042003703a803200041c8036a41c7dcc700410410c50120042003290000370300200020002900c8033703a803200041c8036a41bcd6c500410b10c501200141086a22092003290000370000200120002900c803370000200020083703c809200041a8036a4120200041c8096a410810a702200642003703002001420037030020044200370300200042003703a803200041c8036a41c7dcc700410410c50120042003290000370300200020002900c8033703a803200041c8036a41f0d5c500410b10c50120092003290000370000200120002900c803370000200041c8096a200041a8036a10f10420002802c809210a20002902cc09210b200642003703002001420037030020044200370300200042003703a803200041c8036a41c7dcc700410410c50120042003290000370300200020002900c8033703a803200041c8036a418cd7c500410a10c50120092003290000370000200120002900c803370000200041c8096a200041a8036a10860520002d00c8092104200041c8036a41186a200041e1096a290000370300200041c8036a41106a200041d9096a2900003703002003200041d1096a290000370300200020002900c9093703c803200b4200200a1b210c200b428080808070834200200a1b210b200a4108200a1b21030240024020044101460d00200041e80c6a4200370300200041e00c6a4200370300200041d80c6a4200370300200042003703d00c0c010b200041d00c6a41186a200041c8036a41186a290300370300200041d00c6a41106a200041c8036a41106a290300370300200041d00c6a41086a200041c8036a41086a290300370300200020002903c8033703d00c0b20004188086a41086a200041d00c6a41086a290300220d37030020004188086a41106a200041d00c6a41106a290300220e37030020004188086a41186a200041d00c6a41186a290300220f370300200020002903d00c221037038808200041c8096a41086a200b200c42ffffffff0f8384370300200041c8096a41106a2010370300200041c8096a41186a200d370300200041e8096a200e370300200041c8096a41286a200f370300200020033602cc09200041003602c809200041c8036a200041c8096a102e200041db0c6a200041c8036a41086a280200360000200020002903c8033700d30c200041d4036a200041d70c6a290000370000200041c28289aa043600c903200041023a00c803200020002900d00c3700cd03200041c8036a109a06200ca72204450d00200441286c450d002003102c0b200041a8036a41186a22064200370300200041a8036a41106a220a4200370300200041a8036a41086a22044200370300200042003703a803200041c8036a41c7dcc700410410c5012004200041c8036a41086a2203290000370300200020002900c8033703a803200041c8036a41e8d6c500410b10c501200141086a22092003290000370000200120002900c803370000200041106a200041a8036a10cf02200028021021112000290318210b20064200370300200a420037030020044200370300200042003703a803200041c8036a41c7dcc700410410c50120042003290000370300200020002900c8033703a803200041c8036a4190dbc500410810c50120092003290000370000200120002900c803370000200042002008200b42017c420120111b7d220b200b2008561b3e02c809200041a8036a4120200041c8096a410410a70220064200370300200a420037030020044200370300200042003703a803200041c8036a41c7dcc700410410c50120042003290000370300200020002900c8033703a803200041c8036a41e8d6c500410b10c50120092003290000370000200120002900c803370000200020083703c809200041a8036a4120200041c8096a410810a7024100210420054201510d00200041b0026a41106a280200210420004190026a41186a420037030020004190026a41106a420037030020004190026a41086a220142003703002000420037039002200041c8036a41c7dcc700410410c50120012003290000370300200020002900c80337039002200041c8036a41f0d5c500410b10c501200241086a2003290000370000200220002900c803370000200041c8096a20004190026a10f10420002802c8092201410820011b210302400240200420002902cc09420020011b220b422088a74f0d002003200441286c6a2201290000210c200141086a290000210d200141106a290000210e20004188086a41186a200141186a29000037030020004188086a41106a200e37030020004188086a41086a200d3703002000200c37038808200041c8096a20004188086a10d20720002802c8092101200041c8036a200041c8096a41047241c40110c9081a20014101460d002007410c6a2104200041c8066a200041d00c6a41046a200041c8036a41046a41c00110c90841c00110c9081a20004188086a200041c8066a41c00110c9081a20004190026a41186a420037030020004190026a41106a420037030020004190026a41086a220642003703002000420037039002200041c8036a41c7dcc700410410c5012006200041c8036a41086a2201290000370300200020002900c80337039002200041c8036a418cd7c500410a10c501200241086a2001290000370000200220002900c803370000200041c8096a20004190026a10860520002d00c8092106200041c8036a41186a200041e1096a290000370300200041c8036a41106a200041d9096a2900003703002001200041d1096a290000370300200020002900c9093703c8030240024020064101460d00200041c0036a4200370300200041b8036a4200370300200041b0036a4200370300200042003703a8030c010b200041a8036a41186a200041c8036a41186a290300370300200041a8036a41106a200041c8036a41106a290300370300200041a8036a41086a200041c8036a41086a290300370300200020002903c8033703a8030b200041a8026a220a420037030020004190026a41106a2209420037030020004190026a41086a220142003703002000420037039002200041c8036a41c7dcc700410410c5012001200041c8036a41086a2206290000370300200020002900c80337039002200041c8036a41ccd5c500410a10c501200241086a2006290000370000200220002900c803370000200020004190026a10cf022000290308210c20002802002106200041d00c6a41a4b2c8004104108801200041d00c6a41a8b2c800410b2008108c01200041d00c6a41b3b2c800410d200c420020061b108c01200041d00c6a41c0b2c8004110200041a8036a4120108b01200041c8036a200041d00c6a41d00110c9081a200041c8096a200420004188086a200041c8036a10d30720002802c8094101460d00200041c8036a200041c8096a41086a41800310c9081a200041c8096a200041c8036a41800310c9081a200041d00c6a4191a2c6004109108801200041d00c6a41c4b5c80041004191b2c8004113108b01200041d00c6a419aa2c6004106200041e80a6a4120108b01200041d00c6a41a0a2c6004107200041a80c6a4120108b01200a420037030020094200370300200142003703002000420037039002200041d00c6a41c4b5c800410020004190026a4120108d01410021010340200041d00c6a20016a41003a0000200141016a220141c801470d000b20004188086a41086a20004190026a41086a29030037030020004188086a41106a20004190026a41106a29030037030020004188086a41186a20004190026a41186a290300370300200020002903900237038808410121040c010b410021040b200ba72201450d00200141286c450d002003102c0b024002402005500d00200041003a00c8090c010b200041d1096a20004190086a290300370000200041d9096a20004198086a290300370000200041e1096a200041a0086a290300370000200020043a00c80920002000290388083700c9090b20004190026a41186a2206420037030020004190026a41106a220a420037030020004190026a41086a220142003703002000420037039002200041c8036a41c7dcc700410410c5012001200041c8036a41086a2203290000370300200020002900c80337039002200041c8036a4198dac500410b10c501200241086a22092003290000370000200220002900c80337000020004190026a200041c8096a108c05200041d1096a20004188086a41086a290300370000200041d9096a20004188086a41106a290300370000200041e1096a20004188086a41186a290300370000200020043a00c80920002000290388083700c90920064200370300200a4200370300200142003703002000420037039002200041c8036a41c7dcc700410410c50120012003290000370300200020002900c80337039002200041c8036a41d4dac500411310c50120092003290000370000200220002900c80337000020004190026a200041c8096a108c050b200041a00e6a24000b984d06087f017e057f017e117f037e230041a0066b22002400200041f8006a22014200370300200041f0006a22024200370300200041e0006a41086a2203420037030020004200370360200041c8016a41ffdcc700410710c5012003200041c8016a41086a2204290000370300200020002900c80137036020004198026a41b8b3c300410c10c501200120004198026a41086a22052900003703002002200029009802370300200041206a200041e0006a412010c6012000280224210620002802202107200041286a10ec0220014200370300200242003703002003420037030020004200370360200041c8016a41ffdcc700410710c50120032004290000370300200020002900c80137036020004198026a418893c700410a10c50120012005290000370300200220002900980237030020004188046a200041e0006a10e101200029028c04210820002000280288042201410120011b22033602c003200020033602b80320002008420020011b22083e02bc03200020032008422088a74105746a3602c403200041003602c80320004188046a200041b8036a10bd0602400240024002400240200041c8046a280200450d0041d00010322205450d02200520004188046a41d00010c908210120004281808080103702a401200020013602a001200041c8016a41106a200041b8036a41106a280200360200200041c8016a41086a200041b8036a41086a290300370300200020002903b8033703c80120004198026a200041c8016a10bd060240200041d8026a280200450d0041d00021034101210441012101034020004188046a20004198026a41d00010c9081a024020012004470d00200041a0016a2004410110d60420002802a00121050b200520036a20004188046a41d00010c9081a2000200141016a22013602a80120004198026a200041c8016a10bd0620002802d802450d01200341d0006a210320002802a40121040c000b0b024020002802cc0141ffffff3f71450d0020002802c801102c0b200041386a41086a200041a0016a41086a280200360200200020002903a0013703380c010b200041003602402000420837033820002802bc0341ffffff3f71450d0020002802b803102c0b200041f8006a4200370300200041f0006a4200370300200041e0006a41086a2201420037030020004200370360200041c8016a41ffdcc700410710c5012001200041c8016a41086a290000370300200020002900c80137036020004198026a41b8b3c300410c10c501200241086a20004198026a41086a2900003700002002200029009802370000200041186a200041e0006a412010c601200028021c210120002802182103200041c8016a418dddc700410810c50120004198026a41c0fbc300411210c50120002001410020031b3602e802200041a0016a200041e8026a410410c70120004188046a410c6a200041e8026a41046a3602002000200041a0016a41086a220536028c042000200041e8026a360290042000200041a0016a36028804200041b8036a20004188046a107e20002802c003220141206a2203417f4c0d010240024020030d00410121040c010b200310322204450d010b20004100360290042000200336028c04200020043602880420004188046a4100411010c80120002802880420002802900422036a220420002900c801370000200441086a200041c8016a41086a2900003700002000200341106a22033602900420004188046a2003411010c80120002802880420002802900422036a2204200029009802370000200441086a20004198026a41086a2900003700002000200341106a22043602900420002802b803210320004188046a2004200110c801200028028804220420002802900422096a2003200110c9081a2000200920016a220136029004024020002802bc03450d002003102c0b20042001109d040240200028028c04450d002004102c0b200041f8006a4200370300200041f0006a4200370300200041e0006a41086a2201420037030020004200370360200041c8016a41ffdcc700410710c5012001200041c8016a41086a290000370300200020002900c80137036020004198026a41b8b3c300410c10c501200241086a20004198026a41086a2900003700002002200029009802370000200041106a200041e0006a412010c6012000280214210120002802102103200041c8016a418dddc700410810c50120004198026a41abedc300410e10c50120002001410020031b3602e802200041a0016a200041e8026a410410c70120004188046a410c6a200041e8026a41046a3602002000200536028c042000200041e8026a360290042000200041a0016a36028804200041b8036a20004188046a107e20002802c003220141206a2203417f4c0d010240024020030d00410121040c010b200310322204450d010b20004100360290042000200336028c04200020043602880420004188046a4100411010c80120002802880420002802900422036a220420002900c801370000200441086a200041c8016a41086a2900003700002000200341106a22033602900420004188046a2003411010c80120002802880420002802900422036a2204200029009802370000200441086a20004198026a41086a2900003700002000200341106a22043602900420002802b803210320004188046a2004200110c801200028028804220420002802900422056a2003200110c9081a2000200520016a220136029004024020002802bc03450d002003102c0b20042001109d040240200028028c04450d002004102c0b02400240024002402000280240450d0020004188046a200041386a10be06200041a3026a20004188046a41086a280200360000200020002903880437009b02200041073602880420004194046a20004198026a41076a290000370000200041023a008c04200020002900980237008d0420004188046a10c8022000280230210a200041d8006a200041386a41086a2802003602002000200a36024c20002006410020071b22093602482000200029033837035020004180016a200041c8006a41086a10be0620004100360298012000420137039001200028028001210b200028028401210c2000280288012106410410322201450d04200042043702fc03200020013602f803200041f8036a41004104102f20002802f80320002802800422016a20093600002000200141046a36028004200041c8016a41eddcc700410810c50120004198026a41d4d0c000411210c50120004188046a41cdd5c00010a102200028029004220141206a2203417f4c0d050240024020030d00410121040c010b200310322204450d050b200041003602c003200020033602bc03200020043602b803200041b8036a4100411010c80120002802b80320002802c00322036a220420002900c801370000200441086a200041c8016a41086a2900003700002000200341106a22033602c003200041b8036a2003411010c80120002802b80320002802c00322036a2204200029009802370000200441086a20004198026a41086a2900003700002000200341106a22043602c0032000280288042103200041b8036a2004200110c80120002802b803220420002802c00322056a2003200110c9081a2000200520016a22013602c0030240200028028c04450d002003102c0b20004188046a2004200110f604200029028c04420020002802880422011b21082001410120011b2107024020002802bc03450d002004102c0b200020084220883e028c032000200736028803200041086a20004188036a10870220002802080d01200028020c220d200028028c0341246e22012001200d4b1bad42247e220e422088a70d05200ea72201417f4c0d050240024020010d004104210f0c010b20011032220f450d050b200041003602a0032000200f360298032000200141246e220136029c0341002110024002400240200d450d00410021110340200028028c0322034104490d03201141016a21112000280288032205280000211220002003417c6a220236028c032000200541046a3602880341002101200041003a00a8042003417b6a2103034020022001460d0320004188046a20016a200520016a220441046a2d00003a00002000200441056a360288032000200141016a22043a00a8042000200336028c032003417f6a21032004210120044120470d000b20004198026a41186a220120004188046a41186a29030037030020004198026a41106a220320004188046a41106a29030037030020004198026a41086a220520004188046a41086a290300370300200020002903880437039802200441ff01714120490d03200041b8036a41086a2005290300220e370300200041a0016a41186a22042001290300370300200041a0016a41106a22012003290300370300200041a0016a41086a2203200e3703002000200029039802220e3703b8032000200e3703a001200041e8026a41186a22052004290300370300200041e8026a41106a22042001290300370300200041e8026a41086a22022003290300370300200020002903a0013703e80202402010200028029c03470d0020004198036a201010ff0320002802a0032110200028029803210f0b200f201041246c6a22012012360200200120002903e8023702042001410c6a2002290300370200200141146a20042903003702002001411c6a20052903003702002000201041016a22103602a0032011200d470d000b200028029c032101200028029803210f0b20104100200f1b210520014100200f1b2103200f4104200f1b21040c040b200141ff0171450d00200041003a00a8040b200028029c032201450d01200141246c450d01200028029803102c0c010b200041013a008c04200041073602880420004188046a10c802200028023c2201450d02200141d0006c450d022000280238102c0c020b4100210341042104410021050b20004188046a41cdd5c000200041f8036a10a00220004198026a200028028804220220002802900410fc04200029029c02420020002802980222011b210e2001410120011b21130240200028028c04450d002002102c0b200041c0016a2005360200200041bc016a2003360200200041b0016a200e370300200041a0016a41086a200041f8036a41086a280200360200200020002903f8033703a001200020043602b801200020133602ac0102402008a7450d002007102c0b0240024002400240024002402006450d00200e422088a72111200041b8016a2114200041ac016a2115200b200641d0006c6a211620004188046a41d0006a211720004188046a410c6a2118200041c8016a41c4006a2119200b21024100211a034020004188046a41386a22032002220141386a29030037030020004188046a41306a2204200141306a29030037030020004188046a41286a2205200141286a29030037030020004188046a41206a2206200141206a29030037030020004188046a41186a2207200141186a29030037030020004188046a41106a220f200141106a29030037030020004188046a41086a2210200141086a29030037030020004198026a41086a220d200141cc006a28020036020020002001290300370388042000200141c4006a29020037039802200141d0006a2102200141c0006a2802002201450d02200041b8036a41386a22122003290300370300200041b8036a41306a22032004290300370300200041b8036a41286a22042005290300370300200041b8036a41206a22052006290300370300200041b8036a41186a22062007290300370300200041b8036a41106a221b200f290300370300200041b8036a41086a221c201029030037030020004198036a41086a221d200d28020036020020002000290388043703b803200020002903980237039803200041c8016a41386a2012290300370300200041c8016a41306a2003290300370300200041c8016a41286a2004290300370300200041c8016a41206a2005290300370300200041c8016a41186a2006290300370300200041c8016a41106a201b290300370300200041c8016a41086a201c290300370300200020002903b8033703c80120002001360288022019200029039803370200201941086a201d280200360200410410322201450d082000420437028c04200020013602880420004188046a41004104102f200028028804220320002802900422016a2009360000201841002900cdd540370000201841086a41002900d5d5403700002000200141046a360290042000200041c8016a3602a404200041e8026a20004188046a10bf060240200028028c04450d002003102c0b20004188046a200041e8026a10a202200028028804220320002802900410ce0221010240200028028c04450d002003102c0b024002400240024020010d0020004198026a200041c8016a41d00010c9081a200041e0006a20004190016a10a60220004188046a20004198026a41d00010c9081a201741086a200041e0006a41086a2802003602002017200029036037020020004198026a200041e8026a10a202200028029802220120002802a00220004188046a1092050240200028029c02450d002001102c0b024020002802cc042201450d00200141306c450d0020002802c804102c0b024020002802dc042201450d00200141ffffff3f71450d0020002802d804102c0b20004198026a41186a221b200041e8026a41186a29030037030020004198026a41106a221c200041e8026a41106a290300370300200d200041e8026a41086a290300370300200020002903e802370398024100210120002802b80121060240024020002802c00122120e020103000b4100210120122103034020012003410176220420016a22052006200541246c6a28020020094b1b2101200320046b220341014b0d000c030b0b2007201b290300370300200f201c2903003703002010200d290300370300200020002903980237038804410021030c020b200028028c022201450d02200141306c450d02200028028802102c0c020b2006200141246c6a28020021032007201b290300370300200f201c2903003703002010200d29030037030020002000290398023703880420122001200120032009496a20032009461b22034f0d00200320121044000b0240201220002802bc01470d002014201210ff0320002802b401211120002802b80121060b2006200341246c6a220141246a2001201220036b41246c10ca081a2001200936020020012000290388043702042001410c6a2010290300370200200141146a200f2903003702002001411c6a20072903003702002000201241016a3602c0012007201b290300370300200f201c2903003703002010200d2903003703002000200029039802370388040240201120002802b001470d0020152011410110d60120002802b40121110b20002802ac01221320114105746a2201200029038804370000200141186a2007290300370000200141106a200f290300370000200141086a20102903003700004101211a2000201141016a22113602b4010b20022016470d000b201621020c010b200c450d01200c41d0006c450d01200b102c0c010b024020162002460d0003402002220141d0006a21020240200141c4006a2802002203450d00200341306c450d00200141c0006a280200102c0b20162002470d000b0b0240200c450d00200c41d0006c450d00200b102c0b201a410171450d0002402011450d0020114105742105200041cc046a2101201321030340200041f8036a200310a20220004188046a20002802f803220220002802800410e80420004198026a41086a220620004188046a41086a29030037030020004198026a41106a220720004188046a41106a29030037030020004198026a41186a220f20004188046a41186a29030037030020004198026a41206a221020004188046a41206a29030037030020004198026a41286a220d20004188046a41286a29030037030020004198026a41306a221220004188046a41306a29030037030020004198026a41386a221620004188046a41386a290300370300200041e8026a41086a2218200141086a290200370300200041e8026a41106a2219200141106a290200370300200041e8026a41186a221b200141186a280200360200200020002903880437039802200020012902003703e802024020002802c8042204450d00200041c8016a41386a2016290300370300200041c8016a41306a2012290300370300200041c8016a41286a200d290300370300200041c8016a41206a2010290300370300200041c8016a41186a200f290300370300200041c8016a41106a2007290300370300200041c8016a41086a2006290300370300200041e0006a41086a2018290300370300200041e0006a41106a2019290300370300200041e0006a41186a201b28020036020020002000290398023703c801200020002903e8023703600b024020002802fc03450d002002102c0b20040d03200341206a2103200541606a22050d000b0b42002108410821070c020b200041a0016a10c006410021070c020b200041b8036a41386a2201200041c8016a41386a290300370300200041b8036a41306a2202200041c8016a41306a290300370300200041b8036a41286a2206200041c8016a41286a290300370300200041b8036a41206a2207200041c8016a41206a290300370300200041b8036a41186a220f200041c8016a41186a290300370300200041b8036a41106a2210200041c8016a41106a290300370300200041b8036a41086a220d200041c8016a41086a29030037030020004198036a41086a2212200041e0006a41086a29030037030020004198036a41106a2216200041e0006a41106a29030037030020004198036a41186a2218200041e0006a41186a280200360200200020002903c8013703b803200020002903603703980341e00010322215450d03201520002903b803370300201520043602402015200029039803370244201541386a2001290300370300201541306a2002290300370300201541286a2006290300370300201541206a2007290300370300201541186a200f290300370300201541106a2010290300370300201541086a200d290300370300201541cc006a2012290300370200201541d4006a2016290300370200201541dc006a2018280200360200200042818080801037028c032000201536028803024020054120460d00200341206a210f201320114105746a221441606a210c20004188046a41c4006a21014101210b0340200f21030340200041f8036a200310a20220004188046a20002802f803220720002802800410e80420004198026a41086a220520004188046a41086a221929030037030020004198026a41106a220220004188046a41106a221b29030037030020004198026a41186a220620004188046a41186a221c29030037030020004198026a41206a220f20004188046a41206a221d29030037030020004198026a41286a221020004188046a41286a221729030037030020004198026a41306a220d20004188046a41306a221329030037030020004198026a41386a221120004188046a41386a221a290300370300200041e8026a41086a2212200141086a290200370300200041e8026a41106a2216200141106a290200370300200041e8026a41186a2218200141186a280200360200200020002903880437039802200020012902003703e802024020002802c8042204450d00200041c8016a41386a2011290300370300200041c8016a41306a200d290300370300200041c8016a41286a2010290300370300200041c8016a41206a200f290300370300200041c8016a41186a2006290300370300200041c8016a41106a2002290300370300200041c8016a41086a2005290300370300200041e0006a41086a2012290300370300200041e0006a41106a2016290300370300200041e0006a41186a201828020036020020002000290398023703c801200020002903e8023703600b024020002802fc03450d002007102c0b024020040d002014200341206a2203470d010c030b0b200041b8036a41386a2207200041c8016a41386a290300370300200041b8036a41306a220f200041c8016a41306a290300370300200041b8036a41286a2210200041c8016a41286a290300370300200041b8036a41206a220d200041c8016a41206a290300370300200041b8036a41186a2211200041c8016a41186a290300370300200041b8036a41106a2212200041c8016a41106a290300370300200041b8036a41086a2216200041c8016a41086a29030037030020004198036a41086a2218200041e0006a41086a29030037030020004198036a41106a221e200041e0006a41106a29030037030020004198036a41186a221f200041e0006a41186a280200360200200020002903c8013703b803200020002903603703980320192016290300370300201b2012290300370300201c2011290300370300201d200d290300370300201720102903003703002013200f290300370300201a2007290300370300200020002903b80337038804200520182903003703002002201e2903003703002006201f2802003602002000200029039803370398020240200b200028028c03470d0020004188036a200b410110940220002802880321150b200341206a210f2015200b41e0006c6a2207200029038804370300200741106a201b290300370300200741086a201929030037030020132903002108201a290300210e20172903002120201d2903002121201c2903002122200741c0006a2004360200200741186a2022370300200741206a2021370300200741286a2020370300200741c4006a200029039802370200200741386a200e370300200741306a2008370300200741cc006a2005290300370200200741d4006a2002290300370200200741dc006a20062802003602002000200b41016a220b36029003200c2003470d000b0b2000280288032107200029028c0321080b20004188046a41206a200041a0016a41206a280200220336020020004188046a41186a200041a0016a41186a290300220e37030020004188046a41106a200041a0016a41106a29030037030020004188046a41086a200041a0016a41086a290300370300200020002903a00137038804200341246c41046a2201417f4c0d030240024020010d00410121040c010b200110322204450d030b200041003602682000200136026420002004360260200041e0006a2003108f0102402003450d00200ea72201200341246c6a210620002802682103034020012802002104200041e0006a20034104102f2000280260200028026822036a20043600002000200341046a2205360268412010322203450d042000422037029c02200020033602980220004198026a41004120102f200028029802220420002802a00222026a2203200141046a290000370000200341086a2001410c6a290000370000200341106a200141146a290000370000200341186a2001411c6a2900003700002000200241206a22033602a002200041e0006a20052003102f2000280260200028026822056a2004200310c9081a2000200520036a22033602680240200028029c02450d002004102c0b200141246a22012006470d000b0b200041c8016a41eddcc700410810c50120004198026a41d4d0c000411210c501200041b8036a41cdd5c00010a10220002802c003220141206a2203417f4c0d030240024020030d00410121040c010b200310322204450d030b200041003602f002200020033602ec02200020043602e802200041e8026a4100411010c80120002802e80220002802f00222036a220420002900c801370000200441086a200041c8016a41086a2900003700002000200341106a22033602f002200041e8026a2003411010c80120002802e80220002802f00222036a2204200029009802370000200441086a20004198026a41086a2900003700002000200341106a22043602f00220002802b8032103200041e8026a2004200110c80120002802e802220420002802f00222056a2003200110c9081a2000200520016a22013602f002024020002802bc03450d002003102c0b20042001200041e0006a108a03024020002802ec02450d002004102c0b02402000280264450d002000280260102c0b20004198026a41cdd5c00020004188046a10a002200028029802220120002802a00220004194046a108d050240200028029c02450d002001102c0b20004188046a10c0060b024020002802940141ffffff3f71450d00200028029001102c0b024020070d00200028025021050240200041d8006a2802002201450d00200141d0006c2103200541c0006a210103400240200141046a2802002204450d00200441306c450d002001280200102c0b200141d0006a2101200341b07f6a22030d000b0b0240200041d4006a2802002201450d00200141d0006c450d002005102c0b4184bec800ad4280808080c00184100041f5bdc800ad4280808080f0018410000c010b410021040240200a410a6e417f732008422088a722056a220320054b0d00200a4101200a41014b1b2201418094ebdc036e2001418094ebdc03704100476a22044101200441014b1b220420014b0d042001200341036c220320012003491b20046ead428094ebdc037e200120046ead8042ffffffff0f834280bbb0217e428094ebdc0380a721040b200041003602d001200042043703c801200041c8016a4100200510950220002802d00121020240024020050d0020002802c80121060c010b20002802c801220620024102746a210120052103034020012004360200200141046a21012003417f6a22030d000b200220056a21020b200020023602d0012007200520062002200910a3022101410410322203450d012000420437029c02200020033602980220004198026a41004104102f20002802980220002802a00222036a200936000020004198026a41146a41002900d5d5403702002000200341046a3602a002200041002900cdd5403702a40220004194046a20002903a00237020020004188046a41146a200041a8026a290300370200200041a4046a200041b0026a280200360200200041a8046a20013a00002000410436028804200020002903980237028c0420004188046a10c802024020002802cc0141ffffffff0371450d002006102c0b02402005450d00200541e0006c2103200741d4006a210103400240200141706a2802002204450d00200441306c450d002001416c6a280200102c0b0240200128020041ffffff3f71450d002001417c6a280200102c0b200141e0006a2101200341a07f6a22030d000b0b02402008a72201450d00200141e0006c450d002007102c0b200028025021050240200041d8006a2802002201450d00200141d0006c2103200541c0006a210103400240200141046a2802002204450d00200441306c450d002001280200102c0b200141d0006a2101200341b07f6a22030d000b0b200041d4006a2802002201450d00200141d0006c450d002005102c0b0240200028022c41ffffff3f71450d002000280228102c0b200041a0066a24000f0b1039000b103b000b41f0bcc300411941f8acc800103c000bd90103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42d0007e2204422088a722020d022004a722014100480d022002454103742105024002400240024002402000280200410020031b22020d002001450d010c030b200341d0006c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141d0006e3602000b0f0b2005450d001039000b103b000b18002001ad4220862000ad842003ad4220862002ad8410040bcc1202067f017e230041f0056b2202240041002103200241003a00a8052001280204417f6a2104024002400240024002400240024002400240024002400240024003402004417f460d0120024188056a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00a8052004417f6a21042005210320054120470d000b200241b0056a41086a220320024188056a41086a290300370300200241b0056a41106a220620024188056a41106a290300370300200241b0056a41186a220720024188056a41186a29030037030020022002290388053703b005200541ff0171411f4d0d0120024188036a41086a20032903002208370300200241c8016a41186a2007290300370300200241c8016a41106a2006290300370300200241c8016a41086a2008370300200220022903b005220837038803200220083703c80141002103200241003a00a80503402004417f460d0320024188056a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00a8052004417f6a21042005210320054120470d000b200241b0056a41086a220320024188056a41086a290300370300200241b0056a41106a220620024188056a41106a290300370300200241b0056a41186a220720024188056a41186a29030037030020022002290388053703b005200541ff0171411f4d0d0320024188036a41086a20032903002208370300200241e8016a41186a2007290300370300200241e8016a41106a2006290300370300200241e8016a41086a2008370300200220022903b005220837038803200220083703e80141002103200241003a00a80503402004417f460d0520024188056a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00a8052004417f6a21042005210320054120470d000b200241b0056a41086a220320024188056a41086a290300370300200241b0056a41106a220620024188056a41106a290300370300200241b0056a41186a220720024188056a41186a29030037030020022002290388053703b005200541ff0171411f4d0d0520024188036a41086a2003290300220837030020024188026a41186a200729030037030020024188026a41106a200629030037030020024188026a41086a2008370300200220022903b005220837038803200220083703880241002103200241003a00a80503402004417f460d0720024188056a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00a8052004417f6a21042005210320054120470d000b200241b0056a41086a220320024188056a41086a290300370300200241b0056a41106a220620024188056a41106a290300370300200241b0056a41186a220720024188056a41186a29030037030020022002290388053703b005200541ff0171411f4d0d0720024188036a41086a20032903002208370300200241a8026a41186a2007290300370300200241a8026a41106a2006290300370300200241a8026a41086a2008370300200220022903b005220837038803200220083703a80241002103200241003a00a80503402004417f460d0920024188056a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00a8052004417f6a21042005210320054120470d000b200241b0056a41086a220320024188056a41086a290300370300200241b0056a41106a220620024188056a41106a290300370300200241b0056a41186a220720024188056a41186a29030037030020022002290388053703b005200541ff0171411f4d0d0920024188036a41086a20032903002208370300200241c8026a41186a2007290300370300200241c8026a41106a2006290300370300200241c8026a41086a2008370300200220022903b005220837038803200220083703c80241002103200241003a00a80503402004417f460d0b20024188056a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00a8052004417f6a21042005210320054120470d000b200241b0056a41086a220420024188056a41086a290300370300200241b0056a41106a220120024188056a41106a290300370300200241b0056a41186a220320024188056a41186a29030037030020022002290388053703b005200541ff0171411f4d0d0b20024188036a41086a20042903002208370300200241e8026a41186a22042003290300370300200241e8026a41106a22032001290300370300200241e8026a41086a22012008370300200220022903b005220837038803200220083703e802200241086a41186a200241c8016a41186a290300370300200241086a41106a200241c8016a41106a290300370300200241086a41086a200241c8016a41086a290300370300200220022903c801370308200241c0006a200241e8016a41186a290300370300200241386a200241e8016a41106a290300370300200241306a200241e8016a41086a290300370300200220022903e801370328200241e0006a20024188026a41186a290300370300200241d8006a20024188026a41106a290300370300200241d0006a20024188026a41086a290300370300200220022903880237034820024180016a200241a8026a41186a290300370300200241f8006a200241a8026a41106a290300370300200241f0006a200241a8026a41086a290300370300200220022903a802370368200241a0016a200241c8026a41186a29030037030020024198016a200241c8026a41106a29030037030020024190016a200241c8026a41086a290300370300200220022903c80237038801200241c0016a2004290300370300200241b8016a2003290300370300200241b0016a2001290300370300200220022903e8023703a801200041016a200241086a41c00110c9081a200041003a00000c0c0b200341ff0171450d00200241003a00a8050b200041013a00000c0a0b200341ff0171450d00200241003a00a8050b200041013a00000c080b200341ff0171450d00200241003a00a8050b200041013a00000c060b200341ff0171450d00200241003a00a8050b200041013a00000c040b200341ff0171450d00200241003a00a8050b200041013a00000c020b200341ff0171450d00200241003a00a8050b200041013a00000b200241f0056a24000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42e0017e2204422088a722020d022004a722014100480d022002452105024002400240024002402000280200410020031b22020d002001450d010c030b200341e0016c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141e0016e3602000b0f0b2005450d001039000b103b000b8d0401087f230041e0006b220224002002412036020c20022001360208200241106a2001412010b30102400240024002400240200228021022010d00200041003602000c010b200228021421032002200241186a280200360224200220013602202002200241206a108702024002400240024020022802000d0020022802242204200228020422054102742206490d002006417f4c0d050240024020060d00410121070c010b200610372207450d07200228022421040b024020042006490d0020072002280220200610c9082108200228022422042006490d082002200420066b3602242002200228022020066a3602204100210441042109024020060d00410021060c040b20084103710d00200541ffffffff037122070d022008102c410021060c030b2007102c0b20024100360230200242013703282002410f36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241b4bcc3003602482002200241386a360258200241c4006a41dcb7c000200241c8006a103e1a200235023042208620023502288410000240200228022c450d002002280228102c0b200041003602000c020b200541ffffffff0371210620082109200721040b2000200436020420002009360200200041086a20063602000b2003450d002001102c0b200241e0006a24000f0b103b000b1039000b200620044194afc0001058000be21b030a7f027e137f230041b0096b22022400200241106a108f07200241e0006a41186a22034200370300200241e0006a41106a22044200370300200241e0006a41086a2205420037030020024200370360200241f8056a41a789c5004101109a012003200241f8056a41186a22062900003703002004200241f8056a41106a22072900003703002005200241f8056a41086a2208290000370300200220022900f805370360200241f8056a41a789c5004101109a01200241d0076a41186a22092006290000370300200241d0076a41106a220a2007290000370300200241d0076a41086a220b2008290000370300200220022900f8053703d0070240024002400240412010322203450d002008200b2903003703002007200a29030037030020062009290300370300410041003502ccd248200241b8046aad7c42adfed5e4d485fda8d8007e422189220c3e02ccd24820024180016a41246a4200370200200241ac016a4200370200200220022903d0073703f805200241043602a00120024180016a41c0006a41a889c50036020020024180016a41386a4108360200200241b4016a20033602002002200241e0006a3602c4012002200241106a3602bc01200241013a00c801200241e1016a2006290300370000200241d9016a2007290300370000200241d1016a2008290300370000200241c9016a20022903f805370000200241eb016a200241ba046a2d00003a0000200241e9016a20022f00b8043b000020024180016a41186a420037030020024194016a41c08ec100360200200241003602ec0120024100360290012002200c41ccd2c800ad220d7c370388012002200c200d85220c200d42188985200c42108685200c4225897c370380012001280200220e2001280208220f41d0006c6a2110200241f8056a41206a2111200241d0076a41246a210420024190026a41046a2105200241f8056a41046a2103200241f8056a41017221122001280204211341002114200e211503402014211620152101034002400240024020102001470d00200241f8056a41386a200241b8046a41386a290300370300200241f8056a41306a200241b8046a41306a290300370300200241f8056a41286a200241b8046a41286a290300370300200241f8056a41206a200241b8046a41206a290300370300200241f8056a41186a200241b8046a41186a290300370300200241f8056a41106a200241b8046a41106a290300370300200241f8056a41086a200241b8046a41086a290300370300200220022903b8043703f805201021010c010b200241b8046a41386a200141386a2217290300370300200241b8046a41306a200141306a2218290300370300200241b8046a41286a200141286a2219290300370300200241b8046a41206a200141206a221a290300370300200241b8046a41186a200141186a2214290300370300200241b8046a41106a200141106a2215290300370300200241b8046a41086a200141086a221b290300370300200220012903003703b804200141c0006a280200211c200141c4006a280200211d200141c8006a290200210c200241f8056a41386a221e2017290300370300200241f8056a41306a22172018290300370300200241f8056a41286a221820192903003703002011201a29030037030020062014290300370300200720152903003703002008201b290300370300200220012903003703f805201c0d01200141d0006a21010b024020102001460d0003402001220341d0006a21010240200341c4006a2802002204450d00200441306c450d00200341c0006a280200102c0b20102001470d000b0b02402013450d00201341d0006c450d00200e102c0b20024180016a109407200241f8056a200241106a41d00010c9081a200241e0066a200241f8006a290300370300200241d8066a200241f0006a290300370300200241d0066a200241e0006a41086a290300370300200220022903603703c806200041086a200241f8056a41f00010c9081a200041003602000c060b200241f8026a41386a2219201e290300370300200241f8026a41306a221a2017290300370300200241f8026a41286a22172018290300370300200241f8026a41206a22182011290300370300200241f8026a41186a22142006290300370300200241f8026a41106a22152007290300370300200241f8026a41086a221b2008290300370300200220022903f8053703f802200341386a2019290300370200200341306a201a290300370200200341286a2017290300370200200341206a2018290300370200200341186a2014290300370200200341106a2015290300370200200341086a201b290300370200200320022903f802370200200241d0076a200241f8056a41c40010c9081a20024190026a41086a200b29020037030020024190026a41106a200a29020037030020024190026a41186a200929020037030020024190026a41206a200241d0076a41206a280200360200200241f0016a41086a2217200441086a290200370300200241f0016a41106a2218200441106a290200370300200241f0016a41186a2219200441186a290200370300200220022902d00737039002200220042902003703f001200241b8026a41186a2214200541186a290000370300200241b8026a41106a2215200541106a290000370300200241b8026a41086a221b200541086a290000370300200220052900003703b802200241d8026a41186a221e2019290300370300200241d8026a41106a221f2018290300370300200241d8026a41086a22202017290300370300200220022903f0013703d80220024190096a41ffdcc700410710c501200241d0076a4190b5c300410810c501200241a0096a200241b8026a10e40220022802a809221741206a2218417f4c0d030240024020180d00410121190c010b201810322219450d030b200241003602c807200220183602c407200220193602c007200241c0076a4100411010c80120022802c00720022802c80722186a2219200229009009370000201941086a20024190096a41086a2900003700002002201841106a22183602c807200241c0076a2018411010c80120022802c00720022802c80722186a221920022900d007370000201941086a200b2900003700002002201841106a22193602c80720022802a0092118200241c0076a2019201710c80120022802c007221920022802c807221a6a2018201710c9081a2002201a20176a22173602c807024020022802a409450d002018102c0b200241f8056a2019201710e50220022d00f8052118200241d0076a201241c00110c9081a41002117024020184101470d00200241b8046a200241d0076a41c00110c9081a410121170b024020022802c407450d002019102c0b02402017450d00200241f8026a200241b8046a41c00110c9081a20062014290300370300200720152903003703002008201b290300370300201120022903d802370300201141086a2020290300370300201141106a201f290300370300201141186a201e290300370300200220022903b8023703f8052002200c3703c0062002201d3602bc062002201c3602b806200141d0006a2115201641016a211441682118024002400340200241086a200241f8026a20184187d7c0006a280000221910a902200228020c221c41046a2217417f4c0d072002280208211a0240024020170d004101211d0c010b20171032221d450d070b200241003602c004200220173602bc042002201d3602b804200241b8046a41004104102f20022802b80420022802c00422176a20193600002002201741046a3602c004201a201c200241b8046a10ca0420022802c004211d20022802b80421172002201636029009200241d0076a20024180016a2017201d20024190096a4104109a03024020022802bc04450d002017102c0b20022802d407211720022802d0074101460d0102402017450d0020022802d807450d002017102c0b201841046a22180d000b2002201636029009200241003602c004200242013703b804200241b8046a41004120102f20022802b80420022802c00422186a221720022903f805370000201741086a2008290300370000201741106a2007290300370000201741186a20062903003700002002201841206a3602c0042011200241b8046a10f803200241d0076a20024180016a20024190096a410420022802b804221720022802c004109a03024020022802bc04450d002017102c0b20022802d407211720022802d0074101460d0102402017450d0020022802d807450d002017102c0b20022802bc062201450d04200141306c450d0420022802b806102c0c040b02400240024020172d00000e0402020002010b201741086a280200450d01201741046a280200102c0c010b201741286a280200450d00201741246a280200102c0b2017102c200041086a411a36020020004184edc400360204200041013602000c060b02400240024020172d00000e0402020002010b201741086a280200450d01201741046a280200102c0c010b201741286a280200450d00201741246a280200102c0b2017102c200041086a411a36020020004184edc400360204200041013602000c050b0240201d450d00201d41306c450d00201c102c0b200141d0006a2101201641016a21160c000b0b0b1039000b103b000b201041b07f6a2103024020022802bc062204450d00200441306c450d0020022802b806102c0b024020032001460d00200f41d0006c200e6a41b07f6a21040340024020014194016a2802002203450d00200341306c450d0020014190016a280200102c0b2004200141d0006a2201470d000b0b02402013450d00201341d0006c450d00200e102c0b20024180016a109407200241106a10dd040b200241b0096a24000be20902087f047e230041b0016b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00200041003602000c010b200341186a280200210220032802142104200341003a0060024002402002450d00200320012d00003a0040200341013a0060024020024101460d00200320012d00013a0041200341023a006020024102460d00200320012d00023a0042200341033a006020024103460d00200320012d00033a0043200341043a006020024104460d00200320012d00043a0044200341053a006020024105460d00200320012d00053a0045200341063a006020024106460d00200320012d00063a0046200341073a006020024107460d00200320012d00073a0047200341083a006020024108460d00200320012d00083a0048200341093a006020024109460d00200320012d00093a00492003410a3a00602002410a460d00200320012d000a3a004a2003410b3a00602002410b460d00200320012d000b3a004b2003410c3a00602002410c460d00200320012d000c3a004c2003410d3a00602002410d460d00200320012d000d3a004d2003410e3a00602002410e460d00200320012d000e3a004e2003410f3a00602002410f460d00200320012d000f3a004f200341103a006020024110460d00200320012d00103a0050200341113a006020024111460d00200320012d00113a0051200341123a006020024112460d00200320012d00123a0052200341133a006020024113460d00200320012d00133a0053200341143a006020024114460d00200320012d00143a0054200341153a006020024115460d00200320012d00153a0055200341163a006020024116460d00200320012d00163a0056200341173a006020024117460d00200320012d00173a0057200341183a006020024118460d00200320012d00183a0058200341193a006020024119460d00200320012d00193a00592003411a3a00602002411a460d00200320012d001a3a005a2003411b3a00602002411b460d00200320012d001b3a005b2003411c3a00602002411c460d00200320012d001c3a005c2003411d3a00602002411d460d00200320012d001d3a005d2003411e3a00602002411e460d00200320012d001e3a005e2003411f3a00602002411f460d00200341206a41106a2205200341c0006a41106a2206290300370300200341206a41086a2207200341c0006a41086a2208290300370300200320012d001f3a005f200341206a41186a2209200341c0006a41186a220a290300370300200341203a006020032003290340220b3703682003200b3703202002417c714120460d0120082007290300220b37030020062005290300220c370300200a2009290300220d37030020032003290320220e370340200128002021022000411c6a200d370200200041146a200c3702002000410c6a200b3702002000200e370204200041246a2002360200410121020c020b200341003a00600b4100210220034100360270200342013703682003410f3602242003200341086a3602202003200341e8006a3602ac01200341d4006a410136020020034201370244200341b4bcc3003602402003200341206a360250200341ac016a41dcb7c000200341c0006a103e1a20033502704220862003350268841000200328026c450d002003280268102c0b200020023602002004450d002001102c0b200341b0016a24000b960201067f024020002802102201450d00200041146a280200220241046a2103200120026a41016a21042002280200417f73418081828478712101024003400240024020010d000340200320044f0d04200241c07e6a210220032802002101200341046a220521032001418081828478712201418081828478460d000b2001418081828478732201417f6a2001712106200521030c010b2002450d022001417f6a20017121060b2001682105200621012002410020054103766b41306c6a220541746a280200450d00200541706a280200102c200621010c000b0b200041146a280200200028021041016aad42307ea76b102c0b0240200041246a2802002203450d0020002802202202450d002003450d002002102c0b0be6840105087f017e087f027e057f23004190036b2205240002400240410810322206450d0020062001200241e0016c6a220736020420062001360200410810322208450d0020082003200441e0016c6a2209360204200820033602000240024002402000450d00200541d8016a210a0c010b200541d8016a41186a220b4200370300200541d8016a41106a22044200370300200541d8016a41086a22024200370300200542003703d801200541e8026a41b4f0c500410f10c5012002200541e8026a41086a220c290000370300200520052900e8023703d801200541e8026a418884c600410710c501200b200c290000370300200420052900e802370300200541d8016a210a200541d8016a412010ce020d00200b42003703002004420037030020024200370300200542003703d801200541e8026a41b4f0c500410f10c5012002200c290000370300200520052900e8023703d801200541e8026a41c884c600410c10c501200441086a200c290000370000200420052900e802370000200541d8006a200541d8016a10cf022005290360210d2005280258210420054188026a41186a2202420037030020054188026a41106a220c420037030020054188026a41086a220b4200370300200542003703880220054188016a41ffdcc700410710c501200b20054188016a41086a290000370300200520052900880137038802200541a8026a41b8b3c300410c10c5012002200541a8026a41086a290300370300200c20052903a802370300200541d0006a20054188026a412010c601200528025421022005280250210c200541d8016a200d420020041b10d90720052802e001210b20052802d8012104200520024100200c1b3602e8022004200b200541e8026a410410a702024020052802dc01450d002004102c0b2008102c2006102c0c010b200541e8026a200610da070240024020052802e802450d00200541d8016a41106a200541e8026a41106a290300370300200541d8016a41086a200541e8026a41086a290300370300200541d8016a41186a200541e8026a41186a290300370300200541d8016a41206a200541e8026a41206a28020036020020054188026a41086a200541e4016a29020037030020054188026a41106a200541ec016a29020037030020054188026a41186a200541f4016a290200370300200520052903e8023703d801200520052902dc0137038802200541d8016a200610db07417f20052802d801220441016a220220022004491bad42287e220d422088a70d04200da72204417f4c0d0420041032220e450d03200e200529038802370300200e4201370320200e41186a20054188026a41186a220f290300370300200e41106a20054188026a41106a2210290300370300200e41086a20054188026a41086a22112903003703004101210c200541013602c0012005200e3602b8012005200441286e22043602bc01200541e8026a200610da07024020052802e802450d00200541d8016a4104722102412821124101210c0340200541d8016a41206a200541e8026a41206a280200360200200541d8016a41186a220b200541e8026a41186a290300370300200541d8016a41106a2213200541e8026a41106a290300370300200541d8016a41086a2214200541e8026a41086a290300370300200520052903e8023703d8012011200241086a2902003703002010200241106a290200370300200f200241186a2902003703002005200229020037038802200b200f290300370300201320102903003703002014201129030037030020052005290388023703d8010240200c2004470d00200541e8026a200610db07200541b8016a2004417f20052802e802220e41016a22152015200e491b10f20420052802b801210e0b200e20126a220420052903d8013703002014290300210d20132903002116200b2903002117200441206a4201370300200441186a2017370300200441106a2016370300200441086a200d3703002005200c41016a220b3602c001200541e8026a200610da07024020052802e802450d00201241286a211220052802bc012104200b210c0c010b0b200c41016a210c20052802bc01210420052802b801210e0b2006102c0c010b2006102c4108210e4100210c410021040b200541f0016a220b4200370300200541e8016a22024200370300200541d8016a41086a4200370300200542003703d801200541e8026a41b4f0c500410f10c501200a41086a200541e8026a41086a2213290000370000200a20052900e802370000200541e8026a418884c600410710c501200b2013290000370300200220052900e802370300200541e8026a200a412010a0040240024020052802e8024101460d002005200c3602e001200520043602dc012005200e3602d80120054188026a200541d8016a41004100200510dc070c010b200a412010b40120052902ec02210d2005200c3602e001200520043602dc012005200e3602d80120054188026a200541d8016a200da74101200d422088a710dc070b20052d008802210c200541d8016a41186a220b4200370300200541d8016a41106a22134200370300200541d8016a41086a22144200370300200542003703d801200541e8026a41b4f0c500410f10c501200a41086a2212200541e8026a41086a2204290000370000200a20052900e802370000200541e8026a41c884c600410c10c501200241086a22062004290000370000200220052900e802370000200541c0006a200a10cf022005290348420020052802401b210d0240200c4104470d00200b42003703002013420037030020144200370300200542003703d801200541e8026a41b4f0c500410f10c50120122004290000370000200a20052900e802370000200541e8026a41c884c600410c10c50120062004290000370000200220052900e8023700002005200d42017c220d3703e802200a4120200541e8026a410810a7020b20054188026a41186a2204420037030020054188026a41106a2202420037030020054188026a41086a220c4200370300200542003703880220054188016a41ffdcc700410710c501200c20054188016a41086a290000370300200520052900880137038802200541a8026a41b8b3c300410c10c5012004200541a8026a41086a290300370300200220052903a802370300200541386a20054188026a412010c601200528023c21022005280238210c200541d8016a200d10d90720052802e001210b20052802d8012104200520024100200c1b3602e8022004200b200541e8026a410410a702024020052802dc01450d002004102c0b2008102c0b410810322215450d002015200736020420152001360200410810322208450d002008200936020420082003360200200541e8026a201510dd070240024020052802e802450d00200541d8016a41106a200541e8026a41106a290300370300200541d8016a41086a200541e8026a41086a290300370300200541d8016a41186a200541e8026a41186a290300370300200541d8016a41206a200541e8026a41206a28020036020020054188026a41086a200541e4016a29020037030020054188026a41106a200541ec016a29020037030020054188026a41186a200541f4016a290200370300200520052903e8023703d801200520052902dc0137038802200541d8016a201510db07417f20052802d801220441016a220220022004491bad42287e220d422088a70d03200da72204417f4c0d03200410322210450d02201020052903880237030020104201370320201041186a20054188026a41186a2206290300370300201041106a20054188026a41106a2211290300370300201041086a20054188026a41086a220e29030037030041012118200541013602c001200520103602b8012005200441286e220f3602bc01200541e8026a201510dd07024020052802e802450d00200541d8016a4104722102412821124101210c0340200541d8016a41206a200541e8026a41206a280200360200200541d8016a41186a220b200541e8026a41186a290300370300200541d8016a41106a2213200541e8026a41106a290300370300200541d8016a41086a2214200541e8026a41086a290300370300200520052903e8023703d801200e200241086a2902003703002011200241106a2902003703002006200241186a2902003703002005200229020037038802200b2006290300370300201320112903003703002014200e29030037030020052005290388023703d8010240200c200f470d00200541e8026a201510db07200541b8016a200f417f20052802e802220441016a221020102004491b10f20420052802b80121100b201020126a220420052903d8013703002014290300210d20132903002116200b2903002117200441206a4201370300200441186a2017370300200441106a2016370300200441086a200d3703002005200c41016a22043602c001200541e8026a201510dd07024020052802e802450d00201241286a211220052802bc01210f2004210c0c010b0b200c41016a211820052802bc01210f20052802b80121100b2015102c0c010b2015102c4100210f41082110410021180b200541e8026a200810dd070240024020052802e802450d00200541d8016a41106a200541e8026a41106a290300370300200541d8016a41086a200541e8026a41086a290300370300200541d8016a41186a200541e8026a41186a290300370300200541d8016a41206a200541e8026a41206a28020036020020054188026a41086a200541e4016a29020037030020054188026a41106a200541ec016a29020037030020054188026a41186a200541f4016a290200370300200520052903e8023703d801200520052902dc0137038802200541d8016a200810db07417f20052802d801220441016a220220022004491bad42287e220d422088a70d03200da72204417f4c0d0320041032220a450d02200a200529038802370300200a4201370320200a41186a20054188026a41186a2211290300370300200a41106a20054188026a41106a220e290300370300200a41086a20054188026a41086a221529030037030041012119200541013602c0012005200a3602b8012005200441286e22063602bc01200541e8026a200810dd07024020052802e802450d00200541d8016a4104722102412821124101210c0340200541d8016a41206a200541e8026a41206a280200360200200541d8016a41186a220b200541e8026a41186a290300370300200541d8016a41106a2213200541e8026a41106a290300370300200541d8016a41086a2214200541e8026a41086a290300370300200520052903e8023703d8012015200241086a290200370300200e200241106a2902003703002011200241186a2902003703002005200229020037038802200b20112903003703002013200e2903003703002014201529030037030020052005290388023703d8010240200c2006470d00200541e8026a200810db07200541b8016a2006417f20052802e802220441016a220a200a2004491b10f20420052802b801210a0b200a20126a220420052903d8013703002014290300210d20132903002116200b2903002117200441206a4201370300200441186a2017370300200441106a2016370300200441086a200d3703002005200c41016a22043602c001200541e8026a200810dd07024020052802e802450d00201241286a211220052802bc0121062004210c0c010b0b200c41016a211920052802bc01210620052802b801210a0b2008102c0c010b2008102c410021064108210a410021190b200541a0026a220c420037030020054198026a2211420037030020054188026a41086a220442003703002005420037038802200541a8026a41c7dcc700410410c5012004200541a8026a41086a2202290000370300200520052900a80237038802200541a8026a41ccd5c500410a10c501200c2002290000370300201120052900a802370300200541286a20054188026a10cf02024002400240024002402005290330420020052802281b220d42017c2216200d540d00200c420037030020114200370300200442003703002005420037038802200541a8026a41c7dcc700410410c50120042002290000370300200520052900a80237038802200541a8026a41ccd5c500410a10c501201141086a220b2002290000370000201120052900a802370000200520163703d80120054188026a4120200541d8016a410810a702200c420037030020114200370300200442003703002005420037038802200541a8026a41c7dcc700410410c50120042002290000370300200520052900a80237038802200541a8026a41f0d5c500410b10c501200b2002290000370000201120052900a802370000201841286c4104722204417f4c0d06200410322202450d05200541003602e001200520043602dc01200520023602d801200541d8016a2018108f010240024020180d0020052802d801210c20052802e00121020c010b2010201841286c6a210b20052802e0012102201021040340200541d8016a20024120102f20052802d80120052802e001220c6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200c41206a22023602e001200441206a290300210d200541d8016a20024108102f20052802d801220c20052802e00122026a200d3700002005200241086a22023602e001200b200441286a2204470d000b0b20054188026a4120200c200210a702024020052802dc01450d00200c102c0b0240200f450d002010450d00200f41286c450d002010102c0b201642017c220d2016540d01200541e8006a41186a22044200370300200541e8006a41106a22084200370300200541e8006a41086a2202420037030020054200370368200541a8026a41c7dcc700410410c5012002200541a8026a41086a220c290000370300200520052900a802370368200541a8026a41c8d8c500410e10c5012004200c290000370300200820052900a802370300200541d8016a200541e8006a10860520052d00d801210420054188026a41186a2202200541f1016a29000037030020054188026a41106a220c200541e9016a29000037030020054188026a41086a220b200541e1016a290000370300200520052900d901370388020240024020044101460d0020054198016a41186a420037030020054198016a41106a420037030020054198016a41086a420037030020054200370398010c010b20054198016a41186a200229030037030020054198016a41106a200c29030037030020054198016a41086a200b2903003703002005200529038802370398010b200541e8006a41186a220c4200370300200541e8006a41106a220b4200370300200541e8006a41086a2204420037030020054200370368200541a8026a41c7dcc700410410c5012004200541a8026a41086a2202290000370300200520052900a802370368200541a8026a41f0d8c500410c10c501200841086a22132002290000370000200820052900a802370000200541206a200541e8006a412010c6012005280224211420052802202112200c4200370300200b42003703002004420037030020054200370368200541a8026a41c7dcc700410410c50120042002290000370300200520052900a802370368200541a8026a41f0d8c500410c10c50120132002290000370000200820052900a802370000200541003602d801200541e8006a4120200541d8016a410410a702200541d8016a41186a20054198016a41186a290300370300200541d8016a41106a20054198016a41106a290300370300200541d8016a41086a20054198016a41086a29030037030020052005290398013703d801417f2014410020121b221041016a220420042010491b410d744128722204417f4c0d06200410322202450d05200541003602c002200520043602bc02200520023602b802200541b8026a4100412010c80120052802b80220052802c00222026a220420052903d801370000200441086a200541d8016a41086a290300370000200441106a200541d8016a41106a290300370000200441186a200541d8016a41186a2903003700002005200241206a22043602c002200541b8026a2004410810c80120052802b802221520052802c00222046a200d3700002005200441086a220e3602c002200541e4026a41046a2112200541c8026a41086a210f4100210241002104034020102002201020024b1b211402400240034002402004450d00200b2013470d02200c450d00200c41ffffff3f71450d002004102c0b20142002460d0220054188016a41c7dcc700410410c501200541a8026a41d4d9c500411110c501200520023602e402200541c8026a200541e4026a410410c701200520123602742005200f36026c2005200541e4026a3602702005200541c8026a360268200541d8026a200541e8006a107e20052802e002220441206a220c417f4c0d0a02400240200c0d004101210b0c010b200c1032220b450d0a0b200541003602d0022005200c3602cc022005200b3602c802200541c8026a4100411010c80120052802c80220052802d002220c6a220b200529008801370000200b41086a20054188016a41086a2900003700002005200c41106a220c3602d002200541c8026a200c411010c80120052802c80220052802d002220c6a220b20052903a802370000200b41086a200541a8026a41086a2903003700002005200c41106a220c3602d00220052802d802210b200541c8026a200c200410c80120052802c802220c20052802d00222136a200b200410c9081a2005201320046a22133602d002024020052802dc02450d00200b102c0b200541e8006a200c201310810502400240200528026822040d004200210d410121040c010b200c201310b401200529026c210d0b024020052802cc02450d00200c102c0b200241016a21022004200d422088a74105746a2113200da7210c2004210b0c000b0b20054188026a41186a200b41186a221429000037030020054188026a41106a200b41106a221529000037030020054188026a41086a200b41086a22182900003703002005200b290000370388022018290000210d20152900002116200b2900002117200541b8016a41186a22152014290000370300200541b8016a41106a22142016370300200541b8016a41086a2218200d370300200520173703b801200541e8006a41186a221a2015290300370300200541e8006a41106a221b2014290300370300200541e8006a41086a221c2018290300370300200520052903b801370368200541b8026a200e412010c80120052802b802221520052802c002220e6a22142005290368370000201441086a201c290300370000201441106a201b290300370000201441186a201a2903003700002005200e41206a220e3602c002200b41206a210b0c010b0b200541e8026a2015200e109a01024020052802bc02450d002015102c0b200541e8006a41186a4200370300200541e8006a41106a4200370300200541e8006a41086a2204420037030020054200370368200541a8026a41c7dcc700410410c5012004200541a8026a41086a2202290000370300200520052900a802370368200541a8026a41c8d8c500410e10c501200841086a2002290000370000200820052900a802370000412010322204450d05200542203702dc01200520043602d801200541d8016a41004120102f20052802d801220220052802e001220c6a220420052900e802370000200441086a200541e8026a41086a290000370000200441106a200541e8026a41106a290000370000200441186a200541e8026a41186a2900003700002005200c41206a22043602e001200541e8006a41202002200410a702024020052802dc01450d002002102c0b200541d8016a41186a220c20054198016a41186a290300370300200541d8016a41106a220b20054198016a41106a290300370300200541d8016a41086a221320054198016a41086a29030037030020052005290398013703d80120054188026a41186a420037030020054188026a41106a420037030020054188026a41086a220442003703002005420037038802200541a8026a41c7dcc700410410c5012004200541a8026a41086a2202290000370300200520052900a80237038802200541a8026a418cd7c500410a10c501201141086a2002290000370000201120052900a802370000412010322204450d05200542203702ec02200520043602e802200541e8026a41004120102f20052802e802220220052802f00222146a220420052903d801370000200441086a2013290300370000200441106a200b290300370000200441186a200c2903003700002005201441206a22043602f00220054188026a41202002200410a702024020052802ec02450d002002102c0b20054188026a41186a2202420037030020054188026a41106a220c420037030020054188026a41086a220442003703002005420037038802200541a8026a41c7dcc700410410c5012004200541a8026a41086a220b290000370300200520052900a80237038802200541a8026a41c8d8c500410e10c501201141086a200b290000370000201120052900a802370000200541d8016a20054188026a10860520052d00d801210b2002200541f1016a290000370300200c200541e9016a2900003703002004200541e1016a290000370300200520052900d9013703880202400240200b4101460d00200541b8016a41186a4200370300200541b8016a41106a4200370300200541b8016a41086a4200370300200542003703b8010c010b200541b8016a41186a2002290300370300200541b8016a41106a200c290300370300200541b8016a41086a200429030037030020052005290388023703b8010b200541d8016a410c6a2019360200200541d8016a41086a2006360200200541d8016a41106a20052903b801370300200541d8016a41186a200541b8016a41086a290300370300200541d8016a41206a200541b8016a41106a290300370300200541d8016a41286a200541b8016a41186a2903003703002005200a3602dc01200541003602d801200541e8026a200541d8016a102e20054193026a200541e8026a41086a280200360000200520052903e80237008b02200541e8026a410c6a2005418f026a290000370000200541c28289aa043600e902200541023a00e80220052005290088023700ed02200541e8026a109a0602402006450d00200641286c450d00200a102c0b20054188026a41186a420037030020054188026a41106a420037030020054188026a41086a220442003703002005420037038802200541a8026a41c7dcc700410410c5012004200541a8026a41086a2202290000370300200520052900a80237038802200541a8026a418cd8c500410f10c501201141086a2002290000370000201120052900a802370000200541203602ac02200520054188026a3602a802200541e8006a20054188026a412010b30102400240200528026822020d00410321040c010b200528026c210c0240024002400240200541f0006a2802002204450d0020022d00004101470d002004417f6a4108490d00200441776a4108490d0020044111460d00200229000121162002290009210d41002104024020022d00110e03030200010b410221040c020b200541003602f002200542013703e8022005410f36028c012005200541a8026a360288012005200541e8026a3602c802200541ec016a4101360200200542013702dc01200541b4bcc3003602d801200520054188016a3602e801200541c8026a41dcb7c000200541d8016a103e1a20053502f00242208620053502e802841000024020052802ec02450d0020052802e802102c0b410321040c020b410121040b200520052800d8013602d8022005200541db016a2800003600db020b0240200c450d002002102c0b024020044103470d00410321040c010b20054188026a412010b4010b2005200d3703b002200520163703a802200520052802d8023602d801200520052800db023600db01024020044103460d00200541e8006a41086a200541a8026a41086a290300220d370300200520052903a8022216370368200520052802d80136028801200520052800db0136008b01200541e8016a200d370300200541d8016a41086a2016370300200541f0016a20043a0000200541f4016a200528008b0136000020052005280288013600f101200541023602d801200541e8026a200541d8016a102e2005418b026a220441086a200541e8026a41086a280200360000200420052903e802370000200541f4026a2005418f026a290000370000200541c28289aa043600e902200541023a00e80220052005290088023700ed02200541e8026a109a060b410810322214450d052014200736020420142001360200410810322211450d052011200936020420112003360200200541e8006a41186a4200370300200541e8006a41106a4200370300200541e8006a41086a220442003703002005420037036820054188016a41c1dcc700410610c501200420054188016a41086a2900003703002005200529008801370368200541a8026a4196a4c600410610c501200841086a200541a8026a41086a2204290300370000200820052903a802370000200541186a200541e8006a412010c6012005280218210b200528021c2113200541d8016a41186a22024200370300200541d8016a41106a220a4200370300200541d8016a41086a220c4200370300200542003703d801200541a8026a418dddc700410810c501200c2004290000370300200520052900a8023703d801200541a8026a4199eec300410e10c50120022004290000370300200a20052900a8023703002005201341ac026a41ac02200b1b3602e802200541d8016a4120200541e8026a410410a702200541e8026a201410de070240024020052802e802450d00200a200541e8026a41106a290300370300200c200541e8026a41086a2903003703002002200541e8026a41186a290300370300200541d8016a41206a200541e8026a41206a280200360200200541b8016a41086a200541e4016a290200370300200541b8016a41106a200541ec016a290200370300200541b8016a41186a200541f4016a290200370300200520052903e8023703d801200520052902dc013703b801200541d8016a201410db07417f20052802d801220441016a220220022004491b220441ffffff3f712004470d0820044105742204417f4c0d08200410322210450d07201020052903b801370000201041186a200541b8016a41186a290300370000201041106a200541b8016a41106a290300370000201041086a200541b8016a41086a2903003700004101210c200541013602a001200520103602980120052004410576221336029c01200541e8026a201410de07024020052802e802450d00200541d8016a41047221044120210b4101210c0340200541d8016a41206a200541e8026a41206a280200360200200541d8016a41186a200541e8026a41186a290300370300200541d8016a41106a200541e8026a41106a290300370300200541d8016a41086a200541e8026a41086a290300370300200520052903e8023703d80120054188026a41086a2202200441086a29000037030020054188026a41106a2212200441106a29000037030020054188026a41186a2206200441186a2900003703002005200429000037038802200541e8006a41186a220f2006290300370300200541e8006a41106a22062012290300370300200541e8006a41086a2212200229030037030020052005290388023703680240200c2013470d00200541d8016a201410db0720054198016a2013417f20052802d801220241016a221020102002491b10d60120052802980121100b2010200b6a22022005290368370000200241186a200f290300370000200241106a2006290300370000200241086a20122903003700002005200c41016a220c3602a001200541e8026a201410de07200b41206a210b200528029c01211320052802e8020d000b0b2014102c0c010b2014102c41002113410121104100210c0b200541f0016a4200370300200541e8016a4200370300200541d8016a41086a22044200370300200542003703d801200541a8026a418dddc700410810c5012004200541a8026a41086a2202290000370300200520052900a8023703d801200541a8026a41a7edc300410410c501200a41086a2002290000370000200a20052900a802370000200c4105744104722204417f4c0d06200410322202450d05200541003602f002200520043602ec02200520023602e802200541e8026a200c108f0102400240200c0d0020052802e802211420052802f00221020c010b200c410574210c20052802f0022102201021040340200541e8026a20024120102f20052802e802221420052802f002220b6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200b41206a22023602f002200441206a2104200c41606a220c0d000b0b200541d8016a41202014200210a702024020052802ec02450d002014102c0b02402013450d002010450d00201341ffffff3f71450d002010102c0b2011102c410810322213450d052013200736020420132001360200410810322212450d052012200936020420122003360200200541e8006a41186a4200370300200541e8006a41106a4200370300200541e8006a41086a220442003703002005420037036820054188016a41ffdcc700410710c501200420054188016a41086a2900003703002005200529008801370368200541a8026a41b8b3c300410c10c501200841086a200541a8026a41086a290300370000200820052903a802370000200541106a200541e8006a412010c6012005280214211820052802102119200541e8026a201310df070240024020052802e802450d00200541d8016a41106a200541e8026a41106a290300370300200541d8016a41086a200541e8026a41086a290300370300200541d8016a41186a200541e8026a41186a290300370300200541d8016a41206a200541e8026a41206a280200360200200541b8016a41086a200541d8016a410c6a290200370300200541b8016a41106a200541ec016a290200370300200541b8016a41186a200541f4016a290200370300200520052903e8023703d801200520052902dc013703b801200541d8016a201310db07417f20052802d801220441016a220220022004491b220441ffffff3f712004470d0820044105742204417f4c0d0820041032220e450d07200e20052903b801370000200e41186a200541b8016a41186a290300370000200e41106a200541b8016a41106a290300370000200e41086a200541b8016a41086a2903003700004101210c200541013602a0012005200e3602980120052004410576221436029c01200541e8026a201310df07024020052802e802450d00200541d8016a41047221044120210b4101210c0340200541d8016a41206a200541e8026a41206a280200360200200541d8016a41186a200541e8026a41186a290300370300200541d8016a41106a200541e8026a41106a290300370300200541d8016a41086a200541e8026a41086a290300370300200520052903e8023703d80120054188026a41086a2202200441086a29000037030020054188026a41106a2206200441106a29000037030020054188026a41186a220f200441186a2900003703002005200429000037038802200541e8006a41186a2210200f290300370300200541e8006a41106a220f2006290300370300200541e8006a41086a2206200229030037030020052005290388023703680240200c2014470d00200541d8016a201310db0720054198016a2014417f20052802d801220241016a221120112002491b10d601200528029801210e0b200e200b6a22022005290368370000200241186a2010290300370000200241106a200f290300370000200241086a20062903003700002005200c41016a220c3602a001200541e8026a201310df07200b41206a210b200528029c01211420052802e8020d000b0b2013102c0c010b2013102c4101210e410021144100210c0b200541e8026a201210df070240024020052802e802450d00200541d8016a41106a200541e8026a41106a290300370300200541d8016a41086a200541e8026a41086a290300370300200541d8016a41186a200541e8026a41186a290300370300200541d8016a41206a200541e8026a41206a280200360200200541b8016a41086a200541e4016a290200370300200541b8016a41106a200541ec016a290200370300200541b8016a41186a200541f4016a290200370300200520052903e8023703d801200520052902dc013703b801200541d8016a201210db07417f20052802d801220441016a220220022004491b220441ffffff3f712004470d0820044105742204417f4c0d08200410322215450d07201520052903b801370000201541186a200541b8016a41186a290300370000201541106a200541b8016a41106a290300370000201541086a200541b8016a41086a2903003700004101210b200541013602a001200520153602980120052004410576220236029c01200541e8026a201210df07024020052802e802450d00200541d8016a4104722104412021134101210b0340200541d8016a41206a200541e8026a41206a280200360200200541d8016a41186a200541e8026a41186a290300370300200541d8016a41106a200541e8026a41106a290300370300200541d8016a41086a200541e8026a41086a290300370300200520052903e8023703d80120054188026a41086a2206200441086a29000037030020054188026a41106a220f200441106a29000037030020054188026a41186a2210200441186a2900003703002005200429000037038802200541e8006a41186a22112010290300370300200541e8006a41106a2210200f290300370300200541e8006a41086a220f200629030037030020052005290388023703680240200b2002470d00200541d8016a201210db0720054198016a2002417f20052802d801220641016a221520152006491b10d60120052802980121150b201520136a22022005290368370000200241186a2011290300370000200241106a2010290300370000200241086a200f2903003700002005200b41016a220b3602a001200541e8026a201210df07201341206a2113200528029c01210220052802e8020d000b0b2012102c0c010b2012102c41002102410121154100210b0b2018410020191b211220054188026a10e007200541e8006a41186a4200370300200541f8006a4200370300200541e8006a41086a220442003703002005420037036820054188016a41c1dcc700410610c501200420054188016a41086a2900003703002005200529008801370368200541a8026a4196a4c600410610c501200841086a200541a8026a41086a290300370000200820052903a802370000200541086a200541e8006a412010c601200528020c21062005280208210f02402005280290022213200528028c02470d0020054188026a201310fe0320052802900221130b20052802880220134105746a2204201236021c200420153602102004200e3602042004200641016a4101200f1b360200200441186a200b360200200441146a20023602002004410c6a200c360200200441086a20143602002005201341016a220436029002200541e8026a41086a20043602002005200529038802220d3703e80202400240200da7220c0d00200541f0016a4200370300200541e8016a4200370300200541d8016a41086a22044200370300200542003703d801200541a8026a41f6ddc700410b10c5012004200541a8026a41086a2202290000370300200520052900a8023703d801200541a8026a41e9eec600411610c501200a41086a2002290000370000200a20052900a802370000200541d8016a412010b4010c010b200541f0016a4200370300200541d8016a41106a4200370300200541d8016a41086a22044200370300200542003703d801200541a8026a41f6ddc700410b10c5012004200541a8026a41086a2202290000370300200520052900a8023703d801200541a8026a41e9eec600411610c501200a41086a2002290000370000200a20052900a802370000200541d8016a200541e8026a108b050240200541e8026a41086a2802002204450d0020044105742102200c41106a210403400240200441786a28020041ffffff3f71450d00200441746a280200102c0b0240200441046a28020041ffffff3f71450d002004280200102c0b200441206a2104200241606a22020d000b0b20052802ec0241ffffff3f71450d00200c102c0b410810322214450d052014200736020420142001360200410810322211450d052011200936020420112003360200200541e8026a201410e10720052802e802450d02200541d8016a41106a200541e8026a41106a290300370300200541d8016a41086a200541e8026a41086a290300370300200541d8016a41186a200541e8026a41186a290300370300200541d8016a41206a200541e8026a41206a280200360200200541e8006a41086a200541e4016a290200370300200541e8006a41106a200541ec016a290200370300200541e8006a41186a200541f4016a290200370300200520052903e8023703d801200520052902dc01370368200541d8016a201410db07417f20052802d801220441016a220220022004491b220441ffffff3f712004470d0620044105742204417f4c0d06200410322210450d0520102005290368370000201041186a200541e8006a41186a290300370000201041106a200541e8006a41106a290300370000201041086a200541e8006a41086a2903003700004101210c200541013602a001200520103602980120052004410576221336029c01200541e8026a201410e107024020052802e802450d00200541d8016a41047221044120210b4101210c0340200541d8016a41206a200541e8026a41206a280200360200200541d8016a41186a200541e8026a41186a290300370300200541d8016a41106a200541e8026a41106a290300370300200541d8016a41086a200541e8026a41086a290300370300200520052903e8023703d801200541b8016a41086a2202200441086a290000370300200541b8016a41106a2212200441106a290000370300200541b8016a41186a2206200441186a290000370300200520042900003703b80120054188026a41186a220f200629030037030020054188026a41106a2206201229030037030020054188026a41086a22122002290300370300200520052903b801370388020240200c2013470d00200541d8016a201410db0720054198016a2013417f20052802d801220241016a221020102002491b10d60120052802980121100b2010200b6a2202200529038802370000200241186a200f290300370000200241106a2006290300370000200241086a20122903003700002005200c41016a220c3602a001200541e8026a201410e107200b41206a210b200528029c01211320052802e8020d000b0b2014102c20100d03200541f0016a4200370300200541e8016a4200370300200541d8016a41086a22044200370300200542003703d80120054188016a4189bec300410f10c501200420054188016a41086a29000037030020052005290088013703d801200541a8026a41a0c0c300411410c501200a41086a200541a8026a41086a290300370000200a20052903a802370000200541d8016a412010b4010c040b418eeec50041c90041d8eec500105c000b418eeec50041c90041e8eec500105c000b2014102c410121104100210c410021130b20054180036a22044200370300200541f8026a22024200370300200541e8026a41086a220b4200370300200542003703e80220054188016a4189bec300410f10c501200b20054188016a41086a29000037030020052005290088013703e802200541a8026a41a0c0c300411410c5012004200541a8026a41086a290300370300200220052903a802370300200c4105744104722204417f4c0d02200410322202450d01200541003602e001200520043602dc01200520023602d801200541d8016a200c108f0102400240200c0d0020052802d801211420052802e00121020c010b200c410574210c20052802e0012102201021040340200541d8016a20024120102f20052802d801221420052802e001220b6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200b41206a22023602e001200441206a2104200c41606a220c0d000b0b200541e8026a41202014200210a702024020052802dc01450d002014102c0b2013450d002010450d00201341ffffff3f71450d002010102c0b2011102c410810322206450d00200620073602042006200136020041081032220f450d00200f2009360204200f20033602000240024002402000450d00200541003602e002200541003602d802200541e8026a200610e207024020052802e802450d00200541d8016a41047221040340200541d8016a41206a200541e8026a41206a280200360200200541d8016a41186a2202200541e8026a41186a290300370300200541d8016a41106a220c200541e8026a41106a290300370300200541d8016a41086a220b200541e8026a41086a290300370300200520052903e8023703d80120054188026a41086a2213200441086a29000037030020054188026a41106a2214200441106a29000037030020054188026a41186a2212200441186a290000370300200520042900003703880220022012290300370300200c2014290300370300200b201329030037030020052005290388023703d801200541d8026a200541d8016a10e406200541e8026a200610e20720052802e8020d000b0b2006102c200541e8026a200f10e207024020052802e802450d00200541d8016a41047221040340200541d8016a41206a200541e8026a41206a280200360200200541d8016a41186a2202200541e8026a41186a290300370300200541d8016a41106a220c200541e8026a41106a290300370300200541d8016a41086a220b200541e8026a41086a290300370300200520052903e8023703d801200541b8016a41086a2213200441086a290000370300200541b8016a41106a2214200441106a290000370300200541b8016a41186a2212200441186a290000370300200520042900003703b80120022012290300370300200c2014290300370300200b2013290300370300200520052903b8013703d801200541d8026a200541d8016a10e406200541e8026a200f10e20720052802e8020d000b0b200f102c024020052802d80222040d00410021044100210b410021130c020b20052802e002211320052802dc0221022004210b034020042f0106210c2002450d022002417f6a21022004200c4102746a41e8026a2802002104200b2802e802210b0c000b0b200f102c2006102c0c010b200541ac016a200c36020020054198016a41106a2004360200200520133602b001200542003703a0012005200b36029c012005410036029801200541d8016a20054198016a10e3074101211202400240024020052d00d8014101470d0020054180036a200541f1016a290000370300200541e8026a41106a200541e9016a290000370300200541f0026a200541e1016a290000370300200520052900d9013703e802417f20052802b001220441016a220220022004491b220441ffffff3f712004470d0520044105742204417f4c0d05200410322212450d04201220052903e802370000201241186a200541e8026a41186a2214290300370000201241106a200541e8026a41106a2206290300370000201241086a200541e8026a41086a220f2903003700002005201236026820052004410576221336026c4101210420054101360270200541b8016a41186a20054198016a41186a280200360200200541b8016a41106a20054198016a41106a290300370300200541b8016a41086a20054198016a41086a29030037030020052005290398013703b801200541d8016a200541b8016a10e30720052d00d8014101470d012014200541f1016a2900003703002006200541e9016a290000370300200f200541e1016a290000370300200520052900d9013703e802200541d8016a41017221024120210b4101210c034020054188026a41186a2210201429030037030020054188026a41106a2211200629030037030020054188026a41086a220e200f290300370300200520052903e802370388020240200c2013470d00200541e8006a2013417f20052802d001220441016a221220122004491b10d601200528026821120b2012200b6a2204200529038802370000200441186a2010290300370000200441106a2011290300370000200441086a200e2903003700002005200c41016a2204360270200541d8016a200541b8016a10e307024020052d00d8014101460d00200c41016a2104200528026c21130c030b2014200241186a2900003703002006200241106a290000370300200f200241086a290000370300200520022900003703e802200b41206a210b200528026c21132004210c0c000b0b20054198016a10e40741002104410021130c010b200541b8016a10e4070b20054180016a4200370300200541f8006a4200370300200541e8006a41086a220242003703002005420037036820054188016a4195ddc700411210c501200220054188016a41086a2900003703002005200529008801370368200541a8026a41a7edc300410410c501200841086a200541a8026a41086a290300370000200820052903a80237000020044105744104722202417f4c0d0220021032220c450d01200541003602e001200520023602dc012005200c3602d801200541d8016a2004108f010240024020040d0020052802d801211420052802e00121020c010b2004410574210c20052802e0012102201221040340200541d8016a20024120102f20052802d801221420052802e001220b6a22022004290000370000200241086a200441086a290000370000200241106a200441106a290000370000200241186a200441186a2900003700002005200b41206a22023602e001200441206a2104200c41606a220c0d000b0b200541e8006a41202014200210a702024020052802dc01450d002014102c0b2013450d002012450d00201341ffffff3f71450d002012102c0b20054190036a24000f0b1039000b103b000b130020004102360204200041c8a5c3003602000b3400200041ffdcc70036020420004100360200200041146a4107360200200041106a41a4aec300360200200041086a42073702000b5301027f02404104103222020d001039000b2000420437020420002002360200200041004101102f2000280200200041086a220228020022036a41003a00002002200341016a2203360200200020034100102f0b4901017f02404104103222020d001039000b2000420437020420002002360200200041004104102f2000280200200041086a220028020022026a41003600002000200241046a3602000b130020004104360204200041f8b9c3003602000be90301037f024002402002412c6c41046a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b2000200336020420002004360200200041086a2203410036020020002002108f0102402002450d002002412c6c2102034020012802002104200020032802004101102f200028020020032802006a21050240024020044102470d00200541003a00002003200328020041016a3602000c010b200541013a00002003200328020041016a2204360200024020012802004101460d00200020044101102f2000280200200328020022046a41003a00002003200441016a2204360200200141046a2802002105200020044104102f2000280200200328020022046a20053600002003200441046a2204360200200020044120102f2000280200200328020022056a2204200141086a290000370000200441086a200141106a290000370000200441106a200141186a290000370000200441186a200141206a2900003700002003200541206a2204360200200141286a2802002105200020044104102f2000280200200328020022046a20053600002003200441046a3602000c010b200020044101102f2000280200200328020022046a41013a00002003200441016a3602000b2001412c6a2101200241546a22020d000b0b0f0b103b000b1039000bb60101027f200128020021020240410110322203450d0020004201370204200020033602000240024020020d00200041004101102f2000280200200041086a28020022016a41003a0000200141016a21010c010b200041004101102f2000280200200041086a220228020022036a41013a00002002200341016a220336020020012802042101200020034104102f2000280200200228020022026a2001360000200241046a21010b200041086a20013602000f0b1039000bd40701047f200128020021020240410110322203450d002000420137020420002003360200200041004101102f2000280200200041086a22032802006a21040240024020020d00200441003a0000200328020041016a21020c010b200441013a00002003200328020041016a3602002000200141086a2802002203108f0102402003450d0020034105742105200041086a220428020021030340200020034120102f200028020020042802006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a2900003700002004200428020041206a2203360200200241206a2102200541606a22050d000b0b2001410c6a28020021022000200141146a2802002203108f0102402003450d0020034105742105200041086a220428020021030340200020034120102f200028020020042802006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a2900003700002004200428020041206a2203360200200241206a2102200541606a22050d000b0b200141186a28020021022000200141206a2802002203108f0102402003450d0020034105742105200041086a220428020021030340200020034120102f200028020020042802006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a2900003700002004200428020041206a2203360200200241206a2102200541606a22050d000b0b200141246a280200210220002001412c6a2802002203108f0102402003450d0020022003410c6c6a210303402002280200200241086a280200200010d5032002410c6a22022003470d000b0b200141306a28020021032000200041086a22022802004104102f200028020020022802006a20033600002002200228020041046a2203360200200141346a2802002104200020034104102f200028020020022802006a20043600002002200228020041046a2203360200200141386a2802002104200020034104102f200028020020022802006a20043600002002200228020041046a22033602002001413c6a2802002104200020034104102f200028020020022802006a20043600002002200228020041046a2203360200200141c0006a2802002104200020034104102f200028020020022802006a20043600002002200228020041046a2203360200200141c4006a2802002104200020034104102f200028020020022802006a2004360000200228020041046a21020b200041086a20023602000f0b1039000be30101047f0240024002400240200128020022022802042203450d00200228020022042d0000210520022003417f6a3602042002200441016a36020020050e020203010b200041023602000f0b200041023602000f0b200041003602000f0b02402001280200220228020422034104490d0020022802002204280000210520022003417c6a3602042002200441046a3602002001280200220228020422014104490d00200020053602042000410136020020022802002203280000210420022001417c6a3602042002200341046a360200200041086a20043602000f0b200041023602000ba90201017f230041a0016b220324002003200236020420032001360200200341086a2001200210b30102400240200328020822010d00200041003602400c010b200328020c21022003200341106a28020036027c20032001360278200341186a200341f8006a1093020240024020032802580d00200341003602880120034201370380012003410f360294012003200336029001200320034180016a36029c012003412c6a41013602002003420137021c200341b4bcc300360218200320034190016a3602282003419c016a41dcb7c000200341186a103e1a2003350288014220862003350280018410000240200328028401450d00200328028001102c0b200041003602400c010b2000200341186a41e00010c9081a0b2002450d002001102c0b200341a0016a24000bb60201027f230041e0006b220224002002412036020c20022001360208200241106a2001412010b30102400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a10ea040240024020022802480d0020024100360230200242013703282002410f36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241b4bcc3003602482002200241386a360258200241c4006a41dcb7c000200241c8006a103e1a200235023042208620023502288410000240200228022c450d002002280228102c0b200041003602000c010b20002002290348370200200041086a200241c8006a41086a2802003602000b2003450d002001102c0b200241e0006a24000bbb0503037f017e047f230041206b22022400200241086a2001108702024002402002280208450d00200041003602000c010b02400240200228020c22032001280204410c6e2204200420034b1bad420c7e2205422088a70d002005a72204417f4c0d0002400240024020040d00410421060c010b200410322206450d010b41002107200241003602182002200636021020022004410c6e36021402402003450d0003402002200110870220022802000d042001280204220820022802044102742204490d042004417f4c0d030240024020040d00410121090c010b200410372209450d03200128020421080b0240024020082004490d0020092001280200200410c90821082001280204220920044f0d01200420094194afc0001058000b2004450d052004450d052009102c0c050b2001200920046b3602042001200128020020046a3602002008450d040240024002402004ad22054220862005842205422088a722040d002005a721040c010b024020082004724103710d002005a722044103710d0020044102762209450d012008450d0720054202884280808080f0ffffff3f832009ad842105200821090c020b2005a7450d062008102c0c060b41042109420021052004450d002008102c0b024020072002280214470d00200241106a2007410110ec0120022802182107200228021021060b20062007410c6c6a22042005370204200420093602002002200228021841016a22073602182003417f6a22030d000b0b20002002290310370200200041086a200241106a41086a2802003602000c030b1039000b103b000b200041003602002002280210210802402007450d002007410c6c21042008210103400240200141046a28020041ffffffff0371450d002001280200102c0b2001410c6a2101200441746a22040d000b0b20022802142201450d002001410c6c450d002008102c0b200241206a24000bcf0b04047f017e0a7f027e230041e0026b220224002002412036020c20022001360208200241106a2001412010b30102400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360224200220033602202002200241206a1087020240024020022802000d00024002400240200228020422052002280224412c6e2201200120054b1bad422c7e2206422088a70d002006a72201417f4c0d000240024020010d00410421070c010b200110322207450d020b41002108200241003602302002200736022820022001412c6e36022c0240024002402005450d004100210903402002280224220a450d032002280220220b2d000021012002200a417f6a220c3602242002200b41016a36022002400240024020010e020001060b200241d8006a41186a200241f8006a41186a290300370300200241d8006a41106a200241f8006a41106a290300370300200241d8006a41086a200241f8006a41086a290300370300200220022903783703584102210c0c010b200c450d04200b2d000121012002200a417e6a220d3602242002200b41026a3602204101210c0240024020010e020001060b200d4104490d05200b280002210e2002200a417a6a220f3602242002200b41066a36022041002101200241003a009802200b200f411f200f411f491b6a41076a21104179210c0340200f2001460d05200241f8016a20016a200b20016a220d41066a2d00003a00002002200a200c6a3602242002200d41076a3602202002200141016a220d3a009802200c417f6a210c200d2101200d4120470d000b200241c0026a41186a2201200241f8016a41186a290300370300200241c0026a41106a220c200241f8016a41106a290300370300200241c0026a41086a220b200241f8016a41086a290300370300200220022903f8013703c002200d41ff01714120490d05200241d8016a41086a220f200b290300370300200241d8016a41106a220b200c290300370300200241d8016a41186a220c2001290300370300200220022903c0023703d801200a200d6b2201417a6a4104490d05200241b8016a41086a200f290300370300200241b8016a41106a200b290300370300200241b8016a41186a200c290300370300200220022903d8013703b8012010280000210f2002201041046a3602202002200141766a3602244100210c0b200241f8006a41086a200241b8016a41086a2903002206370300200241d8006a41186a200241b8016a41186a290300370300200241d8006a41106a200241b8016a41106a290300370300200241d8006a41086a2006370300200220022903b8012206370378200220063703580b200941016a2109200241386a41186a220d200241d8006a41186a290300370300200241386a41106a220b200241d8006a41106a290300370300200241386a41086a220a200241d8006a41086a2903003703002002200229035837033802402008200228022c470d00200241286a2008410110dd0120022802302108200228022821070b20072008412c6c6a2201200e3602042001200c360200200141086a2002290338370200200d2903002106200b2903002111200a2903002112200141286a200f360200200141106a2012370200200141186a2011370200200141206a20063702002002200841016a220836023020092005470d000b200228022821070b2007450d052000200229022c370204200020073602000c060b200141ff0171450d00200241003a0098020b200228022c2201450d032001412c6c0d020c030b103b000b1039000b2002280228102c0b200241003602c802200242013703c0022002410f3602a4022002200241086a3602a0022002200241c0026a3602d8012002418c026a4101360200200242013702fc01200241b4bcc3003602f8012002200241a0026a36028802200241d8016a41dcb7c000200241f8016a103e1a20023502c80242208620023502c002841000024020022802c402450d0020022802c002102c0b200041003602000b2004450d002003102c0b200241e0026a24000b920902087f037e230041f0006b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022040d00200041003602000c010b200328021421052003200341186a280200360224200320043602202003200341206a1087020240024020032802000d000240024002402003280204220620032802244105762201200120064b1b22014105742202417f4c0d0002400240024020010d00410821070c010b200210322207450d010b200341003602602003200136025c2003200736025802402006450d00410021080340200341003a003020032802242201450d05200328022022022d0000210920032001417f6a220a360224200320093a0028200341013a00302003200241016a360220200a450d04200328022022022d0000210920032001417e6a220a3602242003200241016a360220200341023a0030200320093a0029200a450d04200328022022022d0000210920032001417d6a220a3602242003200241016a360220200341033a0030200320093a002a200a450d04200328022022022d0000210920032001417c6a220a3602242003200241016a360220200341043a0030200320093a002b200a450d04200328022022022d0000210920032001417b6a220a3602242003200241016a360220200341053a0030200320093a002c200a450d04200328022022022d0000210920032001417a6a220a3602242003200241016a360220200341063a0030200320093a002d200a450d04200328022022022d000021092003200141796a220a3602242003200241016a360220200341073a0030200320093a002e200a450d042003200328022022022d00003a002f2003200241016a3602202003200141786a220936022420094110490d052003290328210b2003200141686a22093602242003200241116a3602202009450d05200241096a290000210c2002290001210d2003200141676a3602242003200241126a3602204100210902400240024020022d00110e03020001080b410121090c010b410221090b200320032800383602502003200341386a41036a2800003600532003200328005336004b20032003280250360248200320032802483602402003200328004b36004302402008200328025c470d00200341d8006a200810ed0420032802602108200328025821070b200720084105746a220120093a00182001200b370310200120032802403600192001411c6a20032800433600002001200c3703082001200d3703002003200328026041016a22083602602006417f6a22060d000b200328025821070b2007450d042000200329025c370204200020073602000c050b1039000b103b000b200341003a00300b200328025c41ffffff3f71450d002003280258102c0b20034100360230200342013703282003410f36023c2003200341086a3602382003200341286a360250200341ec006a41013602002003420137025c200341b4bcc3003602582003200341386a360268200341d0006a41dcb7c000200341d8006a103e1a200335023042208620033502288410000240200328022c450d002003280228102c0b200041003602000b2005450d002004102c0b200341f0006a24000bd20101037f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1b220241ffffff3f7122042002470d02200241057422034100480d0220042002464103742104024002400240024002402000280200410020011b22020d002003450d010c030b200141057422010d0120030d020b200421010c020b200220012003103522010d010c030b200310322201450d020b20002001360200200041046a20034105763602000b0f0b2004450d001039000b103b000b940301017f23004180016b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00200041003602000c010b200328021421022003200341106a41086a28020036025c20032001360258200341206a200341d8006a10ef040240024020032802200d0020034100360268200342013703602003410f3602742003200341086a3602702003200341e0006a36027c200341346a410136020020034201370224200341b4bcc3003602202003200341f0006a360230200341fc006a41dcb7c000200341206a103e1a2003350268422086200335026084100002402003280264450d002003280260102c0b200041003602000c010b20002003290320370200200041306a200341206a41306a290300370200200041286a200341206a41286a290300370200200041206a200341206a41206a290300370200200041186a200341206a41186a290300370200200041106a200341206a41106a290300370200200041086a200341206a41086a2903003702000b2002450d002001102c0b20034180016a24000bfd0c030a7f017e067f230041306b22022400200241206a2001108405024002400240024002400240024002400240024020022802202203450d00200241286a280200210420022802242105200241086a200110870220022802080d0841042106200228020c220720012802044104762208200820074b1b22094104742208417f4c0d0502402009450d00200810322206450d070b4100210820024100360218200220093602142002200636021002402007450d00410021080340200128020422094104490d092001280200220a280000210b20012009417c6a3602042001200a41046a360200200241206a2001108a0220022802202209450d092002290224210c024020082002280214470d00200241106a2008410110ed0120022802182108200228021021060b200620084104746a220820093602042008200b360200200841086a200c3702002002200228021841016a22083602182007417f6a22070d000b20022802142109200228021021060b2006450d0820012802042207450d032001280200220a2d0000210b20012007417f6a3602042001200a41016a36020041002107200b0e020201030b200041003602000c080b200241206a2001108a0220022802202207450d012002290224210c0b200241206a2001108a02200ca7210a2002280220220b0d012000410036020002402007450d00200a450d002007102c0b02402008450d0020084104742108200641046a210103400240200141046a280200450d002001280200102c0b200141106a2101200841706a22080d000b0b0240200941ffffffff0071450d002006102c0b02402004450d002004410c6c21082003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b2005450d062005410c6c450d062003102c0c060b2000410036020002402008450d0020084104742108200641046a210103400240200141046a280200450d002001280200102c0b200141106a2101200841706a22080d000b0b0240200941ffffffff0071450d002006102c0b02402004450d002004410c6c21082003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b2005450d052005410c6c450d052003102c0c050b2002280224210d024002402001280204220e4104490d00200241286a280200210f2001280200221028000021112001200e417c6a22123602042001201041046a36020020124104490d012000200536020420002003360200201028000421052001200e41786a3602042001201041086a360200200041346a2005360200200041306a20113602002000412c6a200f360200200041286a200d360200200041246a200b360200200041206a200c422088a73602002000411c6a200a360200200041186a2007360200200041146a2008360200200041106a20093602002000410c6a2006360200200041086a20043602000c060b200041003602000240200d450d00200b102c0b02402007450d00200a450d002007102c0b02402008450d0020084104742108200641046a210103400240200141046a280200450d002001280200102c0b200141106a2101200841706a22080d000b0b0240200941ffffffff0071450d002006102c0b02402004450d002004410c6c21082003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b2005450d052005410c6c450d052003102c0c050b200041003602000240200d450d00200b102c0b02402007450d00200a450d002007102c0b02402008450d0020084104742108200641046a210103400240200141046a280200450d002001280200102c0b200141106a2101200841706a22080d000b0b0240200941ffffffff0071450d002006102c0b02402004450d002004410c6c21082003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b2005450d042005410c6c450d042003102c0c040b103b000b1039000b2002280210210702402008450d0020084104742108200741046a210103400240200141046a280200450d002001280200102c0b200141106a2101200841706a22080d000b0b200228021441ffffffff0071450d002007102c0b2000410036020002402004450d002004410c6c21082003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b2005450d002005410c6c450d002003102c0b200241306a24000bef0503067f017e077f230041e0006b220224002002412036020c20022001360208200241106a2001412010b3010240024002400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360224200220033602202002200241206a10870202400240024020022802000d002002280204220520022802244103762201200120054b1b22014103742206417f4c0d050240024020010d00410421070c010b200610322207450d050b2001ad210802402005450d000340024002400240200228022422064104490d002002280220220128000021092002200141046a36022020022006417c6a220a360224200a4104490d002001280004210a2002200641786a3602242002200141086a3602202008422088a722012008a7470d02200141016a220b2001490d0a4101210c4100210d02402001410174220e200b200b200e491b220b4104200b41044b1b220b41ffffffff0171200b470d00200b41037421064104210d4100210c0b200c0d0a200641004e0d010c0a0b2008a72201450d042007450d04200141ffffffff0171450d042007102c0c040b2001410374200f20011b210f0240024002402007410020011b2201450d00200f450d002001200f200610352207450d010c020b200d21072006450d012006103222070d010b200c0d090c080b2008428080808070832006410376ad8421080b20072008422088a74103746a2201200a3602042001200936020020084280808080107c21082005417f6a22050d000b0b20070d010b20024100360230200242013703282002410f36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241b4bcc3003602482002200241386a360258200241c4006a41dcb7c000200241c8006a103e1a200235023042208620023502288410000240200228022c450d002002280228102c0b200041003602000c010b20002008370204200020073602000b2004450d002003102c0b200241e0006a24000f0b1039000b103b000bb20804047f017e097f037e230041a0026b220224002002412036020c20022001360208200241106a2001412010b3010240024002400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360224200220033602202002200241206a1087020240024020022802000d0020022802042205200228022441286e2201200120054b1bad42287e2206422088a70d032006a72201417f4c0d030240024020010d00410821070c010b200110322207450d050b4100210820024100360230200220073602282002200141286e36022c0240024002402005450d0041002109034041002101200241003a00d801200941016a21092002280224210a417f210b0340200a2001460d03200241b8016a20016a2002280220220c2d00003a00002002200a200b6a3602242002200c41016a3602202002200141016a220d3a00d801200b417f6a210b200d2101200d4120470d000b20024180026a41186a2201200241b8016a41186a29030037030020024180026a41106a220b200241b8016a41106a29030037030020024180026a41086a220e200241b8016a41086a290300370300200220022903b80137038002200d41ff01714120490d0320024198016a41086a220f200e29030037030020024198016a41106a220e200b29030037030020024198016a41186a220b2001290300370300200220022903800237039801200a200d6b22014108490d03200241d8006a41086a200f2903002206370300200241d8006a41106a200e2903002210370300200241d8006a41186a200b2903002211370300200241386a41086a220b2006370300200241386a41106a220d2010370300200241386a41186a220a2011370300200c29000121062002200c41096a3602202002200141786a360224200220022903980122103703582002201037033802402008200228022c470d00200241286a2008410110f20420022802302108200228022821070b2007200841286c6a22012002290338370300200b2903002110200d2903002111200a290300211220012006370320200141186a2012370300200141106a2011370300200141086a20103703002002200841016a220836023020092005470d000b200228022821070b2007450d022000200229022c370204200020073602000c030b200141ff0171450d00200241003a00d8010b200228022c2201450d00200141286c450d002002280228102c0b200241003602880220024201370380022002410f3602e4012002200241086a3602e001200220024180026a36029801200241cc016a4101360200200242013702bc01200241b4bcc3003602b8012002200241e0016a3602c80120024198016a41dcb7c000200241b8016a103e1a2002350288024220862002350280028410000240200228028402450d00200228028002102c0b200041003602000b2004450d002003102c0b200241a0026a24000f0b103b000b1039000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42287e2204422088a722020d022004a722014100480d022002454103742105024002400240024002402000280200410020031b22020d002001450d010c030b200341286c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141286e3602000b0f0b2005450d001039000b103b000bb10201017f230041f0026b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00200041003602e8010c010b200328021421022003200341186a2802003602cc02200320013602c802200341206a200341c8026a10f404024002402003280288020d00200341003602d802200342013703d0022003410f3602e4022003200341086a3602e0022003200341d0026a3602ec02200341346a410136020020034201370224200341b4bcc3003602202003200341e0026a360230200341ec026a41dcb7c000200341206a103e1a20033502d80242208620033502d002841000024020032802d402450d0020032802d002102c0b200041003602e8010c010b2000200341206a41a80210c9081a0b2002450d002001102c0b200341f0026a24000bc807010c7f230041c0066b2202240002400240024002400240200128020422034104490d0020012802002204280000210520012003417c6a22063602042001200441046a36020041002107200241003a00b8042003417b6a210302400240034020062007460d0120024198046a20076a200420076a220841046a2d00003a0000200120033602042001200841056a3602002002200741016a22083a00b8042003417f6a21032008210720084120470d000b200241b0026a41086a220720024198046a41086a290300370300200241b0026a41106a220320024198046a41106a290300370300200241b0026a41186a220420024198046a41186a29030037030020022002290398043703b002200841ff0171411f4d0d0120024190026a41086a200729030037030020024190026a41106a200329030037030020024190026a41186a2004290300370300200220022903b0023703900220024198046a200110b4052002280298044101460d03200241b0026a20024198046a41047241e40110c9081a20024198046a200110b0062002280298042207450d04200241a0046a22082802002103200228029c04210620024198046a200110b00620022802980422040d05200041003602e8012003450d062007102c0c060b200741ff0171450d00200241003a00b8040b200041003602e8010c040b200041003602e8010c030b200041003602e8010c020b200041003602e8010c010b2008280200210802400240200128020422094104490d00200228029c04210a2001280200220b280000210c20012009417c6a220d3602042001200b41046a360200200d4104490d01200b280004210d2001200941786a3602042001200b41086a360200200241086a41086a220120024190026a41086a290300370300200241086a41106a220920024190026a41106a290300370300200241086a41186a220b20024190026a41186a2903003703002002200229039002370308200241286a200241b0026a41e40110c9081a20002005360200200041046a200241286a41e40110c9081a20004184026a200d36020020004180026a200c360200200041fc016a2008360200200041f8016a200a360200200041f4016a2004360200200041f0016a2003360200200020063602ec01200020073602e80120004188026a200229030837020020004190026a200129030037020020004198026a2009290300370200200041a0026a200b2903003702000c020b200041003602e80102402008450d002004102c0b2003450d012007102c0c010b200041003602e80102402008450d002004102c0b2003450d002007102c0b200241c0066a24000bb80a04047f017e0b7f027e230041c0026b220224002002412036020c20022001360208200241106a2001412010b30102400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360224200220033602202002200241206a1087020240024002400240024020022802000d00200228020422052002280224412c6e2201200120054b1bad422c7e2206422088a70d012006a72201417f4c0d010240024020010d00410421070c010b200110322207450d030b41002108200241003602302002200736022820022001412c6e36022c0240024002402005450d004100210903402002280224220a4104490d03200941016a21092002280220220b280000210c2002200a417c6a220d3602242002200b41046a220e36022041002101200241003a00f801200e200d411f200d411f491b6a41016a210f417b210e0340200d2001460d03200241d8016a20016a200b20016a221041046a2d00003a00002002200a200e6a3602242002201041056a3602202002200141016a22103a00f801200e417f6a210e2010210120104120470d000b200241a0026a41186a2201200241d8016a41186a290300370300200241a0026a41106a220e200241d8016a41106a290300370300200241a0026a41086a220d200241d8016a41086a290300370300200220022903d8013703a002201041ff01714120490d03200241b8016a41086a220b200d290300370300200241b8016a41106a220d200e290300370300200241b8016a41186a220e2001290300370300200220022903a0023703b801200a20106b2201417c6a4104490d0320024198016a41086a220a200b29030037030020024198016a41106a220b200d29030037030020024198016a41186a220d200e290300370300200220022903b80137039801200f28000021112002200f41046a220e3602202002200141786a221036022420104104490d03200241d8006a41086a200a2903002206370300200241d8006a41106a200b2903002212370300200241d8006a41186a200d2903002213370300200241386a41086a22102006370300200241386a41106a220d2012370300200241386a41186a220a2013370300200e280000210b2002200e41046a3602202002200141746a360224200220022903980122063703582002200637033802402008200228022c470d00200241286a200810810420022802302108200228022821070b20072008412c6c6a2201200c36020020012002290338370204200a2903002106200d2903002112201029030021132001200b360228200120113602242001410c6a2013370200200141146a20123702002001411c6a20063702002002200841016a220836023020092005470d000b200228022821070b2007450d02200229022c21062002280224220141034b0d052006a72201450d022001412c6c450d022007102c0c020b200141ff0171450d00200241003a00f8010b200228022c2201450d002001412c6c450d002002280228102c0b200241003602a802200242013703a0022002410f360284022002200241086a360280022002200241a0026a3602b801200241ec016a4101360200200242013702dc01200241b4bcc3003602d801200220024180026a3602e801200241b8016a41dcb7c000200241d8016a103e1a20023502a80242208620023502a002841000024020022802a402450d0020022802a002102c0b200041003602000c030b103b000b1039000b20002006370204200020073602002000410c6a2002280220220e28000036020020022001417c6a3602242002200e41046a3602200b2004450d002003102c0b200241c0026a24000bb60201017f230041e0006b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00200041003602000c010b200328021421022003200341106a41086a28020036022420032001360220200341c8006a200341206a108a020240024020032802480d0020034100360230200342013703282003410f36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341b4bcc3003602482003200341386a360258200341c4006a41dcb7c000200341c8006a103e1a200335023042208620033502288410000240200328022c450d002003280228102c0b200041003602000c010b20002003290348370200200041086a200341c8006a41086a2802003602000b2002450d002001102c0b200341e0006a24000ba50502077f017e230041e0006b220324002003200236021420032001360210200341186a2001200210b30102400240200328021822040d00200041003602000c010b200328021c21052003200341206a28020036022c20032004360228200341086a200341286a1087020240024020032802080d0041042106024002400240200328020c2202200328022c4104762201200120024b1b22074104742201417f4c0d0002402007450d00200110322206450d020b41002101200341003602402003200736023c2003200636023802402002450d000340200328022c22074104490d0420032802282208280000210920032007417c6a36022c2003200841046a360228200341c8006a200341286a10f80420032802482207450d04200329024c210a02402001200328023c470d00200341386a200110ce0120032802402101200328023821060b200620014104746a2201200736020420012009360200200141086a200a3702002003200328024041016a22013602402002417f6a22020d000b200328023821060b2006450d032000200329023c370204200020063602000c040b103b000b1039000b2003280238210702402001450d0020014104742102200741046a210103400240200141046a28020041ffffffff0371450d002001280200102c0b200141106a2101200241706a22020d000b0b200328023c41ffffffff0071450d002007102c0b20034100360240200342013703382003410f3602342003200341106a3602302003200341386a360244200341dc006a41013602002003420137024c200341b4bcc3003602482003200341306a360258200341c4006a41dcb7c000200341c8006a103e1a200335024042208620033502388410000240200328023c450d002003280238102c0b200041003602000b2005450d002004102c0b200341e0006a24000be20201077f230041206b22022400200241086a200110870202400240024002402002280208450d00200041003602000c010b200228020c220320012802044102762204200420034b1b22054102742204417f4c0d010240024020050d00410421060c010b200410322206450d030b4100210420024100360218200220053602142002200636021002402003450d00034002402001280204220541044f0d002000410036020020022802104100200228021422041b2201450d03200441ffffffff0371450d032001102c0c030b20012802002207280000210820012005417c6a3602042001200741046a360200024020042002280214470d00200241106a200410d20420022802182104200228021021060b200620044102746a20083602002002200441016a22043602182003417f6a22030d000b0b20002002290310370200200041086a200241106a41086a2802003602000b200241206a24000f0b103b000b1039000bf10d04047f017e117f027e23004190036b220224002002412036020c20022001360208200241106a2001412010b30102400240200228021022030d00200041003602000c010b200228021421042002200241186a280200360224200220033602202002200241206a1087020240024020022802000d0002400240024020022802042205200228022441346e2201200120054b1bad42347e2206422088a70d002006a72201417f4c0d000240024020010d00410421070c010b200110322207450d020b20024100360230200220073602282002200141346e36022c024002402005450d0020024188016a41206a2108410021094100210a0340024002402002280224220b4104490d002002280220220c280000210d2002200c41046a3602202002200b417c6a220136022420014104490d00200c280004210e2002200b41786a220f3602242002200c41086a2201360220200f450d002002200b41776a22103602242002200141016a22113602204100210f02400240024020012d00000e020100030b41002101200241003a00c802200c2010411f2010411f491b6a410a6a21124176210f034020102001460d02200241a8026a20016a200c20016a221141096a2d00003a00002002200b200f6a36022420022011410a6a3602202002200141016a22113a00c802200f417f6a210f2011210120114120470d000b200241f0026a41186a2201200241a8026a41186a290300370300200241f0026a41106a220f200241a8026a41106a290300370300200241f0026a41086a220c200241a8026a41086a290300370300200220022903a8023703f002201141ff01714120490d0220024188026a41086a2210200c29030037030020024188026a41106a220c200f29030037030020024188026a41186a220f2001290300370300200220022903f00237038802200b20116b220141776a4104490d02200241e0016a41086a2010290300370300200241e0016a41106a200c290300370300200241e0016a41186a200f290300370300200241dc016a41026a20024185026a41026a2d00003a000020022002290388023703e001201228000021132002201241046a22113602202002200141736a2210360224200220022f0085023b01dc014101210f0b200241b8016a41186a2201200241e0016a41186a290300370300200241b8016a41106a220b200241e0016a41106a290300370300200241b8016a41086a220c200241e0016a41086a290300370300200241b4016a41026a2212200241dc016a41026a2d00003a0000200220022903e0013703b801200220022f01dc013b01b40120104104490d0120024188016a41086a200c29030037030020024188016a41106a200b29030037030020024188016a41186a2001290300370300200241b0016a41026a20122d000022013a0000200220022903b80137038801200220022f01b401220b3b01b0012011280000211420022010417c6a3602242002201141046a360220200841026a20013a00002008200b3b0000200e2115200d2116201321170c020b200141ff0171450d00200241003a00c8020b4102210f0b200241e0006a411f6a220120024188016a411f6a280000360000200241e0006a41186a220b20024188016a41186a290300370300200241e0006a41106a221120024188016a41106a290300370300200241e0006a41086a220c20024188016a41086a2903003703002002200229038801370360200f4102460d02200a41016a210a2015ad4220862016ad842106200241386a411f6a22102001280000360000200241386a41186a220d200b290300370300200241386a41106a220b2011290300370300200241386a41086a2211200c2903003703002002200229036037033802402009200228022c470d00200241286a200910830420022802302109200228022821070b2007200941346c6a2201200f3a000820012006370200200141096a200229033837000020102800002109200d2903002106200b290300211820112903002119200141306a20143600002001412c6a2017360000200141116a2019370000200141196a2018370000200141216a2006370000200141286a20093600002002200228023041016a2209360230200a2005470d000b200228022821070b2007450d042000200229022c370204200020073602000c050b200228022c2201450d03200141346c0d020c030b103b000b1039000b2002280228102c0b20024100360268200242013703602002410f36023c2002200241086a3602382002200241e0006a3602a8022002419c016a41013602002002420137028c01200241b4bcc300360288012002200241386a36029801200241a8026a41dcb7c00020024188016a103e1a2002350268422086200235026084100002402002280264450d002002280260102c0b200041003602000b2004450d002003102c0b20024190036a24000bf00c04057f017e017f037e230041e0016b220224002002412036020420022001360200200241086a2001412010b30102400240200228020822010d00200041023a00000c010b200228020c210302400240200241106a2802002204450d0041002105024002400240024020012d00000e020100040b200241003a00980120044101460d0220012d00012105200241013a009801200220053a007820044102460d0120012d00022105200241023a009801200220053a007920044103460d0120012d00032105200241033a009801200220053a007a20044104460d0120012d00042105200241043a009801200220053a007b20044105460d0120012d00052105200241053a009801200220053a007c20044106460d0120012d00062105200241063a009801200220053a007d20044107460d0120012d00072105200241073a009801200220053a007e20044108460d0120012d00082105200241083a009801200220053a007f20044109460d0120012d00092105200241093a009801200220053a0080012004410a460d0120012d000a21052002410a3a009801200220053a0081012004410b460d0120012d000b21052002410b3a009801200220053a0082012004410c460d0120012d000c21052002410c3a009801200220053a0083012004410d460d0120012d000d21052002410d3a009801200220053a0084012004410e460d0120012d000e21052002410e3a009801200220053a0085012004410f460d0120012d000f21052002410f3a009801200220053a00860120044110460d0120012d00102105200241103a009801200220053a00870120044111460d0120012d00112105200241113a009801200220053a00880120044112460d0120012d00122105200241123a009801200220053a00890120044113460d0120012d00132105200241133a009801200220053a008a0120044114460d0120012d00142105200241143a009801200220053a008b0120044115460d0120012d00152105200241153a009801200220053a008c0120044116460d0120012d00162105200241163a009801200220053a008d0120044117460d0120012d00172105200241173a009801200220053a008e0120044118460d0120012d00182105200241183a009801200220053a008f0120044119460d0120012d00192105200241193a009801200220053a0090012004411a460d0120012d001a21052002411a3a009801200220053a0091012004411b460d0120012d001b21052002411b3a009801200220053a0092012004411c460d0120012d001c21052002411c3a009801200220053a0093012004411d460d0120012d001d21052002411d3a009801200220053a0094012004411e460d0120012d001e21052002411e3a009801200220053a0095012004411f460d0120012d001f21052002411f3a009801200220053a00960120044120460d01200241d8006a41106a2205200241f8006a41106a290300370300200241d8006a41086a2204200241f8006a41086a290300370300200220012d00203a009701200241d8006a41186a2206200241f8006a41186a290300370300200241203a0098012002200229037822073703a00120022007370358200241386a41186a22082006290300370300200241386a41106a22062005290300370300200241386a41086a2205200429030037030020022002290358370338200241186a41186a2008290300370300200241186a41106a2006290300370300200241186a41086a200529030037030020022002290338370318410121050b200241f8006a41186a200241186a41186a2903002207370300200241f8006a41106a200241186a41106a2903002209370300200241f8006a41086a200241186a41086a290300220a37030020022002290318220b370378200041196a2007370000200041116a2009370000200041096a200a3700002000200b3700010c030b200241003a0098010b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a2903003703000b200241003602a801200242013703a0012002410f36025c200220023602582002200241a0016a3602382002418c016a41013602002002420137027c200241b4bcc3003602782002200241d8006a36028801200241386a41dcb7c000200241f8006a103e1a20023502a80142208620023502a001841000024020022802a401450d0020022802a001102c0b410221050b200020053a00002003450d002001102c0b200241e0016a24000ba40204017f017e017f027e230041d0006b220224002002412036020420022001360200200241086a2001412010b30102400240200228020822010d00420021030c010b200228020c210402400240200241086a41086a2802004110490d00200141086a290000210520012900002106420121030c010b20024100360220200242013703182002410f36022c200220023602282002200241186a360234200241cc006a41013602002002420137023c200241b4bcc3003602382002200241286a360248200241346a41dcb7c000200241386a103e1a200235022042208620023502188410000240200228021c450d002002280218102c0b420021030b2004450d002001102c0b2000200637030820002003370300200041106a2005370300200241d0006a24000bb60201017f230041e0006b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022010d00200041003602000c010b200328021421022003200341106a41086a28020036022420032001360220200341c8006a200341206a10fd040240024020032802480d0020034100360230200342013703282003410f36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341b4bcc3003602482003200341386a360258200341c4006a41dcb7c000200341c8006a103e1a200335023042208620033502288410000240200328022c450d002003280228102c0b200041003602000c010b20002003290348370200200041086a200341c8006a41086a2802003602000b2002450d002001102c0b200341e0006a24000b970602097f037e23004180026b2202240020022001108702024002402002280200450d00200041003602000c010b0240024002402002280204220320012802044105762204200420034b1b22044105742205417f4c0d000240024020040d00410121060c010b200510322206450d020b41002107200241003602102002200436020c20022006360208024002402003450d0041002108034041002105200241003a00b801200841016a21082001280204417f6a210403402004417f460d0320024198016a20056a200128020022092d00003a0000200120043602042001200941016a3602002002200541016a22093a00b8012004417f6a21042009210520094120470d000b200241c0016a41086a220420024198016a41086a290300370300200241c0016a41106a220520024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200941ff0171411f4d0d05200241386a41086a2004290300220b370300200241386a41106a2005290300220c370300200241386a41186a200a290300220d370300200241186a41186a2205200d370300200241186a41106a2209200c370300200241186a41086a220a200b370300200220022903c001220b3703582002200b3703382002200b37031802402007200228020c470d00200241086a2007410110d60120022802082106200228021021070b200620074105746a22042002290318370000200441186a2005290300370000200441106a2009290300370000200441086a200a2903003700002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c040b200541ff0171450d02200241003a00b8010c020b103b000b1039000b200241386a41086a200241d8006a41086a290300370300200241386a41106a200241d8006a41106a290300370300200241386a41186a200241d8006a41186a290300370300200220022903583703382000410036020020064100200228020c22041b2201450d00200441ffffff3f71450d002001102c0b20024180026a24000bac0303037f037e017f230041d0006b220324002003200236020420032001360200200341086a2001200210b30102400240200328020822010d00200041023a00200c010b200328020c2104024002400240200341106a2802002205450d00410021020240024020012d00000e020100020b410121020b2005417f6a4104490d002005417b6a4110490d002005416b6a410b4b0d010b20034100360220200342013703182003410f36022c200320033602282003200341186a360234200341cc006a41013602002003420137023c200341b4bcc3003602382003200341286a360248200341346a41dcb7c000200341386a103e1a200335022042208620033502188410000240200328021c450d002003280218102c0b410221020c010b200128000121052001410d6a2900002106200129000521072003200328003836021820032003413b6a28000036001b20012900152108200128001d210920002006370308200020073703002000200936021c200020083702142000200536021020002003280218360021200041246a200328001b3600000b200020023a00202004450d002001102c0b200341d0006a24000bb60201027f230041e0006b220224002002412036020c20022001360208200241106a2001412010b30102400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a1080050240024020022802480d0020024100360230200242013703282002410f36023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241b4bcc3003602482002200241386a360258200241c4006a41dcb7c000200241c8006a103e1a200235023042208620023502288410000240200228022c450d002002280228102c0b200041003602000c010b20002002290348370200200041086a200241c8006a41086a2802003602000b2003450d002001102c0b200241e0006a24000bc80502097f037e23004180026b2202240020022001108702024002402002280200450d00200041003602000c010b0240024002402002280204220320012802044105762204200420034b1b22044105742205417f4c0d000240024020040d00410121060c010b200510322206450d020b41002107200241003602102002200436020c20022006360208024002402003450d0041002108034041002105200241003a00b801200841016a21082001280204417f6a210403402004417f460d0320024198016a20056a200128020022092d00003a0000200120043602042001200941016a3602002002200541016a22093a00b8012004417f6a21042009210520094120470d000b200241c0016a41086a220420024198016a41086a290300370300200241c0016a41106a220520024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200941ff0171411f4d0d05200241386a41086a2004290300220b370300200241386a41106a2005290300220c370300200241386a41186a200a290300220d370300200241186a41186a2205200d370300200241186a41106a2209200c370300200241186a41086a220a200b370300200220022903c001220b3703582002200b3703382002200b37031802402007200228020c470d00200241086a2007410110d60120022802082106200228021021070b200620074105746a22042002290318370000200441186a2005290300370000200441106a2009290300370000200441086a200a2903003700002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c040b200541ff0171450d02200241003a00b8010c020b103b000b1039000b2000410036020020064100200228020c22041b2201450d00200441ffffff3f71450d002001102c0b20024180026a24000bcc08010a7f23004180026b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022040d00200041003602000c010b200328021421052003200341186a280200360224200320043602202003200341206a1087020240024020032802000d000240024002402003280204220620032802244105762201200120064b1b22014105742202417f4c0d000240024020010d00410121070c010b200210322207450d020b41002108200341003602302003200136022c200320073602280240024002402006450d0041002109034041002102200341003a00b8012003280224417f6a2101200941016a210903402001417f460d0320034198016a20026a2003280220220a2d00003a00002003200a41016a3602202003200241016a220a3a00b801200320013602242001417f6a2101200a2102200a4120470d000b200341c0016a41086a220220034198016a41086a290300370300200341c0016a41106a220b20034198016a41106a290300370300200341c0016a41186a220c20034198016a41186a29030037030020032003290398013703c001410121010240200a41ff01714120490d00200341f8006a41186a200c290300370300200341f8006a41106a200b290300370300200341f8006a41086a2002290300370300200320032903c001370378410021010b200341d8006a41086a2202200341f8006a41086a290300370300200341d8006a41106a220a200341f8006a41106a290300370300200341d8006a41186a220b200341f8006a41186a2903003703002003200329037837035820010d03200341386a41186a220c200b290300370300200341386a41106a220b200a290300370300200341386a41086a220a20022903003703002003200329035837033802402008200328022c470d00200341286a200810820520032802282107200328023021080b200720084105746a22012003290338370000200141186a200c290300370000200141106a200b290300370000200141086a200a2903003700002003200841016a220836023020092006470d000b0b2007450d052000200329022c370204200020073602000c060b0240200241ff0171450d00200341003a00b8010b200341d8006a41086a200341f8006a41086a290300370300200341d8006a41106a200341f8006a41106a290300370300200341d8006a41186a200341f8006a41186a290300370300200320032903783703580b200328022c41ffffff3f710d020c030b103b000b1039000b2007102c0b200341003602c801200342013703c0012003410f36027c2003200341086a3602782003200341c0016a360258200341ac016a41013602002003420137029c01200341b4bcc300360298012003200341f8006a3602a801200341d8006a41dcb7c00020034198016a103e1a20033502c80142208620033502c001841000024020032802c401450d0020032802c001102c0b200041003602000b2005450d002004102c0b20034180026a24000bcf0101037f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1b220241ffffff3f7122042002470d02200241057422034100480d0220042002462104024002400240024002402000280200410020011b22020d002003450d010c030b200141057422010d0120030d020b200421010c020b200220012003103522010d010c030b200310322201450d020b20002001360200200041046a20034105763602000b0f0b2004450d001039000b103b000ba40303037f017e017f230041e0006b220324002003200236020c20032001360208200341106a2001200210b30102400240200328021022020d00200041003602080c010b200328021421042003200341186a28020036022420032002360220200341c8006a200341206a1084050240024020032802482205450d00200329024c21062003200536024820032006a7220136024c2006422088a72107024002402001694101470d0020014102490d0020012007470d010b200341c8006a2007417f20014101200141016a41024b1b677620076b41016a108505200328024c2101200328024821050b2000200136020c2000200536020820002007360204200041003602000c010b20034100360230200342013703282003410f36023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341b4bcc3003602482003200341386a360258200341c4006a41dcb7c000200341c8006a103e1a200335023042208620033502288410000240200328022c450d002003280228102c0b200041003602080b2004450d002002102c0b200341e0006a24000bba0403037f017e047f230041206b22022400200241086a2001108702024002402002280208450d00200041003602000c010b024002400240200228020c22032001280204410c6e2204200420034b1bad420c7e2205422088a70d002005a72204417f4c0d000240024020040d00410421060c010b200410322206450d020b41002107200241003602182002200636021020022004410c6e36021402402003450d0003402002200110870220022802000d042001280204220820022802042204490d042004417f4c0d020240024020040d00410121090c010b200410372209450d04200128020421080b0240024020082004490d0020092001280200200410c90821082001280204220920044f0d01200420094194afc0001058000b2004450d052004450d052009102c0c050b2001200920046b3602042001200128020020046a3602002008450d042004ad22054220862005842105024020072002280214470d00200241106a2007410110ec0120022802182107200228021021060b20062007410c6c6a22042005370204200420083602002002200228021841016a22073602182003417f6a22030d000b0b20002002290310370200200041086a200241106a41086a2802003602000c030b103b000b1039000b200041003602002002280210210802402007450d002007410c6c21012008210403400240200441046a280200450d002004280200102c0b2004410c6a2104200141746a22010d000b0b20022802142204450d002004410c6c450d002008102c0b200241206a24000bbf0103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d022002ad420c7e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b2003410c6c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a2001410c6e3602000b0f0b2005450d001039000b103b000ba00902057f017e230041b0016b220224002002412036020c20022001360208200241106a2001412010b30102400240200228021022010d00200041003a00000c010b200241186a280200210320022802142104200241003a0060024002402003450d00200220012d00003a0040200241013a0060024020034101460d00200220012d00013a0041200241023a006020034102460d00200220012d00023a0042200241033a006020034103460d00200220012d00033a0043200241043a006020034104460d00200220012d00043a0044200241053a006020034105460d00200220012d00053a0045200241063a006020034106460d00200220012d00063a0046200241073a006020034107460d00200220012d00073a0047200241083a006020034108460d00200220012d00083a0048200241093a006020034109460d00200220012d00093a00492002410a3a00602003410a460d00200220012d000a3a004a2002410b3a00602003410b460d00200220012d000b3a004b2002410c3a00602003410c460d00200220012d000c3a004c2002410d3a00602003410d460d00200220012d000d3a004d2002410e3a00602003410e460d00200220012d000e3a004e2002410f3a00602003410f460d00200220012d000f3a004f200241103a006020034110460d00200220012d00103a0050200241113a006020034111460d00200220012d00113a0051200241123a006020034112460d00200220012d00123a0052200241133a006020034113460d00200220012d00133a0053200241143a006020034114460d00200220012d00143a0054200241153a006020034115460d00200220012d00153a0055200241163a006020034116460d00200220012d00163a0056200241173a006020034117460d00200220012d00173a0057200241183a006020034118460d00200220012d00183a0058200241193a006020034119460d00200220012d00193a00592002411a3a00602003411a460d00200220012d001a3a005a2002411b3a00602003411b460d00200220012d001b3a005b2002411c3a00602003411c460d00200220012d001c3a005c2002411d3a00602003411d460d00200220012d001d3a005d2002411e3a00602003411e460d00200220012d001e3a005e2002411f3a00602003411f460d00200241206a41106a2203200241c0006a41106a290300370300200241206a41086a2205200241c0006a41086a290300370300200220012d001f3a005f200241206a41186a2206200241c0006a41186a290300370300200241203a006020022002290340220737036820022007370320200041196a2006290300370000200041116a2003290300370000200041096a200529030037000020002002290320370001410121030c020b200241003a00600b20024100360270200242013703682002410f3602242002200241086a3602202002200241e8006a3602ac01200241d4006a410136020020024201370244200241b4bcc3003602402002200241206a360250200241ac016a41dcb7c000200241c0006a103e1a200235027042208620023502688410000240200228026c450d002002280268102c0b410021030b200020033a00002004450d002001102c0b200241b0016a24000b900202027e027f200141086a2903002102200129030021032000200041086a22042802004110102f200028020020042802006a22052002370008200520033700002004200428020041106a2205360200200141186a290300210220012903102103200020054110102f200028020020042802006a22052002370008200520033700002004200428020041106a2205360200200141286a290300210220012903202103200020054110102f200028020020042802006a22052002370008200520033700002004200428020041106a2205360200200141386a290300210220012903302103200020054110102f200028020020042802006a22002002370008200020033700002004200428020041106a3602000be10202037f027e230041106b22032400200341003602082003420137030020022d00202104200341004101102f2003280200200328020822056a20043a00002003200541016a220436020820022802102105200320044104102f2003280200200328020822046a20053600002003200441046a2204360208200241086a290300210620022903002107200320044110102f2003280200200328020822046a22052006370008200520073700002003200441106a220436020820022802142105200320044104102f2003280200200328020822046a20053600002003200441046a220436020820022802182105200320044104102f2003280200200328020822046a20053600002003200441046a2204360208200228021c2105200320044104102f20032802002202200328020822046a20053600002003200441046a2204360208200020012002200410a70202402003280204450d002002102c0b200341106a24000bf40301057f230041106b2203240002400240200228020822044105744104722205417f4c0d0020022802002102200510322206450d01200341003602082003200536020420032006360200024002400240200441c000490d00024002400240200441808001490d002004418080808004490d01200341004101102f2003280200200328020822056a41033a00002003200541016a2205360208200320054104102f2003280200200328020822056a2004360000200541046a21050c020b200341004102102f2003280200200328020822056a20044102744101723b0000200541026a21050c010b200341004104102f2003280200200328020822056a2004410274410272360000200541046a21050b20032005360208200220044105746a21070c010b200341004101102f20032802002206200328020822056a20044102743a00002003200541016a22053602082004450d01200220044105746a21070b0340200320054120102f20032802002206200328020822046a22052002290000370000200541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a2900003700002003200441206a22053602082007200241206a2202470d000b0b200020012006200510a70202402003280204450d002006102c0b200341106a24000f0b103b000b1039000bf50101057f230041106b22022400024002402001280208220341027441046a2204417f4c0d00200128020021010240024020040d00410121050c010b200410322205450d020b20024100360208200220043602042002200536020020022003108f010240024020030d0020022802002106200228020821030c010b2003410274210420022802082103034020012802002105200220034104102f20022802002206200228020822036a20053600002002200341046a2203360208200141046a21012004417c6a22040d000b0b200041202006200310a70202402002280204450d002006102c0b200241106a24000f0b103b000b1039000bce0401077f230041106b2202240002400240200128020822034105744104722204417f4c0d0020012802002105200410322201450d0120024100360208200220043602042002200136020020022003108f010240024020030d0020022802002104200228020821030c010b200520034105746a210620022802082103034020052802002101200220034104102f2002280200200228020822036a20013600002002200341046a360208200528020421032002200528020c2201108f0102402001450d0020014105742104200228020821010340200220014120102f2002280200200228020822076a22012003290000370000200141086a200341086a290000370000200141106a200341106a290000370000200141186a200341186a2900003700002002200741206a2201360208200341206a2103200441606a22040d000b0b200541206a210820052802102103200220052802182201108f010240024020010d00200228020821010c010b20014105742104200228020821010340200220014120102f2002280200200228020822076a22012003290000370000200141086a200341086a290000370000200141106a200341106a290000370000200141186a200341186a2900003700002002200741206a2201360208200341206a2103200441606a22040d000b0b200528021c2103200220014104102f20022802002204200228020822016a20033600002002200141046a22033602082008210520082006470d000b0b200041202004200310a70202402002280204450d002004102c0b200241106a24000f0b103b000b1039000b870201057f230041106b2202240002404121410120012d000041014622031b220410322205450d00200241003602082002200436020420022005360200200241004101102f20022802002204200228020822056a21060240024020030d00200641003a0000200541016a21010c010b200641013a00002002200541016a2204360208200220044120102f20022802002204200228020822056a22032001290001370000200341086a200141096a290000370000200341106a200141116a290000370000200341186a200141196a290000370000200541206a21010b20022001360208200041202004200110a70202402002280204450d002004102c0b200241106a24000f0b1039000be30201067f230041206b2203240002400240200228020822044105744104722205417f4c0d0020022802002102200510322206450d0120034100360208200320053602042003200636020020032004108f010240024020040d0020032802002107200328020821040c010b200441057421060340412010322204450d032003422037021420032004360210200341106a41004120102f20032802102205200328021822086a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200841206a2204360218200320032802082004102f20032802002207200328020822086a2005200410c9081a2003200820046a220436020802402003280214450d002005102c0b200241206a2102200641606a22060d000b0b200020012007200410a70202402003280204450d002007102c0b200341206a24000f0b103b000b1039000b7501037f230041106b22022400200241003602082002420137030020022001108f05200128020c2103200220022802084104102f20022802002201200228020822046a20033600002002200441046a2203360208200041202001200310a70202402002280204450d002001102c0b200241106a24000bb30201047f20012802002102200020012802082201108f0102402001450d0020022001412c6c6a2103200041086a22012802002104034020022802002105200020044104102f200028020020012802006a20053600002001200128020041046a2204360200200020044120102f200028020020012802006a2204200241046a290000370000200441186a2002411c6a290000370000200441106a200241146a290000370000200441086a2002410c6a2900003700002001200128020041206a2204360200200241246a2802002105200020044104102f200028020020012802006a20053600002001200128020041046a2204360200200241286a2802002105200020044104102f200028020020012802006a20053600002001200128020041046a22043602002002412c6a22022003470d000b0b0bb10303017f027e027f230041106b220324002003410036020820034201370300200241086a290300210420022903002105200341004110102f2003280200200328020822066a22072004370008200720053700002003200641106a2206360208200241186a290300210420022903102105200320064110102f2003280200200328020822066a22072004370008200720053700002003200641106a220636020820022802202107200320064104102f2003280200200328020822066a20073600002003200641046a220636020820022802242107200320064104102f2003280200200328020822066a20073600002003200641046a220636020820022802282107200320064104102f2003280200200328020822066a20073600002003200641046a2206360208200228022c2107200320064104102f2003280200200328020822066a20073600002003200641046a220636020820022802302107200320064104102f2003280200200328020822066a20073600002003200641046a3602082003200241346a1091052000200120032802002202200328020810a70202402003280204450d002002102c0b200341106a24000ba60201047f230041106b2202240020012d000021032000200041086a22042802004101102f200028020020042802006a210502400240024020034101460d00200541003a00002004200428020041016a3602000c010b200541013a00002004200428020041016a360200412010322204450d012002422037020420022004360200200241004120102f20022802002203200228020822056a22042001290001370000200441086a200141096a290000370000200441106a200141116a290000370000200441186a200141196a2900003700002002200541206a22013602082000200041086a22042802002001102f200028020020042802006a2003200110c9081a2004200428020020016a3602002002280204450d002003102c0b200241106a24000f0b1039000bce0201057f230041106b220324002003410036020820034201370300200341004120102f2003280200200328020822046a22052002290000370000200541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a2900003700002003200441206a360208200241206a200310f803200228025021052003200241d8006a2802002202108f010240024020020d0020032802002106200328020821020c010b20024105742104200328020821020340200320024120102f20032802002206200328020822076a22022005290000370000200241086a200541086a290000370000200241106a200541106a290000370000200241186a200541186a2900003700002003200741206a2202360208200541206a2105200441606a22040d000b0b200020012006200210a70202402003280204450d002006102c0b200341106a24000bd90103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad4298027e2204422088a722020d022004a722014100480d022002454103742105024002400240024002402000280200410020031b22020d002001450d010c030b20034198026c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a20014198026e3602000b0f0b2005450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42287e2204422088a722030d022004a722024100480d022003454103742105024002400240024002402000280200410020011b22030d002002450d010c030b200141286c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241286e3602000b0f0b2005450d001039000b103b000bd40103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad4288027e2204422088a722030d022004a722024100480d022003454103742105024002400240024002402000280200410020011b22030d002002450d010c030b20014188026c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a20024188026e3602000b0f0b2005450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42c1007e2204422088a722020d022004a722014100480d022002452105024002400240024002402000280200410020031b22020d002001450d010c030b200341c1006c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141c1006e3602000b0f0b2005450d001039000b103b000bd90103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42d0007e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b200341d0006c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141d0006e3602000b0f0b2005450d001039000b103b000bd40103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42c0037e2204422088a722030d022004a722024100480d022003454103742105024002400240024002402000280200410020011b22030d002002450d010c030b200141c0036c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241c0036e3602000b0f0b2005450d001039000b103b000bd40103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42f0007e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b200141f0006c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241f0006e3602000b0f0b2005450d001039000b103b000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42187e2204422088a722020d022004a722014100480d022002454103742105024002400240024002402000280200410020031b22020d002001450d010c030b200341186c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141186e3602000b0f0b2005450d001039000b103b000bd90103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42b4027e2204422088a722020d022004a722014100480d022002454102742105024002400240024002402000280200410020031b22020d002001450d010c030b200341b4026c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141b4026e3602000b0f0b2005450d001039000b103b000bd80101027f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1b220141ffffffff017122042001470d02200141037422024100480d0220042001464103742104024002400240024002402000280200410020031b22010d002002450d010c030b200341037422030d0120020d020b200421010c020b200120032002103522010d010c030b200210322201450d020b20002001360200200041046a20024103763602000b0f0b2004450d001039000b103b000bd10103027f017e017f024002400240200041046a2802002001470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42307e2204422088a722030d022004a722024100480d022003454103742105024002400240024002402000280200410020011b22030d002002450d010c030b200141306c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241306e3602000b0f0b2005450d001039000b103b000bd81101167f230041f0006b22022400200241186a4189bec300410f10c501200241d8006a41a0c1c300410810c5010240024002400240024002400240410410322203450d002002420437023420022003360230200241306a41004104102f20022802302204200228023822036a20013600002002200341046a2201360238200341246a2203417f4c0d010240024020030d00410121050c010b200310322205450d010b200241003602102002200336020c20022005360208200241086a4100411010c8012002280208200228021022036a22052002290018370000200541086a200241186a41086a2900003700002002200341106a2203360210200241086a2003411010c8012002280208200228021022036a22052002290058370000200541086a200241d8006a41086a2900003700002002200341106a2203360210200241086a2003200110c80120022802082203200228021022056a2004200110c9081a2002200520016a220136021002402002280234450d002004102c0b2002200136022c20022003360228200241306a2003200110b30120022802302206450d04200228023421072002200241306a41086a28020036024420022006360240200241d8006a200241c0006a108005024020022802582204450d00200241d8006a41086a2802002101200228025c2105200241d8006a200241c0006a108005024002400240024020022802582208450d00200241e0006a2209280200210a200228025c210b200241d8006a200241c0006a1080052002280258220c450d012009280200210d200228025c210e200241d8006a200241c0006a10ea042002280258220f0d020240200e450d00200e41ffffff3f71450d00200c102c0b0240200b450d00200b41ffffff3f71450d002008102c0b2005450d04200541ffffff3f710d030c040b2005450d03200541ffffff3f710d020c030b0240200b450d00200b41ffffff3f71450d002008102c0b2005450d02200541ffffff3f710d010c020b200241e0006a2802002109200228025c211002400240024002400240200228024422114104490d002002280240221228000021132002201241046a36024020022011417c6a221436024420144104490d012002201241086a360240201228000421142002201141786a221536024420154104490d0220022012410c6a3602402002201141746a221536024420154104490d03201228000821152002201241106a3602402002201141706a221636024420164104490d04201228000c21162002201241146a36024020022011416c6a2217360244201741044f0d0902402009450d002009410c6c2109200f210103400240200141046a28020041ffffffff0371450d002001280200102c0b2001410c6a2101200941746a22090d000b0b02402010450d002010410c6c450d00200f102c0b0240200e450d00200e41ffffff3f71450d00200c102c0b0240200b450d00200b41ffffff3f71450d002008102c0b2005450d06200541ffffff3f710d050c060b02402009450d002009410c6c2109200f210103400240200141046a28020041ffffffff0371450d002001280200102c0b2001410c6a2101200941746a22090d000b0b02402010450d002010410c6c450d00200f102c0b0240200e450d00200e41ffffff3f71450d00200c102c0b0240200b450d00200b41ffffff3f71450d002008102c0b2005450d05200541ffffff3f710d040c050b02402009450d002009410c6c2109200f210103400240200141046a28020041ffffffff0371450d002001280200102c0b2001410c6a2101200941746a22090d000b0b02402010450d002010410c6c450d00200f102c0b0240200e450d00200e41ffffff3f71450d00200c102c0b0240200b450d00200b41ffffff3f71450d002008102c0b2005450d04200541ffffff3f710d030c040b02402009450d002009410c6c2109200f210103400240200141046a28020041ffffffff0371450d002001280200102c0b2001410c6a2101200941746a22090d000b0b02402010450d002010410c6c450d00200f102c0b0240200e450d00200e41ffffff3f71450d00200c102c0b0240200b450d00200b41ffffff3f71450d002008102c0b2005450d03200541ffffff3f710d020c030b02402009450d002009410c6c2109200f210103400240200141046a28020041ffffffff0371450d002001280200102c0b2001410c6a2101200941746a22090d000b0b02402010450d002010410c6c450d00200f102c0b0240200e450d00200e41ffffff3f71450d00200c102c0b0240200b450d00200b41ffffff3f71450d002008102c0b2005450d02200541ffffff3f710d010c020b02402009450d002009410c6c2109200f210103400240200141046a28020041ffffffff0371450d002001280200102c0b2001410c6a2101200941746a22090d000b0b02402010450d002010410c6c450d00200f102c0b0240200e450d00200e41ffffff3f71450d00200c102c0b0240200b450d00200b41ffffff3f71450d002008102c0b2005450d01200541ffffff3f71450d010b2004102c0b4100210420024100360220200242013703182002410f36024c2002200241286a3602482002200241186a360254200241ec006a41013602002002420137025c200241b4bcc3003602582002200241c8006a360268200241d4006a41dcb7c000200241d8006a103e1a200235022042208620023502188410000240200228021c450d002002280218102c0b0c030b1039000b103b000b201228001021172002201141686a3602442002201241186a360240201228001421110b02402007450d002006102c0b20040d010b200041003602000c010b2000200536020420002004360200200041c4006a2011360200200041c0006a20173602002000413c6a2016360200200041386a2015360200200041346a2014360200200041306a20133602002000412c6a2009360200200041286a2010360200200041246a200f360200200041206a200d3602002000411c6a200e360200200041186a200c360200200041146a200a360200200041106a200b3602002000410c6a2008360200200041086a20013602000b0240200228020c450d002003102c0b200241f0006a24000b340020004189bec30036020420004100360200200041146a4103360200200041106a4198bec300360200200041086a420f3702000b2701017f230041d0006b22022400200241003602082000200241086a10e604200241d0006a24000bef0201057f230041306b2202240020024189bec300410f10c501200241106a41a0c1c300410810c50102400240410410322203450d002002420437022420022003360220200241206a41004104102f20022802202204200228022822036a20013600002002200341046a2201360228200341246a2203417f4c0d010240024020030d00410121050c010b200310322205450d010b2000200336020420002005360200200041086a2203410036020020004100411010c8012000280200200328020022056a220620022900003700002003200541106a2205360200200641086a200241086a29000037000020002005411010c8012000280200200328020022056a220620022900103700002003200541106a2205360200200641086a200241106a41086a29000037000020002005200110c8012000280200200328020022006a2004200110c9081a2003200020016a36020002402002280224450d002004102c0b200241306a24000f0b1039000b103b000bec0101047f230041c0006b2202240041eea3c6002103410f210441042105024002400240024002400240200141ff01710e06000102030405000b2002411c6a41013602002002420137020c200241eccdc80036020820024104360224200241c0fcc7003602202002200241206a360218200241086a41a8a2c6001046000b41dfa3c6002103410021050c030b41c5a3c6002103411a2104410121050c020b41a8a3c6002103411d2104410221050c010b4195a3c600210341132104410321050b200041033b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b9b0201047f230041c0006b22022400419df3c5002103411621044106210502400240024002400240024002400240200141ff01710e080001020304050607000b2002411c6a41013602002002420137020c200241eccdc80036020820024104360224200241c0fcc7003602202002200241206a360218200241086a41d4f1c5001046000b4192f3c5002103410b2104410021050c050b4186f3c5002103410c2104410121050c040b41f9f2c5002103410d2104410221050c030b41f2f2c500210341072104410321050c020b41daf2c500210341182104410421050c010b41c2f2c500210341182104410521050b20004183163b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b970201047f230041c0006b2202240041acf5c4002103411121044106210502400240024002400240024002400240200141ff01710e080001020304050607000b2002411c6a41013602002002420137020c200241eccdc80036020820024104360224200241c0fcc7003602202002200241206a360218200241086a41c8f7c4001046000b419cf4c4002103410021050c050b41b8f4c4002103410e2104410121050c040b41d0f4c4002103410f2104410221050c030b41e8f4c4002103410c2104410321050c020b419081c700210341102104410421050c010b4184f5c4002103411f2104410521050b20004183323b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000be30401047f230041c0006b2202240041b084c70021034113210441162105024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141ff01710e18000102030405060708090a0b0c0d0e0f1011121314151617000b2002411c6a41013602002002420137020c200241eccdc80036020820024104360224200241c0fcc7003602202002200241206a360218200241086a41b88dc7001046000b4194ffc600210341112104410021050c150b41b0ffc6002103411c2104410121050c140b41d4ffc600210341192104410221050c130b41f8ffc600210341182104410321050c120b419880c700210341142104410421050c110b41b480c700210341202104410521050c100b41dc80c7002103410d2104410621050c0f0b41f480c7002103410721050c0e0b419081c700210341102104410821050c0d0b41a881c700210341142104410921050c0c0b41c481c7002103410f2104410a21050c0b0b41dc81c7002103411b2104410b21050c0a0b418082c700210341172104410c21050c090b41a082c700210341112104410d21050c080b41bc82c7002103410e21050c070b41d882c7002103410e2104410f21050c060b41f082c700210341112104411021050c050b418c83c7002103411a2104411121050c040b41b083c7002103410d2104411221050c030b41c883c700210341202104411321050c020b41f083c700210341152104411421050c010b419084c700210341182104411521050b20004183203b0100200041086a2004360200200041046a2003360200200041026a20053a0000200241c0006a24000b150020002002ad4220862001ad84200310084101460bbe0603017f017e057f230041d0016b22032400024020012002100a2204422088a72201450d002001417f6a21050240024002402004a722062d00000e020001030b41002101200341003a008901200641016a21070240034020052001460d01200341e8006a20016a200720016a2d00003a00002003200141016a22023a0089012002210120024121470d000b20034190016a41086a2207200341f1006a29000037030020034190016a41106a2208200341f9006a29000037030020034190016a41186a220920034181016a290000370300200320032900693703900120032d00682105410121010240200241ff01714121490d00200341c8006a41186a2009290300370300200341c8006a41106a2008290300370300200341c8006a41086a20072903003703002003200329039001370348410021010b200341286a41086a200341c8006a41086a290300370300200341286a41106a200341c8006a41106a290300370300200341286a41186a200341c8006a41186a2903003703002003200329034837032820010d03200341086a41186a200341286a41186a290300370300200341086a41106a200341286a41106a290300370300200341086a41086a200341286a41086a2903003703002003200329032837030841002102200341086a21010c020b0240200141ff0171450d00200341003a0089010b200341286a41086a200341c8006a41086a290300370300200341286a41106a200341c8006a41106a290300370300200341286a41186a200341c8006a41186a290300370300200320032903483703280c020b2005450d014100210502400240024020062d00010e03020100040b410221050c010b410121050b200341086a41186a200341e8006a41186a290000370300200341086a41106a200341e8006a41106a290000370300200341086a41086a200341e8006a41086a2900003703002003200329006837030841012102200341086a21010b200020053a0001200020023a0000200041026a20012900003700002000410a6a200141086a290000370000200041126a200141106a2900003700002000411a6a200141186a2900003700002006102c200341d0016a24000f0b41f2b3c800412e200341e8006a41a0b4c80041b0b4c8001040000b1c00200128021841d8bdc800410f2001411c6a28020028020c1100000bd50101047f230041c0006b22022400419df3c500210341162104410221050240024002400240200141ff01710e0400010203000b2002411c6a41013602002002420137020c200241eccdc80036020820024104360224200241c0fcc7003602202002200241206a360218200241086a41e4c8c5001046000b41c2f2c500210341182104410021050c010b41daf2c500210341182104410121050b20004183023b0118200041003a001020004200370300200041206a20043602002000411c6a20033602002000411a6a20053a0000200241c0006a24000bad0101067f230041106b2202240020012802002103200020012802082201108f0102402001450d00200141246c2104200041086a2101034020022003108402200228020021052000200128020020022802082206102f200028020020012802006a2005200610c9081a2001200620012802006a36020020022802042206200720061b210702402006450d002007450d002005102c0b200341246a21032004415c6a22040d000b0b200241106a24000baf2305057f017e087f017e047f230041f0056b2202240041002103200241003a00c805024002400240024002400240024002400340200128020022042802042205450d01200241a8056a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00c80520034120470d000b200241f0036a41186a200241a8056a41186a2903002207370300200241d0026a41086a2203200241a8056a41086a290300370300200241d0026a41106a2204200241a8056a41106a290300370300200241d0026a41186a22052007370300200220022903a8053703d002200241b0016a41186a22062005290300370300200241b0016a41106a22052004290300370300200241b0016a41086a22042003290300370300200220022903d0023703b00120024190016a41186a200629030037030020024190016a41106a200529030037030020024190016a41086a2004290300370300200220022903b00137039001200241286a200110b00320022802280d02200228022c210841002103200241003a00c8050340200128020022042802042205450d02200241a8056a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00c80520034120470d000b200241f0036a41186a200241a8056a41186a2903002207370300200241d0026a41086a2203200241a8056a41086a290300370300200241d0026a41106a2204200241a8056a41106a290300370300200241d0026a41186a22052007370300200220022903a8053703d002200241f0016a41186a22062005290300370300200241f0016a41106a22052004290300370300200241f0016a41086a22042003290300370300200220022903d0023703f001200241d0016a41186a2006290300370300200241d0016a41106a2005290300370300200241d0016a41086a2004290300370300200220022903f0013703d00141002103200241003a00c8050340200128020022042802042205450d04200241a8056a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00c80520034120470d000b200241f0036a41186a200241a8056a41186a2903002207370300200241d0026a41086a2203200241a8056a41086a290300370300200241d0026a41106a2204200241a8056a41106a290300370300200241d0026a41186a22052007370300200220022903a8053703d002200241b0026a41186a22062005290300370300200241b0026a41106a22052004290300370300200241b0026a41086a22042003290300370300200220022903d0023703b00220024190026a41186a200629030037030020024190026a41106a200529030037030020024190026a41086a2004290300370300200220022903b00237039002200241206a200110b00320022802200d0520022802242209200128020028020441246e2203200320094b1bad42247e2207422088a7450d040c070b0240200341ff0171450d00200241003a00c8050b200241b0016a41086a200241d0026a41086a290300370300200241b0016a41106a200241d0026a41106a290300370300200241b0016a41186a200241d0026a41186a290300370300200220022903d0023703b001200041003602040c050b0240200341ff0171450d00200241003a00c8050b200241f0016a41086a200241d0026a41086a290300370300200241f0016a41106a200241d0026a41106a290300370300200241f0016a41186a200241d0026a41186a290300370300200220022903d0023703f001200041003602040c040b200041003602040c030b0240200341ff0171450d00200241003a00c8050b200241b0026a41086a200241d0026a41086a290300370300200241b0026a41106a200241d0026a41106a290300370300200241b0026a41186a200241d0026a41186a290300370300200220022903d0023703b002200041003602040c020b2007a72203417f4c0d020240024002400240024020030d004104210a0c010b20031032220a450d010b2001200128020441016a2204360204200241003602d8042002200a3602d0042002200341246e3602d404200420012802084b0d0202402009450d00200241fd036a210b200241bb056a220c41056a210d4100210e4100210f0340200128020022032802042204450d04200328020022052d0000210620032004417f6a3602042003200541016a360200024002400240024002400240024002400240024002400240024002400240024020060e080514001402030104140b41002103200241003a00c80502400340200128020022042802042205450d01200241a8056a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00c80520034120470d000b2002200d2900003700e5052002200c2900003703e005200220022900e5053700d505200220022903e0053703d005200220022903d00537039805200220022900d50537009d0520022800af05210520022f01a805210420022d00aa05210620022800ab05210320022900b30521102002200229009d0537008d052002200229039805370388052002200229008d053700fd0420022002290388053703f804200220022900fd043700f503200220022903f8043703f003200b20022f00f5043b0000200b41026a200241f5046a41026a2d00003a0000201042808080807083210720034108762111200420064110747221042010a72106410021120c0f0b200341ff0171450d13200241003a00c8050c130b200241003a00ac05200128020022032802042204450d12200328020022052d0000210620032004417f6a360204200241013a00ac052003200541016a360200200220063a00a8052001280200220328020422040d050c110b200241003a00ac05200128020022032802042204450d11200328020022052d0000210620032004417f6a360204200241013a00ac052003200541016a360200200220063a00a8052001280200220328020422040d060c0a0b200241003a00ac05200128020022032802042204450d10200328020022052d0000210620032004417f6a360204200241013a00ac052003200541016a360200200220063a00a8052001280200220328020422040d040c070b200128020022032802042204450d0f200328020022052d0000210620032004417f6a3602042003200541016a36020020060d0f200241e0056a200110e70420022802e00522034102460d0f200241f0036a41086a200241a8056a41086a290200370300200220022902a8053703f00320022802e805210620022802e40521054104211242002107410021110c010b200241e0056a200110c60420022802e0052203450d0e20022802e805210620022802e4052105200241f0036a41086a200241a8056a41086a290200370300200220022902a8053703f0032003410876211141052112420021070b0c080b200328020022052d0000210620032004417f6a3602042003200541016a360200200241023a00ac05200220063a00a905200128020022032802042204450d0b200328020022052d0000210620032004417f6a3602042003200541016a360200200241033a00ac05200220063a00aa052001280200220328020422040d060c0b0b200328020022052d0000210620032004417f6a3602042003200541016a360200200241023a00ac05200220063a00a905200128020022032802042204450d02200328020022052d0000210620032004417f6a3602042003200541016a360200200241033a00ac05200220063a00aa052001280200220328020422040d010c020b200328020022052d0000210620032004417f6a3602042003200541016a360200200241023a00ac05200220063a00a905200128020022032802042204450d03200328020022052d0000210620032004417f6a3602042003200541016a360200200241033a00ac05200220063a00aa052001280200220328020422040d020c030b200328020022052d0000210620032004417f6a3602042003200541016a360200200220063a00ab0520022802a8052104200241106a200110b00320022802100d0920012802002206280204221220022802142203490d092003417f4c0d0c0240024020030d00410121050c010b200310372205450d082001280200220628020421120b0240024020122003490d0020052006280200200310c90821122006280204221320034f0d01200320134194afc0001058000b2003450d0a2003450d0a2005102c0c0a0b2006201320036b3602042006200628020020036a3602002012450d092003ad22074220862007842210428080808070832107200441187621032010a72106410321120c040b200241003a00ac050c080b200328020022052d0000210620032004417f6a3602042003200541016a360200200220063a00ab0520022802a8052104200241086a200110b00320022802080d07200128020022062802042212200228020c2203490d072003417f4c0d0a0240024020030d00410121050c010b200310372205450d062001280200220628020421120b0240024020122003490d0020052006280200200310c90821122006280204221320034f0d01200320134194afc0001058000b2003450d082003450d082005102c0c080b2006201320036b3602042006200628020020036a3602002012450d072003ad22074220862007842210428080808070832107200441187621032010a72106410221120c020b200241003a00ac050c060b200328020022052d0000210620032004417f6a3602042003200541016a360200200220063a00ab0520022802a8052104200241186a200110b00320022802180d05200128020022062802042212200228021c2203490d052003417f4c0d080240024020030d00410121050c010b200310372205450d042001280200220628020421120b0240024020122003490d0020052006280200200310c90821122006280204221320034f0d01200320134194afc0001058000b2003450d062003450d062005102c0c060b2006201320036b3602042006200628020020036a3602002012450d052003ad22074220862007842210428080808070832107200441187621032010a72106410121120b200f41016a210f200241d0026a41086a200241f0036a41086a2903002210370300200241e0046a41086a22132010370300200220022903f00322103703d002200220103703e0042011410874200341ff017172211420072006ad8421070240200e20022802d404470d00200241d0046a200e410110f20120022802d804210e20022802d004210a0b200a200e41246c6a2203200737000c2003200536000820032014360004200320043b0001200320123a0000200341036a20044110763a0000200320022903e0043700142003411c6a20132903003700002002200e41016a220e3602d804200f2009470d000b2001280204210420022802d004210a0b20012004417f6a360204200a450d0320022902d4042107200241f0006a41186a220320024190016a41186a290300370300200241f0006a41106a220420024190016a41106a290300370300200241f0006a41086a220520024190016a41086a290300370300200241d0006a41086a2206200241d0016a41086a290300370300200241d0006a41106a2201200241d0016a41106a290300370300200241d0006a41186a220e200241d0016a41186a290300370300200241306a41086a220920024190026a41086a290300370300200241306a41106a220f20024190026a41106a290300370300200241306a41186a221220024190026a41186a2903003703002002200229039001370370200220022903d0013703502002200229039002370330200020073702082000200a36020420002008360200200041106a2002290370370200200041186a2005290300370200200041206a2004290300370200200041286a2003290300370200200041306a2002290350370200200041386a2006290300370200200041c0006a2001290300370200200041c8006a200e290300370200200041e8006a2012290300370200200041e0006a200f290300370200200041d8006a2009290300370200200041d0006a20022903303702000c040b1039000b200241003a00ac050b200241d0046a102b0b200041003602040b200241f0056a24000f0b103b000bd80e03057f037e067f23004190046b2202240041002103200241003a00c8032001280204417f6a210402400240024002400240024002400240024003402004417f460d01200241a8036a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8032004417f6a21042005210320054120470d000b200241d0036a41086a2204200241a8036a41086a290300370300200241d0036a41106a2203200241a8036a41106a290300370300200241d0036a41186a2206200241a8036a41186a290300370300200220022903a8033703d003200541ff0171411f4d0d0120024188016a41086a2004290300220737030020024188016a41106a2003290300220837030020024188016a41186a20062903002209370300200241e8006a41186a2009370300200241e8006a41106a2008370300200241e8006a41086a2007370300200220022903d00322073703a8022002200737038801200220073703682002200110870220022802000d042002280204210641002103200241003a00c8032001280204417f6a210403402004417f460d03200241a8036a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8032004417f6a21042005210320054120470d000b200241d0036a41086a2203200241a8036a41086a290300370300200241d0036a41106a220a200241a8036a41106a290300370300200241d0036a41186a220b200241a8036a41186a290300370300200220022903a8033703d003200541ff0171411f4d0d03200241c8016a41086a20032903002207370300200241c8016a41106a200a2903002208370300200241c8016a41186a200b2903002209370300200241a8016a41186a2009370300200241a8016a41106a2008370300200241a8016a41086a2007370300200220022903d00322073703a802200220073703c801200220073703a80141002103200241003a00c80303402004417f460d06200241a8036a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00c8032004417f6a21042005210320054120470d000b200241d0036a41086a2204200241a8036a41086a290300370300200241d0036a41106a2203200241a8036a41106a290300370300200241d0036a41186a220a200241a8036a41186a290300370300200220022903a8033703d003200541ff0171411f4d0d0620024188026a41086a2004290300220737030020024188026a41106a2003290300220837030020024188026a41186a200a2903002209370300200241e8016a41186a2009370300200241e8016a41106a2008370300200241e8016a41086a2007370300200220022903d00322073703a8022002200737038802200220073703e801200241a8036a200110860220022802a8032204450d0720022902ac032107200241c8006a41186a2201200241e8006a41186a290300370300200241c8006a41106a2203200241e8006a41106a290300370300200241c8006a41086a2205200241e8006a41086a290300370300200241286a41086a220a200241a8016a41086a290300370300200241286a41106a220b200241a8016a41106a290300370300200241286a41186a220c200241a8016a41186a290300370300200241086a41086a220d200241e8016a41086a290300370300200241086a41106a220e200241e8016a41106a290300370300200241086a41186a220f200241e8016a41186a29030037030020022002290368370348200220022903a801370328200220022903e801370308200020073702082000200436020420002006360200200041106a2002290348370200200041186a2005290300370200200041206a2003290300370200200041286a2001290300370200200041306a2002290328370200200041386a200a290300370200200041c0006a200b290300370200200041c8006a200c290300370200200041e8006a200f290300370200200041e0006a200e290300370200200041d8006a200d290300370200200041d0006a20022903083702000c080b200341ff0171450d00200241003a00c8030b20024188016a41086a200241a8026a41086a29030037030020024188016a41106a200241a8026a41106a29030037030020024188016a41186a200241a8026a41186a290300370300200220022903a80237038801200041003602040c060b200341ff0171450d00200241003a00c8030b200241c8016a41086a200241a8026a41086a290300370300200241c8016a41106a200241a8026a41106a290300370300200241c8016a41186a200241a8026a41186a290300370300200220022903a8023703c801200041003602040c040b200041003602040c030b200341ff0171450d00200241003a00c8030b20024188026a41086a200241a8026a41086a29030037030020024188026a41106a200241a8026a41106a29030037030020024188026a41186a200241a8026a41186a290300370300200220022903a80237038802200041003602040c010b200041003602040b20024190046a24000b830302027f027e23004180016b220224002000280200210002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d01200520042001106c21000c020b200041086a290300210420002903002105418001210002400340024020000d00410021000c020b200220006a417f6a2005a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b20004181014f0d030b200141a888c0004102200220006a41800120006b104d21000c010b418001210002400340024020000d00410021000c020b200220006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b20004181014f0d030b200141a888c0004102200220006a41800120006b104d21000b20024180016a240020000f0b2000418001419888c0001058000b2000418001419888c0001058000bba0201037f23004180016b220224002000280200210002400240024002400240200128020022034110710d002000280200210420034120710d012004ad2001104921000c020b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141a888c0004102200220006a4180016a410020006b104d21000c010b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d02200141a888c0004102200220006a4180016a410020006b104d21000b20024180016a240020000f0b2004418001419888c0001058000b2004418001419888c0001058000b100020002802002000280204200110690bf10101067f23004180016b220224002001410c6a28020021032001280208210420012802002205210602402005410471450d0020012005410872220636020020040d0020014281808080a0013702080b2001200641047236020020002802002100410021060340200220066a41ff006a2000410f712207413072200741d7006a2007410a491b3a00002006417f6a2106200041047622000d000b024020064180016a2200418101490d002000418001419888c0001058000b200141a888c0004102200220066a4180016a410020066b104d21062001200336020c200120043602082001200536020020024180016a240020060bf00101037f200028020021022001200141086a22032802004104102f200128020020032802006a20023600002003200328020041046a220236020020002d00042104200120024101102f200128020020032802006a21020240024020044101460d00200241003a0000200328020041016a21030c010b200241013a00002003200328020041016a2202360200200120024120102f200128020020032802006a2202200041056a290000370000200241186a2000411d6a290000370000200241106a200041156a290000370000200241086a2000410d6a290000370000200328020041206a21030b200141086a20033602000bd40d030b7f017e057f230041306b22022400200241206a200110b3050240024002400240024002400240024002400240024020022802202203450d00200241286a280200210420022802242105200241086a200110b00320022802080d0941042106200228020c220720012802002802044104762208200820074b1b22094104742208417f4c0d0502402009450d00200810322206450d070b2001200128020441016a220a36020441002108200241003602182002200936021420022006360210200a20012802084b0d0802402007450d0041002108034020012802002209280204220a4104490d092009280200220b280000210c2009200a417c6a3602042009200b41046a360200200241206a200110c60420022802202209450d092002290224210d024020082002280214470d00200241106a2008410110ed0120022802182108200228021021060b200620084104746a220820093602042008200c360200200841086a200d3702002002200228021841016a22083602182007417f6a22070d000b2001280204210a20022802142109200228021021060b2001200a417f6a3602042006450d0920012802002207280204220a450d032007280200220b2d0000210c2007200a417f6a3602042007200b41016a36020041002107200c0e020201030b200041003602000c090b200241206a200110c60420022802202207450d012002290224210d0b200241206a200110c604200da7210a2002280220220c0d012000410036020002402007450d00200a450d002007102c0b02402008450d0020084104742108200641046a210103400240200141046a280200450d002001280200102c0b200141106a2101200841706a22080d000b0b0240200941ffffffff0071450d002006102c0b02402004450d002004410c6c21082003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b2005450d072005410c6c450d072003102c0c070b2000410036020002402008450d0020084104742108200641046a210103400240200141046a280200450d002001280200102c0b200141106a2101200841706a22080d000b0b0240200941ffffffff0071450d002006102c0b02402004450d002004410c6c21082003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b2005450d062005410c6c450d062003102c0c060b2002280224210e024002402001280200220b280204220f4104490d00200241286a2802002110200b28020022112800002112200b200f417c6a360204200b201141046a36020020012802002201280204220b4104490d012000200536020420002003360200200041306a20123602002000412c6a2010360200200041286a200e360200200041246a200c360200200041206a200d422088a73602002000411c6a200a360200200041186a2007360200200041146a2008360200200041106a20093602002000410c6a2006360200200041086a20043602002001280200220828000021092001200b417c6a3602042001200841046a360200200041346a20093602000c070b200041003602000240200e450d00200c102c0b02402007450d00200a450d002007102c0b02402008450d0020084104742108200641046a210103400240200141046a280200450d002001280200102c0b200141106a2101200841706a22080d000b0b0240200941ffffffff0071450d002006102c0b02402004450d002004410c6c21082003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b2005450d062005410c6c450d062003102c0c060b200041003602000240200e450d00200c102c0b02402007450d00200a450d002007102c0b02402008450d0020084104742108200641046a210103400240200141046a280200450d002001280200102c0b200141106a2101200841706a22080d000b0b0240200941ffffffff0071450d002006102c0b02402004450d002004410c6c21082003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b2005450d052005410c6c450d052003102c0c050b103b000b1039000b200228021021062008450d0020084104742108200641046a210103400240200141046a280200450d002001280200102c0b200141106a2101200841706a22080d000b0b20064100200228021422011b2208450d00200141ffffffff0071450d002008102c0b2000410036020002402004450d002004410c6c21082003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b2005450d002005410c6c450d002003102c0b200241306a24000b8a0503037f017e057f230041206b22022400200241086a200110b003024002402002280208450d00200041003602000c010b0240024002400240024002400240200228020c22032001280200280204410c6e2204200420034b1bad420c7e2205422088a70d002005a72204417f4c0d000240024020040d00410421060c010b200410322206450d020b2001200128020441016a2207360204200241003602182002200636021020022004410c6e360214200720012802084b0d022003450d044100210803402002200110b00320022802000d0620012802002207280204220920022802042204490d062004417f4c0d010240024020040d004101210a0c010b20041037220a450d032001280200220728020421090b0240024020092004490d00200a2007280200200410c90821092007280204220a20044f0d012004200a4194afc0001058000b2004450d072004450d07200a102c0c070b2007200a20046b3602042007200728020020046a3602002009450d062004ad22054220862005842105024020082002280214470d00200241106a2008410110ec0120022802182108200228021021060b20062008410c6c6a22042005370204200420093602002002200228021841016a22083602182003417f6a2203450d040c000b0b103b000b1039000b200041003602000c030b200128020421070b2000200229031037020020012007417f6a360204200041086a200241106a41086a2802003602000c020b20004100360200200228021021062008450d002008410c6c21012006210403400240200441046a280200450d002004280200102c0b2004410c6a2104200141746a22010d000b0b20064100200228021422041b2201450d002004410c6c450d002001102c0b200241206a24000bbb17030a7f077e0d7f230041b0066b22022400024002400240024002400240024002400240024002400240200128020422034104490d0020012802002204280000210520012003417c6a22063602042001200441046a220736020041002108200241003a008805024002400340200821092006450d01200241e8046a20096a20072d00003a000020012006417f6a22063602042001200741016a22073602002002200941016a22083a00880520084120470d000b200241b0056a41086a2206200241e8046a41086a290300370300200241b0056a41106a220a200241e8046a41106a290300370300200241b0056a41186a220b200241e8046a41186a290300370300200220022903e8043703b005200841ff0171411f4d0d01200241e8016a41086a2006290300370300200241e8016a41106a200a290300370300200241e8016a41186a200b290300370300200220022903b0053703e80141002106200241003a008805200420086a210a200820036b41046a2104200320096b417a6a21080340200420066a450d04200241e8046a20066a200720066a2d00003a0000200120083602042001200a20066a41056a3602002002200641016a22093a0088052008417f6a21082009210620094120470d000b200241b0056a41086a2204200241e8046a41086a290300370300200241b0056a41106a2203200241e8046a41106a290300370300200241b0056a41186a220b200241e8046a41186a290300370300200220022903e8043703b005200941ff0171411f4d0d04200720096a210620024188026a41086a200429030037030020024188026a41106a200329030037030020024188026a41186a200b290300370300200220022903b0053703880241002107200241003a008805200a20096a210403402008417f460d06200241e8046a20076a20062d00003a0000200120083602042001200420076a41056a3602002002200741016a22093a0088052008417f6a2108200641016a21062009210720094120470d000b200241b0056a41086a2207200241e8046a41086a290300370300200241b0056a41106a2204200241e8046a41106a290300370300200241b0056a41186a220a200241e8046a41186a290300370300200220022903e8043703b005200941ff0171411f4d0d06200241a8026a41086a2007290300370300200241a8026a41106a2004290300370300200241a8026a41186a200a290300370300200220022903b0053703a80241002107200241003a00880503402008417f460d08200241e8046a20076a20062d00003a0000200120083602042001200641016a22063602002002200741016a22093a0088052008417f6a21082009210720094120470d000b200241b0056a41086a2207200241e8046a41086a290300370300200241b0056a41106a2204200241e8046a41106a290300370300200241b0056a41186a220a200241e8046a41186a290300370300200220022903e8043703b005200941ff0171411f4d0d08200241c8026a41086a2007290300370300200241c8026a41106a2004290300370300200241c8026a41186a200a290300370300200220022903b0053703c80241002107200241003a00880503402008417f460d0a200241e8046a20076a20062d00003a0000200120083602042001200641016a22063602002002200741016a22093a0088052008417f6a21082009210720094120470d000b200241b0056a41086a2207200241e8046a41086a290300370300200241b0056a41106a2204200241e8046a41106a290300370300200241b0056a41186a220a200241e8046a41186a290300370300200220022903e8043703b005200941ff0171411f4d0d0a200241e8026a41086a2007290300370300200241e8026a41106a2004290300370300200241e8026a41186a200a290300370300200220022903b0053703e80241002107200241003a00a80503402008417f460d0c200241e8046a20076a20062d00003a0000200120083602042001200641016a22063602002002200741016a22093a00a8052008417f6a210820092107200941c000470d000b200241b0056a41086a2207200241e8046a41086a290300370300200241b0056a41106a2208200241e8046a41106a290300370300200241b0056a41186a2201200241e8046a41186a290300370300200241b0056a41206a2206200241e8046a41206a290300370300200241b0056a41286a2204200241e8046a41286a290300370300200241b0056a41306a220a200241e8046a41306a290300370300200241b0056a41386a2203200241e8046a41386a290300370300200220022903e8043703b005200941ff0171413f4d0d0c200241a8046a41386a22092003290300370300200241a8046a41306a200a290300220c370300200241a8046a41286a2004290300220d370300200241a8046a41206a2006290300220e370300200241a8046a41186a2001290300220f370300200241a8046a41106a20082903002210370300200241a8046a41086a20072903002211370300200220022903b00522123703a804200241086a41306a2207200c370300200241086a41286a2208200d370300200241086a41206a2201200e370300200241086a41186a2206200f370300200241086a41106a22042010370300200241086a41086a220a2011370300200241086a41386a2203200929030037030020022012370308200241c8016a41186a2209200241e8016a41186a290300370300200241c8016a41106a220b200241e8016a41106a290300370300200241c8016a41086a2213200241e8016a41086a290300370300200220022903e8013703c801200241a8016a41186a221420024188026a41186a290300370300200241a8016a41106a221520024188026a41106a290300370300200241a8016a41086a221620024188026a41086a29030037030020022002290388023703a80120024188016a41186a2217200241a8026a41186a29030037030020024188016a41106a2218200241a8026a41106a29030037030020024188016a41086a2219200241a8026a41086a290300370300200220022903a80237038801200241e8006a41186a221a200241c8026a41186a290300370300200241e8006a41106a221b200241c8026a41106a290300370300200241e8006a41086a221c200241c8026a41086a290300370300200220022903c802370368200241c8006a41186a221d200241e8026a41186a290300370300200241c8006a41106a221e200241e8026a41106a290300370300200241c8006a41086a221f200241e8026a41086a290300370300200220022903e80237034820002005360204200041086a20022903c801370200200041106a2013290300370200200041186a200b290300370200200041206a2009290300370200200041286a20022903a801370200200041306a2016290300370200200041386a2015290300370200200041c0006a2014290300370200200041c8006a200229038801370200200041d0006a2019290300370200200041d8006a2018290300370200200041e0006a201729030037020020004180016a201a290300370200200041f8006a201b290300370200200041f0006a201c290300370200200041e8006a2002290368370200200041a0016a201d29030037020020004198016a201e29030037020020004190016a201f29030037020020004188016a2002290348370200200041e0016a2003290300370200200041d8016a2007290300370200200041d0016a2008290300370200200041c8016a2001290300370200200041c0016a2006290300370200200041b8016a2004290300370200200041b0016a200a290300370200200041a8016a2002290308370200200041003602000c0d0b200941ff0171450d00200241003a0088050b200041013602000c0b0b200041013602000c0a0b200641ff0171450d00200241003a0088050b200041013602000c080b200741ff0171450d00200241003a0088050b200041013602000c060b200741ff0171450d00200241003a0088050b200041013602000c040b200741ff0171450d00200241003a0088050b200041013602000c020b200741ff0171450d00200241003a00a8050b200041013602000b200241b0066a24000bca0201047f20002802002102200120002802082203108f0102402003450d0020022003410c6c6a210303402002280200200241086a280200200110bb012002410c6a22022003470d000b0b200028020c21022001200041146a2802002203108f0102402003450d00200220034104746a2104200141086a2103034020022802002105200120032802004104102f200128020020032802006a20053600002003200328020041046a360200200241046a2802002002410c6a280200200110bb01200241106a22022004470d000b0b2001200041186a10b60520002802242000412c6a280200200110bb01200028023021032001200141086a22022802004104102f200128020020022802006a20033600002002200228020041046a220336020020002802342105200120034104102f200128020020022802006a20053600002002200228020041046a3602000b7a01027f0240200128020022020d002000200041086a22012802004101102f200028020020012802006a41003a00002001200128020041016a3602000f0b2000200041086a22032802004101102f200028020020032802006a41013a00002003200328020041016a3602002002200141086a280200200010bb010bd30201057f230041106b2202240020002802002000280208200110bb01200028020c21032001200141086a22042802004104102f200128020020042802006a20033600002004200428020041046a3602002001200041106a10b8050240412010322203450d002002422037020420022003360200200241004120102f20022802002205200228020822066a22032000290020370000200341086a200041286a290000370000200341106a200041306a290000370000200341186a200041386a2900003700002002200641206a2203360208200120042802002003102f200128020020042802006a2005200310c9081a2004200428020020036a220336020002402002280204450d002005102c200141086a28020021030b200028021c2100200120034104102f2001280200200141086a22012802006a20003600002001200128020041046a360200200241106a24000f0b1039000bc60201077f230041106b2202240020012802002103200020012802082201108f01024002402001450d002003200141246c6a2104200041086a2101034020032802002105200020012802004104102f200028020020012802006a20053600002001200128020041046a360200412010322205450d022002422037020420022005360200200241004120102f20022802002206200228020822076a2205200341046a290000370000200541086a2003410c6a290000370000200541106a200341146a290000370000200541186a2003411c6a2900003700002002200741206a2205360208200020012802002005102f200028020020012802006a2006200510c9081a2001200128020020056a36020020022802042205200820051b210802402005450d002008450d002006102c0b200341246a22032004470d000b0b200241106a24000f0b1039000ba90d02037f017e230041e0006b2202240002402001450d00200241d4006a41043602002002411c6a41023602002002420237020c20024194c7c3003602082002410436024c2002418cc7c3003602482002410036025c200241c4b5c8003602582002200241c8006a3602182002200241d8006a360250200241086a41a4c7c3001046000b200241c0006a41002902ecde47370300200241086a41306a220141002902e4de47370300200241306a41002902dcde47370300200241286a41002902d4de47370300200241206a41002902ccde47370300200241186a220341002902c4de47370300200241086a41086a41002902bcde47370300200241002902b4de473703082002410036025020024201370348200241c8006a200241086a108003200241c8006a2003108003200241c8006a20022802504104102f200228024820022802506a41003600002002200228025041046a2203360250200241c8006a20034104102f200228024820022802506a410a3600002002200228025041046a2203360250200241c8006a20034104102f200228024820022802506a41003600002002200228025041046a220336025020012802002101200241c8006a20034101102f200228024820022802506a41303a00002002200228025041016a2203360250200241c8006a20034108102f200228024820022802506a20012900003700002002200228025041086a220336025020012802082104200241c8006a20034104102f200228024820022802506a20043600002002200228025041046a2203360250200241c8006a20034108102f200228024820022802506a200129000c3700002002200228025041086a220336025020012802142104200241c8006a20034104102f200228024820022802506a20043600002002200228025041046a2203360250200241c8006a20034108102f200228024820022802506a20012900183700002002200228025041086a220336025020012802202104200241c8006a20034104102f200228024820022802506a20043600002002200228025041046a2203360250200241c8006a20034108102f200228024820022802506a20012900243700002002200228025041086a2203360250200128022c2104200241c8006a20034104102f200228024820022802506a20043600002002200228025041046a2203360250200241c8006a20034108102f200228024820022802506a20012900303700002002200228025041086a220336025020012802382104200241c8006a20034104102f200228024820022802506a20043600002002200228025041046a2203360250200241c8006a20034108102f200228024820022802506a200129003c3700002002200228025041086a220336025020012802442104200241c8006a20034104102f200228024820022802506a20043600002002200228025041046a2203360250200241c8006a20034108102f200228024820022802506a20012900483700002002200228025041086a220336025020012802502104200241c8006a20034104102f200228024820022802506a20043600002002200228025041046a2203360250200241c8006a20034108102f200228024820022802506a20012900543700002002200228025041086a2203360250200128025c2104200241c8006a20034104102f200228024820022802506a20043600002002200228025041046a2203360250200241c8006a20034108102f200228024820022802506a20012900603700002002200228025041086a220336025020012802682104200241c8006a20034104102f200228024820022802506a20043600002002200228025041046a2203360250200241c8006a20034108102f200228024820022802506a200129006c3700002002200228025041086a220336025020012802742104200241c8006a20034104102f200228024820022802506a20043600002002200228025041046a2203360250200241c8006a20034108102f200228024820022802506a20012900783700002002200228025041086a22033602502001280280012104200241c8006a20034104102f200228024820022802506a20043600002002200228025041046a2203360250200241c8006a20034108102f200228024820022802506a2001290084013700002002200228025041086a2203360250200128028c012101200241c8006a20034104102f200228024820022802506a20013600002002200228025041046a2201360250200241c8006a20014104102f200228024820022802506a41003600002002280250210120023502482105200241086a10ff02200241e0006a24002005200141046aad422086840bb61d03067f017e037f230041e00d6b220224002002428080808080203702f409200220013602c40d2002200041c4b5c80020011b3602c00d2002200241c00d6a3602f009200241106a200241f0096a10ab050240024002402002280214450d0020024188026a200241106a41f00010c9081a200241106a200241f0096a10bb0520022802100d0120024188026a410472102b0b20024188016a200241f8026a41f40010c9081a0c010b200241c8056a41086a2200200241106a41086a280200360200200220022903103703c8052002280288022103200228028c022101200241b0066a20024188026a41086a41e80010c9081a200241b0066a41f0006a2000280200360200200220022903c80537029807200241f8026a200241b0066a41f40010c9081a20024188016a200241f8026a41f40010c9081a2001450d00200220013602840a200220033602800a200241800a6a41086a20024188016a41f40010c90821000240024020022802f009280204450d00200241800a6a410472102b20022802f00a21040240200241f80a6a2802002201450d00200141c0036c210020044198016a210103402001108302200141c0036a2101200041c07c6a22000d000b0b41002101200241f40a6a2802002200450d01200041c0036c450d012004102c0c010b200241b0066a200041f40010c9081a0b2001450d00200241106a200241b0066a41f40010c9081a2002200136028c01200220033602880120024188016a41086a200241106a41f40010c9081a20024188016a10fe020240024002400240024002402002280288012201450d00200241f8026a41c1dcc700410610c501200241b0066a41fda3c600410910c50120022001417f6a3602f009200241c8056a200241f0096a410410c7012002418c0a6a200241f0096a41046a3602002002200241c8056a41086a3602840a2002200241f0096a3602880a2002200241c8056a3602800a20024188026a200241800a6a107e02400240200228029002220141206a2200417f4c0d000240024020000d00410121030c010b200010322203450d020b200241003602d005200220003602cc05200220033602c805200241c8056a4100411010c80120022802c80520022802d00522006a220320022900f802370000200341086a200241f8026a41086a2900003700002002200041106a22003602d005200241c8056a2000411010c80120022802c80520022802d00522006a220320022900b006370000200341086a200241b0066a41086a22042900003700002002200041106a22033602d0052002280288022100200241c8056a2003200110c80120022802c805220320022802d00522056a2000200110c9081a2002200520016a22013602d0050240200228028c02450d002000102c0b200241800a6a2003200110c9012004200241890a6a290000370300200241b0066a41106a200241910a6a290000370300200241b0066a41186a2201200241990a6a290000370300200220022900810a3703b0060240024020022d00800a4101460d00200241f8026a41186a420037030020024188036a420037030020024180036a4200370300200242003703f8020c010b200241f8026a41186a2001290300370300200241f8026a41106a200241b0066a41106a290300370300200241f8026a41086a200241b0066a41086a290300370300200220022903b0063703f8020b024020022802cc05450d002003102c0b200241f8026a20024198016a412010cc080d0220024180026a280200210120022802f80121002002410036028003200242043703f802200241f8026a4100200110ec01200228028003210302402001450d00200141c0036c210420022802f8022003410c6c6a21010340200220003602b006200241800a6a200241b0066a108102200141086a200241800a6a41086a280200360200200120022903800a370200200341016a21032001410c6a2101200041c0036a2100200441c07c6a22040d000b0b2002200336028003200241b8066a2003360200200220022903f8023703b006200241800a6a200241b0066a10bc050240200241d8016a2201200241800a6a412010cc08450d0041e7bdc800ad4280808080e0018410002001ad42808080808004841002200241800a6aad428080808080048410020b2001200241800a6a412010cc080d0310bd05200241fc016a280200210620022802f8012105200228028002210320024188026a20024188016a41f00010c9081a2005200341c0036c6a2100200228028802210720052101024002402003450d00200241b0066a41f0006a21042005210102400340200241c8056a200141e80010c9081a200141e8006a2903002108200241f8026a200141f0006a41d00210c9081a20084203510d01200241b0066a200241c8056a41e80010c9081a20022008370398072004200241f8026a41d00210c9081a2002200241b0066a3602f009200241800a6a200241f0096a10810220022802880a2103024020022802840a450d0020022802800a102c0b200241800a6a200241b0066a41c00310c9081a200241003602c00d200241f0096a200241800a6a2003200241c00d6a10880320022d00f0094101460d08200141c0036a22012000470d000c030b0b200141c0036a21010b20002001460d00034020014198016a1083022000200141c0036a2201470d000b0b02402006450d00200641c0036c450d002005102c0b10be05200710bf05024010c005450d00200241800a6a10c105200220024188026a410c6a28020022053602dc0d2002200241800a6a410c6a28020022013602d00d20052001470d082005450d0720022802840a2106200228028c0221074100210341d1cbc000ad4280808080c002842108034002400240200720036a22012d00002204200620036a22002d0000470d0002400240024002400240024020040e06000102030405000b20072006460d06200141016a200041016a412010cc080d050c060b024020072006460d00200141016a280000200041016a280000470d050b200141106a2802002209200041106a280200470d04200141086a280200220a200041086a280200220b460d05200a200b200910cc080d040c050b024020072006460d00200141016a280000200041016a280000470d040b200141106a2802002209200041106a280200470d03200141086a280200220a200041086a280200220b460d04200a200b200910cc080d030c040b024020072006460d00200141016a280000200041016a280000470d030b200141106a2802002209200041106a280200470d02200141086a280200220a200041086a280200220b460d03200a200b200910cc080d020c030b200141046a2802002209200041046a280200470d012009450d02200141086a280200200041086a280200470d012001410c6a2802002000410c6a280200470d010c020b2001410c6a28020022092000410c6a280200470d00200141046a280200220a200041046a280200220b460d01200a200b200910cc08450d010b20081000200241b0066a200110840220023502b80642208620022802b0062204ad841002024020022802b406450d002004102c0b200241b0066a200010840220023502b80642208620022802b0062204ad841002024020022802b406450d002004102c0b20012d000020002d00002204470d080b024002400240024002400240024020040e06000102030405000b20072006460d05200141016a200041016a412010cc080d0d0c050b024020072006460d00200141016a280000200041016a280000470d0d0b200141106a2802002204200041106a280200470d0c200141086a2802002201200041086a2802002200460d0420012000200410cc080d0c0c040b024020072006460d00200141016a280000200041016a280000470d0c0b200141106a2802002204200041106a280200470d0b200141086a2802002201200041086a2802002200460d0320012000200410cc080d0b0c030b024020072006460d00200141016a280000200041016a280000470d0b0b200141106a2802002204200041106a280200470d0a200141086a2802002201200041086a2802002200460d0220012000200410cc080d0a0c020b200141046a2802002204200041046a280200470d092004450d01200141086a280200200041086a280200470d092001410c6a2802002000410c6a280200460d010c090b2001410c6a28020022042000410c6a280200470d08200141046a2802002201200041046a2802002200460d0020012000200410cc080d080b200341246a21032005417f6a22050d000c080b0b41f0f1c000411e4190f2c000103c000b103b000b1039000b41f8efc000411c4194f0c000103c000b41a4f0c000412441c8f0c000103c000b200241086a20022f00f10920022d00f30941107472108e0320022903082108200241940a6a4101360200200242013702840a200241b4b5c8003602800a200241043602d40d200220083703c00d2002200241d00d6a3602900a2002200241c00d6a3602d00d200241800a6a41d8f0c0001046000b4180f1c000412741a8f1c000103c000b024020024188026a41306a2201200241800a6a41306a2200412010cc08450d0041e7bdc800ad4280808080e0018410002001ad428080808080048410022000ad428080808080048410020b024020012000412010cc08450d0041b8f1c000412841e0f1c000103c000b200241800a6a410472102b20024188026a410472102b200241e00d6a240042010f0b200241f8026a41146a4109360200200241f8026a410c6a411c360200200241c8056a41146a41033602002002200241dc0d6a3602c00d2002200241d00d6a3602f009200241b0066a41146a4100360200200242033702cc05200241c0bbc4003602c8052002411c3602fc02200241c4b5c8003602c006200242013702b406200241e8f0c0003602b0062002200241f8026a3602d8052002200241b0066a360288032002200241f0096a360280032002200241c00d6a3602f802200241c8056a41f0f0c0001046000b20024184036a4104360200200241940a6a4102360200200242023702840a20024194c7c3003602800a200241043602fc0220024198c8c3003602f8022002410036028c01200241c4b5c800360288012002200241f8026a3602900a200220024188016a36028003200241800a6a41a4c7c3001046000bca0403037f017e027f230041d00a6b22022400200241086a200110b003024002402002280208450d00200041003602000c010b02400240200228020c2203200128020028020441c0036e2204200420034b1bad42c0037e2205422088a70d002005a72204417f4c0d000240024020040d00410821060c010b200410322206450d020b2001200128020441016a220736020420024100360218200220063602102002200441c0036e360214024002400240200720012802084b0d0002402003450d0020024190076a41f0006a210741002104034020024190076a200110af03200241a8066a20024190076a41e80010c9081a20022903f8072105200241d8036a200741d00210c9081a20054203510d03200241f0026a200241a8066a41e80010c9081a200241206a200241d8036a41d00210c9081a024020042002280214470d00200241106a200410980520022802182104200228021021060b2006200441c0036c6a200241f0026a41e80010c90822042005370368200441f0006a200241206a41d00210c9081a2002200228021841016a22043602182003417f6a22030d000b200128020421070b2000200229031037020020012007417f6a360204200041086a200241106a41086a2802003602000c050b200041003602000c010b20004100360200200228021021062004450d00200441c0036c210120064198016a210403402004108302200441c0036a2104200141c07c6a22010d000b0b20064100200228021422041b2201450d02200441c0036c450d022001102c0c020b103b000b1039000b200241d00a6a24000bd50301097f230041206b220224000240024020012802082203410c6c41046a2204417f4c0d00200128020021050240024020040d00410121060c010b200410322206450d020b2002410036020820022004360204200220063602002003200210770240024020030d0020022802002107200228020821060c010b20052003410c6c6a210820052104034020042802002109200441086a280200220620021077200220022802082006102f200228020022072002280208220a6a2009200610c9081a2002200a20066a22063602082004410c6a22042008470d000b0b20022802042109200241186a220a2006ad4220862007ad841006220441186a290000370300200241106a2206200441106a290000370300200241086a2208200441086a290000370300200220042900003703002004102c200041186a200a290300370000200041106a2006290300370000200041086a20082903003700002000200229030037000002402009450d002007102c0b02402003450d002003410c6c21062005210403400240200441046a280200450d002004280200102c0b2004410c6a2104200641746a22060d000b0b0240200141046a2802002204450d002004410c6c450d002005102c0b200241206a24000f0b103b000b1039000b0400100f0bcf0201077f230041c0006b22002400200041086a4186a4c600411010c601200028020c21010240200028020822024101470d004186a4c600411010b4010b200041286a22034200370300200041106a41106a22044200370300200041106a41086a2205420037030020004200370310200041306a41c1dcc700410610c5012005200041306a41086a220629000037030020002000290030370310200041306a419cccc600410e10c501200320062900003703002004200029003037030020002001410020021b360230200041106a4120200041306a410410a70220034200370300200442003703002005420037030020004200370310200041306a41c1dcc700410610c5012005200629000037030020002000290030370310200041306a41b0d1c600410e10c5012003200629000037030020042000290030370300200041106a41012000108703200041c0006a24000be20c04087f017e077f037e230041a0026b2201240020014180026a41186a2202420037030020014180026a41106a2203420037030020014180026a41086a22044200370300200142003703800220014180026a41ac95c400410d10c501200141d0006a41c695c400410c10c5012002200141d0006a41086a220529000037030020032001290050370300200141d0006a20014180026a10f5022001280290012103200128029401210620012802a8012107200141d0006a41186a22024200370300200141d0006a41106a22084200370300200542003703002001420037035020014180026a41bee8c700410d10c50120052004290000370300200120012900800237035020014180026a41b4edc700410f10c50120022004290000370300200820012900800237030020014180026a200141d0006a10f5042001280280022104200520014180026a410c6a28020036020020012001290284023703500240024020040d0020014200370308200142043703000c010b2001410c6a200528020036020020012004360200200120012903503702040b42002109200141e8006a4200370300200141e0006a4200370300200141d0006a41086a220542003703002001420037035020014180026a41bee8c700410d10c501200520014180026a41086a2204290000370300200120012900800237035020014180026a41fcefc700410910c501200841086a2004290000370000200820012900800237000020014180026a200141d0006a10f90402400240200128028002220a0d004104210a0c010b200141d0006a412010b40120012902840221090b2009a7210b02402009422088a72205450d0041002006200741024622041b210c4100200320041b210d200541346c2103200a412c6a2105200141d0006a410472210e0340200541586a280200210f2005415c6a2d00002102200141d0006a41186a22062005415d6a220441186a290000370300200141d0006a41106a2207200441106a290000370300200141d0006a41086a2210200441086a2900003703002001200429000037035020024102460d0120052802002104200141106a41186a20062903002209370300200141106a41106a20072903002211370300200141106a41086a20102903002212370300200120012903502213370310200141306a41186a22062009370300200141306a41106a22072011370300200141306a41086a221020123703002001201337033002402002410171450d0020014180026a41186a2202200629030037030020014180026a41106a2206200729030037030020014180026a41086a220720102903003703002001200129033037038002200441016a2204200c4b0d00200e200129038002370200200e41086a2007290300370200200e41106a2006290300370200200e41186a20022903003702002001200f360250200120043602742001200141d0006a200d109d010b200541346a21052003414c6a22030d000b0b0240200b450d00200b41346c450d00200a102c0b200141306a41086a200141086a290300370300200120012903002209370330024002402009a722050d00200141e8006a4200370300200141e0006a4200370300200141d0006a41086a220542003703002001420037035020014180026a41bee8c700410d10c501200520014180026a41086a2204290000370300200120012900800237035020014180026a41b4edc700410f10c501200841086a20042900003700002008200129008002370000200141d0006a412010b4010c010b200141e8006a4200370300200141e0006a4200370300200141d0006a41086a220442003703002001420037035020014180026a41bee8c700410d10c501200420014180026a41086a2202290000370300200120012900800237035020014180026a41b4edc700410f10c501200841086a20022900003700002008200129008002370000200141d0006a200141306a108e0520012802342204450d002004412c6c450d002005102c0b200141e8006a22054200370300200141e0006a22044200370300200141d0006a41086a420037030020014200370350200141d0006a41f6ddc700410b10c50120014180026a41b0f0c600410e10c501200520014180026a41086a290000370300200420012900800237030020014180026a200141d0006a412010b30102402001280280022205450d000240200128028402450d002005102c0b200141d0006a412010b4010b2000109806200141a0026a24000b070010094101460be523020a7f017e230041c0026b2201240020014190016a41186a2202420037030020014190016a41106a2203420037030020014190016a41086a220442003703002001420037039001200141d0016a41c1dcc700410610c5012004200141d0016a41086a2205290000370300200120012900d00137039001200141d0016a41b0d1c600410e10c50120022005290000370300200320012900d00137030020014190016a412010b4012002420037030020034200370300200442003703002001420037039001200141d0016a41c1dcc700410610c50120042005290000370300200120012900d00137039001200141d0016a419cccc600410e10c50120022005290000370300200320012900d00137030020014190016a412010b4012002420037030020034200370300200442003703002001420037039001200141d0016a41c1dcc700410610c50120042005290000370300200120012900d00137039001200141d0016a41f8ccc600411010c50120022005290000370300200320012900d00137030020014190016a412010b4012002420037030020034200370300200442003703002001420037039001200141d0016a41c1dcc700410610c50120042005290000370300200120012900d00137039001200141d0016a4196a4c600410610c50120022005290000370300200320012900d001370300200141086a20014190016a412010c601200128020c210620012802082107200141f8016a41186a22084200370300200141f8016a41106a22094200370300200141f8016a41086a220a4200370300200142003703f801200141d0016a41c1dcc700410610c501200a2005290000370300200120012900d0013703f801200141d0016a41a2a4c600410a10c50120082005290000370300200920012900d001370300200141d0016a200141f8016a412010c90120012d00d00121052002200141e9016a2900003703002003200141e1016a2900003703002004200141d9016a290000370300200120012900d101370390010240024020054101460d00200141106a41186a4200370300200141106a41106a4200370300200141106a41086a4200370300200142003703100c010b200141106a41186a2002290300370300200141106a41106a2003290300370300200141106a41086a200429030037030020012001290390013703100b2006410020071b2103200141306a108907200141f8016a41186a4200370300200141f8016a41106a4200370300200141f8016a41086a22054200370300200142003703f801200141d0016a41c1dcc700410610c5012005200141d0016a41086a2202290000370300200120012900d0013703f801200141d0016a41aca4c600410e10c501200941086a2002290000370000200920012900d001370000200141d0016a200141f8016a412010c901024002400240024020012d00d00122050d0020014190016a41186a200141e9016a29000037030020014190016a41106a200141e1016a29000037030020014190016a41086a200141d9016a290000370300200120012900d101370390010c010b200141f8016a412010b40120014190016a41186a200141e9016a29000037030020014190016a41106a200141e1016a29000037030020014190016a41086a200141d9016a290000370300200120012900d1013703900120054101460d010b200141d8006a4200370300200141d0006a4200370300200141c8006a4200370300200142003703400c010b200141c0006a41186a20014190016a41186a290300370300200141c0006a41106a20014190016a41106a290300370300200141c0006a41086a20014190016a41086a29030037030020012001290390013703400b024002400240024002400240024002400240024002400240200341e112490d002003419f6d6a2205450d0020014190016a41c1dcc700410610c501200141f8016a41fda3c600410910c501200120053602bc0220014180016a200141bc026a410410c701200141dc016a200141bc026a41046a360200200120014188016a3602d4012001200141bc026a3602d801200120014180016a3602d001200141e0006a200141d0016a107e2001280268220541206a2202417f4c0d010240024020020d00410121040c010b200210322204450d050b200141003602d801200120023602d401200120043602d001200141d0016a4100411010c80120012802d00120012802d80122026a2204200129009001370000200441086a20014190016a41086a2900003700002001200241106a22023602d801200141d0016a2002411010c80120012802d00120012802d80122026a220420012900f801370000200441086a200141f8016a41086a2900003700002001200241106a22043602d80120012802602102200141d0016a2004200510c80120012802d001220420012802d80122096a2002200510c9081a2001200920056a22053602d80102402001280264450d002002102c0b2004200510b40120012802d401450d002004102c0b20014190016a10f90720012802980121022001280290012105200141003a00f0012002450d0a200120052d00003a00d001200141013a00f00120024101460d09200120052d00013a00d101200141023a00f00120024102460d09200120052d00023a00d201200141033a00f00120024103460d09200120052d00033a00d301200141043a00f00120024104460d09200120052d00043a00d401200141053a00f00120024105460d09200120052d00053a00d501200141063a00f00120024106460d09200120052d00063a00d601200141073a00f00120024107460d09200120052d00073a00d701200141083a00f00120024108460d09200120052d00083a00d801200141093a00f00120024109460d09200120052d00093a00d9012001410a3a00f0012002410a460d09200120052d000a3a00da012001410b3a00f0012002410b460d09200120052d000b3a00db012001410c3a00f0012002410c460d09200120052d000c3a00dc012001410d3a00f0012002410d460d09200120052d000d3a00dd012001410e3a00f0012002410e460d09200120052d000e3a00de012001410f3a00f0012002410f460d09200120052d000f3a00df01200141103a00f00120024110460d09200120052d00103a00e001200141113a00f00120024111460d09200120052d00113a00e101200141123a00f00120024112460d09200120052d00123a00e201200141133a00f00120024113460d09200120052d00133a00e301200141143a00f00120024114460d09200120052d00143a00e401200141153a00f00120024115460d09200120052d00153a00e501200141163a00f00120024116460d09200120052d00163a00e601200141173a00f00120024117460d09200120052d00173a00e701200141183a00f00120024118460d09200120052d00183a00e801200141193a00f00120024119460d09200120052d00193a00e9012001411a3a00f0012002411a460d09200120052d001a3a00ea012001411b3a00f0012002411b460d09200120052d001b3a00eb012001411c3a00f0012002411c460d09200120052d001c3a00ec012001411d3a00f0012002411d460d09200120052d001d3a00ed012001411e3a00f0012002411e460d09200120052d001e3a00ee012001411f3a00f0012002411f460d09200141e0006a41106a200141d0016a41106a290300370300200141e0006a41086a200141d0016a41086a290300370300200120052d001f3a00ef01200141e0006a41186a200141d0016a41186a290300370300200141203a00f001200120012903d001220b3703f8012001200b3703602001280294010d010c020b103b000b2005102c0b2001410036028002200142013703f801412010322205450d00200142203702d401200120053602d001200141d0016a41004120102f20012802d001220220012802d80122046a22052001290310370000200541086a200141106a41086a290300370000200541106a200141106a41106a290300370000200541186a200141106a41186a2903003700002001200441206a22053602d801200141f8016a41002005102f20012802f801220420012802800222096a2002200510c9081a2001200920056a220536028002024020012802d401450d002002102c0b20014180016a2004200510fa07024020012802fc01450d002004102c0b2001280280012205450d0320014188016a28020021022001280284012108200141003a00f0012002450d05200120052d00003a00d001200141013a00f00120024101460d04200120052d00013a00d101200141023a00f00120024102460d04200120052d00023a00d201200141033a00f00120024103460d04200120052d00033a00d301200141043a00f00120024104460d04200120052d00043a00d401200141053a00f00120024105460d04200120052d00053a00d501200141063a00f00120024106460d04200120052d00063a00d601200141073a00f00120024107460d04200120052d00073a00d701200141083a00f00120024108460d04200120052d00083a00d801200141093a00f00120024109460d04200120052d00093a00d9012001410a3a00f0012002410a460d04200120052d000a3a00da012001410b3a00f0012002410b460d04200120052d000b3a00db012001410c3a00f0012002410c460d04200120052d000c3a00dc012001410d3a00f0012002410d460d04200120052d000d3a00dd012001410e3a00f0012002410e460d04200120052d000e3a00de012001410f3a00f0012002410f460d04200120052d000f3a00df01200141103a00f00120024110460d04200120052d00103a00e001200141113a00f00120024111460d04200120052d00113a00e101200141123a00f00120024112460d04200120052d00123a00e201200141133a00f00120024113460d04200120052d00133a00e301200141143a00f00120024114460d04200120052d00143a00e401200141153a00f00120024115460d04200120052d00153a00e501200141163a00f00120024116460d04200120052d00163a00e601200141173a00f00120024117460d04200120052d00173a00e701200141183a00f00120024118460d04200120052d00183a00e801200141193a00f00120024119460d04200120052d00193a00e9012001411a3a00f0012002411a460d04200120052d001a3a00ea012001411b3a00f0012002411b460d04200120052d001b3a00eb012001411c3a00f0012002411c460d04200120052d001c3a00ec012001411d3a00f0012002411d460d04200120052d001d3a00ed012001411e3a00f0012002411e460d04200120052d001e3a00ee012001411f3a00f0012002411f460d0420014190016a41106a2202200141d0016a41106a220929030037030020014190016a41086a2204200141d0016a41086a2206290300370300200120052d001f3a00ef0120014190016a41186a220a200141d0016a41186a2207290300370300200141203a00f001200120012903d001220b3703f8012001200b3703900120062004290300370300200920022903003703002007200a29030037030020012001290390013703d001200141f8016a41026a220a200141bc026a41026a2d00003a0000200120012f00bc023b01f801200128023822042001280234460d010c020b1039000b200141306a2004410110f201200128023821040b2001280230200441246c6a220241003a0000200220012903d001370001200220012f01f8013b0021200241096a2006290300370000200241116a2009290300370000200241196a2007290300370000200241236a200a2d00003a00002001200441016a3602382008450d002005102c0b200020012903103700102000200336020020002001290360370030200041286a200141106a41186a290300370000200041206a200141106a41106a290300370000200041186a200141106a41086a290300370000200041386a200141e0006a41086a290300370000200041c0006a200141e0006a41106a290300370000200041c8006a200141e0006a41186a290300370000200041e8006a200141c0006a41186a290300370000200041e0006a200141c0006a41106a290300370000200041d8006a200141c0006a41086a290300370000200020012903403700502000410c6a200141306a41086a28020036020020002001290330370204200141c0026a24000f0b200141003a00f0010b41e4e0c600412c200141d0016a4190e1c60041b0e1c6001040000b200141003a00f0010b41e4e0c600412c200141d0016a4190e1c60041a0e1c6001040000bf90201027f230041e0026b22022400200242808080808020370204200220013602142002200041c4b5c80020011b3602102002200241106a360200200241f0016a200210ab0520022802f401210120022802f001210020024188016a200241f0016a41086a41e80010c9081a024002402001450d002002200136021c20022000360218200241186a41086a20024188016a41e80010c9082103024002402002280200280204450d00200241186a410472102b410021010c010b20024188016a200341e80010c9081a0b20010d010b200241246a410436020020024184026a4102360200200242023702f40120024194c7c3003602f0012002410436021c200241b0c8c30036021820024100360204200241c4b5c8003602002002200241186a3602800220022002360220200241f0016a41a4c7c3001046000b200220013602f401200220003602f001200241f8016a20024188016a41e80010c9081a200241f0016a10fe02200241f0016a410472102b200241e0026a240042010b9d0c03067f017e047f230041306b2202240002400240024020010d002002410036022020024204370318410810322201450d0220014110360204200141b0cfc4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a200210c405410810322201450d022001410e360204200141b4a1c7003602002002200141086a36020c200220013602082002410136020420022001360200200241186a200210c405410810322201450d022001410c360204200141e5cbc0003602002002200141086a36020c200220013602082002410136020420022001360200200241186a200210c405410810322201450d022001410e3602042001418dbcc3003602002002200141086a36020c200220013602082002410136020420022001360200200241186a200210c405410810322201450d022001410a360204200141fcedc6003602002002200141086a36020c200220013602082002410136020420022001360200200241186a200210c405410810322201450d022001410b360204200141b5dec4003602002002200141086a36020c200220013602082002410136020420022001360200200241186a200210c405410810322201450d0220014118360204200141c4e2c7003602002002200141086a36020c200220013602082002410136020420022001360200200241186a200210c40520022802182103200228021c210402400240200228022022010d004100210541042106410021070c010b20014104200141044b1bad420c7e2208422088a722070d022008a722094100480d02200920074541027420091032220a1b21070240200a0d002007450d030c040b200320014103746a210b2007410c6e2105200141037441786a41037641016a210c41002107200a2009200a1b220621012003210903402009280200220a450d01200141086a200941046a280200360200200141046a200a360200200141003602002001410c6a2101200741016a2107200941086a2209200b470d000b200c21070b0240200441ffffffff0171450d002003102c0b2002410036020820024201370300200241004104102f2002280200200228020822016a41edcad18b063600002002200141046a2201360208200220014101102f2002280200200228020822016a410c3a00002002200141016a36020841b8d7c000411c20021076200220022802084101102f2002280200200228020822016a41043a00002002200141016a3602082007200210770240024020070d0020022802082109200228020021030c010b2007410c6c2107200641086a210103402001417c6a280200210a2001280200220920021077200220022802082009102f200228020022032002280208220b6a200a200910c9081a2002200b20096a22093602082001410c6a2101200741746a22070d000b0b2002280204210702402005450d002005410c6c450d002006102c0b200941046a2201417f4c0d0102400240024002400240024020010d002002410036020820022001360204200241013602000c010b20011032220a450d0720024100360208200220013602042002200a360200200941c000490d01200941808001490d022009418080808004490d030b200241004101102f2002280200200228020822016a41033a00002002200141016a2201360208200220014104102f2002280200200228020822016a2009360000200141046a21010c030b200241004101102f2002280200200228020822016a20094102743a0000200141016a21010c020b200241004102102f2002280200200228020822016a20094102744101723b0000200141026a21010c010b200241004104102f2002280200200228020822016a2009410274410272360000200141046a21010b20022001360208200220012009102f200228020022012002280208220a6a2003200910c9081a02402003410020071b220b450d002007450d00200b102c0b200241306a2400200a20096aad4220862001ad840f0b200241246a4104360200200241146a41023602002002420237020420024194c7c3003602002002410436021c200241c8c8c3003602182002410036022c200241c4b5c8003602282002200241186a3602102002200241286a360220200241a4c7c3001046000b103b000b1039000beb0201077f02400240200041046a2802002202200041086a28020022036b2001410c6a280200200141086a28020022046b22054103752206490d00200028020021020c010b0240200320066a22072003490d00200241017422032007200320074b1b22034104200341044b1b220341ffffffff017122082003470d00200341037422074100480d00200820034641027421080240024002400240024002402000280200410020021b22030d002007450d010c030b200241037422020d0120070d020b200821020c020b200320022007103522020d010c020b200710322202450d010b20002002360200200041046a2007410376360200200041086a28020021030c020b2008450d001039000b103b000b200220034103746a2004200510c9081a200141086a2001410c6a280200360200200041086a2200200028020020066a3602000240200141046a2802002200450d0020012802002201450d00200041ffffffff0171450d002001102c0b0b880903017f017e017f230041c00b6b22022400200242808080808020370204200220013602b40b2002200041c4b5c80020011b3602b00b2002200241b00b6a360200200241f0076a200210af03200241b8036a200241f0076a41e80010c9081a20022903d8082103200241e8006a200241f0076a41f0006a41d00210c9081a0240024020034203510d00200241a0046a200241b8036a41e80010c9081a2002200337038805200241a0046a41f0006a200241e8006a41d00210c9082101024002402002280200280204450d00200241b8056a108302420321030c010b200241b8036a200241a0046a41e80010c9081a200241f0076a200141d00210c9081a0b20034203510d002002200241b8036a41e80010c908220241e8006a200241f0076a41d00210c9081a200241a0046a200241e80010c9081a200220033703880520024190056a200241e8006a41d00210c9081a2002200241a0046a3602f007200241e0076a200241f0076a10810220022802e8072101200241f0076a200241a0046a41c00310c9081a200241b80b6a20022802e807360200200220022903e0073703b00b200241b8036a200241f0076a2001200241b00b6a1088034101410220022d00b80322014101461b220010322204450d01200241003602f807200220003602f407200220043602f0070240024020014101470d00200241f0076a41004101102f20022802f00720022802f8076a41013a0000200220022802f80741016a3602f807200241b8036a410172200241f0076a108d0320022802f80721010c010b200241f0076a41004101102f20022802f00720022802f8076a41003a0000200220022802f80741016a22003602f80720022d00bc032101200241f0076a20004101102f20022802f00720022802f8076a21000240024020014104460d00200041013a0000200220022802f80741016a22003602f807024002400240024020010e0400010203000b200241f0076a20004101102f20022802f00720022802f8076a41003a000020022802f80741016a21010c040b200241f0076a20004101102f20022802f00720022802f8076a41013a000020022802f80741016a21010c030b200241f0076a20004101102f20022802f00720022802f80722016a41023a0000200141016a21010c020b200241f0076a20004101102f20022802f00720022802f8076a41033a0000200220022802f80741016a22013602f80720022d00bd032100200241f0076a20014101102f20022802f00720022802f8076a20003a0000200220022802f80741016a22013602f80720022d00be032100200241f0076a20014101102f20022802f00720022802f8076a20003a000020022802f80741016a21010c010b200041003a000020022802f80741016a21010b200220013602f8070b20023502f0072103200241c00b6a240020032001ad422086840f0b200241f4006a4104360200200241b4046a4102360200200242023702a40420024194c7c3003602a0042002410436026c200241d8c8c30036026820024100360204200241c4b5c8003602002002200241e8006a3602b00420022002360270200241a0046a41a4c7c3001046000b1039000bcf11020f7f027e230041f0016b2202240002400240024020010d0010be0520024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200241d0016a41c1dcc700410610c5012005200241d0016a41086a2206290000370300200220022900d00137038001200241b0016a4196a4c600410610c5012003200241b0016a41086a2207290000370300200420022900b001370300200241086a20024180016a412010c601200228020c410020022802081b10bf052003420037030020044200370300200542003703002002420037038001200241d0016a41c1dcc700410610c50120052006290000370300200220022900d00137038001200241d0016a419cccc600410e10c50120032006290000370300200420022900d001370300200220024180016a412010c601200241003602a801200242043703a001200241a0016a41002002280204410020022802001b220810ec0120022802a801210102402008450d00200120086a210920022802a0012001410c6c6a2101200241ec016a41046a210a200241e0016a41086a210b4100210c0340200241d0016a41c1dcc700410610c501200241b0016a41c0cdc600410d10c5012002200c3602ec01200241e0016a200241ec016a410410c7012002200a36021c2002200b3602142002200241ec016a3602182002200241e0016a36021020024180016a200241106a107e200228028801220d41206a220e417f4c0d0302400240200e0d004101210f0c010b200e1032220f450d050b200241003602e8012002200e3602e4012002200f3602e001200241e0016a4100411010c80120022802e00120022802e801220e6a220f20022900d001370000200f41086a20062900003700002002200e41106a220e3602e801200241e0016a200e411010c80120022802e00120022802e801220e6a220f20022900b001370000200f41086a20072900003700002002200e41106a220e3602e801200228028001210f200241e0016a200e200d10c80120022802e001220e20022802e80122106a200f200d10c9081a20022010200d6a220d3602e8010240200228028401450d00200f102c0b200241106a200e200d10f604024002402002280210220f0d00420021114101210f0c010b200e200d10b401200229021421110b200c41016a210c024020022802e401450d00200e102c0b2001200f360200200141046a20113702002001410c6a21012008200c470d000b200921010b200220013602a801200241106a41086a220c2001360200200220022903a001370310200241b0016a200241106a10bc05200241106a41186a200241b0016a41186a290300370300200241106a41106a200241b0016a41106a290300370300200c2007290300370300200220022903b0013703102003420037030020044200370300200542003703002002420037038001200241d0016a41c1dcc700410610c50120052006290000370300200220022900d00137038001200241d0016a41aca4c600410e10c501200441086a2006290000370000200420022900d00137000020024180016a4120200241106a10c902200241106a10c10520024100360288012002420137038001412010322201450d02200242203702b401200220013602b001200241b0016a41004120102f20022802b001220c20022802b801220d6a22012002290320370000200141086a200241106a41186a290300370000200141106a200241106a41206a290300370000200141186a200241386a2903003700002002200d41206a22013602b80120024180016a2002280288012001102f2002280280012002280288016a200c200110c9081a200220022802880120016a220d36028801024020022802b401450d00200c102c0b02400240024002402002280210220141c000490d00200141808001490d012001418080808004490d0220024180016a2002280288014101102f2002280280012002280288016a41033a0000200220022802880141016a220c3602880120024180016a200c4104102f2002280280012002280288016a2001360000200220022802880141046a360288010c030b20024180016a2002280288014101102f2002280280012002280288016a20014102743a0000200220022802880141016a360288010c020b20024180016a200d4102102f200228028001200228028801220c6a20014102744101723b00002002200c41026a360288010c010b20024180016a2002280288014104102f200228028001200228028801220c6a20014102744102723600002002200c41046a360288010b412010322201450d02200242203702b401200220013602b001200241b0016a41004120102f20022802b001220c20022802b801220d6a22012002290340370000200141086a200241c8006a290300370000200141106a200241d0006a290300370000200141186a200241d8006a2903003700002002200d41206a22013602b80120024180016a2002280288012001102f2002280280012002280288016a200c200110c9081a200220022802880120016a36028801024020022802b401450d00200c102c0b412010322201450d02200242203702b401200220013602b001200241b0016a41004120102f20022802b001220c20022802b801220d6a22012002290360370000200141086a200241e8006a290300370000200141106a200241f0006a290300370000200141186a200241f8006a2903003700002002200d41206a22013602b80120024180016a2002280288012001102f2002280280012002280288016a200c200110c9081a200220022802880120016a36028801024020022802b401450d00200c102c0b20024180016a200241106a410472220110aa05200235028001211120023502880121122001102b200241f0016a240020112012422086840f0b200241bc016a4104360200200241246a41023602002002420237021420024194c7c300360210200241043602b401200241f0c8c3003602b0012002410036028401200241c4b5c800360280012002200241b0016a360220200220024180016a3602b801200241106a41a4c7c3001046000b103b000b1039000bca2709017f017e037f017e077f017e017f057e247f230041d0076b220224002002428080808080203702a407200220013602d4042002200041c4b5c80020011b3602d0042002200241d0046a3602a007200241d0006a200241a0076a10c8050240024020022802504101460d00200220022902543703e0022002200241dc006a2802003602e80220022802a007280204450d01200241e0026a10bb040b200241ec026a4104360200200241e4006a41023602002002420237025420024194c7c300360250200241043602e40220024188c9c3003602e002200241003602a407200241c4b5c8003602a0072002200241e0026a3602602002200241a0076a3602e802200241d0006a41a4c7c3001046000b200241206a41086a200241e0026a41086a22002802002201360200200220022903e0022203370320200241c0006a41086a200136020020024208370310410021042002410036021820022003370340200241d0006a200241c0006a109701024020022802504101460d00200241d0006a41086a22012903002103200241c8036a41186a22004200370300200241c8036a41106a22054200370300200241c8036a41086a22064200370300200242003703c803200241d0006a41cbdcc700410910c50120062001290000370300200220022900503703c803200241d0006a41f8d7c300410310c50120002001290000370300200520022900503703002002200241c8036a10cf022002280200210020022903082107200241106a4100109805200228021022082002280218220541c0036c6a200241e0026a41e80010c90822014202370368200141a0016a2003200742b8177c42b81720001b220720032007561b3703002001410236029801200120022903a007370370200141f8006a200241a0076a41086a29030037030020014180016a200241a0076a41106a29030037030020014188016a200241a0076a41186a29030037030020014190016a200241c0076a290300370300200141b4016a200241d0006a418c0210c9081a2002200541016a2209360218024002402002280240220a0d000c010b2002280244210b0340200a410c6a2105200a418c016a2100200a2f018a01210c41002101024002400340200c2001460d0141e7dfc3002000410810cc082206450d02200041086a21002005410c6a2105200141016a21012006417f4a0d000b2001417f6a210c0b0240200b0d00410021040c030b200b417f6a210b200a200c4102746a41e4016a280200210a0c010b0b200541786a28020021012002200528020036028c042002200136028804200241e0026a20024188046a10c9050240024020022802e0022204450d00200241e0026a41086a280200210d20022802e402210e200241d0006a20024188046a10ca0520022802500d010240200d450d002004200d41d0006c6a2100200421010340200141046a410036020020012802002105200141013602000240200141086a280200450d002005102c0b200141d0006a22012000470d000b0b200e450d00200e41d0006c450d002004102c0b20024129360254200241ccb1c80036025041efdfc3004128200241d0006a4198e0c30041a8e0c3001040000b200241d0046a41086a200241d0006a41086a280200360200200220022903503703d0040b200241e8036a41086a2201200241d0046a41086a280200360200200220022903d0043703e8030240024002402004450d00200241f8036a41086a2001280200360200200220022903e8033703f80320024180043b015020024188046a200241d0006a10c702200dad220f42d0007e2203422088a70d012003a72201417f4c0d010240024020010d00410421000c010b200110322200450d030b200241003602b804200220003602b0042002200141d0006e3602b404200241b0046a4100200d41d0006c220141d0006e109705200420016a211020022802b804210502402001450d0020022802b004200541d0006c6a2106200241d0006a41106a2100200421010340200241d0006a200110cb052001410c6a280200210c200141106a2900002103200141c8006a2900002107200141c0006a2900002111200141386a2900002112200141306a2900002113200141286a2900002114200141206a2900002115200241e0026a41086a220a200141186a290000370300200241e0026a41106a220b2015370300200241e0026a41186a22162014370300200241e0026a41206a22172013370300200241e0026a41286a22182012370300200241e0026a41306a22192011370300200241e0026a41386a221a200737030020002003370000200041086a200a290300370000200041106a200b290300370000200041186a2016290300370000200041206a2017290300370000200041286a2018290300370000200041306a2019290300370000200041386a201a2903003700002002200c36025c200541016a21052006200241d0006a41d00010c90841d0006a2106200141d0006a22012010470d000b0b200220053602b804200228028004221bad42b4027e2203422088a70d012003a72201417f4c0d0120022802f803211c0240024020010d00410421000c010b200110322200450d030b200241003602c804200220003602c0042002200141b4026e3602c404200241c0046a4100201b109b0520022802c80421170240201b450d00201c201b41b4026c6a211d20022802c004201741b4026c6a2101200241a0076a41246a2118200241a0076a41186a2106200241a0076a410c6a2119200241d0006a41206a211a200241d0006a41286a211e200241d0006a41386a211f200241d0006a41306a2120201c2100034020002802002121200241c8036a41186a22222000411c6a290000370300200241c8036a41106a2223200041146a290000370300200241c8036a41086a22242000410c6a2900003703002002200041046a2900003703c80320024180076a41186a22252000413c6a29020037030020024180076a41106a2226200041346a29020037030020024180076a41086a22272000412c6a2902003703002002200041246a29020037038007200241e0066a41086a2228200041cc006a290000370300200241e0066a41106a2229200041d4006a290000370300200241e0066a41186a222a200041dc006a2900003703002002200041c4006a2900003703e006200241c0066a41086a222b200041ec006a290000370300200241c0066a41106a222c200041f4006a290000370300200241c0066a41186a222d200041fc006a2900003703002002200041e4006a2900003703c006200241a0066a41086a222e2000418c016a290000370300200241a0066a41106a222f20004194016a290000370300200241a0066a41186a22302000419c016a290000370300200220004184016a2900003703a006200241d0006a41086a220c200041ac016a290000370300200241d0006a41106a2231200041b4016a290000370300200241d0006a41186a2232200041bc016a290000370300201a200041c4016a290000370300201e200041cc016a290000370300201f200041dc016a2900003703002020200041d4016a2900003703002002200041a4016a290000370350200241e0056a200041e4016a10cc0520024180066a200041f0016a220510cd0502400240200041fc016a280200220a0d00200241003602d0040c010b20004184026a2802002200417f4c0d040240024020000d004101210b0c010b20001032220b450d060b200241003602d804200220003602d4042002200b3602d004200241d0046a4100200010c80120022802d00420022802d804220b6a200a200010c9081a2002200b20006a3602d8040b200541206a2802002200417f4c0d03200541186a280200210a0240024020000d004101210b0c010b20001032220b450d050b200241003602e802200220003602e4022002200b3602e002200241e0026a4100200010c80120022802e00220022802e802220b6a200a200010c9081a2002200b20006a22333602e802200541246a2902002103200241a0076a41086a2200200241e0056a41086a220a2802003602002019200229038006370200201941086a20024180066a41086a220b280200360200200620022903d004370200200641086a200241d0046a41086a2216280200360200201820022903e002370200201841086a2033360200200220022903e0053703a00720024180066a41186a2233202229030037030020024180066a41106a22222023290300370300200b2024290300370300200220022903c80337038006200241e0056a41186a22232025290300370300200241e0056a41106a22242026290300370300200a202729030037030020022002290380073703e005200241c0056a41186a2225202a290300370300200241c0056a41106a22262029290300370300200241c0056a41086a22272028290300370300200220022903e0063703c005200241a0056a41186a2228202d290300370300200241a0056a41106a2229202c290300370300200241a0056a41086a222a202b290300370300200220022903c0063703a00520024180056a41186a222b203029030037030020024180056a41106a222c202f29030037030020024180056a41086a222d202e290300370300200220022903a00637038005200241e0026a41386a222e201f290300370300200241e0026a41306a222f2020290300370300200241e0026a41286a2230201e290300370300200241e0026a41206a2234201a290300370300200241e0026a41186a22352032290300370300200241e0026a41106a22322031290300370300200241e0026a41086a2231200c290300370300200220022903503703e002200241d0046a41286a2236200241a0076a41286a290300370300200241d0046a41206a2237200241a0076a41206a290300370300200241d0046a41186a22382006290300370300200241d0046a41106a2239200241a0076a41106a29030037030020162000290300370300200220022903a0073703d004200241d0006a2005412c6a10ce05200241a0076a200541386a10cb05200120213602002001411c6a2033290300370200200141146a20222903003702002001410c6a200b290300370200200141046a2002290380063702002001413c6a2023290300370200200141346a20242903003702002001412c6a200a290300370200200141246a20022903e005370200200141c4006a20022903c005370200200141cc006a2027290300370200200141d4006a2026290300370200200141dc006a2025290300370200200141e4006a20022903a005370200200141ec006a202a290300370200200141f4006a2029290300370200200141fc006a202829030037020020014184016a2002290380053702002001418c016a202d29030037020020014194016a202c2903003702002001419c016a202b290300370200200141a4016a20022903e002370200200141ac016a2031290300370200200141bc016a2035290300370200200141b4016a2032290300370200200141dc016a202e290300370200200141d4016a202f290300370200200141cc016a2030290300370200200141c4016a20342903003702002001418c026a203629030037020020014184026a2037290300370200200141fc016a2038290300370200200141f4016a2039290300370200200141ec016a2016290300370200200141e4016a20022903d00437020020014194026a2003370200200141a4026a200c2802003602002001419c026a2002290350370200200141b0026a2000280200360200200141a8026a20022903a007370200200141b4026a2101201741016a2117200541c4006a2200201d470d000b0b200220173602c804200241d0006a20024188046a200241b0046a200241c0046a10ee020240024020022d00504104460d00200241f8036a10c2020240200d450d00200421010340200141046a410036020020012802002100200141013602000240200141086a280200450d002000102c0b200141d0006a22012010470d000b0b0240200e450d00200e41d0006c450d002004102c0b420021034104211c4100211b41002100410421040c010b200f422086200ead84210320022802fc0321000b024020092002280214470d00200241106a2009109805200228021021080b20082002280218220541c0036c6a200241e0026a41e80010c90822014202370368200141b0016a201b360200200141ac016a2000360200200141a8016a201c360200200141a0016a20033703002001419c016a20043602002001410e36029801200120022903a007370370200141f8006a200241a8076a29030037030020014180016a200241b0076a29030037030020014188016a200241b8076a29030037030020014190016a200241c0076a290300370300200141b4016a200241d0006a418c0210c9081a2002200541016a2209360218200228021021080b200241c0006a10bb04200941c0036c220c4104722201417f4c0d00200110322200450d01200241003602e802200220013602e402200220003602e002200241e0026a2009108f010240024020090d0020022802e802210620022802e002210a0c010b20022802e8022106200821010340200220013602a007200241d0006a200241a0076a10810220022802502105200241e0026a200620022802582200102f20022802e002220a20022802e80222066a2005200010c9081a2002200620006a22063602e80202402002280254450d002005102c0b200141c0036a2101200c41c07c6a220c0d000b2009450d00200941c0036c210020084198016a210103402001108302200141c0036a2101200041c07c6a22000d000b0b024020022802142201450d00200141c0036c450d002008102c0b200241d0076a24002006ad422086200aad840f0b103b000b1039000b2000200241dc006a290200370300200220022902543703e00241d2dcc3004128200241e0026a41fcdcc300418cddc3001040000bf50a03067f037e017f23004190026b22022400200241086a200110b003024002402002280208450d00200041013602000c010b200228020c21032001200128020441016a220436020402400240024002400240200420012802084b0d00200241003a00172002410036022020024100360218024002400240024020030d0020024188016a41086a200241186a41086a280200360200200220022903183703880120024188016a21040c010b0340200241003a009001200128020022042802042205450d06200428020022062d0000210720042005417f6a3602042004200641016a360200200241013a009001200220073a008801200128020022042802042205450d05200428020022062d0000210720042005417f6a3602042004200641016a360200200241023a009001200220073a008901200128020022042802042205450d05200428020022062d0000210720042005417f6a3602042004200641016a360200200241033a009001200220073a008a01200128020022042802042205450d05200428020022062d0000210720042005417f6a3602042004200641016a360200200241043a009001200220073a008b01200128020022042802042205450d05200428020022062d0000210720042005417f6a3602042004200641016a360200200241053a009001200220073a008c01200128020022042802042205450d05200428020022062d0000210720042005417f6a3602042004200641016a360200200241063a009001200220073a008d01200128020022042802042205450d05200428020022062d0000210720042005417f6a3602042004200641016a360200200241073a009001200220073a008e01200128020022042802042205450d05200428020022062d0000210720042005417f6a3602042004200641016a360200200220073a008f0120022903880121082002200110b00320022802000d0620012802002205280204220620022802042204490d062004417f4c0d020240024020040d00410121070c010b200410372207450d042001280200220528020421060b0240024020062004490d0020072005280200200410c90821062005280204220720044f0d01200420074194afc0001058000b2004450d072004450d072007102c0c070b2005200720046b3602042005200528020020046a3602002006450d06200220083703280240024020022802182205450d00200228021c21070c010b41e40110322205450d044100210720054100360200200541046a20024188016a41860110c9081a200541003b018a012005418c016a200241306a41d80010c9081a2002410036021c200220053602180b2004ad2209422086200984210920024188016a20072005200241286a109102024002402002280288014101470d00200229028c01210a2002280294012104200220083703980120022004360290012002200a370388012002200241186a36029401200220093702342002200636023020024188016a200241306a10bc040c010b200228029001200228029401410c6c6a220541086a2207280200210420072009370200200541046a22072802002105200720063602002005450d002004200b20041b210b2005410020041b2204450d00200b450d002004102c0b2003417f6a22030d000b20022d0017210420024188016a41086a200241186a41086a280200360200200220022903183703880120040d0620024188016a21040b200020042902003702042000410c6a200441086a280200360200410021040c060b103b000b1039000b200041013602000c040b200241003a0090010b200241013a001720024188016a41086a200241186a41086a28020036020020022002290318370388010b20024188016a10bb04410121040b2000200436020020012001280204417f6a3602040b20024190026a24000be30905037f017e067f047e067f230041a0026b2202240020022001108702024002402002280200450d00200041003602000c010b02400240024020022802042203200128020441d0006e2204200420034b1bad42d0007e2205422088a70d002005a72204417f4c0d000240024020040d00410421060c010b200410322206450d020b4100210720024100360210200220063602082002200441d0006e36020c02402003450d00200241d8016a41017221080340200241d8016a200110b0060240024020022802d8012209450d0020022902dc01210502400240200128020422044104490d002001280200220a280000210b20012004417c6a3602042001200a41046a360200200241d8016a200110ae0320022d00d8014101470d032005422088a72204450d0220040d010c020b2005422088a72204450d012004450d010b2009102c0b200241d8006a41386a20024198016a41386a290300370300200241d8006a41306a20024198016a41306a290300370300200241d8006a41286a20024198016a41286a290300370300200241d8006a41206a20024198016a41206a290300370300200241d8006a41186a20024198016a41186a290300370300200241d8006a41106a20024198016a41106a290300370300200241d8006a41086a20024198016a41086a29030037030020022002290398013703580c050b20024198016a41386a200841386a290000220c37030020024198016a41306a200841306a290000220d37030020024198016a41286a200841286a290000220e37030020024198016a41206a200841206a290000220f370300200241d8006a41086a2204200841086a290000370300200241d8006a41106a220a200841106a290000370300200241d8006a41186a2210200841186a290000370300200241d8006a41206a2211200f370300200241d8006a41286a2212200e370300200241d8006a41306a2213200d370300200241d8006a41386a2214200c370300200220082900003703582009450d04200241186a41386a22152014290300370300200241186a41306a22142013290300370300200241186a41286a22132012290300370300200241186a41206a22122011290300370300200241186a41186a22112010290300370300200241186a41106a2210200a290300370300200241186a41086a220a20042903003703002002200229035837031802402007200228020c470d00200241086a2007410110970520022802102107200228020821060b2006200741d0006c6a2204200b36020c200420053702042004200936020020042002290318370210200441186a200a290300370200200441206a2010290300370200200441286a2011290300370200200441306a2012290300370200200441386a2013290300370200200441c0006a2014290300370200200441c8006a20152903003702002002200741016a22073602102003417f6a22030d000b0b20002002290308370200200041086a200241086a41086a2802003602000c030b103b000b1039000b200041003602002002280208210302402007450d002003200741d0006c6a2109200321040340200441046a41003602002004280200210720044101360200200441086a2802002208200120081b210102402008450d002001450d002007102c0b200441d0006a22042009470d000b0b200228020c2204450d00200441d0006c450d002003102c0b200241a0026a24000bbe1505037f017e157f067e1d7f230041800b6b22022400200241086a200110870202400240024002402002280208450d00200041003602000c010b200228020c2203200128020441b4026e2204200420034b1bad42b4027e2205422088a70d022005a72204417f4c0d020240024020040d00410421060c010b200410322206450d020b20024100360218200220063602102002200441b4026e360214024002402003450d0020024188086a4101722107200241b4086a210820024188086a41047221094100210a034020024188086a200110b405024002402002280288084101460d00200241a0066a200941e40110c9081a20024188086a200110ef04200228028808220b450d00200241a8046a41086a220c200841086a280200360200200220082902003703a80420022802b008210d20022802ac08210e20022802a808210f20022802a408211020022802a0082111200228029c082112200228029808211320022802940821142002280290082115200228028c082116200241b8046a200241a0066a41e40110c9081a20022001108702024020022802000d0020022802042217200128020441c1006e2204200420174b1bad42c1007e2205422088a70d082005a72204417f4c0d080240024020040d00410121180c010b200410322218450d080b41002106200241003602f809200220183602f0092002200441c1006e22043602f40902400240024002402017450d0041002106034020012802042204450d02200128020022192d0000211a20012004417f6a3602042001201941016a360200024002400240201a417f6a0e020001050b20024188086a200110ae0320022d0088084101460d04200241a0066a41386a200741386a290000370300200241a0066a41306a200741306a290000370300200241a0066a41286a200741286a290000370300200241a0066a41206a200741206a290000370300200241a0066a41186a200741186a290000370300200241a0066a41106a200741106a290000370300200241a0066a41086a200741086a290000370300200220072900003703a006410021190c010b20024188086a200110ae0320022d0088084101460d03200241a0066a41386a200741386a290000370300200241a0066a41306a200741306a290000370300200241a0066a41286a200741286a290000370300200241a0066a41206a200741206a290000370300200241a0066a41186a200741186a290000370300200241a0066a41106a200741106a290000370300200241a0066a41086a200741086a290000370300200220072900003703a006410121190b200241c00a6a41386a200241a0066a41386a2903002205370300200241c00a6a41306a200241a0066a41306a290300221b370300200241c00a6a41286a200241a0066a41286a290300221c370300200241c00a6a41206a200241a0066a41206a290300221d370300200241c00a6a41186a200241a0066a41186a290300221e370300200241c00a6a41106a200241a0066a41106a290300221f370300200241c00a6a41086a200241a0066a41086a2903002220370300200241800a6a41086a221a2020370300200241800a6a41106a2221201f370300200241800a6a41186a2222201e370300200241800a6a41206a2223201d370300200241800a6a41286a2224201c370300200241800a6a41306a2225201b370300200241800a6a41386a22262005370300200220022903a00622053703c00a200220053703800a0240200620022802f409470d00200241f0096a2006410110960520022802f809210620022802f00921180b2018200641c1006c6a220420193a0000200420022903800a370001200441096a201a290300370000200441116a2021290300370000200441196a2022290300370000200441216a2023290300370000200441296a2024290300370000200441316a2025290300370000200441396a20262903003700002002200641016a22063602f8092017417f6a22170d000b20022802f409210420022802f00921180b2018450d0320024188086a200110b006200228028808450d01200241c00a6a41086a20024188086a41086a28020036020020022002290388083703c00a20024188086a200241b8046a41e40110c9081a200241a0066a41086a200c280200360200200220022903a8043703a006201821272004212820062129200d212a200e212b200f212c2010212d2011212e2012212f201321302014213120152132201621330c050b20022802f409220441c1006c203420041b213420022802f009410020041b2204450d0220340d010c020b200441c1006c203520041b213502402004450d002035450d002018102c0b02402015450d002015410c6c2106200b210403400240200441046a280200450d002004280200102c0b2004410c6a2104200641746a22060d000b0b2016410c6c203620161b213602402016450d002036450d00200b102c0b02402012450d0020124104742106201441046a210403400240200441046a280200450d002004280200102c0b200441106a2104200641706a22060d000b0b2013410474203720131b213702402014410020131b2204450d002037450d002004102c0b02402011450d002010203820101b21382010450d002038450d002011102c0b200d2039200d1b2139200e4100200d1b2204450d022039450d022004102c0c020b2004102c0b02402015450d002015410c6c2106200b210403400240200441046a280200450d002004280200102c0b2004410c6a2104200641746a22060d000b0b2016410c6c203a20161b213a02402016450d00203a450d00200b102c0b02402012450d0020124104742106201441046a210403400240200441046a280200450d002004280200102c0b200441106a2104200641706a22060d000b0b2013410474203b20131b213b02402014410020131b2204450d00203b450d002004102c0b02402011450d002010203c20101b213c2010450d00203c450d002011102c0b200d203d200d1b213d200e4100200d1b2204450d00203d450d002004102c0b4100210b0b200241c4026a20024188086a41e40110c9081a200241b8026a41086a2204200241a0066a41086a280200360200200241a8026a41086a2206200241c00a6a41086a280200360200200220022903a0063703b802200220022903c00a3703a802200b450d02200a41016a210a200241c0006a200241c4026a41e40110c9081a200241306a41086a22172004280200360200200241206a41086a220d2006280200360200200220022903b802370330200220022903a8023703200240200228021822062002280214470d00200241106a20064101109b05200228021821060b2002280210200641b4026c6a200241c0006a41e40110c9082204418c026a202a36020020044188026a202b36020020044184026a202c36020020044180026a202d360200200441fc016a202e360200200441f8016a202f360200200441f4016a2030360200200441f0016a2031360200200441ec016a2032360200200441e8016a20333602002004200b3602e401200441a4026a2029360200200441a0026a20283602002004419c026a202736020020044190026a200229033037020020044198026a2017280200360200200441a8026a2002290320370200200441b0026a200d2802003602002002200641016a360218200a2003470d000b0b20002002290310370200200041086a200241106a41086a2802003602000c010b20004100360200200241106a10c2020b200241800b6a24000f0b1039000b103b000bbf0101057f230041106b220224002001280200210302400240200141046a280200220441037622050d0041012105410021010c010b4101210102402005410820044107716b22064d0d0041024101200520066b22014107711b20014103766a21010b2001103222050d001039000b20024100360208200220013602042002200536020020024100200110c8012002280200220520022802086a2003200110c9081a200020043602042000200536020020002002280204360208200241106a24000bca0203027f017e057f230041106b220224000240024020012802082203ad420c7e2204422088a70d002004a72205417f4c0d00200128020021014104210602402005450d00200510322206450d020b20002006360200200041086a22074100360200200041046a2005410c6e36020020004100200310ec012007280200210502402003450d0020012003410c6c6a210820002802002005410c6c6a21030340200141086a2802002200417f4c0d02200128020021060240024020000d00410121090c010b200010322209450d040b20024100360208200220003602042002200936020020024100200010c8012002280200200228020822096a2006200010c9081a200341086a200920006a36020020032002290300370200200541016a21052003410c6a21032001410c6a22012008470d000b0b20072005360200200241106a24000f0b103b000b1039000be60201087f230041106b22022400024002402001280208220341ffffffff00712003470d0020034104742204417f4c0d00200128020021014104210502402004450d00200410322205450d020b20002005360200200041086a22064100360200200041046a200441047636020020004100200310ed012006280200210402402003450d00200120034104746a2107200028020020044104746a210303402001410c6a2802002200417f4c0d02200141046a2802002105200128020021080240024020000d00410121090c010b200010322209450d040b20024100360208200220003602042002200936020020024100200010c8012002280200200228020822096a2005200010c9081a2002200920006a36020820032008360200200341046a20022903003702002003410c6a2002280208360200200341106a2103200441016a2104200141106a22012007470d000b0b20062004360200200241106a24000f0b103b000b1039000b8c0405027f017e0a7f067e017f230041c0006b220224000240024020012802082203ad42c1007e2204422088a70d002004a72205417f4c0d00200128020021010240024020050d00410121060c010b200510322206450d020b20002006360200200041086a22074100360200200041046a200541c1006e3602002000410020031096052007280200210802402003450d002001200341c1006c6a21092000280200200841c1006c6a2100200241386a2105200241306a2106200241286a210a200241206a210b200241186a210c200241106a210d200241086a210e0340200141016a2900002104200141096a290000210f200141116a2900002110200141196a2900002111200141216a2900002112200141296a2900002113200141316a290000211420012d000021152005200141396a29000037030020062014370300200a2013370300200b2012370300200c2011370300200d2010370300200e200f37030020022004370300200020153a0000200041016a2002290300370000200041096a200e290300370000200041116a200d290300370000200041196a200c290300370000200041216a200b290300370000200041296a200a290300370000200041316a2006290300370000200041396a2005290300370000200041c1006a2100200141c1006a22012009470d000b200820036a21080b20072008360200200241c0006a24000f0b103b000b1039000bb518060e7f017e037f017e017f027e230041a0086b22022400200242808080808020370224200220013602342002200041c4b5c80020011b3602302002200241306a360220200241a0076a200241206a10ab05024020022802a407450d00200241b0066a200241a0076a41f00010c9081a200241a0076a200241206a10bb05024020022802a0070d00200241b0066a410472102b0c010b20024190086a41086a2200200241a0076a41086a280200360200200220022903a0073703900820022802b006210320022802b4062101200241b8056a200241b0066a41086a41e80010c9081a200241b8056a41f0006a200028020036020020022002290390083702a006200241c0046a200241b8056a41f40010c9081a2001450d00200220013602c403200220033602c003200241c0036a41086a200241c0046a41f40010c9082100200241b8056a200241206a10c805024020022802b8054101470d00200241c0036a410472102b20022802b00421030240200241b8046a2802002201450d00200141c0036c210020034198016a210103402001108302200141c0036a2101200041c07c6a22000d000b0b200241b4046a2802002201450d01200141c0036c450d012003102c0c010b200241a0076a41086a2204200241c4056a280200360200200220022902bc053703a007200241c0026a200041f40010c9081a200241bc036a2004280200360200200220022903a0073702b403200241c0016a200241c0026a41800110c9081a2002200136023c20022003360238200241386a41086a200241c0016a41800110c9082100024002402002280220280204450d00200241386a410472102b20022802a80121040240200241b0016a2802002201450d00200141c0036c210020044198016a210103402001108302200141c0036a2101200041c07c6a22000d000b0b0240200241ac016a2802002201450d00200141c0036c450d002004102c0b200241b4016a10bb04410021010c010b200241c0026a200041800110c9081a0b2001450d00200241386a200241c0026a41800110c9081a200241c0016a200241c0026a41f40010c9081a200241a0076a41086a2200200241b4016a280200360200200220022902ac013703a0072002200136023c20022003360238200241386a41086a200241c0016a41f40010c9081a200241c0046a41086a2000280200360200200220022903a0073703c004200241013b01c405200241003602c005200241003602b80520022802a801210502400240024002400240200241b0016a2802002206450d002005200641c0036c6a2107200241d0026a210820022802c404210920022802c004210a200241d8026a210b2005210c0340200c41e8006a2903004202520d010240200c28029801410247220d0d0041f5b1c800210e411c210f02400240024002400240200a450d00200c2903a0012110200241c0046a210120092111034020012802002212410c6a21032012418c016a210020122f018a0121134100210102400240034020132001460d0141c4b1c8002000410810cc082204450d02200041086a21002003410c6a2103200141016a21012004417f4a0d000b2001417f6a21130b2011450d022011417f6a2111201220134102746a41e4016a21010c010b0b0240200328020041084f0d0041ccb1c800210e4129210f0c010b201042f02e80200341786a280200290000510d0141f0efc500210e4131210f0b2002200f3602242002200e360220200242e2c289abb68edbb7f400370390082002200241b8056a20024190086a200241206a10bd04200228020022010d01200241c0036a41086a200241b8056a41086a290300370300200220022903b8053703c0030c080b200d0d03200c2903a0012114200241c0026a200241c0046a109701024020022802c0024101460d0020022903c8022110200b420037030020084200370300200241c0026a41086a22014200370300200242003703c002200241c0036a41cbdcc700410910c5012001200241c0036a41086a2200290000370300200220022900c0033703c002200241c0036a41f8d7c300410310c501200841086a2000290000370000200820022900c003370000200241106a200241c0026a10cf022014201042b0ea017c560d022014200229031842b8177c42b81720022802101b22105a0d04201042808080807083211441002101410121000c030b20022903c802221042808080807083211420022802c4022115410121014100210020164280808080708320023502d00284221621170c020b20022802042100200220013602c002200220003602c402419cc6c3004122200241c0026a41c0c6c300418cc6c3001040000b201742808080807083211741addcc300ad211041012101410021154280808080d0042114410021000b200220173703d002200220153602c402200220013602c002200242f4d2b59bc7ae98b8303703b00620022014201042ffffffff0f83843703c802200241086a200241b8056a200241b0066a200241c0026a10ba04200228020822030d052014422088a721032010a7210420010d032000201545720d002003450d002004102c0b200c41c0036a220c2007470d000b0b200241c0036a41086a200241b8056a41086a290300370300200220022903b8053703c0030c010b200241c0036a41086a200241b8056a41086a290300370300200220022903b8053703c0032015450d002003450d002004102c0b200241c0046a10bb04200241386a410472102b02402006450d00200641c0036c210020054198016a210103402001108302200141c0036a2101200041c07c6a22000d000b0b0240200241ac016a2802002201450d00200141c0036c450d002005102c0b200241003602c802200242013703c00220022d00cc032101200241c0026a41004101102f20022802c00220022802c80222006a20013a00002002200041016a22013602c80220022d00cd032100200241c0026a20014101102f20022802c00220022802c80222016a20003a00002002200141016a3602c802200241c0026a20022802c8032213108f01024020022802c00322010d004100210141002103410021130c020b20022802c403210020012103034020012f018a0121042000450d022000417f6a2100200120044102746a41e4016a280200210120032802e40121030c000b0b200228020c2101200220033602c003200220013602c403419cc6c3004122200241c0036a41c0c6c300418cc6c3001040000b200241cc006a2004360200200241c8006a200136020020022013360250200242003703402002200336023c2002410036023802402013450d0020022013417f6a360250200241386a410020031b221328020021030240024020132802082204201328020422002f018a014f0d00200021010c010b03400240200028020022010d00410021010c020b200341016a210320002f018801210420012100200420012f018a014f0d000b0b200441016a21120240024020030d00200121000c010b200120124102746a41e4016a280200210002402003417f6a2203450d00034020002802e40121002003417f6a22030d000b0b410021120b20132000360204201341003602002013201236020820012004410c6c6a41046a2100200120044103746a418c016a21010340200241c0026a20022802c8024108102f20022802c00220022802c80222036a20012900003700002002200341086a3602c80220002802002000280208200241c0026a10bb0120022802502201450d0120022001417f6a360250200241386a4100200228023c1b221328020021030240024020132802082204201328020422002f018a014f0d00200021010c010b03400240200028020022010d00410021010c020b200341016a210320002f018801210420012100200420012f018a014f0d000b0b200441016a21120240024020030d00200121000c010b200120124102746a41e4016a280200210002402003417f6a2203450d00034020002802e40121002003417f6a22030d000b0b410021120b20132000360204201341003602002013201236020820012004410c6c6a41046a2100200120044103746a418c016a21010c000b0b20023502c802211020023502c0022114200241c0036a10bb04200241a0086a240020142010422086840f0b200241cc016a4104360200200241cc006a41023602002002420237023c20024194c7c300360238200241043602c401200241a4c9c3003602c001200241003602c403200241c4b5c8003602c0032002200241c0016a3602482002200241c0036a3602c801200241386a41a4c7c3001046000bda0501067f23004190016b220224000240024020010d00200241f0006a41186a22014200370300200241f0006a41106a22034200370300200241f0006a41086a2204420037030020024200370370200241f0006a41c7dcc700410410c501200241c8006a418cd7c500410a10c5012001200241c8006a41086a29000037030020032002290048370300200241c8006a200241f0006a10860520022d004821052001200241e1006a2900003703002003200241d9006a2900003703002004200241d1006a290000370300200220022900493703700240024020054101460d00200241286a41186a4200370300200241286a41106a4200370300200241286a41086a4200370300200242003703280c010b200241286a41186a2001290300370300200241286a41106a2003290300370300200241286a41086a2004290300370300200220022903703703280b200241086a41086a2204200241286a41086a290300370300200241086a41106a2205200241286a41106a290300370300200241086a41186a2206200241286a41186a290300370300200220022903283703082002410036027820024201370370412010322201450d012002422037024c20022001360248200241c8006a41004120102f20022802482203200228025022076a22012002290308370000200141086a2004290300370000200141106a2005290300370000200141186a20062903003700002002200741206a2201360250200241f0006a41002001102f20022802702204200228027822056a2003200110c9081a2002200520016a22013602780240200228024c450d002003102c0b20024190016a24002001ad4220862004ad840f0b200241fc006a4104360200200241dc006a41023602002002420237024c20024194c7c30036024820024104360274200241bcc9c3003602702002410036022c200241c4b5c8003602282002200241f0006a3602582002200241286a360278200241c8006a41a4c7c3001046000b1039000b910d03017f027e047f230041e0136b220224002002428080808080203702dc02200220013602ec022002200041c4b5c80020011b22003602e8022002200241e8026a3602d80202400240024002402001450d0020022001417f6a3602ec022002200041016a3602e80241002101024020002d00000e03030200010b410221010c020b420321030c020b410121010b200241a8076a200241d8026a10af0342032103024020022903900822044203520d000c010b200241ef0a6a200241a8076a41e80010c9081a200241e0106a20024198086a41d00210c9081a200241086a200241e80a6a41ef0010c9081a200421030b200241b8066a200241086a41ef0010c9081a200241e00d6a200241e0106a41d00210c9081a0240024020034203510d00200220013a00f002200241f0026a410172200241b8066a41ef0010c9082100200241e0036a2003370300200241e8036a200241e00d6a41d00210c90821050240024020022802d802280204450d0020024190046a108302420321030c010b200241e0106a200041ef0010c9081a200241a8076a200541d00210c9081a0b20034203510d00200241f0026a200241e0106a41ef0010c9081a200241b8066a200241f7026a41e80010c9081a200241086a200241a8076a41d00210c9081a200241a8076a200241b8066a41e80010c9081a200220033703900820024198086a200241086a41d00210c9081a2002200241a8076a3602e010200241f0026a200241e0106a10810220022802f8022106024020022802f002410020022802f40222001b2205450d002000450d002005102c0b200241f0026a200241a8076a41c00310c9081a200241e0106a200241f0026a10890320022d00e010210020022f00e110210720022d00e3102108200241e00d6a200241e0106a41047241fc0210c9081a410121050240024020004101460d00200241e80a6a200241e00d6a41046a41f80210c9081a200241e0106a200241b80b6a220010b702200241f0026a200241e80a6a200120022903e01020022d00e81020022d00e910200610d205200010830220022d00f00221050c010b200241013a00f0022002200720084110747222013b00f102200220014110763a00f3020b410110322201450d01200242013702ac07200220013602a80702400240200541ff01714101470d00200241a8076a41004101102f20022802a80720022802b00722016a41013a00002002200141016a3602b007200241f0026a410172200241a8076a108d0320022802b007210620022802a80721070c010b200241a8076a41004101102f20022802a80720022802b00722016a41003a00002002200141016a22013602b007200241f0026a41086a2903002103200241a8076a20014108102f20022802a80720022802b00722016a20033700002002200141086a3602b00720024188036a2802002101200241a8076a20024190036a2802002200108f0102402000450d0020012000410c6c6a210003402001280200200141086a280200200241a8076a10bb012001410c6a22012000470d000b0b20024194036a2802002101200241a8076a2002419c036a2802002200108f0102402000450d0020012000410c6c6a210003402001280200200141086a280200200241a8076a10bb012001410c6a22012000470d000b0b20024180036a2903002103200241a8076a20022802b0074108102f20022802a80720022802b00722016a20033700002002200141086a22013602b007200241a0036a2d00002100200241a8076a20014101102f20022802a807220720022802b00722016a20003a0000200141016a2106200541ff01710d0020024188036a2802002105024020024190036a2802002201450d002001410c6c21002005210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b02402002418c036a2802002201450d002001410c6c450d002005102c0b20024194036a280200210502402002419c036a2802002201450d002001410c6c21002005210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b20024198036a2802002201450d002001410c6c450d002005102c0b200241e0136a24002006ad4220862007ad840f0b200241ec0d6a410436020020024184036a4102360200200242023702f40220024194c7c3003602f002200241043602e40d200241d0c9c3003602e00d200241003602ec0a200241c4b5c8003602e80a2002200241e00d6a360280032002200241e80a6a3602e80d200241f0026a41a4c7c3001046000b1039000bfb5f03087f067e047f23004190066b2207240002400240024002400240024002400240024020012903204202520d00200741f8006a41206a22084200370300200741f8006a41186a22094280808080c000370300200741013a00a00120074204370388012007427f3703800120074200370378200741a8046a41206a220a4200370300200741a8046a41186a220b4280808080c000370300200741013a00d004200742043703b8042007427f3703b004200742003703a804200741b8016a200741f8006a200741a8046a10d106200741f8006a41286a220c200741b8016a41286a2903003703002008200741b8016a41206a2903003703002009200741b8016a41186a290300370300200741f8006a41106a220d200741b8016a41106a290300370300200741f8006a41086a220e200741b8016a41086a290300370300200720072903b801370378200a4200370300200b4280808080c000370300200741013a00d004200742043703b8042007427f3703b004200742003703a804200741e8016a200741f8006a200741a8046a10d106200c200741e8016a41286a2903003703002008200741e8016a41206a2903003703002009200741e8016a41186a290300370300200d200741e8016a41106a290300370300200e200741e8016a41086a290300370300200720072903e801370378200a4200370300200b4280808080c000370300200741013a00d004200742043703b8042007427f3703b004200742003703a80420074198026a200741f8006a200741a8046a10d106200c20074198026a41286a290300370300200820074198026a41206a290300370300200920074198026a41186a290300370300200d20074198026a41106a290300370300200e20074198026a41086a2903003703002007200729039802370378200a4200370300200b4280808080c000370300200741013a00d004200742043703b8042007427f3703b004200742003703a804200741c8026a200741f8006a200741a8046a10d106200c200741c8026a41286a2903003703002008200741c8026a41206a2903003703002009200741c8026a41186a290300370300200d200741c8026a41106a290300370300200e200741c8026a41086a290300370300200720072903c802370378200a4200370300200b4280808080c000370300200741013a00d004200742043703b8042007427f3703b004200742003703a804200741f8026a200741f8006a200741a8046a10d106200741d8036a41286a200741f8026a41286a290300370300200741d8036a41206a200741f8026a41206a290300370300200741d8036a41186a2205200741f8026a41186a290300370300200741d8036a41106a200741f8026a41106a290300370300200741d8036a41086a200741f8026a41086a290300370300200720072903f8023703d803200741a8046a20032004200610d206200e200741a8046a410c6a290200370300200d200741a8046a41146a2902003703002009200741a8046a411c6a2902003703002008200741a8046a41246a290200370300200c200741a8046a412c6a290200370300200741a8016a200741dc046a280200360200200720072902ac0437037820072d00a8044101470d0120072d00ab04210a20072f00a904210b20072802e8032109024020052802002201450d002001410c6c21082009210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b0240200741ec036a2802002201450d002001410c6c450d002009102c0b200a411074210a20072802f40321090240200741fc036a2802002201450d002001410c6c21082009210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b200b200a7221010240200741f8036a2802002208450d002008410c6c450d002009102c0b200741e0006a41086a20074188046a41086a290200370300200741e0006a41106a20074188046a41106a2802003602002007200729028804370360200041036a20014110763a0000200020013b0001200041013a00000c080b200741f8006a41206a22084200370300200741f8006a41186a22094280808080c000370300200741013a00a0012007420437038801427f210f2007427f3703800120074200370378200741a8046a41206a220a4200370300200741a8046a41186a220b4280808080c000370300200741013a00d004200742043703b8042007427f3703b004200742003703a804200741b8016a200741f8006a200741a8046a10d106200741f8006a41286a220c200741b8016a41286a2903003703002008200741b8016a41206a2903003703002009200741b8016a41186a290300370300200741f8006a41106a220d200741b8016a41106a290300370300200741f8006a41086a220e200741b8016a41086a290300370300200720072903b801370378200a4200370300200b4280808080c000370300200741013a00d004200742043703b8042007427f3703b004200742003703a804200741e8016a200741f8006a200741a8046a10d106200c200741e8016a41286a2903003703002008200741e8016a41206a2903003703002009200741e8016a41186a290300370300200d200741e8016a41106a290300370300200e200741e8016a41086a290300370300200720072903e801370378200a4200370300200b4280808080c000370300200741013a00d004200742043703b8042007427f3703b004200742003703a80420074198026a200741f8006a200741a8046a10d106200c20074198026a41286a290300370300200820074198026a41206a290300370300200920074198026a41186a290300370300200d20074198026a41106a290300370300200e20074198026a41086a290300370300200720072903980237037820074188046a41186a2208420037030020074188046a41106a220c420037030020074188046a41086a220942003703002007420037038804200741e0006a41c1dcc700410610c5012009200741e0006a41086a2900003703002007200729006037038804200741a8046a4196a4c600410610c5012008200741a8046a41086a290000370300200c20072900a804370300200741c8006a20074188046a412010c601200728024c410020072802481bad2110024020012903204201520d002001290328220f4200510d02200141306a2903002211200f7c4200201020117d221120112010561b22117c2011200f827d210f0b200a4200370300200b4280808080c000370300200720072800e0053602d8032007200741e3056a2800003600db03200741d4046a20072800db03360000200741013a00d004200742043703b804200742003703a80420074200200f20107d22102010200f561b3703b004200720072802d8033600d104200741c8026a200741f8006a200741a8046a10d106200741e0056a41286a200741c8026a41286a290300370300200741e0056a41206a200741c8026a41206a290300370300200741e0056a41186a200741c8026a41186a290300370300200741e0056a41106a200741c8026a41106a290300370300200741e0056a41086a200741c8026a41086a290300370300200720072903c8023703e005200741e0006a41c1dcc700410610c501200741a8046a41acc8c700410710c501200741d8036a200110d50220072802e003220841206a2209417f4c0d020240024020090d004101210a0c010b20091032220a450d040b200741003602b003200720093602ac032007200a3602a803200741a8036a4100411010c80120072802a80320072802b00322096a220a2007290060370000200a41086a200741e0006a41086a2900003700002007200941106a22093602b003200741a8036a2009411010c80120072802a80320072802b00322096a220a20072900a804370000200a41086a200741a8046a41086a2900003700002007200941106a220a3602b00320072802d8032109200741a8036a200a200810c80120072802a803220a20072802b003220b6a2009200810c9081a2007200b20086a22083602b003024020072802dc03450d002009102c0b200741a8046a200a200810d602200741f0046a280200410020072903a8044201511b2108024020072802ac03450d00200a102c0b02400240200128023822092008490d00410c1032220a450d054104210d41041032220b450d05200742043702ac042007200b3602a8044100210e200741a8046a41004120102f20072802a80420072802b00422026a220b2001290000370000200b41086a200141086a290000370000200b41106a200141106a290000370000200b41186a200141186a2900003700002007200241206a220b3602b004200741a8046a200b4104102f20072802a80420072802b004220b6a2009360000200a20072903a804370200200a41086a200b41046a3602000240200820094f0d00410c1032220d450d06410410322208450d06200742043702ac04200720083602a804200741a8046a41004120102f20072802a80420072802b004220b6a22082001290000370000200841086a200141086a290000370000200841106a200141106a290000370000200841186a200141186a2900003700002007200b41206a22083602b004200741a8046a20084104102f20072802a80420072802b00422086a2009417f6a360000200d20072903a804370200200d41086a200841046a3602004101210e0b200741f8006a41206a428180808010370300200741f8006a41186a200e360200200741f8006a41146a200e36020020072007280088043602b00120072007418b046a2800003600b301200741f8006a412c6a20072800b301360000200741013a00a0012007200a360294012007200d360288012007427f3703800120074200370378200720072802b0013600a101200741f8026a200741e0056a200741f8006a10d106200741d8036a41286a200741f8026a41286a290300370300200741d8036a41206a200741f8026a41206a290300370300200741d8036a41186a200741f8026a41186a290300370300200741d8036a41106a200741f8026a41106a290300370300200741d8036a41086a200741f8026a41086a290300370300200720072903f8023703d8030240200441ff01714102470d0020074180016a200741b4046a29020037030020074188016a200741a8046a41146a29020037030020074190016a200741c4046a29020037030020074198016a200741cc046a290200370300200741f8006a41286a200741a8046a412c6a290200370300200741a8016a200741dc046a280200360200200720072902ac0437037841801221010c090b200741a8046a20032004200610d206200741f8006a41086a200741a8046a410c6a290200370300200741f8006a41106a200741a8046a41146a290200370300200741f8006a41186a200741a8046a411c6a290200370300200741f8006a41206a200741a8046a41246a290200370300200741f8006a41286a200741a8046a412c6a290200370300200741a8016a200741dc046a280200360200200720072902ac0437037820072d00a8044101470d0120072f00a90420072d00ab044110747221010c080b20072007280088043602b001200720074188046a41036a2800003600b301200041036a41003a000020004180063b0001200041013a000020072802f00521000240200741f8056a2802002201450d002001410c6c21082000210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b0240200741f4056a2802002201450d002001410c6c450d002000102c0b20072802fc052100024020074184066a2802002201450d002001410c6c21082000210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b20074180066a2802002201450d082001410c6c450d082000102c0c080b200741e0056a41286a2208200741a4016a220e290200370300200741e0056a41206a2209200741f8006a41246a290200370300200741e0056a41186a220a200741f8006a411c6a290200370300200741e0056a41106a220b2007418c016a290200370300200741e0056a41086a220d200741f8006a410c6a2902003703002007200729027c3703e005200741a8036a200741d8036a200741e0056a10d1062008200741a8036a41286a2903003703002009200741a8036a41206a290300370300200a200741a8036a41186a290300370300200b200741a8036a41106a290300370300200d200741a8036a41086a290300370300200720072903a8033703e005200741386a2006200320012903402211200141c8006a2903002212200541ff01714100472004109206024002402007290338220f200741386a41086a290300221084500d00200741a8046a2001200f2010410141112011201284501b410010cd0620072802a8044101460d01200741a8046a41106a290300211320072903b0042111200741a0046a2209420037030020074188046a41106a220a420037030020074188046a41086a220142003703002007420037038804200741e0006a41d4dcc700410810c5012001200741e0006a41086a220b2900003703002007200729006037038804200741a8046a41bba8c700410d10c501200c41086a220d200741a8046a41086a2204290000370000200c20072900a804370000200741206a20074188046a412010d301200741206a41106a2903002112200729032821142007280220210820094200370300200a4200370300200142003703002007420037038804200741e0006a41d4dcc700410810c5012001200b2900003703002007200729006037038804200741a8046a41bba8c700410d10c501200d2004290000370000200c20072900a804370000200742002012420020081b221220137d2014420020081b2213201154ad7d2214201320117d2211201356201420125620142012511b22011b3703b00420074200201120011b3703a80420074188046a4120200741a8046a411010a7020b200741a8046a109b0120072903b0042111200741013a00a001200720104200418080f00120064101200641014b1b6ead221220112003420120034201561b80220320032012561b2203420010ce08200741106a200f42002003420010ce08200741f8006a41206a4200370300200741f8006a41186a4280808080c0003703002007200741d3006a2800003600b301200720072800503602b001200e20072800b3013600002007420437038801200720072802b0013600a1012007290308210f200741106a41086a2903002103200729030021102007427f370380012007427f2007290310200f420052200320107c220f2003547222011b427f427f200f20011b501b370378200741d8036a200741e0056a200741f8006a10d106200041306a200741d8036a41286a290300370300200041286a200741d8036a41206a290300370300200041206a200741d8036a41186a290300370300200041186a200741d8036a41106a290300370300200041106a200741d8036a41086a290300370300200041086a20072903d803370300200041003a00000c080b200720072800503602b0012007200741d0006a41036a2800003600b301200041036a41003a000020004180023b0001200041013a000020072802f00521000240200741f8056a2802002201450d002001410c6c21082000210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b0240200741f4056a2802002201450d002001410c6c450d002000102c0b20072802fc052100024020074184066a2802002201450d002001410c6c21082000210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b20074180066a2802002201450d072001410c6c450d072000102c0c070b200741e0056a41286a200741f8006a412c6a290200370300200741e0056a41206a2204200741f8006a41246a290200370300200741e0056a41186a2206200741f8006a411c6a290200370300200741e0056a41106a200741f8006a41146a290200370300200741e0056a41086a2205200741f8006a410c6a2902003703002007200729027c3703e005200741a8036a200741d8036a200741e0056a10d106200c200741a8036a41286a2903003703002008200741a8036a41206a2903003703002009200741a8036a41186a290300370300200d200741a8036a41106a290300370300200e200741a8036a41086a290300370300200720072903a803370378200a4200370300200b4280808080c000370300200741013a00d004200742043703b8042007427f3703b004200742003703a804200741e0056a200741f8006a200741a8046a10d10620074188046a410c6a2005290300370200200720072903e00537028c04200741e0056a41146a280200210c200628020021082004280200210d200741e0056a41246a280200210920072802f005210a20072802fc05210b2007290388062103200741e0006a41106a20074188046a41106a280200360200200741e0006a41086a20074188046a41086a2902003703002007200729028804370360200741d0006a41086a200741e0006a410c6a29020037030020072007290264370350024002400240024002402001280250417f6a0e0a01000000000200000304000b200741003a00ab0420074181023b00a9040c070b0240200141d8006a2802004102460d00200741003a00ab04200741003b00a9040c070b0240200241ff017141014b0d00200741a8046a41086a427f370300200741dc046a4110360200200741a8046a41206a4200370300200741a8046a41186a4280808080c0003703002007427f3703a804200741cdc8c5003602d804200741013a00d004200742043703b804200741a8036a41186a200141f0026a290200220f370300200741a8036a41106a200141e8026a2902002210370300200741a8036a41086a200141e0026a29020022113703002007200141d8026a29020022123703a803200141f0006a2903002113200741e0056a411c6a200f370200200741f4056a2010370200200741ec056a2011370200200720123702e405411c10322201450d06200741d1046a21062007421c3702fc02200720013602f80241002101200741f8026a41004101102f20072802f802200728028003220e6a41c0003a00002007200e41016a220e36028003200741f8026a200e4110102f20072802f802200728028003220e6a220441002900cdc845370000200441086a41002900d5c8453700002007200e41106a220e36028003200741f8026a200e4120102f20072802f80220072802800322026a220e200741e4056a2204290000370000200e41086a200441086a290000370000200e41106a200441106a290000370000200e41186a200441186a2900003700002007200241206a220e36028003200741f8026a200e4108102f20072802f802200728028003220e6a20133700002007200e41086a36028003024020072802cc04220e20072802c804470d00200741a8046a411c6a200e410110ec0120072802cc04210e0b20072802c404200e410c6c6a220e20072903f802370200200e41086a200741f8026a41086a280200360200200741e0056a41086a220e200741a8046a41086a2204290300370300200741e0056a41106a2202200741a8046a41106a2205290300370300200741e0056a41186a2215200741a8046a41186a2216290300370300200720072802cc0441016a3602cc04200741e0056a41206a2217200741a8046a41206a2218290300370300200720072903a8043703e0052007200641076a2900003700ff02200720062900003703f802200741a8036a41206a22062017290300370300200741a8036a41186a22172015290300370300200741a8036a41106a22152002290300370300200741a8036a41086a2202200e290300370300200720072903e0053703a803200720072900ff023700cf02200720072903f8023703c802200741d0046a2006290300370300201820172903003703002016201529030037030020052002290300370300200420072903a803370300200741d8046a41003a0000200741dc046a20072800cb02360000200741d9046a20072802c802360000200741003a00a8040c080b024041002802d8d2484102490d00200741d4003602e405200741fcf0c5003602e00541002802d4d248210141002802d0d248210e41002802dcd2482104200741e8046a41af01360200200741e0046a42e480808010370300200741dc046a41989fc800360200200741d4046a4219370200200741d0046a41ff9ec800360200200741c8046a4201370300200741b8046a4201370300200741b0046a4104360200200741c4046a200741a8036a360200200741b4b5c8003602b404200741ddc8c5003602ac04200741043602ac03200741023602a804200141e0a3c000200441024622041b28021021012007200741e0056a3602a803200e41f8a3c00020041b200741a8046a20011103000b200741003a00ab04200741003b00a9040c060b0240200141d8006a2d00004118460d00200741003a00ab04200741003b00a9040c060b2007200141a8026a220e3602980202400240200241ff017141014b0d00200741a8046a41286a200141b8026a220141286a290300370300200741a8046a41206a200141206a290300370300200741a8046a41186a200141186a290300370300200741a8046a41106a200141106a290300370300200741a8046a41086a200141086a290300370300200720012903003703a804200741e0056a200741a8046a200e28020010a70420072903e0054201520d014107210e200741073a00f802200720072d0082064100200741e0056a41206a2d00004103461b22013a00f902024041002802d8d2484104490d002007411d3602ac032007200741f8026a3602a80341002802d4d248210141002802d0d248210e41002802dcd2482104200741e8046a41a61a360200200741e0046a42de80808010370300200741dc046a41acc5c300360200200741d4046a420e370200200741d0046a41e28fc100360200200741c8046a4201370300200741b8046a4202370300200741b0046a4107360200200741c4046a200741a8036a360200200741949cc3003602b404200741db8fc1003602ac04200741043602a804200e41f8a3c000200441024622041b200741a8046a200141e0a3c00020041b28021011030020072d00f902210120072d00f802210e0b200720013a00ab0441012101200741013a00a8042007200e4108743b00a9040c080b024041002802d8d2484104490d00200741d39bc3003602e00541002802d4d248210141002802d0d248210e41002802dcd2482104200741c0003602e405200741a8046a41c0006a419f1a360200200741e0046a42de80808010370300200741dc046a41acc5c300360200200741d4046a420e370200200741d0046a41e28fc100360200200741c8046a4201370300200741b8046a4201370300200741b0046a4107360200200741c4046a200741a8036a360200200741b4b5c8003602b404200741db8fc1003602ac04200741043602a804200741043602ac03200141e0a3c000200441024622041b28021021012007200741e0056a3602a803200e41f8a3c00020041b200741a8046a20011103000b200741003a00ab04200741003b00a9040c060b024041002802d8d2484104490d002007411e3602e405200720074198026a3602e00541002802d4d248210e41002802d0d248210441002802dcd2482106200741e8046a41ae1a360200200741e0046a42de80808010370300200741dc046a41acc5c300360200200741d4046a420e370200200741d0046a41e28fc100360200200741c8046a4201370300200741b8046a4202370300200741b0046a4107360200200741c4046a200741e0056a360200200741a49cc3003602b404200741db8fc1003602ac04200741043602a804200441f8a3c000200641024622061b200741a8046a200e41e0a3c00020061b2802101103000b200741dc046a410f360200200741c8046a4200370300200741c0046a4280808080c000370300200741b49cc3003602d804200741013a00d004200742043703b804200141086a290300210f2007427f3703b0042007427f2001290300427f200f501b220f42ffffffffffffffffff007c22102010200f541b3703a8042007280298022106411710322201450d04200742173702ac03200720013602a80320072802d8042102024002400240024020072802dc04220141c000490d00200141808001490d012001418080808004490d02200741a8036a41004101102f20072802a80320072802b003220e6a41033a00002007200e41016a220e3602b003200741a8036a200e4104102f20072802a80320072802b003220e6a20013600002007200e41046a22053602b003200741a8036a210e0c030b200741a8036a41004101102f20072802a80320072802b003220e6a20014102743a00002007200e41016a22053602b003200741a8036a210e0c020b200741a8036a41004102102f20072802a80320072802b003220e6a20014102744101723b00002007200e41026a22053602b003200741a8036a210e0c010b200741a8036a41004104102f20072802a80320072802b003220e6a20014102744102723600002007200e41046a22053602b003200741a8036a210e0b200741d1046a2104200e20052001102f20072802a80320072802b00322056a2002200110c9081a2007200520016a22013602b00320062802002106200e20014104102f20072802a80320072802b00322016a20063600002007200141046a3602b003024020072802cc04220120072802c804470d00200741c4046a2001410110ec0120072802cc0421010b20072802c4042001410c6c6a220120072903a803370200200141086a200741a8036a41086a2201280200360200200741e0056a41086a220e200741c0046a2206290300370300200720072802cc0441016a3602cc04200741e0056a41106a2202200741c8046a2205290300370300200720072903b8043703e005200720042900003703f8022007200441076a2900003700ff0220072903a804210f200741a8036a41106a220420022903003703002001200e290300370300200720072903e0053703a803200720072900ff023700cf02200720072903f8023703c802200741a8046a41106a429601370300200741a8046a41086a200f370300200741d0046a200429030037030020052001290300370300200620072903a80337030041002101200741d8046a41003a0000200741dc046a20072800cb02360000200741d9046a20072802c802360000200741003a00a8040c060b0240200141d8006a2802004102460d00200741003a00ab04200741003b00a9040c050b0240200241ff017141014b0d00200741a8046a41086a427f370300200741dc046a4113360200200741a8046a41206a4200370300200741a8046a41186a4280808080c0003703002007427f3703a804200741e9f0c5003602d804200741013a00d004200742043703b804200741a8036a41086a200141d8026a290200220f370300200741a8036a41106a200141e0026a2902002210370300200741a8036a41186a200141e8026a29020022113703002007200141d0026a29020022123703a80320014180016a2903002113200141f0006a2903002114200741e0056a41186a22062011370300200741e0056a41106a22022010370300200741e0056a41086a2205200f370300200720123703e005412710322201450d04200741d1046a2104200742273702fc02200720013602f80241002101200741f8026a41004101102f20072802f802200728028003220e6a41cc003a00002007200e41016a220e36028003200741f8026a200e4113102f20072802f80220072802800322156a220e41002900e9f045370000200e41086a41002900f1f045370000200e410f6a41002800f8f0453600002007201541136a220e36028003200741f8026a200e4120102f20072802f80220072802800322156a220e20072903e005370000200e41086a2005290300370000200e41106a2002290300370000200e41186a20062903003700002007201541206a220e36028003200741f8026a200e4108102f20072802f802200728028003220e6a20143700002007200e41086a220e36028003200741f8026a200e4108102f20072802f802200728028003220e6a20133700002007200e41086a36028003024020072802cc04220e20072802c804470d00200741c4046a200e410110ec0120072802cc04210e0b20072802c404200e410c6c6a220e20072903f802370200200e41086a200741f8026a41086a280200360200200741e0056a41086a220e200741a8046a41086a2206290300370300200741e0056a41106a2202200741a8046a41106a2205290300370300200741e0056a41186a2215200741a8046a41186a2216290300370300200720072802cc0441016a3602cc04200741e0056a41206a2217200741a8046a41206a2218290300370300200720072903a8043703e0052007200441076a2900003700ff02200720042900003703f802200741a8036a41206a22042017290300370300200741a8036a41186a22172015290300370300200741a8036a41106a22152002290300370300200741a8036a41086a2202200e290300370300200720072903e0053703a803200720072900ff023700cf02200720072903f8023703c802200741d0046a2004290300370300201820172903003703002016201529030037030020052002290300370300200620072903a803370300200741d8046a41003a0000200741dc046a20072800cb02360000200741d9046a20072802c802360000200741003a00a8040c060b024041002802d8d2484102490d00200741d4003602e405200741fcf0c5003602e00541002802d4d248210141002802d0d248210e41002802dcd2482104200741e8046a41c601360200200741e0046a42e780808010370300200741dc046a41c8a0c800360200200741d4046a421c370200200741d0046a41aca0c800360200200741c8046a4201370300200741b8046a4201370300200741b0046a4103360200200741c4046a200741a8036a360200200741b4b5c8003602b404200741d0f1c5003602ac04200741043602ac03200741023602a804200141e0a3c000200441024622041b28021021012007200741e0056a3602a803200e41f8a3c00020041b200741a8046a20011103000b200741003a00ab04200741003b00a9040c040b200741a8046a200141d4006a10b50620072d00a80441014621010c040b41d0b6c800411941ecb6c800103c000b103b000b1039000b41012101200741013a00a8040b200741f8006a41086a220e200741a8046a410c6a290200370300200741f8006a41106a200741a8046a41146a290200370300200741f8006a41186a2204200741a8046a411c6a290200370300200741f8006a41206a2206200741a8046a41246a290200370300200741f8006a41286a200741a8046a412c6a290200370300200741f8006a41306a200741dc046a280200360200200720072902ac04370378024020010d00200741d8036a41286a2201200741f8006a412c6a290200370300200741d8036a41206a2202200741f8006a41246a2205290200370300200741d8036a41186a2215200741f8006a411c6a290200370300200741d8036a41106a2216200741f8006a41146a2217290200370300200741d8036a41086a2218200741f8006a410c6a2902003703002007200729027c3703d803200e200741d0006a41086a290300370300200520093602002006200d360200200420083602002017200c36020020072007290350370378200720033703a0012007200b360294012007200a36028801200741a8046a41286a2001290300370300200741a8046a41206a2002290300370300200741a8046a41186a2015290300370300200741a8046a41106a2016290300370300200741a8046a41086a2018290300370300200720072903d8033703a804200741e0056a200741f8006a200741a8046a10d106200041306a200741e0056a41286a290300370300200041286a200741e0056a41206a290300370300200041206a200741e0056a41186a290300370300200041186a200741e0056a41106a290300370300200041106a200741e0056a41086a290300370300200041086a20072903e005370300200041003a00000c020b200020072f00a90420072d00ab044110747222013b0001200041013a0000200041036a20014110763a000002402008450d002008410c6c2108200a210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b0240200c450d00200a450d00200c410c6c450d00200a102c0b02402009450d002009410c6c2108200b210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b200d450d01200b450d01200d410c6c450d01200b102c0c010b200020013b0001200041013a0000200041036a20014110763a000020072802e80321000240200741f0036a2802002201450d002001410c6c21082000210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b0240200741ec036a2802002201450d002001410c6c450d002000102c0b20072802f40321000240200741fc036a2802002201450d002001410c6c21082000210103400240200141046a280200450d002001280200102c0b2001410c6a2101200841746a22080d000b0b200741f8036a2802002201450d002001410c6c450d002000102c0b20074190066a24000bc23d06037f017e197f017e017f027e230022022103200241e0046b416071220224002002428080808080203702cc02200220013602a4022002200041c4b5c80020011b3602a0022002200241a0026a3602c80220024198036a200241c8026a10ab05200228029c0321042002280298032101200241a0016a20024198036a41086a41e80010c9081a0240024002400240024002400240024002402004450d002002200436023420022001360230200241306a41086a200241a0016a41e80010c90821000240024020022802c802280204450d00200241306a410472102b410021040c010b20024198036a200041e80010c9081a0b2004450d002002200436023420022001360230200241386a20024198036a41e80010c9081a02402002413c6a2802002201ad42247e2205422088a70d002005a72200417f4c0d0002400240024020000d00410421060c010b200010322206450d010b200241003602980220022006360290022002200041246e3602940220024190026a4100200110f201200228029802210602402001450d00200141246c2107200228029002200641246c6a21084100210003400240024002400240024002400240200420006a22012d00000e06010203040500010b2001410c6a2802002209417f4c0d09200141046a28020021010240024020090d004101210a0c010b20091032220a450d090b200241003602a0032002200936029c032002200a3602980320024198036a4100200910c801200228029803220a20022802a003220b6a2001200910c9081a2002200a3600a301200b20096a2109200228029c03210a4105210b0c050b4100210b2002410036009b0320024100360298032002200141046a28000036009b032002200141016a280000360298032002200141146a2900003703a0022002200141196a2900003700a50220022002280298033602a0012002200228009b033600a301200141086a280000210a2001410c6a2800002109200141106a280000210c0c040b200141106a2802002209417f4c0d07200141016a280000210c200141086a280200210d4101210b4101210102402009450d00200910322201450d070b200241003602a0032002200936029c03200220013602980320024198036a4100200910c801200228029803220a20022802a00322016a200d200910c9081a2002200c3602a001200120096a210c200228029c0321090c030b200141106a2802002209417f4c0d06200141016a280000210b200141086a28020021010240024020090d004101210a0c010b20091032220a450d060b200241003602a0032002200936029c032002200a3602980320024198036a4100200910c801200228029803220a20022802a003220c6a2001200910c9081a2002200b3602a001200c20096a210c200228029c0321094102210b0c020b200141106a2802002209417f4c0d05200141016a280000210b200141086a28020021010240024020090d004101210a0c010b20091032220a450d050b200241003602a0032002200936029c032002200a3602980320024198036a4100200910c801200228029803220a20022802a003220c6a2001200910c9081a2002200b3602a001200c20096a210c200228029c0321094103210b0c010b4104210b2002200141046a2802003600a3012001410c6a2802002109200141086a280200210a0b200820006a2201200b3a0000200141016a20022802a001360000200141046a20022800a301360000200141106a200c3602002001410c6a2009360200200141086a200a360200200141146a20022903a0023702002001411c6a200241a0026a41086a290300370200200641016a21062007200041246a2200470d000b0b20022006360298022002280230200241c0006a20024180016a20024190026a410010830320024198036a200241306a1028200241c8026a41c1dcc700410610c501200241a0026a41fda3c600410910c501200220022802303602a004200241f0026a200241a0046a410410c701200241ac016a200241a0046a41046a3602002002200241f8026a3602a4012002200241a0046a3602a8012002200241f0026a3602a001200241a8046a200241a0016a107e20022802b004220141206a2200417f4c0d010240024020000d00410121060c010b200010322206450d010b200241003602a801200220003602a401200220063602a001200241a0016a4100411010c80120022802a00120022802a80122006a220620022900c802370000200641086a200241c8026a41086a2900003700002002200041106a22003602a801200241a0016a2000411010c80120022802a00120022802a80122006a220620022903a002370000200641086a200241a0026a41086a2903003700002002200041106a22063602a80120022802a8042100200241a0016a2006200110c80120022802a001220620022802a80122096a2000200110c9081a2002200920016a22013602a801024020022802ac04450d002000102c0b2006200120024198036a10c902024020022802a401450d002006102c0b410041002802dcd2482201410120011b3602dcd24802400240024020010e020001020b41004180a0c0003602d4d248410041c4b5c8003602d0d248410041023602dcd2480c010b034041002802dcd2484101460d000b0b410041053602d8d24820022002280230220e36029c0210d405450d03200241b0036a22014200370300200241a8036a2200420037030020024198036a41086a220642003703002002420037039803200241a0016a418dddc700410810c5012006200241a0016a41086a2209290000370300200220022900a00137039803200241a0016a4199eec300410e10c50120012009290000370300200020022900a001370300200241286a20024198036a412010c601410021090240200228022c410020022802281b220f200e4d0d00200241a8046a2100200241a0016a21010c090b2001420037030020004200370300200642003703002002420037039803200241c8026a41ffdcc700410710c5012006200241c8026a41086a2209290000370300200220022900c80237039803200241a0026a41b8b3c300410c10c5012001200241a0026a41086a220a290300370300200020022903a002370300200241206a20024198036a412010c60120022802242110200228022021112001420037030020004200370300200642003703002002420037039803200241c8026a41ffdcc700410710c50120062009290000370300200220022900c80237039803200241a0026a418893c700410a10c5012001200a290300370300200020022903a002370300200241a0016a20024198036a10e1010240024020022802a00122010d00410021120c010b20022902a4012205422088a721122005a72200450d00200041ffffff3f71450d002001102c0b200241c8026a10ec0220024198036a41e9dabdf30610d505200228029c03211320022802980322142101024020022802a0032200450d0020004105742100201421010340200141206a2101200041606a22000d000b0b200120146b41057522154115490d062015410176220141ffffff3f712001470d0120014105742216417f4c0d01201610322217450d00200241003602a801200242043703a001201441606a2118201441a07f6a211941042100410021012015211a02400340201a211b4100211a4101210a0240201b417f6a220b450d000240024002400240024002402014200b4105746a201b410574220420146a41406a412010cc084100480d00201b417e6a210b201920046a21064100211a4100210903400240200b2009470d00201b210a0c080b200941016a2109200641206a2006412010cc08210a200641606a2106200a417f4a0d000b200941016a210a2009417f73201b6a210b0c010b201920046a2106024003400240200b4101470d004100210b0c020b200b417f6a210b200641206a2006412010cc082109200641606a210620094100480d000b0b201b200b490d01201b20154b0d02201b200b6b220a410176220c450d00201820046a21062014200b4105746a2109034020024198036a41186a2204200941186a220729000037030020024198036a41106a2208200941106a220d29000037030020024198036a41086a221c200941086a220f2900003703002002200929000037039803200641086a221d2900002105200641106a221e290000211f200641186a222029000021212009200629000037000020072021370000200d201f370000200f200537000020202004290300370000201e2008290300370000201d201c2903003700002006200229039803370000200641606a2106200941206a2109200c417f6a220c0d000b0b0240200b0d00200b211a0c050b0240200a41094d0d00200b211a0c050b201b20154b0d02201b200b6b210a200b417f6a21062018200b4105746a21090340201b2006490d0c2009200a41016a220a10bc012006417f6a220b20064f0d04200941606a2109200b2106200a410a490d000c040b0b200b201b41b8a3c8001059000b201b201541b8a3c800104f000b201b200b417f6a2206490d08201b201541c8a3c800104f000b200b41016a211a0b0240200120022802a401470d00200241a0016a10ae0120022802a801210120022802a00121000b200020014103746a2206200a3602042006201a3602002002200141016a22013602a8010240024020014102490d0020022802a001210003400240024002400240024020002001417f6a4103746a2206280200450d00200141037420006a220b41746a280200220a200628020422094b0d010b20014103490d022006280204210920002001417d6a221c4103746a28020421060c010b200141024d0d0420002001417d6a221c4103746a28020422062009200a6a4d0d00200141034d0d04200b41646a2802002006200a6a4b0d040b20062009490d010b2001417e6a211c0b02400240024002400240024002402001201c41016a220f4d0d002001201c4d0d012000201c410374221e6a2201280204222020012802006a22012000200f410374221b6a2200280200221d490d02200120154b0d032014201d4105746a22082000280204220d41057422006a2106200141057421092001201d6b220a200d6b2201200d4f0d04201720062001410574220010c908220c20006a2107200d4101480d0520014101480d05201820096a21012006210020072109034002400240200941606a220a200641606a220b412010cc084100480d00200a21072006210b0c010b200b21002009210a200621090b2001200941606a2206290000370000200141186a200641186a290000370000200141106a200641106a290000370000200141086a200641086a2900003700000240200a200c4b0d00200c21040c080b200141606a2101200a2109200b2106200c21042008200b490d000c070b0b200f200141d8a3c800103f000b201c200141e8a3c800103f000b201d200141f8a3c8001059000b2001201541f8a3c800104f000b20172008200010c908220120006a21070240200d4101480d00200a200d4c0d00201420096a210b20012104200121012008210003400240024020062001412010cc084100480d00200141206a220421092006210a0c010b200641206a210a20012109200621010b20002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a290000370000200041206a2100200920074f0d0320092101200a2106200a200b490d000c030b0b20012104200821000c010b200c2104200621000b20002004200720046b41607110c9081a20022802a8012201201c4d0d0220022802a0012200201e6a22062020200d6a3602042006201d3602002001200f4d0d042000201b6a2206200641086a2001200f417f736a41037410ca081a20022001417f6a22013602a801200141014b0d000b0b201a450d080c010b0b201c20014188a4c800103f000b200f20011047000b1039000b103b000b200241ac016a4104360200200241c4006a41023602002002420237023420024194c7c300360230200241043602a401200241ecc9c3003602a001200241003602cc02200241c4b5c8003602c8022002200241a0016a3602402002200241c8026a3602a801200241306a41a4c7c3001046000b41002802d8d2484105490d05200241133602a40120022002419c026a3602a00141002802d4d248210141002802d0d248210041002802dcd2482106200241d8036a418203360200200241d0036a42e080808010370300200241cc036a41b9edc300360200200241c4036a4210370200200241c0036a41d0eec300360200200241b8036a4201370300200241a8036a420237030020024198036a41086a4108360200200241b4036a200241a0016a360200200241b8eec3003602a403200241c8eec30036029c032002410536029803200041f8a3c000200641024622061b20024198036a200141e0a3c00020061b2802101103000c050b2006201b41c8a3c8001059000b024020022802a40141ffffffff0171450d0020022802a001102c0b2016450d012017102c0c010b4102210120154102490d0020142015417e6a22004105746a2106034020152000490d042006200110bc01200641606a2106200141016a21012000417f6a2200417f470d000b0b2010410020111b210120022802cc02210f20022802c802210920022802d0022100200220123602c0012002200e3602bc01200220013602b801200220153602b401200220133602b001200220143602ac01200241003602a8012002200920004105746a22003602a401200220093602a001200220123602c8042002200e3602c404200220013602c004200220153602bc04200220133602b804200220143602b404200241003602b004200220003602ac04200220093602a804200241a8046a2100200241a0016a21010b200241a0026a41106a2206200141106a2902002205370300200241a0026a41186a2204200141186a290200221f370300200241f0026a41086a220b200141086a290200370300200241f0026a41106a220c2005370300200241f0026a41186a2207201f370300200241f0026a41206a2208200141206a280200360200200241c8026a41206a220d20024198036a41206a290200370300200241c8026a41186a221c20024198036a41186a290200370300200241c8026a41106a221d20024198036a41106a290200370300200241c8026a41086a221e20024198036a41086a220a290200370300200220012902003703f00220022002290298033703c802200241a0026a41206a2201200241a0016a41206a2903003703002004200241a0016a41186a2903003703002006200241a0016a41106a290300370300200241a0026a41086a2220200241a0016a41086a290300370300200220022903a0013703a002200a200f3602002002200936029c032002410136029803200241a4036a220920022903f002370200200241ac036a220a200b290300370200200241b4036a220b200c290300370200200241bc036a220c2007290300370200200241c4036a2008280200360200200241003602c803200241cc036a20022903c802370200200241d4036a201e290300370200200241dc036a201d290300370200200241e4036a201c290300370200200241ec036a200d290300370200200241003602f40320024198046a200129030037030020024190046a200429030037030020024188046a200629030037030020024180046a2020290300370300200241f8036a20022903a002370300200241e8036a2107200241d0036a2101200241f4036a211d200241c8036a211c200241d8036a2108200241e0036a210d410021060340024002402006450d00200241186a201c10d6050240200228021822064108460d00200228021c21040c020b024020022802c8032206450d00024020022802cc032204450d00200441ffffff3f71450d002006102c0b20022802e0032206450d00200641ffffff3f71450d0020022802dc03102c0b20012000290200370200200141086a200041086a290200370200200141106a200041106a290200370200200141186a200041186a290200370200200141206a200041206a2802003602002002200f3602cc03200241003602c8030b200b290200211f200b20022903b801370200200a2902002121200a20022903b00137020020092902002122200920022903a801370200200241a8046a41086a2204200c41086a280200360200200241003602a0012002200c2902003703a804200229029c032105200220022903a00137029c0302402005a72206450d00200720022903a804370200200220053703c80320012022370300200741086a200428020036020020082021370300200d201f3703000c020b024020022802f4030d00410821060c010b200241106a201d10d60520022802142104200228021021060b024002400240200641796a0e020200010b0240200228029803450d00200228029c032201450d00024020022802a00341ffffff3f71450d002001102c0b200241b4036a28020041ffffff3f71450d00200241b0036a280200102c0b024020022802c8032201450d00024020022802cc0341ffffff3f71450d002001102c0b20022802e00341ffffff3f71450d0020022802dc03102c0b20022802f4032201450d030240200241f8036a28020041ffffff3f71450d002001102c0b2002418c046a28020041ffffff3f71450d0320024188046a280200102c0c030b200220043602a404200220063602a00441002802d8d2484104490d002002411f3602b404200241133602ac042002200241a0046a3602b00420022002419c026a3602a80441002802d4d248210641002802d0d248210441002802dcd248211e200241f9023602e001200242e0808080103703d801200241b9edc3003602d401200242103702cc01200241d0eec3003602c801200242023703c001200242023703b001200241a8eec3003602ac01200241083602a801200241c8eec3003602a401200241043602a001200641e0a3c000201e410246221e1b28021021062002200241a8046a3602bc01200441f8a3c000201e1b200241a0016a20061103000b20022802c80321060c000b0b200241306a4104722101200241b0036a22004200370300200241a8036a2206420037030020024198036a41086a220942003703002002420037039803200241c8026a41e6dcc700410710c5012009200241c8026a41086a290000370300200220022900c80237039803200241a0026a41a08ec100411110c5012000200241a0026a41086a290300370300200620022903a002370300200241086a20024198036a108904024020022802084101470d00200228020c200e470d00200241a0016a4101419acbc000411810d80502400240024020022802a0012200450d00200241a8016a28020041034d0d0002400240200e200028000022064f0d004105210641cedec30021090c010b200641056a200e490d014112210641bcdec30021090b20022802a401450d012000102c0c010b2002200e3602a0022002200e3602c80220024198036a41086a200241a0016a41086a280200360200200220022903a001370398034101419acbc000411820024198036a200241c8026a410410d9050d01411f210641b2cbc00021090b200220063602cc02200220093602c80241002802d8d2484102490d01200241043602a4012002200241c8026a3602a00141002802d4d248210041002802d0d248210641002802dcd2482109200241d8036a41ac0a360200200241d0036a42de80808010370300200241cc036a41acc5c300360200200241c4036a420e370200200241c0036a41e28fc100360200200241b8036a4201370300200241a8036a4202370300200241a0036a4107360200200241b4036a200241a0016a360200200241e890c1003602a403200241db8fc10036029c032002410236029803200641f8a3c000200941024622091b20024198036a200041e0a3c00020091b2802101103000c010b200241c8026a10d101024020022802c802410a460d00200241a0016a41086a200241c8026a41086a280200360200200220022903c8023703a00141002802d8d248450d01200241203602a4022002200241a0016a3602a00241002802d4d248210041002802d0d248210641002802dcd2482109200241d8036a41af0a360200200241d0036a42de80808010370300200241cc036a41acc5c300360200200241c4036a420e370200200241c0036a41e28fc100360200200241b8036a4201370300200241a8036a420137030020024198036a41086a4107360200200241b4036a200241a0026a360200200241f890c1003602a403200241db8fc10036029c032002410136029803200641f8a3c000200941024622091b20024198036a200041e0a3c00020091b2802101103000c010b41002802d8d2484104490d002002418091c1003602a00241002802d4d248210041002802d0d248210641002802dcd2482109200241343602a402200241d8036a41b10a360200200241d0036a42de8080801037030020024198036a41346a41acc5c300360200200241c4036a420e370200200241c0036a41e28fc100360200200241b8036a4201370300200241a8036a4201370300200241a0036a4107360200200241b4036a200241a0016a360200200241b4b5c8003602a403200241db8fc10036029c032002410436029803200241043602a401200041e0a3c000200941024622091b28021021002002200241a0026a3602a001200641f8a3c00020091b20024198036a20001103000b20024190026a102b2001102b2003240042010f0b2000201541a8a3c8001058000b070010164101460b940705017f017e077f037e047f23004180026b220224002002200136020c0240024002402002410c6a100c2203422088a72201450d002002200136021420022003a722043602102002200241106a108702024002400240024020022802000d002002280204220520022802144105762201200120054b1b22014105742206417f4c0d060240024020010d00410121070c010b200610322207450d030b2001ad210302402005450d00410021080340200241003a00b8012002280214417f6a2101200841016a210841002106024002400240024003402001417f460d0120024198016a20066a200228021022092d00003a00002002200941016a3602102002200641016a22093a00b801200220013602142001417f6a21012009210620094120470d000b200241c0016a41086a220120024198016a41086a290300370300200241c0016a41106a220620024198016a41106a290300370300200241c0016a41186a220a20024198016a41186a29030037030020022002290398013703c001200941ff0171411f4d0d01200241386a41086a2001290300220b370300200241386a41106a2006290300220c370300200241386a41186a200a290300220d370300200241186a41186a2206200d370300200241186a41106a2209200c370300200241186a41086a220a200b370300200220022903c001220b3703582002200b3703382002200b3703182003422088a722012003a7470d03200141016a220e2001490d0c2001410174220f200e200e200f491b220e4104200e41044b1b220e41ffffff3f712210200e470d0c200e410574220f41004e0d020c0c0b200641ff0171450d00200241003a00b8010b200342ffffff3f834200510d042007102c0c040b2010200e46210e2001410574201120011b2111024002400240024002402007410020011b22010d00200f450d010c030b20110d01200f0d020b200e21070c020b20012011200f103522070d010c060b200f10322207450d050b200342808080807083200f410576ad8421030b20072003422088a74105746a22012002290318370000200141186a2006290300370000200141106a2009290300370000200141086a200a29030037000020034280808080107c210320082005470d000b0b20070d030b41f2b3c800412e20024198016a41d0b2c80041e0b2c8001040000b200e450d040b1039000b20002003370204200020073602002004102c0c010b20004100360208200042013702000b20024180026a24000f0b103b000bf21d030a7f047e0d7f230041d0066b220224000240024020012802082203200128020c2204460d002001200341206a22053602082001280210210620024190036a41186a200341186a29000037030020024190036a41106a200341106a29000037030020024190036a41086a200341086a2900003703002002200329000037039003200128021421074100210302400240024002402001411c6a28020022080e020201000b410021032008210903402009410176220a20036a210b200b20032007200b4105746a20024190036a412010cc084101481b21032009200a6b220941014b0d000b0b200720034105746a20024190036a412010cc08450d010b03402001200641016a220636021020052004460d022001200541206a220a36020820024190036a41186a200541186a29000037030020024190036a41106a200541106a29000037030020024190036a41086a200541086a290000370300200220052900003703900341002103200a21050240024020080e020201000b410021032008210503402005410176220b20036a210920092003200720094105746a20024190036a412010cc084101481b21032005200b6b220541014b0d000b0b200a2105200720034105746a20024190036a412010cc080d000b0b024002400240200820034d0d00200241086a41186a200720034105746a220341186a290000220c370300200241086a41106a200341106a290000220d370300200241086a41086a200341086a290000220e37030020022003290000220f3703082001200641016a360210200141286a2802002108200141206a2802002103200141246a2802002105200241286a41186a200c370300200241286a41106a200d370300200241286a41086a200e3703002002200f37032820022005360254200220033602502002200636024c20024190036a41186a2203420037030020024190036a41106a2205420037030020024190036a41086a220942003703002002420037039003200241d8006a41ffdcc700410710c5012009200241d8006a41086a220b2900003703002002200229005837039003200241d8006a418893c700410a10c5012003200b29000037030020052002290058370300200241d8006a20024190036a10e10120022802582203410120031b2105024002402006200229025c420020031b220c422088a7490d00200ca72203450d01200341ffffff3f71450d012005102c200228024c21060c010b2006200520064105746a10b60621090240200ca72203450d00200341ffffff3f71450d002005102c0b41022103200228024c210620090d050b200228025421092002280250210102400240411b10322203450d002002421b37025c20022003360258200241d8006a4100411b10c8012002280258200228026022056a220341002900c4f143370000200341086a41002900ccf143370000200341106a41002900d4f143370000200341176a41002800dbf14336000020022005411b6a220b360260410410322203450d002002420437029403200220033602900320024190036a41004104102f200228029003220520022802980322036a20063600002002200341046a220336029803200228029403210a200241d8006a200b200310c8012002280258220b200228026022076a2005200310c9081a2002200720036a22073602600240200a450d002005102c0b200228025c210a200241c0026a4101200b200710d805024002400240024020022802c0022203450d00200241c8026a28020022054104490d002005417c714104460d0020032800002001470d002003280004220541036a20094b0d010b200241003602602002420137035841042103200241d8006a41004104102f2002280258200228026022056a20013600002002200541046a2205360260200241d8006a20054104102f20022802582205200228026022046a20093600002002200441046a220436026020024190036a41086a200241c0026a41086a280200360200200220022903c002370390034101200b200720024190036a2005200410d90521040240200228025c450d002005102c0b20040d02200921050c010b024020022802c402450d002003102c0b410121030b0240200a0d00200521060c080b200b102c200521060c070b20024190036a10b7062002280290032204450d01200241a0036a280200211020024190036a410c6a2802002111200241a4036a280200211220024190036a41086a280200211320022802940321142002410036028803200242013703800320024180036a41004104102f20022802800320022802880322036a20093600002002200341046a360288032004201320024180036a10bb0120024180036a2012108f0102402012450d0020112012410c6c6a21052011210303402003280200200341086a28020020024180036a10bb012003410c6a22032005470d000b0b20024180036a2002280288034104102f20022802800320022802880322036a20013600002002200341046a22033602880320024180036a20034104102f20022802800320022802880322036a20063600002002200341046a22033602880320024180036a20034104102f200228028003220320022802880322056a20083600002002200541046a22053602880320024190036a41e9dabdf306200241286a2003200510b806410121050240024020022d0090034101460d00410321150c010b200241fe026a20022d0093033a0000200241c0026a41086a200241a4036a290200370300200241d0026a200241ac036a290200370300200241d8026a200241b4036a290200370300200241e0026a200241bc036a290200370300200241e8026a200241c4036a290200370300200241ed026a200241c9036a290000370000200220022f0091033b01fc0220022002419c036a2902003703c00220024190036a41086a28020021162002280294032115410021050b200241bc026a41026a2217200241fc026a41026a2d00003a000020024180026a41086a2218200241c0026a41086a29030037030020024180026a41106a2219200241c0026a41106a29030037030020024180026a41186a221a200241c0026a41186a29030037030020024180026a41206a221b200241c0026a41206a29030037030020024180026a41286a221c200241c0026a41286a29030037030020024180026a41306a200241c0026a41306a290300370300200220022f01fc023b01bc02200220022903c00237038002024020050d00200241fc016a41026a20172d00003a000020024190036a41086a201829030037030020024190036a41106a201929030037030020024190036a41186a201a29030037030020024190036a41206a201b29030037030020024190036a41286a201c29030037030020024190036a412d6a20024180026a412d6a290000370000200220022f01bc023b01fc012002200229038002370390030240200228028403450d002003102c0b200220022f01fc013b01c0022002200241fe016a2d00003a00c202410021030c050b0240200228028403450d002003102c0b02402014450d002004102c0b02402012450d002012410c6c21052011210303400240200341046a280200450d002003280200102c0b2003410c6a2103200541746a22050d000b0b4101210302402010450d002011450d002010410c6c450d002011102c0b20152109201621040c030b1039000b41012103410521090c010b2003200841b4f1c300103f000b0b200241c0016a41086a220520024190036a41086a290300370300200241c0016a41106a221720024190036a41106a290300370300200241c0016a41186a221820024190036a41186a290300370300200241c0016a41206a221920024190036a41206a290300370300200241c0016a41286a221a20024190036a41286a290300370300200241c0016a412d6a221b20024190036a412d6a290000370000200220022d00c2023a00fa01200220022f01c0023b01f80120022002290390033703c00102400240024020030d00200241d8006a41186a2012360200200241d8006a41146a2010360200200241d8006a41106a2011360200200241d8006a410c6a2013360200200241d8006a41086a201436020020024182016a20022d00fa013a000020024187016a201636000020024183016a20153600002002418b016a20022903c00137000020024193016a20052903003700002002419b016a2017290300370000200241a3016a2018290300370000200241ab016a2019290300370000200241b3016a201a290300370000200241b8016a201b2900003700002002200836027c20022006360278200220013602742002200436025c20022009360258200220022f01f8013b018001024041002802d8d2484103490d00200241c0026a411c6a4121360200200241c0026a41146a4113360200200241c0026a410c6a4113360200200241133602c4022002200241d8006a3602d8022002200241d0006a3602d0022002200241d4006a3602c8022002200241cc006a3602c00241002802d4d248210341002802d0d248210541002802dcd2482109200241d0036a418304360200200241c8036a42e080808010370300200241c4036a41b9edc300360200200241bc036a4210370200200241b8036a41d0eec300360200200241b0036a4204370300200241a0036a420437030020024190036a41086a410836020020024190036a411c6a200241c0026a360200200241e0f1c30036029c03200241c8eec300360294032002410336029003200541f8a3c000200941024622091b20024190036a200341e0a3c00020091b2802101103000b2002410a3602a804200242023703f803200241ac046a200241d8006a41e80010c9081a200220024190036a3602c00220024180026a200241c0026a108102200241c0026a41086a20024180026a41086a28020036020020022002290380023703c002200241c0026a1082022105200241a8046a108302410721034106210920050d010c020b4107210320094107460d010b2002410036029803200242013703900320024190036a41004104102f20022802900320022802980322036a20013600002002200341046a22033602980320024190036a20034104102f200228029003220320022802980322056a41003600002002200541046a2205360298034101200b20072003200510ba060240200228029403450d002003102c0b200921030b0240200a450d00200b102c0b200421060c010b410821030b2000200636020420002003360200200241d0066a24000bef0401017f230041306b220224000240024002400240024002400240024020002802000e0701020304050600010b2001411c6a2802002100200128021821012002412c6a4100360200200241c4b5c8003602282002420137021c20024188efc30036021820012000200241186a103e21010c060b2002200041046a36020c2002411c3602142001411c6a280200210020022002410c6a360210200128021821012002412c6a41013602002002420137021c20024190efc3003602182002200241106a36022820012000200241186a103e21010c050b2002200041046a36020c2002411c3602142001411c6a280200210020022002410c6a360210200128021821012002412c6a41013602002002420237021c20024198efc3003602182002200241106a36022820012000200241186a103e21010c040b2002200028020436020c200241023602142001411c6a280200210020022002410c6a360210200128021821012002412c6a41013602002002420237021c200241a8efc3003602182002200241106a36022820012000200241186a103e21010c030b2001411c6a2802002100200128021821012002412c6a4100360200200241c4b5c8003602282002420137021c200241b8efc30036021820012000200241186a103e21010c020b2001411c6a2802002100200128021821012002412c6a4100360200200241c4b5c8003602282002420137021c200241c0efc30036021820012000200241186a103e21010c010b2001411c6a2802002100200128021821012002412c6a4100360200200241c4b5c8003602282002420137021c200241c8efc30036021820012000200241186a103e21010b200241306a240020010b1800200020014101472003ad4220862002ad84101810fc070b8d0101017f230041206b22062400200641086a200310b00820004101472002ad4220862001ad84200641186a200641106a2200200628020822014101461b2903002005ad4220862004ad841017210202402001450d002000280200450d00200628020c102c0b024020032802002201450d00200341046a280200450d002001102c0b200641206a240020024101460be60202027f027e230041c0006b22022400024020010d00200241286a22014200370300200241206a22034200370300200241106a41086a420037030020024200370310200241106a41968dc700410d10c501200241306a418893c700410a10c5012001200241306a41086a29000037030020032002290030370300200241306a200241106a10ff0402400240200228023022010d00200241003602082002420137030041012101410121030c010b20022002290234220437020420022001360200200442ffffff3f835021030b200241106a200210db052002350218210420023502102105024020030d002001102c0b200241c0006a240020044220862005840f0b2002413c6a4104360200200241246a41023602002002420237021420024194c7c3003602102002410436023420024184cac30036023020024100360204200241c4b5c8003602002002200241306a36022020022002360238200241106a41a4c7c3001046000bec0102047f047e02400240200128020822024105744104722203417f4c0d0020012802002101200310322204450d012000200336020420002004360200200041086a2203410036020020002002108f0102402002450d0020024105742104200328020021050340200020054120102f200141186a2900002106200141106a2900002107200141086a29000021082001290000210920032003280200220241206a2205360200200220002802006a22022009370000200241086a2008370000200241106a2007370000200241186a2006370000200141206a2101200441606a22040d000b0b0f0b103b000b1039000bac0503027f017e077f230041c0006b2202240002400240024020010d00200241286a22014200370300200241206a22034200370300200241106a41086a420037030020024200370310200241106a41bee8c700410d10c501200241306a41dcecc700410f10c5012001200241306a41086a29000037030020032002290030370300200241306a200241106a10e9042002290234210420022802302105200241106a10dd052004422088a7410020051b2206410c6c41046a2201417f4c0d012002280218210720022802142108200228021021090240024020010d00410121030c010b200110322203450d030b2004a7210a2005410420051b210b200241003602182002200136021420022003360210200241106a2006108f0102402006450d00200b2006410c6c6a2103200b210103402001280200200141086a280200200241106a10d5032001410c6a22012003470d000b0b200a410020051b2105200241106a20022802184104102f2002280210200228021822016a20093600002002200141046a2201360218200241106a20014104102f2002280210200228021822016a20083600002002200141046a2201360218200241106a20014104102f20022802102208200228021822096a200736000002402006450d002006410c6c2103200b210103400240200141046a28020041ffffffff0371450d002001280200102c0b2001410c6a2101200341746a22030d000b0b02402005450d002005410c6c450d00200b102c0b200241c0006a2400200941046aad4220862008ad840f0b2002413c6a4104360200200241246a41023602002002420237021420024194c7c3003602102002410436023420024198cac3003602302002410036020c200241c4b5c8003602082002200241306a3602202002200241086a360238200241106a41a4c7c3001046000b103b000b1039000bdc0301097f230041e0016b22012400200141106a41186a22024200370300200141106a41106a22034200370300200141106a41086a2204420037030020014200370310200141106a41bee8c700410d10c501200141c0016a41c4efc700411110c5012002200141c0016a41086a2205290000370300200320012900c001370300200141086a200141106a412010c601200128020c210620012802082107200141c0016a41186a22024200370300200141c0016a41106a2203420037030020054200370300200142003703c001200141106a41c1dcc700410610c50120052004290000370300200120012900103703c001200141106a4196a4c600410610c50120022004290000370300200320012900103703002001200141c0016a412010c6012001280204210820012802002109200242003703002003420037030020054200370300200142003703c001200141106a41ac95c400410d10c50120052004290000370300200120012900103703c001200141106a41c695c400410c10c5012002200429000037030020032001290010370300200141106a200141c0016a10f502200128025821042001280268210520002008410020091b36020820002006410020071b36020020004101200420054102461b360204200141e0016a24000bdd4608067f017e017f017e057f027e207f037e230041800d6b22022400024002400240024002400240024002400240024020010d00200241f00a6a22014200370300200241e80a6a22034200370300200241d80a6a41086a22044200370300200242003703d80a200241b0086a41bee8c700410d10c5012004200241b0086a41086a2205290000370300200220022900b0083703d80a200241f0086a4188eec700411110c5012001200241f0086a41086a2206290000370300200320022900f008370300200241206a200241d80a6a10eb042002280220210720022902242108200142003703002003420037030020044200370300200242003703d80a200241b0086a41f1ddc700410510c50120042005290000370300200220022900b0083703d80a200241f0086a41c4fec000410a10c50120012006290000370300200320022900f008370300200241206a200241d80a6a412010b903200228022021092002290224210a200142003703002003420037030020044200370300200242003703d80a200241b0086a41ac95c400410d10c50120042005290000370300200220022900b0083703d80a200241f0086a41c695c400410c10c50120012006290000370300200320022900f008370300200241206a200241d80a6a10f5022002280278210b200228026c210c2002280270210d200241106a10dd05410021054104210e4100210f02402008420020071b2210422088a72201412c6c2204450d002004412c6d22064104200641044b1bad42f0027e2208422088a70d092008a722064100480d0920061032220e450d0a200641f0026e210f0b200a420020091b21112007410420071b21122009410420091b211302402001450d00201220046a21144101200c200b41024622041b21154101200d20041b21162001410274417c6a41027641016a21172011422088a7211820024188066a41a8016a210420024188066a4188016a211920024188066a41e8006a211a200241d0066a211b20024188066a41286a210620024188066a41086a210b20024188066a4188026a211c20024188066a41ec016a210720024188066a41e8016a211d200241206a41ec016a2109200241b8056a41046a211e200241d8056a41086a211f20024188066a41386a212020132121200e2101410021052012210c0340200c28020022224103460d0141022123024020224102460d000240024020220d00200c41046a280200210d200241d80a6a41968dc700410d10c501200241f0086a41a38dc700411310c5012002200d3602b805200241d8056a200241b8056a410410c7012002201e3602a40b2002201f36029c0b2002200241b8056a3602a00b2002200241d8056a3602980b200241b0086a200241980b6a107e20022802b808220d41206a2222417f4c0d0d0240024020220d00410121230c010b202210322223450d0f0b200241003602e005200220223602dc05200220233602d805200241d8056a4100411010c80120022802d80520022802e00522226a222320022900d80a370000202341086a200241d80a6a41086a22242900003700002002202241106a22223602e005200241d8056a2022411010c80120022802d80520022802e00522226a222320022900f008370000202341086a200241f0086a41086a22252900003700002002202241106a22233602e00520022802b0082122200241d8056a2023200d10c80120022802d805222320022802e00522266a2022200d10c9081a20022026200d6a220d3602e005024020022802b408450d002022102c0b200241206a2023200d10f304200241980b6a200241206a41e80110c9081a2024200941086a290200370300200241d80a6a41106a2227200941106a290200370300200241d80a6a41186a2228200941186a290200370300200241d80a6a41206a2229200941206a290200370300200241d80a6a41286a220d200941286a290200370300200241d80a6a41306a2222200941306a290200370300200241d80a6a41386a2226200941386a280200360200200220092902003703d80a0240200228028802222a450d00200241f0086a200241980b6a41e80110c9081a200241b0086a41386a2026280200360200200241b0086a41306a2022290300370300200241b0086a41286a200d290300370300200241b0086a41206a2029290300370300200241b0086a41186a2028290300370300200241b0086a41106a2027290300370300200241b0086a41086a2024290300370300200220022903d80a3703b0080b024020022802dc05450d002023102c0b202a450d0620024188066a200241f0086a41e80110c9081a200741386a200241b0086a41386a280200360200200741306a200241b0086a41306a290300370200200741286a200241b0086a41286a290300370200200741206a200241b0086a41206a222b290300370200200741186a200241b0086a41186a222c290300370200200720022903b008370200200741086a200241b0086a41086a222d290300370200200741106a200241b0086a41106a222e2903003702002002202a3602f007200228028c08210d200241f0086a200510df0520022802142226450d072016200d6a2122200228021821232002280210212f200241980b6a200510e00520024188046a201d10cb052002200228028806200d10e105202620236a223041002030202f6b2231203120304b1b2026706b2130202341002023202f6b222f202f20234b1b2026706b2123024002402002280200450d00200228020421260c010b4100212641002802d8d2484102490d00200241f4003602dc0a20024184a2c7003602d80a4100212641002802d4d248212a41002802d0d248212f41002802dcd2482131200241d000360260200242d48080801037035820024198a3c7003602542002423137024c200241eca3c7003602482002420137034020024201370330200241b4b5c80036022c20024131360228200241eca3c700360224200241043602b40820024102360220202a41e0a3c000203141024622311b280210212a2002200241b0086a36023c2002200241d80a6a3602b008202f41f8a3c00020311b200241206a202a11030020022802f007212a0b202220304b2131202320166a2123200241b8046a41186a201c41186a290200370300200241b8046a41106a201c41106a290200370300200241b8046a41086a201c41086a290200370300201f200b41086a290200370300200241d8056a41106a200b41106a290200370300200241d8056a41186a200b41186a2902003703002002201c2902003703b8042002200b2902003703d805200228028c06212f20024198056a41086a201b41086a29020037030020024198056a41106a201b41106a29020037030020024198056a41186a201b41186a290200370300200241f8046a41086a201a41086a290200370300200241f8046a41106a201a41106a290200370300200241f8046a41186a201a41186a290200370300200241d8046a41086a201941086a290200370300200241d8046a41106a201941106a290200370300200241d8046a41186a201941186a2902003703002002201b290200370398052002201a2902003703f804200220192902003703d804200241206a41386a200441386a290200370300200241206a41306a200441306a290200370300200241206a41286a200441286a290200370300200241206a41206a200441206a290200370300200241206a41186a200441186a290200370300200241206a41106a200441106a290200370300200241206a41086a200441086a290200370300200241b8056a41186a200641186a290200370300200241b8056a41106a200641106a290200370300200241b8056a41086a200641086a29020037030020022004290200370320200220062902003703b8052029200241f0086a41206a2903003703002028200241f0086a41186a2903003703002027200241f0086a41106a29030037030020242025290300370300200220022903f0083703d80a202b200241980b6a41206a290300370300202c200241980b6a41186a290300370300202e200241980b6a41106a290300370300202d200241980b6a41086a290300370300200220022903980b3703b008200241f8056a41086a20024188046a41086a28020036020020022002290388043703f805200242013703f007024020022802f807450d00202a102c0b2022203020311b212a20222023492123200241003602800820022802fc072124200241013602fc070240200228028408450d002024102c0b2022202a20231b212a0c010b200520184f0d072021280200210d200241b0086a41968dc700410d10c501200241f0086a41a38dc700411310c5012002200d3602b805200241d8056a200241b8056a410410c7012002201e3602a40b2002201f36029c0b2002200241b8056a3602a00b2002200241d8056a3602980b200241d80a6a200241980b6a107e20022802e00a220d41206a2222417f4c0d0c0240024020220d00410121230c010b202210322223450d0e0b200241003602e005200220223602dc05200220233602d805200241d8056a4100411010c80120022802d80520022802e00522226a222320022900b008370000202341086a200241b0086a41086a22242900003700002002202241106a22223602e005200241d8056a2022411010c80120022802d80520022802e00522226a222320022900f008370000202341086a200241f0086a41086a222b2900003700002002202241106a22233602e00520022802d80a2122200241d8056a2023200d10c80120022802d805222320022802e00522266a2022200d10c9081a20022026200d6a220d3602e005024020022802dc0a450d002022102c0b200241206a2023200d10f304200241980b6a200241206a41e80110c9081a200241d80a6a41086a2227200941086a290200370300200241d80a6a41106a2228200941106a290200370300200241d80a6a41186a2229200941186a290200370300200241d80a6a41206a2225200941206a290200370300200241d80a6a41286a220d200941286a290200370300200241d80a6a41306a2222200941306a290200370300200241d80a6a41386a2226200941386a280200360200200220092902003703d80a0240200228028802222a450d00200241f0086a200241980b6a41e80110c9081a200241b0086a41386a2026280200360200200241b0086a41306a2022290300370300200241b0086a41286a200d290300370300200241b0086a41206a2025290300370300200241b0086a41186a2029290300370300200241b0086a41106a202829030037030020242027290300370300200220022903d80a3703b0080b024020022802dc05450d002023102c0b202a450d0820024188066a200241f0086a41e80110c9081a200741386a200241b0086a41386a280200360200200741306a200241b0086a41306a290300370200200741286a200241b0086a41286a290300370200200741206a200241b0086a41206a222c290300370200200741186a200241b0086a41186a222d290300370200200720022903b008370200200741086a2024290300370200200741106a200241b0086a41106a222e2903003702002002202a3602f007200228028c08210d200241f0086a200510df0520022802142226450d092015200d6a2122200228021821232002280210212f200241980b6a200510e00520024188046a201d10cb05200241086a200228028806200d10e105202620236a223041002030202f6b2231203120304b1b2026706b2130202341002023202f6b222f202f20234b1b2026706b2123024002402002280208450d00200228020c21260c010b4100212641002802d8d2484102490d00200241f4003602dc0a20024184a2c7003602d80a4100212641002802d4d248212a41002802d0d248212f41002802dcd2482131200241d000360260200242d48080801037035820024198a3c7003602542002423137024c200241eca3c7003602482002420137034020024201370330200241b4b5c80036022c20024131360228200241eca3c700360224200241043602b40820024102360220202a41e0a3c000203141024622311b280210212a2002200241b0086a36023c2002200241d80a6a3602b008202f41f8a3c00020311b200241206a202a11030020022802f007212a0b202220304b2131202320156a2123200241b8046a41186a201c41186a290200370300200241b8046a41106a201c41106a290200370300200241b8046a41086a201c41086a290200370300201f200b41086a290200370300200241d8056a41106a200b41106a290200370300200241d8056a41186a200b41186a2902003703002002201c2902003703b8042002200b2902003703d805200228028c06212f20024198056a41086a201b41086a29020037030020024198056a41106a201b41106a29020037030020024198056a41186a201b41186a290200370300200241f8046a41086a201a41086a290200370300200241f8046a41106a201a41106a290200370300200241f8046a41186a201a41186a290200370300200241d8046a41086a201941086a290200370300200241d8046a41106a201941106a290200370300200241d8046a41186a201941186a2902003703002002201b290200370398052002201a2902003703f804200220192902003703d804200241206a41386a200441386a290200370300200241206a41306a200441306a290200370300200241206a41286a200441286a290200370300200241206a41206a200441206a290200370300200241206a41186a200441186a290200370300200241206a41106a200441106a290200370300200241206a41086a200441086a290200370300200241b8056a41186a200641186a290200370300200241b8056a41106a200641106a290200370300200241b8056a41086a200641086a29020037030020022004290200370320200220062902003703b8052025200241f0086a41206a2903003703002029200241f0086a41186a2903003703002028200241f0086a41106a2903003703002027202b290300370300200220022903f0083703d80a202c200241980b6a41206a290300370300202d200241980b6a41186a290300370300202e200241980b6a41106a2903003703002024200241980b6a41086a290300370300200220022903980b3703b008200241f8056a41086a20024188046a41086a28020036020020022002290388043703f805200242013703f007024020022802f807450d00202a102c0b2022203020311b212a20222023492123200241003602800820022802fc072124200241013602fc070240200228028408450d002024102c0b2022202a20231b212a0b200241980b6a41206a200241d80a6a41206a290300370300200241980b6a41186a200241d80a6a41186a290300370300200241980b6a41106a200241d80a6a41106a290300370300200241980b6a41086a200241d80a6a41086a290300370300200241f0086a41086a200241b0086a41086a290300370300200241f0086a41106a200241b0086a41106a290300370300200241f0086a41186a200241b0086a41186a290300370300200241f0086a41206a200241b0086a41206a290300370300200220022903d80a3703980b200220022903b0083703f008200241a8046a41086a200241f8056a41086a28020036020020024188046a41186a200241d8056a41186a29030037030020024188046a41106a200241d8056a41106a29030037030020024188046a41086a201f290300370300200241e8036a41186a200241b8056a41186a290300370300200241e8036a41106a200241b8056a41106a290300370300200241e8036a41086a200241b8056a41086a290300370300200220022903f8053703a804200220022903d80537038804200220022903b8053703e803200241c8036a41186a20024198056a41186a290300370300200241c8036a41106a20024198056a41106a290300370300200241c8036a41086a20024198056a41086a29030037030020022002290398053703c803200241a8036a41186a200241f8046a41186a290300370300200241a8036a41106a200241f8046a41106a290300370300200241a8036a41086a200241f8046a41086a290300370300200220022903f8043703a80320024188036a41186a200241d8046a41186a29030037030020024188036a41106a200241d8046a41106a29030037030020024188036a41086a200241d8046a41086a290300370300200220022903d804370388032020200241206a41386a29030037030020024188066a41306a200241206a41306a2903003703002006200241206a41286a29030037030020024188066a41206a200241206a41206a29030037030020024188066a41186a200241206a41186a29030037030020024188066a41106a200241206a41106a290300370300200b200241206a41086a2903003703002002200229032037038806200241e8026a41186a200241b8046a41186a290300370300200241e8026a41106a200241b8046a41106a290300370300200241e8026a41086a200241b8046a41086a290300370300200220022903b8043703e802410021230b20012023360200200241980b6a41086a2903002108200241980b6a41106a290300210a200241980b6a41186a2903002132200241980b6a41206a290300213320022903980b2134200141306a202a3602002001412c6a200d360200200141246a20333702002001411c6a2032370200200141146a200a3702002001410c6a2008370200200141046a20343702002001413c6a200241f0086a41086a290300370200200141346a20022903f008370200200141c4006a200241f0086a41106a290300370200200141cc006a200241f0086a41186a290300370200200141d4006a200241f0086a41206a290300370200200241a8046a41086a280200212220022903a8042108200141ec006a202f360200200141e8006a2026360200200141e4006a2022360200200141dc006a200837020020014188016a20024188046a41186a29030037020020014180016a20024188046a41106a290300370200200141f8006a20024188046a41086a290300370200200141f0006a200229038804370200200141a8016a200241e8036a41186a290300370200200141a0016a200241e8036a41106a29030037020020014198016a200241e8036a41086a29030037020020014190016a20022903e803370200200141c8016a200241c8036a41186a290300370200200141c0016a200241c8036a41106a290300370200200141b8016a200241c8036a41086a290300370200200141b0016a20022903c803370200200141e8016a200241a8036a41186a290300370200200141e0016a200241a8036a41106a290300370200200141d8016a200241a8036a41086a290300370200200141d0016a20022903a80337020020014188026a20024188036a41186a29030037020020014180026a20024188036a41106a290300370200200141f8016a20024188036a41086a290300370200200141f0016a200229038803370200200141c0026a20024188066a41306a290300370200200141b8026a2006290300370200200141b0026a20024188066a41206a290300370200200141a8026a20024188066a41186a290300370200200141a0026a20024188066a41106a29030037020020014198026a200b29030037020020014190026a200229038806370200200141c8026a2020290300370200200141e8026a200241e8026a41186a290300370200200141e0026a200241e8026a41106a290300370200200141d8026a200241e8026a41086a290300370200200141d0026a20022903e802370200200141f0026a2101202141046a2121200541016a2105200c412c6a220c2014470d000b201721050b02402010a72201450d002001412c6c450d002012102c0b200241d80a6a41186a4200370300200241d80a6a41106a4200370300200241d80a6a41086a22014200370300200242003703d80a200241b0086a41bee8c700410d10c5012001200241b0086a41086a290000370300200220022900b0083703d80a200241f0086a41fcefc700410910c501200341086a200241f0086a41086a220d290000370000200320022900f008370000200241206a200241d80a6a10f90420022802202201410420011b21262002290224420020011b2210422088a72201450d072026200141346c6a211b200241206a41276a2122200241206a41206a2123200241206a41186a2107200241206a41106a2109202621040340200441086a2d00002106200429020021082022200441306a2800003600002023200441296a2900003703002007200441216a2900003703002009200441196a290000370300200241206a41086a2201200441116a2900003703002002200441096a29000037032020064102460d08200241980b6a41276a220b2022280000360000200241980b6a41206a220c2023290300370300200241980b6a41186a2007290300220a370300200241980b6a41106a20092903002232370300200241980b6a41086a200129030022333703002002200229032022343703980b20024188066a41276a200b28000036000020024188066a41206a200c29030037030020024188066a41186a2221200a37030020024188066a41106a2219203237030020024188066a41086a221a203337030020022034370388062008a7210b4100210c024020064101470d0020072021290300370300200920192903003703002001201a29030037030020022002290388063703204101210c0b200241f0086a41186a22062007290300370300200241f0086a41106a22212009290300370300200d2001290300370300200241b0086a41026a2219200241d80a6a41026a2d00003a0000200220022903203703f008200220022f00d80a3b01b0082005200b4d0d072008422088a7211a0240200e200b41f0026c6a22012802000d00200141e0006a4100360200200141dc006a220b280200211c200b4101360200200141e4006a280200450d00201c102c0b200141013602002001201a360204200141086a200c3a0000200141216a2006290300370000200141196a2021290300370000200141116a200d290300370000200120022903f008370009200120022f01b0083b00292001412b6a20192d00003a00002001412c6a200241206a41c40210c9081a200441346a2204201b470d000c080b0b20024194066a4104360200200241346a41023602002002420237022420024194c7c3003602202002410436028c06200241b0cac300360288062002410036029c0b200241c4b5c8003602980b200220024188066a3602302002200241980b6a36029006200241206a41a4c7c3001046000b41c2a1c700413241f4a1c700105c000b41d0c6c300413941a0fcc700103c000b2005201841f8a2c700103f000b41c2a1c70041324188a3c700105c000b41d0c6c300413941a0fcc700103c000b200b200541d8e8c300103f000b02402010a72201450d00200141346c450d002026102c0b0240201142ffffffff0383500d002013102c0b200541f0026c4104722201417f4c0d00200110322204450d01200241003602282002200136022420022004360220200241206a2005108f0102402005450d00200541f0026c21074100210403400240024002400240200e20046a22012802000e03000102030b200241206a20022802284101102f200228022020022802286a41003a00002002200228022841016a360228200241206a200141046a10e2052001412c6a2802002109200241206a20022802284104102f200228022020022802286a20093600002002200228022841046a2209360228200141306a2802002106200241206a20094104102f200228022020022802286a20063600002002200228022841046a360228200241206a200141346a10e205200241206a200141dc006a10e305200141e8006a2802002109200241206a20022802284104102f200228022020022802286a20093600002002200228022841046a360228200241206a200141d0026a10e405200241206a200141ec006a10c8040c020b200241206a20022802284101102f200228022020022802286a41013a00002002200228022841016a360228200141046a200241206a10b1050c010b200241206a20022802284101102f200228022020022802286a41023a00002002200228022841016a3602280b2007200441f0026a2204470d000b0b200235022821082002350220210a02402005450d00200541f0026c2104200e21010340024020012802000d00200141e0006a4100360200200141dc006a2205280200210720054101360200200141e4006a280200450d002007102c0b200141f0026a2101200441907d6a22040d000b0b0240200f450d00200f41f0026c450d00200e102c0b200241800d6a24002008422086200a840f0b103b000b1039000bfd0402077f017e230041c0006b22022400200241286a22034200370300200241206a22044200370300200241106a41086a2205420037030020024200370310200241106a41f1ddc700410510c501200241306a41c4fec000410a10c5012003200241306a41086a220629000037030020042002290030370300200241306a200241106a412010b90320022802302207410420071b2108024002402002290234420020071b2209422088a7220720014b0d0020034200370300200442003703002005420037030020024200370310200241106a41bee8c700410d10c501200241306a41b4edc700410f10c50120032006290000370300200420022900303703002002200241106a10f5040240200228020022060d00200041023a00040c020b2002280204210502400240200241086a28020022030d00410221030c010b200120076b21072003410274417c6a41027641016a2101410021042006210302400340200341286a2802002007460d012003412c6a21032001200441016a2204470d000b410221030c010b200020032802003602002000200341046a2900003700052000410d6a2003410c6a290000370000200041156a200341146a2900003700002000411d6a2003411c6a290000370000410121030b200020033a00042005450d012005412c6c450d012006102c0c010b200820014102746a2802002107200041003a000420002007360200200020022900103700052000410d6a2005290000370000200041156a20042900003700002000411d6a2003290000370000200041256a20022f00303b0000200041276a200241306a41026a2d00003a00000b02402009a72203450d00200341ffffffff0371450d002008102c0b200241c0006a24000bd40704077f017e027f017e230041306b22022400200241186a22034200370300200241106a22044200370300200241086a2205420037030020024200370300200241f1ddc700410510c501200241206a41c4fec000410a10c5012003200241206a41086a220629000037030020042002290020370300200241206a2002412010b90320022802202207410420071b2108024002402002290224420020071b2209422088a7220720014b0d0020034200370300200442003703002005420037030020024200370300200241206a41bee8c700410d10c5012005200629000037030020022002290020370300200241206a41b4edc700410f10c5012003200629000037030020042002290020370300200241206a200210f50420022802244100200228022022031b210a2003410420031b210b0240024002402003450d0020062802002203450d00200120076b21052003410274417c6a41027641016a210641002107200b21030340200341286a2802002005460d022003412c6a21032006200741016a2207470d000b0b200241186a4200370300200241106a4200370300200241086a2203420037030020024200370300200241206a41bee8c700410d10c5012003200241206a41086a220729000037030020022002290020370300200241206a4188eec700411110c501200441086a200729000037000020042002290020370000200241206a200210eb0420022802202203410420031b210702400240024002402002290224420020031b220c422088a720014d0d004102210520072001412c6c6a2203280200417f6a0e020200010b200041023a00040c020b20002003280204360200200020032900083700052000410d6a200341106a290000370000200041156a200341186a2900003700002000411d6a200341206a290000370000410121050b200020053a00040b200ca72203450d012003412c6c450d012007102c0c010b20032802002107200041013a0004200020073602002000200341046a2900003700052000410d6a2003410c6a290000370000200041156a200341146a2900003700002000411d6a2003411c6a290000370000200041256a20022f00003b0000200041276a200241026a2d00003a00000b200a450d01200a412c6c450d01200b102c0c010b200820014102746a2802002107200041003a000420002007360200200020022900003700052000410d6a2005290000370000200041156a20042900003700002000411d6a2003290000370000200041256a20022f00203b0000200041276a200241206a41026a2d00003a00000b02402009a72203450d00200341ffffffff0371450d002008102c0b200241306a24000bd50502097f017e230041e0016b22032400200341c0016a41186a22044200370300200341c0016a41106a22054200370300200341c0016a41086a22064200370300200342003703c001200341c0016a41ac95c400410d10c501200341106a41c695c400410c10c5012004200341106a41086a220729000037030020052003290010370300200341106a200341c0016a10f5022003280258210820032802682109200341106a41186a22054200370300200341106a41106a220442003703002007420037030020034200370310200341c0016a41bee8c700410d10c50120072006290000370300200320032900c001370310200341c0016a41c4efc700411110c50120052006290000370300200420032900c001370300200341086a200341106a412010c6014100210a02400240200328020c410020032802081b220b20024b0d0020054200370300200442003703002007420037030020034200370310200341c0016a41bee8c700410d10c50120072006290000370300200320032900c001370310200341c0016a41dcecc700410f10c501200441086a2006290000370000200420032900c001370000200341c0016a200341106a10e90420032802c0012206410420061b2105024020032902c401420020061b220c422088a7220620014b0d0002402006450d002006410c6c21072005210603400240200641046a28020041ffffffff0371450d002006280200102c0b2006410c6a2106200741746a22070d000b0b200ca72206450d012006410c6c450d012005102c0c010b02404101200820094102461b22040d0041a0fac70041194184aac800103c000b2006410c6c21072002200b6b20046e20016a20067021042005210603400240200641046a28020041ffffffff0371450d002006280200102c0b2006410c6a2106200741746a22070d000b4101210a200ca72206450d012006410c6c450d012005102c0c010b0b200020043602042000200a360200200341e0016a24000b7301017f024020012d00044102470d002000200041086a22012802004101102f200028020020012802006a41003a00002001200128020041016a3602000f0b2000200041086a22022802004101102f200028020020022802006a41013a00002002200228020041016a3602002001200010b1050bbc0201057f200141046a2802002202410376210320012802002104024002402002418004490d002003410274210102402002418080084f0d002000200041086a22052802004102102f200028020020052802006a20014101723b00002005200528020041026a22063602000c020b2000200041086a22052802004104102f200028020020052802006a20014102723600002005200528020041046a22063602000c010b2000200041086a22012802004101102f200028020020012802006a20034102743a00002001200128020041016a22063602000b0240024020030d00410021010c010b410121012003410820024107716b22024d0d0041024101200320026b22014107711b20014103766a21010b200020062001102f2000280200200041086a22002802006a2004200110c9081a2000200028020020016a3602000bce0101047f230041106b220224000240412010322203450d002002422037020420022003360200200241004120102f20022802002204200228020822056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a22013602082000200041086a22032802002001102f200028020020032802006a2004200110c9081a2003200328020020016a36020002402002280204450d002004102c0b200241106a24000f0b1039000bae0902057f027e230041f0026b220224002002200041c4b5c80020011b200110e60502400240024020022d000422004103460d00200228020021010240024002400240024020000e03010200010b200241c0026a41968dc700410d10c501200241d0026a41a38dc700411310c501200220013602ec02200241b0026a200241ec026a410410c701200241146a200241ec026a41046a3602002002200241b8026a36020c2002200241ec026a3602102002200241b0026a360208200241e0026a200241086a107e20022802e802220041206a2203417f4c0d050240024020030d00410121040c010b200310322204450d070b200241003602b802200220033602b402200220043602b002200241b0026a4100411010c80120022802b00220022802b80222036a220420022900c002370000200441086a200241c0026a41086a2900003700002002200341106a22033602b802200241b0026a2003411010c80120022802b00220022802b80222036a220420022900d002370000200441086a200241d0026a41086a2900003700002002200341106a22043602b80220022802e0022103200241b0026a2004200010c80120022802b002220420022802b80222056a2003200010c9081a2002200520006a22003602b802024020022802e402450d002003102c0b200241086a2004200010f30420024184026a2802002105200241fc016a2802002103200241f8016a280200210620022802f0012100024020022802b402450d002004102c0b20000d02200241086a200110e7050c030b200110e805200241086a200110e7050c020b200241086a200110e7050c010b02402006450d002000102c0b02402005450d002003450d002003102c0b200241023602200b410110322201450d02200242013702d402200220013602d00220022802202100200241d0026a41004101102f20022802d002220120022802d80222036a21040240024020004102470d00200441003a0000200341016a21000c010b200441013a00002002200341016a3602d802200241306a200241d0026a10b70520022802182101200241d0026a20022802d8024104102f20022802d00220022802d80222006a20013600002002200041046a22013602d802200228021c2100200241d0026a20014104102f20022802d00220022802d80222016a20003600002002200141046a22013602d802200241106a290300210720022903082108200241d0026a20014110102f20022802d00220022802d80222016a22002007370008200020083700002002200141106a3602d802200241d0026a200241206a10be0320022802282100200241d0026a20022802d8024104102f20022802d002220120022802d80222036a20003600000240200241346a280200450d002002280230102c0b200341046a2100200241c4006a2802002203450d00200341246c450d00200241c0006a280200102c0b200241f0026a24002000ad4220862001ad840f0b200241dc026a41043602002002411c6a41023602002002420237020c20024194c7c300360208200241043602d402200241cccac3003602d002200241003602c402200241c4b5c8003602c0022002200241d0026a3602182002200241c0026a3602d802200241086a41a4c7c3001046000b103b000b1039000b6101037f4103210302400240200241044f0d000c010b2001280000210420024104460d004100210502400240024020012d00040e03020100030b410221050c010b410121050b2005410320024105461b21030b200020033a0004200020043602000bb90c03087f017e057f23004180036b22022400200241a0016a200110b703200241f8006a41086a2203200241a0016a41206a290300370300200241f8006a41106a2204200241c8016a290300370300200241f8006a41186a2205200241d0016a290300370300200241f8006a41206a2206200241d8016a2903003703002002200241a0016a41186a290300370378024002400240024020022802a0012207450d00200241b4016a2802002108200241a0016a41106a2802002109200241a0016a41086a290300210a20022802a401210b200241d0006a41206a2006290300370300200241d0006a41186a2005290300370300200241d0006a41106a2004290300370300200241d0006a41086a20032903003703002002200229037837035020054200370300200442003703002003420037030020024200370378200241d4026a41ac95c400410d10c5012003200241d4026a41086a290000370300200220022900d402370378200241e4026a41c695c400410c10c5012005200241e4026a41086a290000370300200420022900e402370300200241a0016a200241f8006a10f5024100210541002106410021034100210c024020022802f8014102460d0020022802c801210c20022802cc01210320022802d401210620022802d80121050b20024190016a420037030020024188016a4200370300200241f8006a41086a220d420037030020024200370378200241d4026a41c1dcc700410610c501200d200241d4026a41086a290000370300200220022900d402370378200241e4026a4196a4c600410610c501200441086a200241e4026a41086a290000370000200420022900e402370000200241206a200241f8006a412010c601200228022021042002280224210d200241186a200110c803200d417f6a417f20041b2104024002402002280218450d004100210d02402004200228021c220e4f0d000c020b41002004200e6b220e200e20044b1b200c490d010b200320046a210f4101210d0b200241d4026a4181dec700410310c501200241e4026a41a4bfc000411510c501200220013602f402200241f8026a200241f4026a410410c701200241ac016a200241f4026a41046a360200200220024180036a3602a4012002200241f4026a3602a8012002200241f8026a3602a001200241f8006a200241a0016a107e200228028001220441206a2201417f4c0d020240024020010d00410121030c010b200110322203450d040b200241003602a801200220013602a401200220033602a001200241a0016a4100411010c80120022802a00120022802a80122016a220320022900d402370000200341086a200241d4026a41086a2900003700002002200141106a22013602a801200241a0016a2001411010c80120022802a00120022802a80122016a220320022900e402370000200341086a200241e4026a41086a2900003700002002200141106a22033602a80120022802782101200241a0016a2003200410c80120022802a001220320022802a801220c6a2001200410c9081a2002200c20046a22043602a8010240200228027c450d002001102c0b200241e8026a41003a0000200241003602e402200241106a20032004200241e4026a4105410010b704024002402002280210450d00200220022802142204410520044105491b36027c2002200241e4026a360278200241086a200241f8006a108702200228020c210420022802084521010c010b410021010b024020022802a401450d002003102c0b20004200370308200042003703002000200536021420002006360210200241286a41086a2203200241d0006a41086a290300370300200241286a41106a2205200241d0006a41106a290300370300200241286a41186a2206200241d0006a41186a290300370300200241286a41206a220c200241d0006a41206a290300370300200220022903503703282000413c6a2008360200200041386a2009360200200041306a200a3703002000412c6a200b360200200041286a2007360200200041206a2004410020011b3602002000200f36021c2000200d360218200041c0006a2002290328370300200041c8006a2003290300370300200041d0006a2005290300370300200041d8006a2006290300370300200041e0006a200c2903003703000c010b200041023602180b20024180036a24000f0b103b000b1039000ba50e01147f230041a0086b2201240020014188026a41968dc700410d10c50120014198066a41a38dc700411310c501200120003602f80120014180086a200141f8016a410410c701200141fc036a200141f8016a41046a360200200120014188086a3602f4032001200141f8016a3602f803200120014180086a3602f00320014190086a200141f0036a107e024002400240200128029808220241206a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b20014100360288082001200336028408200120043602800820014180086a4100411010c80120012802800820012802880822036a2204200129008802370000200441086a20014188026a41086a2900003700002001200341106a22033602880820014180086a2003411010c80120012802800820012802880822036a2204200129009806370000200441086a20014198066a41086a2900003700002001200341106a220336028808200128029008210420014180086a2003200210c801200128028008220320012802880822056a2004200210c9081a2001200520026a2202360288080240200128029408450d002004102c0b200141f0036a2003200210f304024020012802d8052204450d002003200210b4010b20014198066a200141f0036a41e80110c9081a200141f0056a2802002106200141ec056a2802002107200141e8056a2802002108200141e4056a2802002109200141e0056a280200210a20012802dc05210b02402004450d00200120014198066a41e80110c9081a0b0240200128028408450d002003102c0b20014188026a41968dc700410d10c50120014198066a41bc92c700411e10c501200120003602f80120014180086a200141f8016a410410c701200141fc036a200141f8016a41046a360200200120014188086a3602f4032001200141f8016a3602f803200120014180086a3602f00320014190086a200141f0036a107e200128029808220241206a2203417f4c0d000240024020030d00410121000c010b200310322200450d020b20014100360288082001200336028408200120003602800820014180086a4100411010c80120012802800820012802880822036a2200200129008802370000200041086a20014188026a41086a2900003700002001200341106a22033602880820014180086a2003411010c80120012802800820012802880822036a2200200129009806370000200041086a20014198066a41086a2900003700002001200341106a220336028808200128029008210020014180086a2003200210c801200128028008220320012802880822056a2000200210c9081a2001200520026a2202360288080240200128029408450d002000102c0b200141f0036a2003200210ee04024020012802f0032200450d002003200210b4010b20014198046a280200210c20014194046a280200210d20014190046a280200210e2001418c046a280200210f20014188046a280200211020014184046a280200211120014180046a2802002112200141fc036a2802002113200141f0036a41086a280200210220012802f403210520014198066a41086a2214200141a4046a28020036020020012001419c046a290200370398060240024020000d00410021000c010b200141e8016a41086a201428020036020020012001290398063703e8010b0240200128028408450d002003102c0b20014188026a200141e80110c9081a200141f8016a41086a200141e8016a41086a280200360200200120012903e8013703f801024002402004450d002000450d0120014198066a20014188026a41e80110c9081a200141f0036a20014198066a41047241e40110c9081a200141fc056a200c360200200141f8056a200d360200200141f4056a200e360200200141f0056a200f360200200141ec056a2010360200200141e8056a2011360200200141e4056a2012360200200141e0056a2013360200200141dc056a2002360200200141f0036a41e8016a200536020020014180066a20012903f80137030020014188066a20014180026a280200360200200120003602d4052001200736028808200120083602840820012009360280082001200a360298082001200b3602940820012004360290082006200141f0036a20014180086a20014190086a1084080c040b2000450d0302402002450d002002410c6c21032000210203400240200241046a280200450d002002280200102c0b2002410c6a2102200341746a22030d000b0b02402005450d002005410c6c450d002000102c0b02402011450d0020114104742103201341046a210203400240200241046a280200450d002002280200102c0b200241106a2102200341706a22030d000b0b02402012450d002013450d00201241ffffffff0071450d002013102c0b02402010450d00200f450d002010102c0b200c450d03200d450d03200d102c0c030b0240200a450d002004102c0b2007450d022009450d022009102c0c020b103b000b1039000b200141a0086a24000bd10701057f230041f0026b220224002002200041c4b5c80020011b200110e60502400240024020022d000422004103460d00200228020021010240024002400240024020000e03010200010b200241c0026a41968dc700410d10c501200241d0026a41a38dc700411310c501200220013602ec02200241b0026a200241ec026a410410c701200241146a200241ec026a41046a3602002002200241b8026a36020c2002200241ec026a3602102002200241b0026a360208200241e0026a200241086a107e20022802e802220041206a2203417f4c0d050240024020030d00410121040c010b200310322204450d070b200241003602b802200220033602b402200220043602b002200241b0026a4100411010c80120022802b00220022802b80222036a220420022900c002370000200441086a200241c0026a41086a2900003700002002200341106a22033602b802200241b0026a2003411010c80120022802b00220022802b80222036a220420022900d002370000200441086a200241d0026a41086a2900003700002002200341106a22043602b80220022802e0022103200241b0026a2004200010c80120022802b002220420022802b80222056a2003200010c9081a2002200520006a22003602b802024020022802e402450d002003102c0b200241086a2004200010f30420024184026a2802002105200241fc016a2802002103200241f8016a280200210620022802f0012100024020022802b402450d002004102c0b20000d02200241086a200110b7030c030b200110e805200241086a200110b7030c020b200241086a200110b7030c010b02402006450d002000102c0b02402005450d002003450d002003102c0b200241003602080b410110322201450d02200242013702d402200220013602d00202400240200228020822030d00200241d0026a41004101102f20022802d002220120022802d80222006a41003a0000200041016a21000c010b200241d0026a41004101102f20022802d00220022802d80222016a41013a00002002200141016a3602d802200241086a200241d0026a10b70520022802d802210020022802d00221010240200228020c450d002003102c0b2002411c6a2802002203450d00200341246c450d00200241186a280200102c0b200241f0026a24002000ad4220862001ad840f0b200241dc026a41043602002002411c6a41023602002002420237020c20024194c7c300360208200241043602d402200241e8cac3003602d002200241003602c402200241c4b5c8003602c0022002200241d0026a3602182002200241c0026a3602d802200241086a41a4c7c3001046000b103b000b1039000bfe10020d7f017e23004180056b220224002002428080808080203702ac042002200136021c2002200041c4b5c80020011b22003602182002200241186a3602a8040240024020014104490d0020022001417c6a36021c2002200041046a36021820002800002103200241d0006a200241a8046a10b20520022802502204450d00200241a0026a41086a220120024184016a2802003602002002200241fc006a2902003703a002200241f8006a2802002105200241f4006a2802002106200241f0006a2802002107200241ec006a2802002108200241e8006a2802002109200241e4006a280200210a200241e0006a280200210b200241dc006a280200210c200241d0006a41086a280200210d2002280254210e0240024020022802a804280204450d000240200d450d00200d410c6c21002004210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b0240200e450d00200e410c6c450d002004102c0b0240200a450d00200a4104742100200c41046a210103400240200141046a280200450d002001280200102c0b200141106a2101200041706a22000d000b0b0240200b450d00200c450d00200b41ffffffff0071450d00200c102c0b02402009450d002008450d002009102c0b410021042005450d012006450d012006102c0c010b200241d0036a41086a2001280200360200200220022903a0023703d0030b2004450d00200241086a41086a200241d0036a41086a2802002201360200200220022903d003220f370308200241c0006a2005360200200241186a41206a2007360200200241346a20083602002002412c6a200a360200200241186a41106a200b360200200241c4006a200f370200200241cc006a20013602002002200636023c200220093602302002200c3602242002200d3602202002200e36021c20022004360218200241e8006a22014200370300200241d0006a41106a22004200370300200241d0006a41086a220e420037030020024200370350200241a0026a41c1dcc700410610c501200e200241a0026a41086a2209290000370300200220022900a002370350200241a0026a4196a4c600410610c50120012009290000370300200020022900a0023703002002200241d0006a412010c60120022802042105200228020021082001420037030020004200370300200e420037030020024200370350200241a0026a41ac95c400410d10c501200e2009290000370300200220022900a002370350200241a0026a41c695c400410c10c50120012009290000370300200020022900a002370300200241a0026a200241d0006a10f50220022802f802210b200241a8046a200241a0026a41d80010c9081a200241d0036a200241a0026a41dc006a41d40010c9081a410021062005410020081b210902400240200b4102470d0020024190016a420037030020024188016a420037030020024180016a4200370300200e42003703002000420037030020014200370300200241d0006a41206a42003703002002420037037820024280808080103703b001200242013703a00120024281808080103703980120024200370350200241b8016a410041c80010cb081a0c010b200241d0006a200241a8046a41d80010c9081a200241d0006a41dc006a200241d0036a41d40010c9081a200b21060b200220063602a801200220093602800220022009417f6a36028402200241d0036a200241d0006a20032002280244200241306a20022802482004200d200228024c200c200a10eb0541012104024020022802d0034107460d00200241a8046a41106a200241d0036a41106a280200360200200241a8046a41086a200241d0036a41086a290300370300410041002802dcd2482201410120011b3602dcd248200220022903d0033703a80402400240024020010e020001020b41004180a0c0003602d4d248410041c4b5c8003602d0d248410041023602dcd2480c010b034041002802dcd2484101460d000b0b410041053602d8d248024041000d0020024194026a41223602002002410236028c022002200336029c022002200241a8046a3602900220022002419c026a3602880241002802d4d248210141002802d0d248210041002802dcd2482104200241e0026a41ec04360200200241d8026a42ca80808010370300200241d4026a41c4f9c600360200200241cc026a4226370200200241c8026a41bc98c700360200200241c0026a4202370300200241b0026a4202370300200241a8026a411c360200200241a0026a411c6a20024188026a360200200241c49bc7003602ac02200241c899c7003602a402200241043602a002200041f8a3c000200441024622041b200241a0026a200141e0a3c00020041b2802101103000b410021040b2002280218210e024020022802202201450d002001410c6c2100200e210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b0240200228021c2201450d002001410c6c450d00200e102c0b2002280224210e0240200228022c2201450d0020014104742100200e41046a210103400240200141046a280200450d002001280200102c0b200141106a2101200041706a22000d000b0b0240200228022841ffffffff0071450d00200e102c0b024020022802302201450d002002280234450d002001102c0b02402002280240450d00200228023c102c0b410110322201450d012002420137025420022001360250200241d0006a41004101102f20022802502201200228025822006a20043a000020024180056a2400200041016aad4220862001ad840f0b200241ac026a4104360200200241e4006a41023602002002420237025420024194c7c300360250200241043602a4022002418ccbc3003602a002200241003602ac04200241c4b5c8003602a8042002200241a0026a3602602002200241a8046a3602a802200241d0006a41a4c7c3001046000b1039000b8d1c03047f027e027f230041c0016b220b2400024002400240024020012802382003490d002004280200450d02200b41186a200210c8030240200b280218450d0020012802b4012203200b28021c220c490d0241002003200c6b220c200c20034b1b2001280228490d020b200441086a28020020012802344d0d02200041023602000c030b200041003602000c020b200041013602000c010b200b41f8006a4181dec700410310c501200b4188016a41a4bfc000411510c501200b200236029801200b41a8016a200b4198016a410410c701200b412c6a200b4198016a41046a360200200b200b41b0016a220d360224200b200b4198016a360228200b200b41a8016a360220200b41b0016a200b41206a107e02400240024002400240200b2802b801220341206a2204417f4c0d000240024020040d004101210c0c010b20041032220c450d020b200b4100360228200b2004360224200b200c360220200b41206a4100411010c801200b280220200b28022822046a220c200b290078370000200c41086a200b41f8006a41086a290000370000200b200441106a2204360228200b41206a2004411010c801200b280220200b28022822046a220c200b29008801370000200c41086a200b4188016a41086a290000370000200b200441106a220c360228200b2802b0012104200b41206a200c200310c801200b280220220c200b280228220e6a2004200310c9081a200b200e20036a22033602280240200b2802b401450d002004102c0b200b41fc006a41003a0000200b4100360278200b41106a200c2003200b41f8006a4105410010b70402400240200b280210450d00200b200b2802142203410520034105491b36028c01200b200b41f8006a36028801200b41086a200b4188016a108702200b28020c2103200b2802084521040c010b410021040b0240200b280224450d00200c102c0b4100210c2003410020041b210302400240024020050d0020030d010b200320054f0d012003ad4220862005ad84210f4101210c0b2000200c36020420004103360200200041086a200f3702000c060b024002400240200128028801220420074f0d00410021010c010b200b41f8006a4184dec700410310c501200b4188016a41f494c600411610c501200b200236029801200b41a8016a200b4198016a410410c701200b412c6a200b4198016a41046a360200200b200d360224200b200b4198016a360228200b200b41a8016a360220200b41b0016a200b41206a107e200b2802b801220341206a2204417f4c0d020240024020040d00410121050c010b200410322205450d040b200b4100360228200b2004360224200b2005360220200b41206a4100411010c801200b280220200b28022822046a2205200b290078370000200541086a200b41f8006a41086a290000370000200b200441106a2204360228200b41206a2004411010c801200b280220200b28022822046a2205200b29008801370000200541086a200b4188016a41086a220c290000370000200b200441106a2205360228200b2802b0012104200b41206a2005200310c801200b2802202205200b280228220e6a2004200310c9081a200b200e20036a22033602280240200b2802b401450d002004102c0b200b4188016a2005200310a004200b280288014101462103200b28028c012104200c280200210c0240200b280224450d002005102c0b2004410020031b210e200c410020031b21050240024020070d00200e21070c010b2007410c6c210c200641086a21032001280284012106410021070240024003402003280200220420064b0d012003410c6a21032007417f6a2107200420056a2105200c41746a220c450d020c000b0b410020076b2107410121010c020b200e20076b21070b02402007200128027822044d0d00410221010c010b02402005200128027c22044d0d0041032101200521070c010b20012802b4012107200b41f8006a4187dec700410410c501200b4188016a41e39ac500410e10c501200b20023602a801200b4198016a200b41a8016a410410c701200b412c6a200b41a8016a41046a360200200b200b41a0016a360224200b200b41a8016a360228200b200b4198016a360220200b41b0016a200b41206a107e200b2802b801220341206a2204417f4c0d020240024020040d00410121050c010b200410322205450d040b200b4100360228200b2004360224200b2005360220200b41206a4100411010c801200b280220200b28022822046a2205200b290078370000200541086a200b41f8006a41086a290000370000200b200441106a2204360228200b41206a2004411010c801200b280220200b28022822046a2205200b29008801370000200541086a200b4188016a41086a290000370000200b200441106a2205360228200b2802b0012104200b41206a2005200310c801200b2802202205200b28022822066a2004200310c9081a200b200620036a22033602280240200b2802b401450d002004102c0b200b2005200310c601200b2802042104200b28020021030240200b280224450d002005102c0b024020034101470d0020042008490d002004ad4220862008ad84210f410021010c060b20072008490d0402400240024020072008460d00200b41f8006a4187dec700410410c501200b4188016a41f19ac500411210c501200b200236029801200b41a8016a200b4198016a410410c701200b412c6a200b4198016a41046a360200200b200d360224200b200b4198016a360228200b200b41a8016a360220200b41b0016a200b41206a107e200b2802b801220341206a2204417f4c0d050240024020040d00410121050c010b200410322205450d070b200b4100360228200b2004360224200b2005360220200b41206a4100411010c801200b280220200b28022822046a2205200b290078370000200541086a200b41f8006a41086a290000370000200b200441106a2204360228200b41206a2004411010c801200b280220200b28022822046a2205200b29008801370000200541086a200b4188016a41086a290000370000200b200441106a2205360228200b2802b0012104200b41206a2005200310c801200b2802202205200b28022822076a2004200310c9081a200b200720036a22033602280240200b2802b401450d002004102c0b200b4188016a2005200310f704200b29028c014200200b2802880122031b21100240200b280224450d002005102c0b2003410420031b2106410021030240024002402010422088a7220c0e020002010b2008ad210f0c040b41002103200c2104034020032004410176220520036a2207200620074104746a28020020084b1b2103200420056b220441014b0d000b0b200620034104746a2802002008470d010240200c450d00200c4104742104200641046a210303400240200341046a28020041ffffffff0371450d002003280200102c0b200341106a2103200441706a22040d000b0b2010a72203450d00200341ffffffff0071450d002006102c0b20012802ac012201200a4f0d03410021030c080b2008ad210f200c450d00200c4104742103200641046a210103400240200141046a28020041ffffffff0371450d002001280200102c0b200141106a2101200341706a22030d000b0b410221012010a72203450d05200341ffffffff0071450d052006102c0c050b2000200136020420004104360200200041106a20063602002000410c6a2004360200200041086a20073602000c060b0240200a450d002009200a4104746a2111410121014100210a034020092802002104024020014101710d00200420034b0d00410121030c070b200b41f8006a4187dec700410410c501200b4188016a41acb1c500410c10c501200b41003602b801200b42013703b001200b41b0016a41004104102f200b2802b001200b2802b80122016a2002360000200b200141046a22013602b801200b41b0016a20014104102f200b2802b0012201200b2802b80122036a2004360000200b200341046a22033602b801200b41a8016a2001200310c701200b200120036a36022c200b2001360228200b200d360224200b200b41a8016a360220200b4198016a200b41206a107e0240200b2802b401450d002001102c0b200b2802a001220141206a2203417f4c0d020240024020030d00410121050c010b200310322205450d040b200b41003602b801200b20033602b401200b20053602b001200b41b0016a4100411010c801200b2802b001200b2802b80122036a2205200b290078370000200541086a200b41f8006a41086a290000370000200b200341106a22033602b801200b41b0016a2003411010c801200b2802b001200b2802b80122036a2205200b29008801370000200541086a200b4188016a41086a290000370000200b200341106a22053602b801200b280298012103200b41b0016a2005200110c801200b2802b0012205200b2802b80122086a2003200110c9081a200b200820016a22013602b8010240200b28029c01450d002003102c0b200b41206a2005200110f3020240200b2d005422014102460d00200b280240210e200b2802442106200b2802482107200b28024c2112200b280250210c0b0240200b2802b401450d002005102c0b41022103024020014102470d0020042107200221010c070b02402009410c6a280200220120074d0d00410321030c070b02402001200c6a220120064d0d0041042103200621070c070b0240201241016a2201200e4d0d0041052103200e21070c070b200a41016a210a41002101200421032011200941106a2209470d000b0b200041073602000c050b103b000b1039000b2007ad4220862008ad84210f410121010b2000200136020420004105360200200041086a200f3702000c010b2000200336020420004106360200200041106a20073602002000410c6a2001360200200041086a200a3602000b200b41c0016a24000bfe0701027f230041106b2202240002400240024002400240024002400240024020002802000e0701020304050600010b2002200128021841ba9ac700410c2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41c89ac70010661a20022d0008210120022802042203450d07200141ff017121004101210120000d06024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841fa9dc00041012000411c6a28020028020c1100000d070b2002280200220128021841c5c7c50041012001411c6a28020028020c11000021010c060b2001280218419081c70041102001411c6a28020028020c11000021010c060b200128021841a881c70041142001411c6a28020028020c11000021010c050b200128021841c481c700410f2001411c6a28020028020c11000021010c040b2002200128021841d89ac70041192001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41f49ac70010661a20022d0008210120022802042203450d03200141ff017121004101210120000d02024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841fa9dc00041012000411c6a28020028020c1100000d030b2002280200220128021841c5c7c50041012001411c6a28020028020c11000021010c020b2002200128021841849bc700410e2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41949bc70010661a20022d0008210120022802042203450d02200141ff017121004101210120000d01024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841fa9dc00041012000411c6a28020028020c1100000d020b2002280200220128021841c5c7c50041012001411c6a28020028020c11000021010c010b2002200128021841a49bc700410d2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b49bc70010661a20022d0008210120022802042203450d01200141ff017121004101210120000d00024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841fa9dc00041012000411c6a28020028020c1100000d010b2002280200220128021841c5c7c50041012001411c6a28020028020c11000021010b200220013a00080b200241106a2400200141ff01714100470bd20201047f230041c0006b220224000240024020010d00200241286a22014200370300200241206a22034200370300200241106a41086a420037030020024200370310200241106a41968dc700410d10c501200241306a41bc93c700411310c5012001200241306a41086a290000370300200320022900303703002002200241106a412010c6012002280204210120022802002103410410322204450d012002420437021420022004360210200241106a41004104102f20022802102204200228021822056a2001410020031b360000200241c0006a2400200541046aad4220862004ad840f0b2002413c6a4104360200200241246a41023602002002420237021420024194c7c30036021020024104360234200241accbc3003602302002410036020c200241c4b5c8003602082002200241306a3602202002200241086a360238200241106a41a4c7c3001046000b1039000b841102057f017e230041f0026b220224002002200041c4b5c80020011b200110e60502400240024020022d000422004103460d00200228020021010240024002400240024020000e03010200010b200241c0026a41968dc700410d10c501200241d0026a41a38dc700411310c501200220013602ec02200241b0026a200241ec026a410410c701200241146a200241ec026a41046a3602002002200241b8026a36020c2002200241ec026a3602102002200241b0026a360208200241e0026a200241086a107e20022802e802220041206a2203417f4c0d050240024020030d00410121040c010b200310322204450d070b200241003602b802200220033602b402200220043602b002200241b0026a4100411010c80120022802b00220022802b80222036a220420022900c002370000200441086a200241c0026a41086a2900003700002002200341106a22033602b802200241b0026a2003411010c80120022802b00220022802b80222036a220420022900d002370000200441086a200241d0026a41086a2900003700002002200341106a22043602b80220022802e0022103200241b0026a2004200010c80120022802b002220420022802b80222056a2003200010c9081a2002200520006a22003602b802024020022802e402450d002003102c0b200241086a2004200010f30420024184026a2802002105200241fc016a2802002103200241f8016a280200210620022802f0012100024020022802b402450d002004102c0b2000450d0202402006450d002000102c0b4100210102402005450d002003450d002003102c0b0c030b200110e805200241c0026a41f1ddc700410510c501200241d0026a41acffc000410b10c501200220013602ec02200241b0026a200241ec026a410410c701200241146a200241ec026a41046a3602002002200241b8026a36020c2002200241ec026a3602102002200241b0026a360208200241e0026a200241086a107e20022802e802220141206a2200417f4c0d040240024020000d00410121030c010b200010322203450d060b200241003602102002200036020c20022003360208200241086a4100411010c8012002280208200228021022006a220320022900c002370000200341086a200241c0026a41086a2900003700002002200041106a2200360210200241086a2000411010c8012002280208200228021022006a220320022900d002370000200341086a200241d0026a41086a2900003700002002200041106a220336021020022802e0022100200241086a2003200110c80120022802082203200228021022046a2000200110c9081a2002200420016a2201360210024020022802e402450d002000102c0b200241d0026a2003200110b80320022902d402210720022802d0022101200228020c450d022003102c0c020b200241c0026a41f1ddc700410510c501200241d0026a41acffc000410b10c501200220013602ec02200241b0026a200241ec026a410410c701200241146a200241ec026a41046a3602002002200241b8026a36020c2002200241ec026a3602102002200241b0026a360208200241e0026a200241086a107e20022802e802220141206a2200417f4c0d030240024020000d00410121030c010b200010322203450d050b200241003602102002200036020c20022003360208200241086a4100411010c8012002280208200228021022006a220320022900c002370000200341086a200241c0026a41086a2900003700002002200041106a2200360210200241086a2000411010c8012002280208200228021022006a220320022900d002370000200341086a200241d0026a41086a2900003700002002200041106a220336021020022802e0022100200241086a2003200110c80120022802082203200228021022046a2000200110c9081a2002200420016a2201360210024020022802e402450d002000102c0b200241d0026a2003200110b80320022902d402210720022802d0022101200228020c450d012003102c0c010b200241c0026a41f1ddc700410510c501200241d0026a41acffc000410b10c501200220013602ec02200241b0026a200241ec026a410410c701200241146a200241ec026a41046a3602002002200241b8026a36020c2002200241ec026a3602102002200241b0026a360208200241e0026a200241086a107e20022802e802220141206a2200417f4c0d020240024020000d00410121030c010b200010322203450d040b200241003602102002200036020c20022003360208200241086a4100411010c8012002280208200228021022006a220320022900c002370000200341086a200241c0026a41086a2900003700002002200041106a2200360210200241086a2000411010c8012002280208200228021022006a220320022900d002370000200341086a200241d0026a41086a2900003700002002200041106a220336021020022802e0022100200241086a2003200110c80120022802082203200228021022046a2000200110c9081a2002200420016a2201360210024020022802e402450d002000102c0b200241d0026a2003200110b80320022902d402210720022802d0022101200228020c450d002003102c0b410110322200450d022002420137020c20022000360208200241086a41004101102f20022802082200200228021022036a21040240024020010d00200441003a0000200341016a21030c010b200441013a00002002200341016a36021020012007422088a7200241086a10bb0120022802102103200228020821002001450d002007a7450d002001102c0b200241f0026a24002003ad4220862000ad840f0b200241dc026a41043602002002411c6a41023602002002420237020c20024194c7c300360208200241043602d402200241cccbc3003602d002200241003602c402200241c4b5c8003602c0022002200241d0026a3602182002200241c0026a3602d802200241086a41a4c7c3001046000b103b000b1039000be21002097f017e230041a0026b220224000240024002400240024020014104490d002001417c714104460d0020014108470d00200041c4b5c80020011b2201280000210320012800042104200241c0006a22014200370300200241386a22004200370300200241286a41086a2205420037030020024200370328200241c8006a41c1dcc700410610c5012005200241c8006a41086a220629000037030020022002290048370328200241d8006a4196a4c600410610c5012001200241d8006a41086a220729000037030020002002290058370300200241106a200241286a412010c60120014200370300200042003703002005420037030020024200370328200241c8006a41ac95c400410d10c5012005200629000037030020022002290048370328200241d8006a41c695c400410c10c5012001200729000037030020002002290058370300200241e8006a200241286a10f502200241c8006a41f1ddc700410510c501200241d8006a4191f6c000411210c5012002200336029c02200241186a2002419c026a410410c701200241e8006a410c6a2002419c026a41046a3602002002200241186a41086a36026c20022002419c026a3602702002200241186a360268200241286a200241e8006a107e2002280230220141206a2200417f4c0d010240024020000d00410121050c010b200010322205450d050b200241003602702002200036026c20022005360268200241e8006a4100411010c8012002280268200228027022006a22052002290048370000200541086a200241c8006a41086a2900003700002002200041106a2200360270200241e8006a2000411010c8012002280268200228027022006a22052002290058370000200541086a200241d8006a41086a2900003700002002200041106a220536027020022802282100200241e8006a2005200110c80120022802682205200228027022066a2000200110c9081a2002200620016a22013602700240200228022c450d002000102c0b200241086a2005200110c6010240200228026c450d002005102c0b200241c8006a41f1ddc700410510c501200241d8006a4185f6c000410c10c5012002200336029c02200241186a2002419c026a410410c701200241e8006a410c6a2002419c026a41046a3602002002200241206a36026c20022002419c026a3602702002200241186a360268200241286a200241e8006a107e2002280230220141206a2200417f4c0d010240024020000d00410121060c010b200010322206450d050b41002105200241003602202002200036021c20022006360218200241186a4100411010c8012002280218200228022022006a22062002290048370000200641086a200241c8006a41086a2900003700002002200041106a2200360220200241186a2000411010c8012002280218200228022022006a22062002290058370000200641086a200241d8006a41086a2900003700002002200041106a220636022020022802282100200241186a2006200110c80120022802182206200228022022076a2000200110c9081a2002200720016a22013602200240200228022c450d002000102c0b200241e8006a2006200110bb0302400240200228027422084102470d004104210741002109410021080c010b2002280278210a20022802682107200228026c2109200228027021050b0240200228021c450d002006102c0b0240024002402005450d00200541037441786a41037641016a210541002100200721010340200128020020044f0d02200141086a21012005200041016a2200470d000b0b20084101470d01200a2004490d010c040b024020000d002008450d00200a20044f0d040b200241e8006a2003200128020010bf03200241286a20022802682200200228027010b803200229022c210b20022802282101200228026c450d042000102c0c040b200241c8006a41f1ddc700410510c501200241d8006a41acffc000410b10c5012002200336029c02200241186a2002419c026a410410c701200241f4006a2002419c026a41046a3602002002200241206a36026c20022002419c026a3602702002200241186a360268200241286a200241e8006a107e2002280230220141206a2200417f4c0d010240024020000d00410121040c010b200010322204450d050b200241003602702002200036026c20022004360268200241e8006a4100411010c8012002280268200228027022006a22042002290048370000200441086a200241c8006a41086a2900003700002002200041106a2200360270200241e8006a2000411010c8012002280268200228027022006a22042002290058370000200441086a200241d8006a41086a2900003700002002200041106a220436027020022802282100200241e8006a2004200110c80120022802682204200228027022056a2000200110c9081a2002200520016a22013602700240200228022c450d002000102c0b200241286a2004200110b803200229022c210b20022802282101200228026c450d032004102c0c030b200241346a4104360200200241fc006a41023602002002420237026c20024194c7c3003602682002410436022c200241d4cbc3003602282002410036025c200241c4b5c8003602582002200241286a3602782002200241d8006a360230200241e8006a41a4c7c3001046000b103b000b410021010b02402009450d002007450d00200941ffffffff0171450d002007102c0b410110322200450d002002420137026c20022000360268200241e8006a41004101102f20022802682200200228027022046a21050240024020010d00200541003a0000200441016a21040c010b200541013a00002002200441016a3602702001200b422088a7200241e8006a10bb0120022802702104200228026821002001450d00200ba7450d002001102c0b200241a0026a24002004ad4220862000ad840f0b1039000bb81102067f057e230041d0086b2202240002400240024020014104490d0020014104470d00200041c4b5c80020011b2800002103200241a8086a41968dc700410d10c501200241086a41a38dc700411310c501200220033602c408200241c8086a200241c4086a410410c701200241cc066a200241c4086a41046a3602002002200241d0086a3602c4062002200241c4086a3602c8062002200241c8086a3602c006200241b8086a200241c0066a107e20022802c008220141206a2200417f4c0d010240024020000d00410121040c010b200010322204450d030b200241003602b806200220003602b406200220043602b006200241b0066a4100411010c80120022802b00620022802b80622006a220420022900a808370000200441086a200241a8086a41086a2900003700002002200041106a22003602b806200241b0066a2000411010c80120022802b00620022802b80622006a22042002290008370000200441086a200241086a41086a2900003700002002200041106a22043602b80620022802b8082100200241b0066a2004200110c80120022802b006220420022802b80622056a2000200110c9081a2002200520016a22013602b806024020022802bc08450d002000102c0b20024188046a2004200110f304200241c0066a20024188046a41e80110c9081a02400240024020022802f0052200450d0020024184066a2802002105200241fc056a2802002101200241f8056a2802002106200241a0026a200241c0066a41e80110c9081a024020022802b406450d002004102c0b20024188046a200241a0026a41e80110c9081a2002413c6a20024188046a41047241e40110c9081a02402006450d002000102c0b02402005450d002001450d002001102c0b200241a8086a41968dc700410d10c501200241086a41bc92c700411e10c501200220033602b006200241b8086a200241b0066a410410c70120024194046a200241b0066a41046a3602002002200241c0086a36028c042002200241b0066a360290042002200241b8086a36028804200241c0066a20024188046a107e20022802c806220141206a2200417f4c0d040240024020000d00410121040c010b200010322204450d060b41002103200241003602c008200220003602bc08200220043602b808200241b8086a4100411010c80120022802b80820022802c00822006a220420022900a808370000200441086a200241a8086a41086a2900003700002002200041106a22003602c008200241b8086a2000411010c80120022802b80820022802c00822006a22042002290008370000200441086a200241086a41086a2900003700002002200041106a22043602c00820022802c0062100200241b8086a2004200110c80120022802b808220420022802c00822056a2000200110c9081a2002200520016a22013602c008024020022802c406450d002000102c0b20024188046a2004200110ee04200241c0066a41086a20024194046a290200370300200241c0066a41106a2002419c046a290200370300200241c0066a41186a2201200241a4046a290200370300200241c0066a41206a2200200241ac046a290200370300200241c0066a41286a2205200241b4046a290200370300200241c0066a41306a2206200241bc046a2802003602002002200229028c043703c00602402002280288042207450d00200241a0026a41306a2006280200360200200241a0026a41286a2005290300370300200241a0026a41206a2000290300370300200241a0026a41186a2001290300370300200241a0026a41106a200241c0066a41106a290300370300200241a0026a41086a200241c0066a41086a290300370300200220022903c0063703a002200721030b024020022802bc08450d002004102c0b200241c0066a2002413c6a41e40110c9081a2003450d0120024188046a200241c0066a41e40110c9081a200241086a41306a200241a0026a41306a2802002201360200200241086a41286a200241a0026a41286a2903002208370300200241086a41206a200241a0026a41206a2903002209370300200241086a41186a200241a0026a41186a290300220a370300200241086a41106a200241a0026a41106a290300220b370300200241086a41086a200241a0026a41086a290300220c370300200241f8056a200c37030020024180066a200b37030020024188066a200a37030020024190066a200937030020024198066a2008370300200241a0066a2001360200200220022903a0022208370308200220033602ec05200220083703f0050c020b20022802b406450d002004102c0b41002103200241003602ec050b410110322201450d02200242013702c406200220013602c006200241c0066a41004101102f20022802c00620022802c8066a21010240024020030d00200141003a000020022802c80641016a210420022802c00621050c010b200141013a0000200220022802c80641016a3602c806200241c0066a20024188046a10c804200241ec056a200241c0066a10b50520022802c006210520022802c8062104024020022802f4052201450d002001410c6c21002003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b024020022802f0052201450d002001410c6c450d002003102c0b20022802f805210302402002280280062201450d0020014104742100200341046a210103400240200141046a280200450d002001280200102c0b200141106a2101200041706a22000d000b0b024020022802fc0541ffffffff0071450d002003102c0b02402002280284062201450d00200228028806450d002001102c0b200228029406450d00200228029006102c0b200241d0086a24002004ad4220862005ad840f0b200241cc066a41043602002002419c046a41023602002002420237028c0420024194c7c30036028804200241043602c406200241f8cbc3003602c006200241003602a402200241c4b5c8003602a0022002200241c0066a360298042002200241a0026a3602c80620024188046a41a4c7c3001046000b103b000b1039000bfc1c05067f017e067f017e067f230041e00d6b2202240002400240024002400240024002400240024002400240024020010d0020024188056a2201420037030020024180056a22034200370300200241f0046a41086a22044200370300200242003703f004200241b00b6a41c1dcc700410610c5012004200241b00b6a41086a2205290000370300200220022900b00b3703f004200241b00b6a41baa4c600410610c50120012005290000370300200320022900b00b370300200241203602142002200241f0046a360210200241186a200241f0046a412010b3010240200228021822060d00410021030c060b200228021c21072002200241186a41086a28020036022c20022006360228200241086a200241286a10870220022802080d03200228020c2205200228022c41b0026e2201200120054b1bad42b0027e2208422088a70d062008a72201417f4c0d060240024020010d00410821030c010b200110322203450d0c0b200141b0026ead210802402005450d00034002400240200228022c2201450d00200228022822092d0000210a20022001417f6a220b36022c4101210c2002200941016a36022841032104024002400240200a0e03000201040b200b4104490d022009280001210d20022001417b6a36022c2002200941056a3602284100210c0c010b4102210c0b200241b00b6a200241286a10f20520022802b00b410a460d0020024198096a200241b00b6a41980210c9081a200241b00b6a200241286a10fd04024020022802b00b450d0020024190076a41086a200241b00b6a41086a280200360200200220022903b00b37039007200241b00b6a20024198096a41980210c9081a200c2104200d210e0c020b20024198096a10f3050b410321040b200241d8026a200241b00b6a41980210c9081a200241c8026a41086a220120024190076a41086a28020036020020022002290390073703c80202400240024020044103460d00200241306a200241d8026a41980210c9081a20024180076a41086a22092001280200360200200220022903c802370380072008422088a722012008a7470d02200141016a220a2001490d0b2001410174220c200a200a200c491b220a4104200a41044b1bad42b0027e220f422088a70d0b41000d0b200fa7220a4100480d0b200141b0026c201020011b2110024002402003410020011b22010d00200a0d01410821030c030b024020100d00200a0d01410821030c030b20012010200a10352203450d110c020b200a103222030d010c100b2008422088a72201450d06200141b0026c2104200321010c050b200842808080807083200a41b0026ead8421080b20032008422088a741b0026c6a200241306a41980210c9082201419c026a200e3602002001200436029802200141a0026a200229038007370200200141a8026a200928020036020020084280808080107c21082005417f6a22050d000b0b2003450d030c040b200241a4096a4104360200200241c40b6a4102360200200242023702b40b20024194c7c3003602b00b2002410436029c09200241a0ccc30036029809200241003602dc02200241c4b5c8003602d802200220024198096a3602c00b2002200241d8026a3602a009200241b00b6a41a4c7c3001046000b0340200110f405200141b0026a2101200441d07d6a22040d000b0b02402008a72201450d002003450d01200141b0026c450d012003102c0b0b41002103200241003602a00920024201370398092002410f3602dc022002200241106a3602d802200220024198096a360230200241c40b6a4101360200200242013702b40b200241b4bcc3003602b00b2002200241d8026a3602c00b200241306a41dcb7c000200241b00b6a103e1a20023502a009422086200235029809841000200228029c09450d00200228029809102c0b2007450d002006102c0b2003410820031b220b2008420020031b2208422088a7220c41b0026c22016a21032008a721060240200c0d00200b21010c030b200241d8026a410472210d200141d07d6a210a200241b00b6a41a0026a2109200241c8026a41086a2105200b21010240034020024198096a200141980210c9081a2001419c026a280200211020014198026a28020021042005200141a8026a2802003602002002200141a0026a2902003703c80220044103460d03200141ac026a280200210e200241b00b6a20024198096a41980210c9081a200920022903c802370200200941086a2005280200360200200220103602cc0d200220043602c80d2002200e3602dc0d200241d8026a200241b00b6a10f50520022802d80222044103470d01200a41d07d6a210a200141b0026a22012003470d000b200321010c030b200241306a200d41900210c9081a200241f0046a200241306a41900210c9081a200241b00b6a200241f0046a41900210c9081a20024198096a200241f0046a41840210c9081a200241d8026a41086a2205200241bc0d6a280200360200200220022902b40d3703d802024002400240024020040e03010200010b20024190076a20024198096a41840210c9081a20024180076a41086a2005280200360200200220022903d80237038007410221040c020b20024190076a20024198096a41840210c9081a20024180076a41086a2005280200360200200220022903d80237038007410021040c010b20024190076a20024198096a41840210c9081a20024180076a41086a2005280200360200200220022903d80237038007410121040b4194021032220e450d05200e2004360200200e41046a20024190076a41840210c9081a200e4190026a20024180076a41086a2207280200360200200e2002290380073702880202400240200a0d004101210d41012105200321010c010b200141b0026a2104200241d8026a4104722111200c41b0026c200b6a41d07d6a2112200241b00b6a4184026a2113200241b00b6a41a0026a210a200241c8026a41086a21094101210d410121050340200421010240024002400240034020024198096a200141980210c9081a2001419c026a280200211020014198026a28020021042009200141a8026a2802003602002002200141a0026a2902003703c80220044103460d02200141ac026a280200210c200241b00b6a20024198096a41980210c9081a200a20022903c802370200200a41086a2009280200360200200220103602cc0d200220043602c80d2002200c3602dc0d200241d8026a200241b00b6a10f50520022802d80222044103470d01200141b0026a22012003470d000b200321010c050b200241306a201141900210c9081a200241f0046a200241306a41900210c9081a200241b00b6a200241f0046a41900210c9081a20024198096a200241f0046a41840210c9081a200241d8026a41086a2210201341086a280200360200200220132902003703d802024002400240024020040e03010200010b20024190076a20024198096a41840210c9081a20072010280200360200200220022903d802370380074102210c0c020b20024190076a20024198096a41840210c9081a20072010280200360200200220022903d802370380074100210c0c010b20024190076a20024198096a41840210c9081a20072010280200360200200220022903d802370380074101210c0b200241b00b6a20024190076a41840210c9081a20024198096a41086a221420072802003602002002200229038007370398092005200d470d02200d41016a2204200d490d05200d41017422102004201020044b1b22044104200441044b1bad4294027e2208422088a70d0541000d052008a722044100480d05200d4194026c2015200d1b211502400240200e4100200d1b22100d0020040d014104210e0c030b024020150d0020040d014104210e0c030b2010201520041035220e450d0b0c020b20041032220e450d0a0c010b200141b0026a21010c030b20044194026e210d0b200141b0026a2104200e20054194026c6a2210200c360200201041046a200241b00b6a41840210c9081a20104190026a201428020036020020104188026a200229039809370200200541016a210520122001470d000b200321010b024020032001460d000340200110f4052003200141b0026a2201470d000b0b02402006450d00200641b0026c450d00200b102c0b20054194026c41046a2201417f4c0d0020010d0341012103410021010c040b103b000b200141b0026a21010b024020032001460d000340200110f4052003200141b0026a2201470d000b0b02402006450d00200641b0026c450d00200b102c0b4104210e410021054100210d410421010b200110322203450d010b200241003602b80b200220013602b40b200220033602b00b200241b00b6a2005108f0102402005450d0020054194026c2103200e21010340024002400240024020012802000e03000102030b200241b00b6a20022802b80b4101102f20022802b00b20022802b80b6a41003a0000200220022802b80b41016a3602b80b200241b00b6a200141046a10f60520014188026a28020020014190026a280200200241b00b6a10bb010c020b200241b00b6a20022802b80b4101102f20022802b00b20022802b80b6a41013a0000200220022802b80b41016a3602b80b200241b00b6a200141046a10f60520014188026a28020020014190026a280200200241b00b6a10bb010c010b200241b00b6a20022802b80b4101102f20022802b00b20022802b80b6a41023a0000200220022802b80b41016a3602b80b200241b00b6a200141046a10f60520014188026a28020020014190026a280200200241b00b6a10bb010b20014194026a2101200341ec7d6a22030d000b0b20023502b80b210820023502b00b210f02402005450d0020054194026c2103200e21010340024002400240024020012802000e020001020b2001418c026a280200450d0220014188026a280200102c0c020b2001418c026a280200450d0120014188026a280200102c0c010b2001418c026a280200450d0020014188026a280200102c0b20014194026a2101200341ec7d6a22030d000b0b0240200d450d00200e450d00200d4194026c450d00200e102c0b200241e00d6a24002008422086200f840f0b1039000ba94d07067f027e037f077e017f047e047f230041900b6b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a36020020050e1c010b0b02030b0b04050b0607080b0b0b090b0b0b0b0b0b0b0b0b0b0a0b0b2000410a3602000c140b02402006450d0020042d0001210520012003417e6a2207360204410221062001200441026a36020002400240024002400240024020050e050001040203060b200241a8096a200110d90620022d00b1094102460d0520022903b009210820022903a8092109410021060c030b2007450d0420042d0002210520012003417d6a220a3602042001200441036a36020041c4b5c800ad210842002109410121064100210b024002400240024020050e0402030001080b410221060c020b200a450d0620042d0003210720012003417c6a22053602042001200441046a3602002005450d0620042d0004210c20012003417b6a3602042001200441056a360200420021084103210b0b200b2106200821090b200241a8096a200110d90620022d00b1094102460d04200c41ff0171411074200741ff017141087472200672210a200942ffffffff0f83210920022903b009210d20022903a80921084200210e410121060c020b41002105200241003a00c8092003417d6a21030240034020072005460d01200241a8096a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00c8092003417f6a21032006210520064120470d000b200641ff01714120490d04200241b7096a290000210820022900bf09210d20022900af09210920022800ab09210a20022f00a909210c20022d00a809210b200241c7096a31000042ff0183210e410321060c020b200541ff0171450d03200241003a00c8090c030b41002105200241003a00c8092003417d6a2103034020072005460d02200241a8096a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00c8092003417f6a21032006210520064120470d000b200641ff01714120490d02200241b7096a290000210820022900bf09210d20022900af09210920022800ab09210a20022f00a909210c20022d00a809210b200241c7096a31000042ff0183210e410421060b2000200c3b000a2000200b3a000920004100360200200041286a200e370000200041206a200d370000200041186a2008370000200041106a20093700002000410c6a200a360000200041086a20063a0000200041306a200241e80110c9081a0c150b200541ff0171450d00200241003a00c8090b2000410a3602000c130b02402006450d0020042d0001210520012003417e6a220c3602042001200441026a3602000240024002400240024020050e03000102050b41002105200241003a00c809200c411f200c411f491b20046a41036a210b417d210702400340200c2005460d01200241a8096a20056a200420056a220641026a2d00003a00002001200320076a3602042001200641036a3602002002200541016a22063a00c8092007417f6a21072006210520064120470d000b200641ff01714120490d05200320066b220a417e6a41034d0d05200241c7096a3100002108200241b7096a290000210d20022900bf09210920022900af09210e20022800ab09210520022f00a909210320022d00a8092107200b280000210c2001200a417a6a3602042001200420066a41066a3602002002200e3703c0072002200d3703c807200220093703d0072009423888200842ff0183420886842109200e421888a72101200e420888a72104200241cf076a290000210820022900c707210d200ea721064100210b0c030b200541ff0171450d04200241003a00c8090c040b200c4104490d032004280002210520012003417a6a3602042001200441066a3602004200210d4101210b4100210c420021080c010b200c4104490d022004280002210c20012003417a6a22073602042001200441066a36020041002105200241003a00c809200341796a2103034020072005460d02200241a8096a20056a200420056a220641066a2d00003a0000200120033602042001200641076a3602002002200541016a22063a00c8092003417f6a21032006210520064120470d000b200641ff0171411f4d0d02200241a8096a411f6a3100002108200241a8096a410f6a290000210d20022900bf09210920022800ab09210520022f00a909210320022d00a8092107200220022900af09220e3703d8052002200d3703e005200220093703e8052009423888200842ff0183420886842109200e421888a72101200e420888a72104200241d8056a410f6a290000210820022900df05210d200ea721064102210b0b200020043b000d200020033b0006200020073a00052000200b3a000420004101360200200041276a20094220883c0000200041236a20093e00002000411b6a2008370000200041136a200d370000200041286a200c3602002000410f6a20013600002000410c6a20063a0000200041086a20053602002000412c6a200241ec0110c9081a0c140b200541ff0171450d00200241003a00c8090b2000410a3602000c120b2006450d1020042d0001210620012003417e6a22053602042001200441026a3602000240024002400240024002400240024020060e080001020304050607180b41002106200241003a00c809417d210c0240034020052006460d01200241a8096a20066a200420066a220741026a2d00003a000020012003200c6a3602042001200741036a3602002002200641016a22073a00c809200c417f6a210c2007210620074120470d000b200741ff01714120490d18200320076b2203417e6a4110490d18200241c7096a310000210d200241b7096a290000210e20022900bf09210f20022900af09211020022800ab09210520022f00a909210620022d00a809210c200420076a2204410a6a2900002111200441026a290000211220012003416e6a3602042001200441126a3602002005ad4218862006ad42ffff038342088684200cad42ff01838421094100210142002113410021040c170b200641ff0171450d17200241003a00c8090c170b41002106200241003a00c809417d210c0240034020052006460d01200241a8096a20066a200420066a220741026a2d00003a000020012003200c6a3602042001200741036a3602002002200641016a22073a00c809200c417f6a210c2007210620074120470d000b200741ff01714120490d17200320076b2203417e6a4110490d17200241c7096a310000210d200241b7096a290000210e20022900bf09210f20022900af09211020022800ab09210520022f00a909210620022d00a809210c200420076a2204410a6a2900002111200441026a290000211220012003416e6a3602042001200441126a3602002005ad4218862006ad42ffff038342088684200cad42ff0183842109410121040c150b200641ff0171450d16200241003a00c8090c160b41002106200241003a00c8092003210702400240034020052006460d01200241a8096a20066a200420066a220c41026a2d00003a000020012007417d6a3602042001200c41036a3602002002200641016a220c3a00c8092007417f6a2107200c2106200c4120470d000b200c41ff01714120490d172003200c6b417e6a210b200241c7096a310000210d200241b7096a290000210e20022900bf09210f20022900af09211020022800ab09210620022f00a909210a20022d00a809211441002105200241003a00c8092006ad421886200aad42ffff0383420886842014ad42ff01838421092004200c6a210c2007417d6a21060340200b2005460d02200241a8096a20056a200c20056a220441026a2d00003a0000200120063602042001200441036a3602002002200541016a22043a00c8092006417f6a21062003417f6a21032004210520044120470d000b200441ff01714120490d17200720046b2205417e6a4110490d17200241c7096a3100002115200241b7096a290000211120022900bf09211620022900af09211220022800ab09210620022f00a909210720022d00a809210b200c20046a2203410a6a290000211741022104200341026a290000211820012005416e6a3602042001200341126a3602002006ad4218862007ad42ffff038342088684200bad42ff01838421080c160b200641ff0171450d16200241003a00c8090c160b200541ff0171450d15200241003a00c8090c150b41002106200241003a00c809417d21070240034020052006460d01200241a8096a20066a200420066a220c41026a2d00003a00002001200320076a3602042001200c41036a3602002002200641016a220c3a00c8092007417f6a2107200c2106200c4120470d000b200c41ff01714120490d152003200c6b2203417e6a4110490d15200241c7096a310000210d200241b7096a290000210e20022900bf09210f20022900af09211020022800ab09210620022f00a909210720022d00a809210b2004200c6a2204410a6a2900002111200441026a290000211220012003416e6a22053602042001200441126a220c36020020054110490d152006ad4218862007ad42ffff038342088684200bad42ff0183842109200c29000021162004411a6a290000211520012003415e6a3602042001200441226a360200201542108821132015420888a72101410321040c140b200641ff0171450d14200241003a00c8090c140b41002106200241003a00c809417d210c0240034020052006460d01200241a8096a20066a200420066a220741026a2d00003a000020012003200c6a3602042001200741036a3602002002200641016a22073a00c809200c417f6a210c2007210620074120470d000b200741ff01714120490d14200320076b2203417e6a4110490d14200241c7096a310000210d200241b7096a290000210e20022900bf09210f20022900af09211020022800ab09210520022f00a909210620022d00a809210c200420076a2204410a6a2900002111200441026a290000211220012003416e6a3602042001200441126a3602002005ad4218862006ad42ffff038342088684200cad42ff0183842109410421040c120b200641ff0171450d13200241003a00c8090c130b41002106200241003a00c809417d210c0240034020052006460d01200241a8096a20066a200420066a220741026a2d00003a000020012003200c6a3602042001200741036a3602002002200641016a22073a00c809200c417f6a210c2007210620074120470d000b200741ff01714120490d13200320076b2203417e6a4110490d13200241c7096a310000210d200241b7096a290000210e20022900bf09210f20022900af09211020022800ab09210520022f00a909210620022d00a809210c200420076a2204410a6a2900002111200441026a290000211220012003416e6a3602042001200441126a3602002005ad4218862006ad42ffff038342088684200cad42ff0183842109410521040c110b200641ff0171450d12200241003a00c8090c120b41002106200241003a00c809417d210c0240034020052006460d01200241a8096a20066a200420066a220741026a2d00003a000020012003200c6a3602042001200741036a3602002002200641016a22073a00c809200c417f6a210c2007210620074120470d000b200741ff01714120490d12200320076b2203417e6a410f4d0d12200241c7096a310000210d200241a8096a410f6a290000210e20022900bf09210f20022900af09211020022800ab09210520022f00a909210620022d00a809210c200420076a2204410a6a2900002111200441026a290000211220012003416e6a3602042001200441126a3602002005ad4218862006ad42ffff038342088684200cad42ff0183842109410621040c100b200641ff0171450d11200241003a00c8090c110b41002106200241003a00c809200321070240024002400240034020052006460d01200241a8096a20066a200420066a220c41026a2d00003a000020012007417d6a3602042001200c41036a3602002002200641016a220c3a00c8092007417f6a2107200c2106200c4120470d000b200c41ff01714120490d142003200c6b417e6a210a200241c7096a310000210d200241b7096a290000210e20022900bf09210f20022900af09211020022800ab09211920022f00a909211a20022d00a809211b41002105200241003a00c8092004200c6a21142007417d6a21042003210b0340200a2005460d02200241a8096a20056a201420056a220641026a2d00003a0000200120043602042001200641036a3602002002200541016a22063a00c8092004417f6a2104200b417f6a210b2006210520064120470d000b200641ff01714120490d14200241b7096a290000210920022900bf09210820022900af09211520022800ab09210b20022f00a909210a20022d00a809211c200241f0056a200241c7096a3100003c0000200220083703e805200220153703d805200220093703e005200720066b2204417e6a4110490d14201420066a2205410a6a2900002117200541026a290000211820012004416e6a3602042001200541126a2207360200200c20036b20066a416e460d1420072d0000210320012004416d6a3602042001200541136a3602004100210120030e020302140b200641ff0171450d13200241003a00c8090c130b200541ff0171450d12200241003a00c8090c120b410121010b200241c0076a41186a2204200241d8056a41186a2d00003a0000200241c0076a41106a200241d8056a41106a2903002216370300200bad421886200aad42ffff038342088684201cad42ff01838421082019ad421886201aad42ffff038342088684201bad42ff0183842109200241e0056a290300211120022903d805211220043100002115410721040c0f0b02402006450d0020042d0001210620012003417e6a22053602042001200441026a360200024002400240024002400240024002400240024020060e090001020304050708090a0b20054104490d092004280002210520012003417a6a22063602042001200441066a36020020064110490d092004410e6a29000021092004290006210820012003416a6a22063602042001200441166a36020020064110490d092004411e6a29000021102004290016210d20012003415a6a3602042001200441266a360200410021040c160b41002106200241003a00c809417d210c0240034020052006460d01200241a8096a20066a200420066a220741026a2d00003a000020012003200c6a3602042001200741036a3602002002200641016a22073a00c809200c417f6a210c2007210620074120470d000b200741ff01714120490d09200320076b2203417e6a4110490d09200241c7096a3100002110200241b7096a290000210920022900bf09210d20022900af09210820022800ab09210520022f00a909210620022d00a809210b200420076a2204410a6a290000210f200441026a290000210e20012003416e6a3602042001200441126a360200201042ff01832110410121040c160b200641ff0171450d08200241003a00c8090c080b41002106200241003a00c809417d21070240034020052006460d01200241a8096a20066a200420066a220c41026a2d00003a00002001200320076a3602042001200c41036a3602002002200641016a220c3a00c8092007417f6a2107200c2106200c4120470d000b200c41ff01714120490d08200241a8096a410f6a290000210920022900bf09210d20022900af09210820022800ab09210520022f00a909210620022d00a8092107200241c0076a411f6a200241a8096a411f6a31000022103c0000200241c0076a410f6a20093700002002200d3700d707200220083700c707200220053600c307200220063b00c107200220073a00c0072003200c6b2203417e6a4110490d082004200c6a2205410a6a290000210f41022104200541026a290000210e20012003416e6a3602042001200541126a360200201042ff0183211020023502c007221520023301c40720023100c60742108684422086842211421888a721052011420888a721062015a7210b0c150b200641ff0171450d07200241003a00c8090c070b20054104490d062004280002210520012003417a6a3602042001200441066a360200410321040c130b2005450d0520042d0002210720012003417d6a3602042001200441036a360200410421044100210b20070e03121101050b2005450d0420042d0002210720012003417d6a3602042001200441036a360200410521044100210b20070e03111000040b4102210b0c100b41002106200241003a00c809417d210c0240034020052006460d01200241a8096a20066a200420066a220741026a2d00003a000020012003200c6a3602042001200741036a3602002002200641016a22073a00c809200c417f6a210c2007210620074120470d000b200741ff01714120490d03200320076b2203417e6a4110490d03200241c7096a3100002110200241b7096a290000210920022900bf09210d20022900af09210820022800ab09210520022f00a909210620022d00a809210b200420076a2204410a6a290000210f200441026a290000210e20012003416e6a3602042001200441126a360200201042ff01832110410621040c100b200641ff0171450d02200241003a00c8090c020b41002106200241003a00c809417d210c0240034020052006460d01200241a8096a20066a200420066a220741026a2d00003a000020012003200c6a3602042001200741036a3602002002200641016a22073a00c809200c417f6a210c2007210620074120470d000b200741ff01714120490d02200320076b2203417e6a410f4d0d02200241c7096a3100002110200241a8096a410f6a290000210920022900bf09210d20022900af09210820022800ab09210520022f00a909210620022d00a809210b200420076a2204410a6a290000210f200441026a290000210e20012003416e6a3602042001200441126a360200201042ff01832110410721040c0f0b200641ff0171450d01200241003a00c8090c010b41002106200241003a00c809417d21070240034020052006460d01200241a8096a20066a200420066a220c41026a2d00003a00002001200320076a3602042001200c41036a3602002002200641016a220c3a00c8092007417f6a2107200c2106200c4120470d000b200c41ff01714120490d01200241b7096a290000210920022900bf09210d20022900af09210820022800ab09210520022f00a909210620022d00a809210b200241f0056a200241c7096a31000022103c00002002200d3703e805200220083703d805200220093703e0052003200c6b2203417e6a4110490d012004200c6a2204410a6a290000210f200441026a290000210e20012003416e6a3602042001200441126a360200201042ff01832110410821040c0e0b200641ff0171450d00200241003a00c8090b2000410a3602000c100b0240024002402006450d0020042d0001210520012003417e6a3602042001200441026a36020020050d00200241a8096a200110cb0420022d00a8094101460d00200241b1096a290000210920022900a9092108200241a8096a2001108a0220022802a8092204450d0020022802ac092103024020012802042205450d00200241b0096a280200210c200128020022062d0000210720012005417f6a3602042001200641016a3602004100210120070e020302000b2003450d002004102c0b2000410a3602000c110b410121010b2000200436020420004104360200200041186a2009370200200041106a2008370200200041206a20013a00002000410c6a200c360200200041086a2003360200200041246a200241f40110c9081a0c0f0b02402006450d0020042d0001210520012003417e6a22063602042001200441026a36020020050d0020064104490d002004280002210520012003417a6a3602042001200441066a3602002000200536020420004105360200200041086a200241900210c9081a0c0f0b2000410a3602000c0e0b02402006450d0020042d0001210520012003417e6a3602042001200441026a3602004101210302400240024020050e03000201030b200241a8096a200110fd0520022802a8092204450d0220022902ac092109410021030c010b410221030b20002003360204200041063602002000410c6a2009370200200041086a2004360200200041146a200241840210c9081a0c0e0b2000410a3602000c0d0b2006450d0620042d0001210520012003417e6a22073602042001200441026a3602004101210c02400240024020050e03000201090b41002105200241003a00c8092003417d6a21030240034020072005460d01200241a8096a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00c8092003417f6a21032006210520064120470d000b200641ff01714120490d09200241c7096a3100002108200241b7096a290000210d20022900bf09210920022900af09210e20022800ab09210620022f00a909210b20022d00a809210a4100210c0c020b200541ff0171450d08200241003a00c8090c080b200241a8096a200110950420022802a8092206450d0720022902ac09210e4102210c0b2000200b3b00062000200a3a00052000200c3a000420004107360200200041246a20083c00002000411c6a2009370000200041146a200d3700002000410c6a200e370000200041086a2006360000200041286a200241f00110c9081a0c0c0b2006450d0420042d0001210520012003417e6a3602042001200441026a3602000240024002400240024020050e03000102090b2002200110b40520022802004101460d08200241a8096a200241047241e40110c9081a41002103200241003a00202001280204417f6a21040240024003402004417f460d01200220036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00202004417f6a21042005210320054120470d000b200541ff017141204f0d010c0a0b200341ff0171450d09200241003a00200c090b2002411f6a31000021092002410f6a29000021082002290017210d2002290007210e2002280003210420022f0001210320022d00002105200241c0076a200241a8096a41e40110c9081a200241d8056a200241c0076a41e40110c9081a20022001108a0220022802002201450d082002290204210f200241f4036a200241d8056a41e40110c9081a410021060c020b2002200110b40520022802004101460d07200241a8096a200241047241e40110c9081a41002103200241003a00202001280204417f6a2104024003402004417f460d01200220036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00202004417f6a21042005210320054120470d000b200541ff01714120490d082002411f6a31000021092002410f6a29000021082002290017210d2002290007210e2002280003210420022f0001210320022d00002105200241c0076a200241a8096a41e40110c9081a200241d8056a200241c0076a41e40110c9081a20022001108a0220022802002201450d082002290204210f200241f4036a200241d8056a41e40110c9081a410121060c020b200341ff0171450d07200241003a00200c070b2002200110b40520022802004101460d06200241a8096a200241047241e40110c9081a41002103200241003a00202001280204417f6a210403402004417f460d02200220036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00202004417f6a21042005210320054120470d000b200541ff01714120490d062002411f6a31000021092002410f6a29000021082002290017210d2002290007210e2002280003210420022f0001210320022d00002105200241c0076a200241a8096a41e40110c9081a200241d8056a200241c0076a41e40110c9081a20022001108a0220022802002201450d062002290204210f200241f4036a200241d8056a41e40110c9081a410221060b20024190026a200241f4036a41e40110c9081a2000200636020420004108360200200041086a20024190026a41e40110c9081a2000418b026a20093c000020004183026a200d370000200041fb016a2008370000200041f3016a200e37000020004190026a200f3702002000418c026a2001360200200041ef016a2004360000200041ed016a20033b0000200041ec016a20053a00000c0c0b200341ff0171450d04200241003a00200c040b2006450d0120042d0001210520012003417e6a22073602042001200441026a36020002400240024020050e03000102040b200241a8096a2001109f0720022d00a8094105460d0320022902ac09210920022802a8092101410021040c040b41002105200241003a00c8092003417d6a21030240034020072005460d01200241a8096a20056a200420056a220641026a2d00003a0000200120033602042001200641036a3602002002200541016a22063a00c8092003417f6a21032006210520064120470d000b200641ff01714120490d03200241c7096a310000210e200241b7096a290000210820022900bf09210d20022900af09210920022800ab09210120022f00a909210320022d00a8092105410121040c040b200541ff0171450d02200241003a00c8090c020b200241a8096a2001109f0720022d00a8094105460d0120022902ac09210920022802a8092101410221040c020b2000410a3602000c090b2000410a3602000c080b200020033b0006200020053a0005200020043a000420004109360200200041246a200e3c00002000411c6a200d370000200041146a20083700002000410c6a2009370000200041086a2001360000200041286a200241f00110c9081a0c070b2000410a3602000c060b2000410a3602000c050b4101210b0b200020063b010a2000200b3a000920004103360200200041386a200f370200200041306a200e370200200041286a2010370200200041206a200d370200200041186a2009370200200041106a20083702002000410c6a2005360200200041086a20043a0000200041c0006a200241d80110c9081a0c030b41002101420021130b200020083e0029200020093e0009200041023602002000412f6a20084230883c00002000412d6a20084220883d00002000410f6a20094230883c00002000410d6a20094220883d0000200041d8006a2017370200200041d0006a2018370200200041c0006a2016370200200041386a2011370200200041306a2012370200200041286a200d3c0000200041206a200f370000200041186a200e370000200041106a2010370000200041086a20043a0000200041c8006a20134210862001ad42ff018342088684201542ff018384370200200041e0006a200241b80110c9081a0c010b2000410a3602000b200241900b6a24000b810301037f024002400240024002402000280200417c6a0e050004010203040b200041086a2802002201450d0320002802042202450d032001450d032002102c0c030b20002802040d022000410c6a2802002201450d02200041086a2802002202450d02200141286c450d022002102c0f0b20002d00044102490d010240200041106a2802002201450d00200141d0006c2102200041086a28020041c0006a210103400240200141046a2802002203450d00200341306c450d002001280200102c0b200141d0006a2101200241b07f6a22020d000b0b2000410c6a2802002201450d0120002802082202450d01200141d0006c450d012002102c0f0b02400240024020002802040e020001020b20004190026a2802002201450d022000418c026a2802002202450d022001450d022002102c0f0b20004190026a2802002201450d012000418c026a2802002202450d012001450d012002102c0f0b20004190026a2802002201450d002000418c026a2802002202450d002001450d002002102c0f0b0baf0301037f024002400240024002402000280200417c6a0e050004010203040b200041086a2802002201450d0320002802042202450d032001450d032002102c0c030b20002802040d022000410c6a2802002201450d02200041086a2802002202450d02200141286c450d022002102c0c020b20002d00044102490d010240200041106a2802002201450d00200141d0006c2102200041086a28020041c0006a210103400240200141046a2802002203450d00200341306c450d002001280200102c0b200141d0006a2101200241b07f6a22020d000b0b2000410c6a2802002201450d0120002802082202450d01200141d0006c450d012002102c0c010b02400240024020002802040e020001020b20004190026a2802002201450d022000418c026a2802002202450d022001450d022002102c0c020b20004190026a2802002201450d012000418c026a2802002202450d012001450d012002102c0c010b20004190026a2802002201450d002000418c026a2802002202450d002001450d002002102c0b0240200041a4026a2802002201450d0020002802a0022200450d00200141ffffff3f71450d002000102c0b0b870301087f23004190026b22022400200141a4026a280200210320012802a0022104200141106a28020021052001410c6a2802002106200141086a280200210720012802042108200128020021092002410c6a200141146a41840210c9081a0240024020094108460d00200041033602000240024002402009417c6a0e0400040102040b2008410020071b2201450d032007450d032001102c0c030b20080d022007410020061b2201450d02200641286c450d022001102c0c020b200841ff01714102490d0102402005450d00200541d0006c2100200741c0006a210103400240200141046a2802002209450d00200941306c450d002001280200102c0b200141d0006a2101200041b07f6a22000d000b0b2007410020061b2201450d01200641d0006c450d012001102c0c010b20002007360204200020083602002000410c6a2005360200200041086a2006360200200041106a2002410c6a41840210c9081a0b02402004410020031b2201450d00200341ffffff3f71450d002001102c0b20024190026a24000bd90101047f230041106b220224002000200110c8040240412010322203450d002002422037020420022003360200200241004120102f20022802002204200228020822056a220320012900e401370000200341086a200141ec016a290000370000200341106a200141f4016a290000370000200341186a200141fc016a2900003700002002200541206a22013602082000200041086a22032802002001102f200028020020032802006a2004200110c9081a2003200328020020016a36020002402002280204450d002004102c0b200241106a24000f0b1039000bce0102017f027e230041e0006b22022400024020014104470d002002200041c4b5c80020011b280000109e05200241c8006a200210e604200235025021032002350248210402402002280200450d00200210f8050b200241e0006a240020034220862004840f0b200241d4006a4104360200200241146a41023602002002420237020420024194c7c3003602002002410436024c200241b8ccc3003602482002410036025c200241c4b5c8003602582002200241c8006a3602102002200241d8006a360250200241a4c7c3001046000bef0101027f024020002802042201450d0020002802002202450d00200141ffffff3f71450d002002102c0b0240200041106a2802002201450d00200028020c2202450d00200141ffffff3f71450d002002102c0b02402000411c6a2802002201450d0020002802182202450d00200141ffffff3f71450d002002102c0b02402000412c6a2802002202450d00200028022421012002410c6c210203400240200141046a28020041ffffffff0371450d002001280200102c0b2001410c6a2101200241746a22020d000b0b0240200041286a2802002201450d0020002802242202450d002001410c6c450d002002102c0b0bea0502047f027e230041d0006b2202240002400240024020014104470d00200041c4b5c80020011b2800002101200241186a4181dec700410310c501200241286a41a4bfc000411510c50120022001360244200241c8006a200241c4006a410410c7012002410c6a200241c4006a41046a3602002002200241d0006a3602042002200241c4006a3602082002200241c8006a360200200241386a2002107e2002280240220141206a2200417f4c0d010240024020000d00410121030c010b200010322203450d030b20024100360208200220003602042002200336020020024100411010c8012002280200200228020822006a22032002290018370000200341086a200241186a41086a2900003700002002200041106a220036020820022000411010c8012002280200200228020822006a22032002290028370000200341086a200241286a41086a2900003700002002200041106a22033602082002280238210020022003200110c80120022802002204200228020822036a2000200110c9081a2002200320016a22013602080240200228023c450d002000102c0b200241286a2004200110cd0102400240200228022822030d0041002105200241003602202002420437031841042103410021010c010b2002200229022c220637021c200220033602182006a741ffffffff007121052006422088a721010b02402002280204450d002004102c0b2002200241186a10c301200235020821062002350200210702402001450d0020014104742100200341046a210103400240200141046a280200450d002001280200102c0b200141106a2101200041706a22000d000b0b02402005450d002003102c0b200241d0006a240020064220862007840f0b200241346a4104360200200241146a41023602002002420237020420024194c7c3003602002002410436022c200241ccccc3003602282002410036021c200241c4b5c8003602182002200241286a3602102002200241186a360230200241a4c7c3001046000b103b000b1039000be02607047f017e0a7f017e017f017e137f230041a0026b2202240002400240024002400240024020014104490d0020014104470d00200041c4b5c80020011b280000210320024187dec700410410c501200241d8016a41ecb1c500411810c5012002200336029802200241106a20024198026a410410c7012002412c6a20024198026a41046a3602002002200241186a360224200220024198026a3602282002200241106a36022020024188026a200241206a107e200228029002220141206a2200417f4c0d020240024020000d00410121040c010b200010322204450d040b200241003602282002200036022420022004360220200241206a4100411010c8012002280220200228022822006a22042002290000370000200441086a200241086a2900003700002002200041106a2200360228200241206a2000411010c8012002280220200228022822006a220420022900d801370000200441086a200241d8016a41086a2900003700002002200041106a22043602282002280288022100200241206a2004200110c80120022802202204200228022822056a2000200110c9081a2002200520016a22013602280240200228028c02450d002000102c0b200241d8016a2004200110b90320022902dc01420020022802d80122011b210602402002280224450d002004102c0b2001410420011b210702402006422088a722010d0041002108410021090c020b200720014102746a210a20024198026a41086a210b200241f0016a210c20024180026a210d41002108410021092007210e0340200e280200210f20024187dec700410410c501200241d8016a41d09ac500411310c5012002410036029002200242013703880220024188026a41004104102f20022802880220022802900222016a200f3600002002200141046a22013602900220024188026a20014104102f200228028802220120022802900222006a20033600002002200041046a22003602900220024198026a2001200010c7012002200120006a36022c200220013602282002200b360224200220024198026a360220200241106a200241206a107e0240200228028c02450d002001102c0b2002280218220141206a2200417f4c0d030240024020000d00410121040c010b200010322204450d050b200241003602282002200036022420022004360220200241206a4100411010c8012002280220200228022822006a22042002290000370000200441086a200241086a2900003700002002200041106a2200360228200241206a2000411010c8012002280220200228022822006a220420022900d801370000200441086a200241d8016a41086a22102900003700002002200041106a220436022820022802102100200241206a2004200110c80120022802202204200228022822056a2000200110c9081a2002200520016a220136022802402002280214450d002000102c0b200241d8016a2004200110cd0120022802d801210120022902dc01211102402002280224450d002004102c0b024020090d0041b80110322209450d054100211220094100360200200941046a200241206a41b20110c9081a200941003b01b6010b200e41046a210e2011420020011b21132001410420011b211420092104201221150240024002400240024002400340200441246a210020042f01b601211641002101200441046a2217210502400340024020162001470d00201621010c020b20052802002118200541046a21052000410c6a2100200141016a21010240417f2018200f472018200f4b1b41016a0e03000401000b0b2001417f6a21010b02402015450d002015417f6a2115200420014102746a41b8016a28020021040c010b0b2016410b490d01410021154104210502400240200141054f0d00200121180c010b4105210541052118024002402001417b6a0e020201000b200141796a211841012115410621050c010b41002118410121150b41b80110322200450d0a4100211920004100360200200041046a200241206a41b20110c908211a200041003b01b60120042005410c6c6a220141386a280200211b200141346a280200211c200141306a280200211d201720054102746a2216280200211e201a201641046a20042f01b6012005417f736a221641027410c9081a200041306a2001413c6a2016410c6c10c9081a200420053b01b601200020163b01b6012000200420151b220120184102746a220541086a200541046a220520012f01b60120186b41027410ca081a2005200f36020020012018410c6c6a2205413c6a200541306a220f20012f01b60120186b410c6c10ca081a200541346a2013370200200f2014360200200120012f01b60141016a3b01b6010240024020042802002201450d0041002119034020002114201e211a201b211f201c2120201d212120042f01b401210f024002400240200122042f01b6012200410b490d0041002117410421180240200f4105490d00200f211802400240200f417b6a0e020201000b200f41796a210f41012117410621180c010b4100210f41012117410521180b41e80110322200450d10201941016a21194100210120004100360200200041046a200241206a41b20110c9082122200041003b01b601200020022902d8013702b801200041c0016a2010290200370200200041c8016a200241d8016a41106a290200370200200041d0016a200c290200370200200041d8016a200241d8016a41206a290200370200200041e0016a200d290200370200200441306a22232018410c6c6a2216280208211b2016280204211c2016280200211d200441046a2215201841027422056a280200211e20222015200541046a22246a20042f01b60122252018417f736a220541027410c9082122200041306a2016410c6a2005410c6c10c9082126200420183b01b601200020053b01b601200041b8016a200420246a41b8016a202520186b41027410c908211602400340200020014102746a41b8016a280200221820013b01b401201820003602002001200120054922186a220120054b0d0120180d000b0b2017450d01200f410274220520166a41086a2016200f41016a220141027422186a221620002f01b601200f6b41027410ca081a20162014360200202220186a202220056a220520002f01b601200f6b41027410ca081a2005201a3602002026200f410c6c6a2205410c6a200520002f01b601200f6b410c6c10ca081a2005201f3602082005202036020420052021360200200020002f01b60141016a22053b01b6012001200541ffff037122054b0d020340200020014102746a41b8016a280200221820013b01b40120182000360200200120012005496a221820054b0d03200120054f210f20182101200f450d000c030b0b200f4102742205200441b8016a22186a41086a2018200f41016a220141027422166a22182000200f6b410274220010ca081a20182014360200200441046a221820166a201820056a2205200010ca081a2005201a3602002004200f410c6c6a2200413c6a200041306a220520042f01b601200f6b410c6c10ca081a200041386a201f360200200041346a202036020020052021360200200420042f01b60141016a22003b01b601200f200041ffff037122004f0d040340200420014102746a41b8016a280200220520013b01b40120052004360200200120012000496a220520004b0d05200120004f2118200521012018450d000c050b0b200f4102742205200441b8016a22186a41086a2018200f41016a220141027422166a221820042f01b601200f6b41027410ca081a20182014360200201520166a201520056a220520042f01b601200f6b41027410ca081a2005201a3602002023200f410c6c6a2205410c6a200520042f01b601200f6b410c6c10ca081a2005201f3602082005202036020420052021360200200420042f01b60141016a22053b01b6012001200541ffff037122054b0d000340200420014102746a41b8016a280200221820013b01b401201820043602002001200120054922186a220120054b0d0120180d000b0b200428020022010d000b0b2009450d0341e80110322201450d0b20014100360200200141046a200241206a41b20110c908210f200141003b01b601200120022902d8013702b801200141c0016a2010290200370200200141c8016a200241d8016a41106a290200370200200141d0016a200c290200370200200141d8016a200241d8016a41206a290200370200200141e0016a200d290200370200200120093602b801200941003b01b4012009200136020020122019470d0420012f01b6012204410a4b0d05201241016a21122001200441016a22053b01b60120012004410c6c6a221841346a201c360200200f20044102746a201e360200201841306a201d360200201841386a201b360200200120054102746a41b8016a2000360200200020053b01b40120002001360200200121090b200841016a21080c050b2000280200210420002014360200200041046a22012902002111200120133702002004450d042011a7210502402011422088a72201450d0020014104742100200441046a210103400240200141046a280200450d002001280200102c0b200141106a2101200041706a22000d000b0b2005450d04200541ffffffff0071450d042004102c0c040b201720014102746a220041046a2000201620016b41027410ca081a2000200f36020020042001410c6c6a2200413c6a200041306a220520042f01b60120016b410c6c10ca081a200041346a201337020020052014360200200420042f01b60141016a3b01b601200841016a21080c030b41ecd0c800412b41bcd2c800103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b200e200a460d020c000b0b200241e4016a4104360200200241346a41023602002002420237022420024194c7c300360220200241043602dc01200241e0ccc3003602d80120024100360204200241c4b5c8003602002002200241d8016a360230200220023602e001200241206a41a4c7c3001046000b02402006a72201450d00200141ffffffff0371450d002007102c0b20084104744104722201417f4c0d00200110322200450d01200241003602e001200220013602dc01200220003602d801200241d8016a2008108f010240024020090d004100210141002104410021000c010b2009210120122100200921040240034020012f01b60121052000450d012000417f6a2100200120054102746a41b8016a280200210120042802b80121040c000b0b200821000b200241346a2005360200200241306a20013602002002200036023820024200370328200220043602242002410036022002402000450d0020022000417f6a360238200241206a410020041b221828020021040240024020182802082205201828020422002f01b6014f0d00200021010c010b03400240200028020022010d00410021010c020b200441016a210420002f01b401210520012100200520012f01b6014f0d000b0b200541016a210f0240024020040d00200121000c010b2001200f4102746a41b8016a280200210002402004417f6a2204450d00034020002802b80121002004417f6a22040d000b0b4100210f0b20182000360204201841003602002018200f36020820012005410c6c6a41306a2100200120054102746a41046a2101034020012802002101200241d8016a20022802e0014104102f20022802d80120022802e00122046a20013600002002200441046a3602e00120002802002101200241d8016a20002802082200108f0102402000450d00200120004104746a2105034020012802002100200241d8016a20022802e0014104102f20022802d80120022802e00122046a20003600002002200441046a3602e001200141046a2802002001410c6a280200200241d8016a10bb01200141106a22012005470d000b0b20022802382201450d0120022001417f6a360238200241206a410020022802241b221828020021040240024020182802082205201828020422002f01b6014f0d00200021010c010b03400240200028020022010d00410021010c020b200441016a210420002f01b401210520012100200520012f01b6014f0d000b0b200541016a210f0240024020040d00200121000c010b2001200f4102746a41b8016a280200210002402004417f6a2204450d00034020002802b80121002004417f6a22040d000b0b4100210f0b20182000360204201841003602002018200f36020820012005410c6c6a41306a2100200120054102746a41046a21010c000b0b20023502d801211120023502e00121132009450d02200921010240034020092f01b60121002012450d012012417f6a2112200920004102746a41b8016a280200210920012802b80121010c000b0b200241346a2000360200200241306a20093602002002420037032820022001360224200241003602200c030b103b000b1039000b41002108200241306a4100360200200241003602240b20022008360238200241d8016a200241206a10fb05024020022802dc012204450d00034020022802e0012105024020022802e4012201450d0020014104742100200441046a210103400240200141046a280200450d002001280200102c0b200141106a2101200041706a22000d000b0b02402005450d002004450d00200541ffffffff0071450d002004102c0b200241d8016a200241206a10fb0520022802dc0122040d000b0b024020022802242200450d00200028020021012000102c2001450d000340200128020021002001102c2000210120000d000b0b200241a0026a240020134220862011840bfa0202077f017e230041206b2202240002400240024020012802182203450d0020012003417f6a36021820012802042204450d0220012802002105024002402001280208220620042f01b6014f0d00200421030c010b034002400240200428020022030d00410021030c010b200541016a210520042f01b40121060b2004102c20032104200620032f01b6014f0d000b0b200320064102746a41046a2802002107200241106a41086a220820032006410c6c6a220441386a2802003602002002200441306a290200370310200641016a210402402005450d00200320044102746a41b8016a280200210302402005417f6a2204450d00034020032802b80121032004417f6a22040d000b0b410021040b200241086a2008280200220636020020022002290310220937030020002007360200200020093702042000410c6a20063602002001200436020820012003360204200141003602000c010b200041003602040b200241206a24000f0b41ecd0c800412b4198d1c800103c000b850904057f017e027f037e230041e0006b2202240002400240024020010d002002411436021c200241d0f0c500360218200241206a41d0f0c500411410b3010240024002400240200228022022010d004100210141082103410021040c010b200228022421042002200241286a2802002205360234200220013602300240024002402005450d0020012d0000210320022005417f6a3602342002200141016a360230200241c8006a200241306a10fd0520022802482206450d00200229024c2107200341ff01714101460d012007a72205450d00200541286c450d002006102c0b4100210320024100360210200242013703082002410f36023c2002200241186a3602382002200241086a36024441012105200241dc006a41013602002002420137024c200241b4bcc3003602482002200241386a360258200241c4006a41dcb7c000200241c8006a103e1a200235021042208620023502088410000240200228020c450d002002280208102c0b0c010b2007422088a721082007a7210941002105410121030b02402004450d002001102c0b20052003724101470d014100200820051b21044100200920051b21014108200620051b21030b200220043602102002200136020c200220033602080c010b20062802082205ad42287e2207422088a70d022007a72204417f4c0d02200628020021010240024020040d00410821060c010b200410322206450d040b20024100360210200220063602082002200441286e36020c200241086a4100200510fe05200228021021042002280208210302402005450d00200541286c21062003200441286c6a21050340200141086a2903002107200141106a290300210a200141186a290300210b2001290300210c200541206a200141206a290300370300200541186a200b370300200541106a200a370300200541086a20073703002005200c370300200541286a2105200441016a2104200141286a2101200641586a22060d000b0b200220043602100b200441286c4104722201417f4c0d01200110322205450d02200241003602502002200136024c20022005360248200241c8006a2004108f010240024020040d0020022802502105200228024821040c010b2003200441286c6a210620022802502105200321010340200241c8006a20054120102f2002280248200228025022046a22052001290000370000200541086a200141086a290000370000200541106a200141106a290000370000200541186a200141186a2900003700002002200441206a2205360250200141206a2903002107200241c8006a20054108102f20022802482204200228025022056a20073700002002200541086a22053602502006200141286a2201470d000b0b0240200228020c2201450d00200141286c450d002003102c0b200241e0006a24002005ad4220862004ad840f0b200241146a4104360200200241dc006a41023602002002420237024c20024194c7c3003602482002410436020c20024188cdc30036020820024100360224200241c4b5c8003602202002200241086a3602582002200241206a360210200241c8006a41a4c7c3001046000b103b000b1039000bdd0604037f017e087f037e230041a0026b2202240020022001108702024002402002280200450d00200041003602000c010b02400240024020022802042203200128020441286e2204200420034b1bad42287e2205422088a70d002005a72204417f4c0d000240024020040d00410821060c010b200410322206450d020b4100210720024100360210200220063602082002200441286e36020c02402003450d0041002108034041002104200241003a00d801200841016a210820012802042109417f210a02400240034020092004460d01200241b8016a20046a2001280200220b2d00003a000020012009200a6a3602042001200b41016a3602002002200441016a220b3a00d801200a417f6a210a200b2104200b4120470d000b200241e0016a41086a2204200241b8016a41086a290300370300200241e0016a41106a220a200241b8016a41106a290300370300200241e0016a41186a220c200241b8016a41186a290300370300200220022903b8013703e001200b41ff0171411f4b0d010c060b200441ff0171450d05200241003a00d8010c050b200241f8006a41086a220d2004290300370300200241f8006a41106a2204200a290300370300200241f8006a41186a220a200c290300370300200220022903e0013703782009200b6b220b4108490d042001280200220929000021052001200b41786a3602042001200941086a360200200241386a41086a200d290300220e370300200241386a41106a2004290300220f370300200241386a41186a200a2903002210370300200241186a41186a220a2010370300200241186a41106a220b200f370300200241186a41086a2209200e37030020022002290378220e3703382002200e37031802402007200228020c470d00200241086a2007410110f20420022802102107200228020821060b2006200741286c6a220420022903183703002009290300210e200b290300210f200a290300211020042005370320200441186a2010370300200441106a200f370300200441086a200e3703002002200741016a220736021020082003470d000b0b20002002290308370200200041086a200241086a41086a2802003602000c030b103b000b1039000b2000410036020020022802084100200228020c22041b2201450d00200441286c450d002001102c0b200241a0026a24000bd60103017f017e017f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1bad42287e2204422088a722020d022004a722014100480d022002454103742105024002400240024002402000280200410020031b22020d002001450d010c030b200341286c22030d0120010d020b200521020c020b200220032001103522020d010c030b200110322202450d020b20002002360200200041046a200141286e3602000b0f0b2005450d001039000b103b000b8b0b05017f027e017f017e047f230041d0076b220224002002428080808080203702b4072002200136020c2002200041c4b5c80020011b3602082002200241086a3602b007200241f0036a200241b0076a10ab0302400240024020022903f80322034202510d0020022903f003210420024180026a20024180046a41f00110c9081a200241c0076a200241b0076a10c60420022802c0072205450d0020022902c4072106200241106a20024180026a41f00110c9081a2006a7210702400240200228020c450d00420221032007450d012005102c0c010b200241f0036a200241106a41f00110c9081a0b20034202510d00200241106a200241f0036a41f00110c9081a20024180026a200241106a41f00110c9081a20022006422088a722013602c407200220053602c0074100210820014104490d012005280000210020022001417c6a3602c4072002200541046a3602c007200241f0036a200241c0076a10840520022802f0032209450d0120022902f4032106024020022802c407220a41044f0d0002402006422088a72201450d002001410c6c21002009210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b2006a72201450d022001410c6c450d022009102c0c030b20022802c007220828000021012002200a417c6a3602c4072002200841046a3602c007200921080c020b2002411c6a410436020020024194026a4102360200200242023702840220024194c7c3003602800220024104360214200241a4cdc300360210200241003602c407200241c4b5c8003602c0072002200241106a360290022002200241c0076a36021820024180026a41a4c7c3001046000b0b02402007450d002005102c0b0240024020080d00410021010c010b200241b0056a2003370300200241a8056a2004370300200241a4056a20013602002002419c056a200637020020024198056a200836020020024194056a200036020020024190056a41023602002002410936028805200242023703d804200241b8056a20024180026a41f00110c9081a2002200241f0036a3602c007200241b0076a200241c0076a108102200241c0076a41086a200241b0076a41086a280200360200200220022903b0073703c007200241c0076a108202210120024188056a10830241002802d8d24821000240024020010d0020004103490d01200241263602b407200241fc9fc8003602b00741002802d4d248210141002802d0d248210041002802dcd2482105200241b0046a41a501360200200241a8046a42e780808010370300200241a4046a41c8a0c8003602002002419c046a421c37020020024198046a41aca0c80036020020024190046a420137030020024180046a4201370300200241f8036a411c360200200241f0036a411c6a200241c0076a360200200241b4b5c8003602fc03200241aca0c8003602f403200241033602f003200241043602c407200141e0a3c000200541024622051b28021021012002200241b0076a3602c007200041f8a3c00020051b200241f0036a20011103000c010b2000450d00200241233602c4072002200241b0076a3602c00741002802d4d248210141002802d0d248210041002802dcd2482105200241b0046a41a601360200200241a8046a42e780808010370300200241a4046a41c8a0c8003602002002419c046a421c37020020024198046a41aca0c80036020020024190046a420137030020024180046a4201370300200241f8036a411c360200200241f0036a411c6a200241c0076a360200200241a4a0c8003602fc03200241aca0c8003602f403200241013602f003200041f8a3c000200541024622051b200241f0036a200141e0a3c00020051b2802101103000b410121010b200241f0036a200110c50320023502f803210320023502f0032106200241d0076a240020062003422086840b0d00200141ffcac800410210500ba32904077f047e117f037e230041d0056b22022400024020014108490d00200241003a00e80320014108460d00200241013a00e8032002200041c4b5c80020011b22002d00083a00c803024020014109460d00200241023a00e803200220002d00093a00c9032001410a460d00200241033a00e803200220002d000a3a00ca032001410b460d00200241043a00e803200220002d000b3a00cb032001410c460d00200241053a00e803200220002d000c3a00cc032001410d460d00200241063a00e803200220002d000d3a00cd032001410e460d00200241073a00e803200220002d000e3a00ce032001410f460d00200241083a00e803200220002d000f3a00cf0320014110460d00200241093a00e803200220002d00103a00d00320014111460d002002410a3a00e803200220002d00113a00d10320014112460d002002410b3a00e803200220002d00123a00d20320014113460d002002410c3a00e803200220002d00133a00d30320014114460d002002410d3a00e803200220002d00143a00d40320014115460d002002410e3a00e803200220002d00153a00d50320014116460d002002410f3a00e803200220002d00163a00d60320014117460d00200241103a00e803200220002d00173a00d70320014118460d00200241113a00e803200220002d00183a00d80320014119460d00200241123a00e803200220002d00193a00d9032001411a460d00200241133a00e803200220002d001a3a00da032001411b460d00200241143a00e803200220002d001b3a00db032001411c460d00200241153a00e803200220002d001c3a00dc032001411d460d00200241163a00e803200220002d001d3a00dd032001411e460d00200241173a00e803200220002d001e3a00de032001411f460d00200241183a00e803200220002d001f3a00df0320014120460d00200241193a00e803200220002d00203a00e00320014121460d002002411a3a00e803200220002d00213a00e10320014122460d002002411b3a00e803200220002d00223a00e20320014123460d002002411c3a00e803200220002d00233a00e30320014124460d002002411d3a00e803200220002d00243a00e40320014125460d002002411e3a00e803200220002d00253a00e50320014126460d002002411f3a00e803200220002d00263a00e60320014127460d00200241c8006a41106a2203200241c8036a41106a2204290300370300200241c8006a41086a2205200241c8036a41086a2206290300370300200220002d00273a00e703200241c8006a41186a2207200241c8036a41186a2208290300370300200241203a00e803200220022903c80322093703a80120022009370348200241286a41186a22002007290300370300200241286a41106a22072003290300370300200241286a41086a220320052903003703002002200229034837032820014128470d0120082000290300220937030020042007290300220a37030020062003290300220b37030020022002290328220c3703c803200241086a41186a2009370300200241086a41106a200a370300200241086a41086a200b3703002002200c37030820024188016a41186a200937030020024188016a41106a200a37030020024188016a41086a200b3703002002200c3703880120004200370300200742003703002003420037030020024200370328200241c8036a41ffdcc700410710c50120032006290000370300200220022900c803370328200241c8036a41b8b3c300410c10c50120002006290000370300200720022900c8033703002002200241286a412010c6012002280204210d2002280200210e20004200370300200742003703002003420037030020024200370328200241c8036a41ffdcc700410710c50120032006290000370300200220022900c803370328200241c8036a418893c700410a10c50120002006290000370300200720022900c803370300200241c8036a200241286a10e10120022802c8032201410120011b210f20022902cc03420020011b2209a7211002400240024002402009422088a72201450d00200f200141057422086a2111200241c4056a2112200241c8036a41206a2100200f2101034020024180056a41186a2206200141186a220729000037030020024180056a41106a2204200141106a220329000037030020024180056a41086a2205200141086a22132900003703002002200129000037038005201329000021092003290000210a2001290000210b200241c8006a41186a22132007290000370300200241c8006a41106a2214200a370300200241c8006a41086a221520093703002002200b370348200241c8036a41186a22072006290300370300200241c8036a41106a22032004290300370300200241c8036a41086a2204200529030037030020022002290380053703c803200241a0056a200241c8036a10a304200241286a41186a22052013290300370300200241286a41106a22132014290300370300200241286a41086a22142015290300370300200220022903483703280240024020022802c00522060d00410021060c010b200020022903a005370300200041186a200241a0056a41186a290300370300200041106a200241a0056a41106a290300370300200041086a200241a0056a41086a290300370300200720052903003703002003201329030037030020042014290300370300200241f0046a41086a201241086a280200360200200220022903283703c803200220122902003703f004200241a8016a41386a200241c8036a41386a290300370300200241a8016a41306a200241c8036a41306a290300370300200241a8016a41286a200241c8036a41286a290300370300200241a8016a41206a2000290300370300200241a8016a41186a2007290300370300200241a8016a41106a2003290300370300200241a8016a41086a2004290300370300200220022903c8033703a8010b20060d02200141206a2101200841606a22080d000b0b4108210102402010450d00201041ffffff3f71450d00200f102c0b41002116410021000c010b20024198026a41386a2200200241a8016a41386a29030037030020024198026a41306a2207200241a8016a41306a29030037030020024198026a41286a2203200241a8016a41286a29030037030020024198026a41206a2204200241a8016a41206a29030037030020024198026a41186a2205200241a8016a41186a29030037030020024198026a41106a2213200241a8016a41106a29030037030020024198026a41086a2214200241a8016a41086a290300370300200241d0046a41086a2215200241f0046a41086a280200360200200220022903a80137039802200220022903f0043703d004200241f0026a41086a22122014290300370300200241f0026a41106a22142013290300370300200241f0026a41186a22132005290300370300200241f0026a41206a22052004290300370300200241f0026a41286a22042003290300370300200241f0026a41306a22032007290300370300200241f0026a41386a22072000290300370300200241e0046a41086a2200201528020036020020022002290398023703f002200220022903d0043703e00441d00010322217450d01201720022903f00237030020172006360240201720022903e004370244201741386a2007290300370300201741306a2003290300370300201741286a2004290300370300201741206a2005290300370300201741186a2013290300370300201741106a2014290300370300201741086a2012290300370300201741cc006a200028020036020020024281808080103702c404200220173602c0040240024020084120470d00410121160c010b200141206a2105201141606a2118200241c4056a2112200241c8036a41206a210041012116034020052101034020024180056a41186a2206200141186a220729000037030020024180056a41106a2204200141106a220329000037030020024180056a41086a2208200141086a22052900003703002002200129000037038005200241c8006a41186a22132007290000370300200241c8006a41106a22142003290000370300200241c8006a41086a2215200529000037030020022001290000370348200241c8036a41186a22072006290300370300200241c8036a41106a22032004290300370300200241c8036a41086a2204200829030037030020022002290380053703c803200241a0056a200241c8036a10a304200241286a41186a22082013290300370300200241286a41106a22052014290300370300200241286a41086a22132015290300370300200220022903483703280240024020022802c00522060d00410021060c010b200020022903a005370300200041186a200241a0056a41186a290300370300200041106a200241a0056a41106a290300370300200041086a200241a0056a41086a290300370300200720082903003703002003200529030037030020042013290300370300200241f0046a41086a201241086a280200360200200220022903283703c803200220122902003703f004200241a8016a41386a200241c8036a41386a290300370300200241a8016a41306a200241c8036a41306a290300370300200241a8016a41286a200241c8036a41286a290300370300200241a8016a41206a2000290300370300200241a8016a41186a2007290300370300200241a8016a41106a2003290300370300200241a8016a41086a2004290300370300200220022903c8033703a8010b024020060d002011200141206a2201470d010c030b0b20024198026a41386a2208200241a8016a41386a29030037030020024198026a41306a2205200241a8016a41306a29030037030020024198026a41286a2214200241a8016a41286a29030037030020024198026a41206a2215200241a8016a41206a29030037030020024198026a41186a2219200241a8016a41186a29030037030020024198026a41106a221a200241a8016a41106a29030037030020024198026a41086a221b200241a8016a41086a2213290300370300200241d0046a41086a221c200241f0046a41086a280200360200200220022903a80137039802200220022903f0043703d004200241f0026a41086a221d201b290300370300200241f0026a41106a221b201a290300370300200241f0026a41186a221a2019290300370300200241f0026a41206a22192015290300370300200241f0026a41286a22152014290300370300200241f0026a41306a22142005290300370300200241f0026a41386a22052008290300370300200241e0046a41086a2208201c28020036020020022002290398023703f002200220022903d0043703e0042004201d2903003703002003201b2903003703002007201a29030037030020002019290300370300200241c8036a41286a22192015290300370300200241c8036a41306a22152014290300370300200241c8036a41386a22142005290300370300200220022903f0023703c80320132008280200360200200220022903e0043703a8010240201620022802c404470d00200241c0046a2016410110d60420022802c00421170b200141206a21052017201641d0006c6a220820022903c803370300200329030021092007290300210a2000290300210b2019290300210c2015290300211e2014290300211f2004290300212020082006360240200841086a2020370300200820022903a801370244200841cc006a2013280200360200200841386a201f370300200841306a201e370300200841286a200c370300200841206a200b370300200841186a200a370300200841106a20093703002002201641016a22163602c80420182001470d000b0b02402010450d00201041ffffff3f71450d00200f102c0b20022802c404210020022802c00421010b200220163602a805200220003602a405200220013602a005200241c8036a200241a0056a10db0441002101024020022802c8034101460d0020024180056a41106a200241e0036a28020036020020024180056a41086a200241c8036a41106a2903003703002002200241c8036a41086a29030037038005200241e4036a2802002101200241f0026a200241e8036a41d80010c9081a0b200241a0056a41086a220020024180056a41086a290300370300200241a0056a41106a220620024180056a41106a28020036020020022002290380053703a005200241c8036a200241f0026a41d80010c9081a0240024002402001450d00200241a8016a41106a2006280200360200200241a8016a41086a2000290300370300200220022903a0053703a80120024198026a200241c8036a41d80010c9081a200241bc016a2001360200200241a8016a41186a20024198026a41d80010c9081a200241c8036a41186a20024188016a41186a290300370300200241c8036a41106a20024188016a41106a290300370300200241c8036a41086a20024188016a41086a29030037030020022002290388013703c803200241f0026a200241a8016a41e7e485f306200241c8036a10820620022902f402210920022802f0022106200241a8016a10dd0420060d010b41002101200241003602a8010c010b200241d0036a2009370300200220163602d803200220063602cc032002200d4100200e1b3602c803200241a8016a200241c8036a10ba012009a7210702402009422088a72201450d002001410c6c21002006210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b02402007450d002007410c6c450d002006102c0b024020022802a80122010d00410021010c010b200241b0016a280200210320022802ac0121040b410110322200450d00200242013702cc03200220003602c803200241c8036a41004101102f20022802c803220020022802d00322066a21070240024020010d00200741003a0000200641016a21060c010b200741013a00002002200641016a3602d00320012003200241c8036a10bb0120022802d003210620022802c80321002001450d002004450d002001102c0b200241d0056a24002006ad4220862000ad840f0b1039000b200241003a00e8030b200241b4016a4104360200200241dc036a4102360200200242023702cc0320024194c7c3003602c803200241043602ac01200241dccdc3003602a801200241003602f402200241c4b5c8003602f0022002200241a8016a3602d8032002200241f0026a3602b001200241c8036a41a4c7c3001046000bce0e03037f017e047f230041e0016b220424000240024002400240024002400240024002400240200141d0006a22052001412c6a412010cc08450d00200441d0006a41186a200541186a290000370300200441d0006a41106a200541106a290000370300200441d0006a41086a200541086a2900003703002004200529000037035002402001200441d0006a1092072206450d00200628020c41004a0d010b200441206a41086a2201200541086a290000370300200441206a41106a2202200541106a290000370300200441206a41186a2203200541186a29000037030020042005290000370320413010322205450d01200541003a00002005200429032037000120052004290050370021200541096a2001290300370000200541116a2002290300370000200541196a2003290300370000200541286a200441d7006a2900003700000240024020052d00000e040a0a000a010b20052802082201450d0920052802042202450d092001450d092002102c0c090b20052802282201450d0820052802242202450d082001450d082002102c0c080b2004410036020c20042005360208200441f0ecc400360204200420013602002004420037031820044204370310412410322205450d00200442243702a401200420053602a001200441a0016a41004104102f20042802a00120042802a80122056a20023600002004200541046a3602a80120034120200441a0016a10ca04200441d0006a200420042802a001220120042802a801200441106a10950702400240024020042802504101460d0020042802542203450d0102400240200441d8006a2903002207422088a741044f0d00410021050c010b20032800002102410121050b2007a7450d022003102c0c020b024002400240200428025422052d00000e0402020002010b200541086a2802002202450d01200541046a2802002203450d012002450d012003102c0c010b200541286a2802002202450d00200541246a2802002203450d002002450d002003102c0b2005102c0b410021050b024020042802a401450d002001102c0b02402005450d0020042002360244200441d0006a2004200441c4006a4104200441106a109507024020042802504101460d0020042802542203450d05200441d8006a29030021072004200336024820042007422088a7220636024c41002105200441003a00702006417f6a210102400240034020062005460d01200441d0006a20056a200320056a22022d00003a00002004200241016a3602482004200541016a22023a00702004200136024c2001417f6a21012002210520024120470d000b200441a0016a41086a2205200441d0006a41086a290300370300200441a0016a41106a2201200441d0006a41106a290300370300200441a0016a41186a2206200441d0006a41186a290300370300200420042903503703a001200241ff0171411f4b0d010c050b200541ff0171450d04200441003a0070410021050c050b200441206a41086a2005290300370300200441206a41106a2001290300370300200441206a41186a2006290300370300200420042903a001370320200441d0006a200441c8006a10f60320042802702205450d03200441f4006a28020021010c040b024002400240200428025422052d00000e0402020002010b200541086a2802002201450d01200541046a2802002202450d012001450d012002102c0c010b200541286a2802002201450d00200541246a2802002202450d002001450d002002102c0b2005102c0c040b200041003602000c040b1039000b410021050b02402007a7450d002003102c0b2005450d0002402001450d00200141306c450d002005102c0b20004204370200200041086a220841003602002004280218210520044100360218200428021421092004280210210a2004420437031020004100200541306c220141306d220310ec012008280200210220050d02200a21050c030b200041003602000b20042802102102024020042802182205450d00200541306c2101200241046a210503400240200541046a280200450d002005280200102c0b200541306a2105200141506a22010d000b0b20042802142205450d03200541306c450d032002102c0c030b200a20016a210b200541306c2103200a41306a210520002802002002410c6c6a210102400340200541546a2802002206450d01200141046a200541586a290200370200200120063602002001410c6a2101200541306a2105200241016a2102200341506a22030d000b200b21050b200b20056b220141306d21030b2008200236020002402001450d00200341306c2101200541046a210503400240200541046a280200450d002005280200102c0b200541306a2105200141506a22010d000b0b0240200a410020091b2205450d00200941306c450d002005102c0b024020042802182205450d00200541306c21014108210503400240200541046a280200450d002005280200102c0b200541306a2105200141506a22010d000b0b20042802142205450d01200541306c450d014104102c0c010b2005102c200041003602000b200441e0016a24000bf90804057f017e037f027e230041c0016b22022400024020010d00200241a0016a41186a22034200370300200241a0016a41106a22044200370300200241a0016a41086a22054200370300200242003703a001200241f8006a41c7dcc700410410c5012005200241f8006a41086a2201290000370300200220022900783703a001200241f8006a41f0d5c500410b10c5012003200129000037030020042002290078370300200241086a200241a0016a10f10420022802082106200229020c2107200241086a41186a22084200370300200241086a41106a22094200370300200241086a41086a220a420037030020024200370308200241f8006a41c7dcc700410410c501200a200129000037030020022002290078370308200241f8006a418cd7c500410a10c5012008200129000037030020092002290078370300200241f8006a200241086a10860520022d00782101200320024191016a290000370300200420024189016a290000370300200520024181016a290000370300200220022900793703a0012007420020061b21072006410820061b21060240024020014101460d00200241d8006a41186a4200370300200241d8006a41106a4200370300200241d8006a41086a4200370300200242003703580c010b200241d8006a41186a2003290300370300200241d8006a41106a2004290300370300200241d8006a41086a2005290300370300200220022903a0013703580b2002412c6a2007370200200241086a41186a42043703002002413c6a2203200241d8006a41086a290300370200200241c4006a2204200241d8006a41106a290300370200200241cc006a2205200241d8006a41186a2903003702002002200636022820024201370318200242d804370310200242f02e37030820022002290358370234200241013a0054200241003602800120024201370378200241f8006a41004108102f200228027820022802800122016a42f02e3700002002200141086a220136028001200241f8006a20014108102f200228027820022802800122016a42d8043700002002200141086a220136028001200241f8006a20014108102f200228027820022802800122016a42013700002002200141086a220136028001200241f8006a20014108102f200228027820022802800122016a42043700002002200141086a36028001200241f8006a200241086a41206a1030200241f8006a2002280280014120102f200228027820022802800122086a22012002290234370000200141086a2003290200370000200141106a2004290200370000200141186a20052902003700002002200841206a36028001200241f8006a41011031200235028001210b2002350278210c02402007a72201450d00200141286c450d002006102c0b200241c0016a2400200b422086200c840f0b20024184016a41043602002002411c6a41023602002002420237020c20024194c7c3003602082002410436027c20024180cec300360278200241003602a401200241c4b5c8003602a0012002200241f8006a3602182002200241a0016a36028001200241086a41a4c7c3001046000b820402047f047e230041e0006b220224000240024020010d00200241c8006a22014200370300200241c0006a22034200370300200241306a41086a2204420037030020024200370330200241d0006a41c7dcc700410410c5012004200241d0006a41086a220529000037030020022002290050370330200241d0006a41ccd5c500410a10c5012001200529000037030020032002290050370300200241186a200241306a10cf02200229032021062002290318210720014200370300200342003703002004420037030020024200370330200241d0006a41c7dcc700410410c5012004200529000037030020022002290050370330200241d0006a41bcd6c500410b10c5012001200529000037030020032002290050370300200241086a200241306a10cf022002290310210820022903082109410810322201450d012002420837023420022001360230200241306a41004108102f20022802302201200228023822036a200842002009a71b200642d8047e42002007a71b7c370000200241e0006a2400200341086aad4220862001ad840f0b200241dc006a4104360200200241c4006a41023602002002420237023420024194c7c3003602302002410436025420024198cec3003602502002410036022c200241c4b5c8003602282002200241d0006a3602402002200241286a360258200241306a41a4c7c3001046000b1039000ba32904077f047e117f037e230041d0056b22022400024020014108490d00200241003a00e80320014108460d00200241013a00e8032002200041c4b5c80020011b22002d00083a00c803024020014109460d00200241023a00e803200220002d00093a00c9032001410a460d00200241033a00e803200220002d000a3a00ca032001410b460d00200241043a00e803200220002d000b3a00cb032001410c460d00200241053a00e803200220002d000c3a00cc032001410d460d00200241063a00e803200220002d000d3a00cd032001410e460d00200241073a00e803200220002d000e3a00ce032001410f460d00200241083a00e803200220002d000f3a00cf0320014110460d00200241093a00e803200220002d00103a00d00320014111460d002002410a3a00e803200220002d00113a00d10320014112460d002002410b3a00e803200220002d00123a00d20320014113460d002002410c3a00e803200220002d00133a00d30320014114460d002002410d3a00e803200220002d00143a00d40320014115460d002002410e3a00e803200220002d00153a00d50320014116460d002002410f3a00e803200220002d00163a00d60320014117460d00200241103a00e803200220002d00173a00d70320014118460d00200241113a00e803200220002d00183a00d80320014119460d00200241123a00e803200220002d00193a00d9032001411a460d00200241133a00e803200220002d001a3a00da032001411b460d00200241143a00e803200220002d001b3a00db032001411c460d00200241153a00e803200220002d001c3a00dc032001411d460d00200241163a00e803200220002d001d3a00dd032001411e460d00200241173a00e803200220002d001e3a00de032001411f460d00200241183a00e803200220002d001f3a00df0320014120460d00200241193a00e803200220002d00203a00e00320014121460d002002411a3a00e803200220002d00213a00e10320014122460d002002411b3a00e803200220002d00223a00e20320014123460d002002411c3a00e803200220002d00233a00e30320014124460d002002411d3a00e803200220002d00243a00e40320014125460d002002411e3a00e803200220002d00253a00e50320014126460d002002411f3a00e803200220002d00263a00e60320014127460d00200241c8006a41106a2203200241c8036a41106a2204290300370300200241c8006a41086a2205200241c8036a41086a2206290300370300200220002d00273a00e703200241c8006a41186a2207200241c8036a41186a2208290300370300200241203a00e803200220022903c80322093703a80120022009370348200241286a41186a22002007290300370300200241286a41106a22072003290300370300200241286a41086a220320052903003703002002200229034837032820014128470d0120082000290300220937030020042007290300220a37030020062003290300220b37030020022002290328220c3703c803200241086a41186a2009370300200241086a41106a200a370300200241086a41086a200b3703002002200c37030820024188016a41186a200937030020024188016a41106a200a37030020024188016a41086a200b3703002002200c3703880120004200370300200742003703002003420037030020024200370328200241c8036a41ffdcc700410710c50120032006290000370300200220022900c803370328200241c8036a41b8b3c300410c10c50120002006290000370300200720022900c8033703002002200241286a412010c6012002280204210d2002280200210e20004200370300200742003703002003420037030020024200370328200241c8036a41ffdcc700410710c50120032006290000370300200220022900c803370328200241c8036a418893c700410a10c50120002006290000370300200720022900c803370300200241c8036a200241286a10e10120022802c8032201410120011b210f20022902cc03420020011b2209a7211002400240024002402009422088a72201450d00200f200141057422086a2111200241c4056a2112200241c8036a41206a2100200f2101034020024180056a41186a2206200141186a220729000037030020024180056a41106a2204200141106a220329000037030020024180056a41086a2205200141086a22132900003703002002200129000037038005201329000021092003290000210a2001290000210b200241c8006a41186a22132007290000370300200241c8006a41106a2214200a370300200241c8006a41086a221520093703002002200b370348200241c8036a41186a22072006290300370300200241c8036a41106a22032004290300370300200241c8036a41086a2204200529030037030020022002290380053703c803200241a0056a200241c8036a10a304200241286a41186a22052013290300370300200241286a41106a22132014290300370300200241286a41086a22142015290300370300200220022903483703280240024020022802c00522060d00410021060c010b200020022903a005370300200041186a200241a0056a41186a290300370300200041106a200241a0056a41106a290300370300200041086a200241a0056a41086a290300370300200720052903003703002003201329030037030020042014290300370300200241f0046a41086a201241086a280200360200200220022903283703c803200220122902003703f004200241a8016a41386a200241c8036a41386a290300370300200241a8016a41306a200241c8036a41306a290300370300200241a8016a41286a200241c8036a41286a290300370300200241a8016a41206a2000290300370300200241a8016a41186a2007290300370300200241a8016a41106a2003290300370300200241a8016a41086a2004290300370300200220022903c8033703a8010b20060d02200141206a2101200841606a22080d000b0b4108210102402010450d00201041ffffff3f71450d00200f102c0b41002116410021000c010b20024198026a41386a2200200241a8016a41386a29030037030020024198026a41306a2207200241a8016a41306a29030037030020024198026a41286a2203200241a8016a41286a29030037030020024198026a41206a2204200241a8016a41206a29030037030020024198026a41186a2205200241a8016a41186a29030037030020024198026a41106a2213200241a8016a41106a29030037030020024198026a41086a2214200241a8016a41086a290300370300200241d0046a41086a2215200241f0046a41086a280200360200200220022903a80137039802200220022903f0043703d004200241f0026a41086a22122014290300370300200241f0026a41106a22142013290300370300200241f0026a41186a22132005290300370300200241f0026a41206a22052004290300370300200241f0026a41286a22042003290300370300200241f0026a41306a22032007290300370300200241f0026a41386a22072000290300370300200241e0046a41086a2200201528020036020020022002290398023703f002200220022903d0043703e00441d00010322217450d01201720022903f00237030020172006360240201720022903e004370244201741386a2007290300370300201741306a2003290300370300201741286a2004290300370300201741206a2005290300370300201741186a2013290300370300201741106a2014290300370300201741086a2012290300370300201741cc006a200028020036020020024281808080103702c404200220173602c0040240024020084120470d00410121160c010b200141206a2105201141606a2118200241c4056a2112200241c8036a41206a210041012116034020052101034020024180056a41186a2206200141186a220729000037030020024180056a41106a2204200141106a220329000037030020024180056a41086a2208200141086a22052900003703002002200129000037038005200241c8006a41186a22132007290000370300200241c8006a41106a22142003290000370300200241c8006a41086a2215200529000037030020022001290000370348200241c8036a41186a22072006290300370300200241c8036a41106a22032004290300370300200241c8036a41086a2204200829030037030020022002290380053703c803200241a0056a200241c8036a10a304200241286a41186a22082013290300370300200241286a41106a22052014290300370300200241286a41086a22132015290300370300200220022903483703280240024020022802c00522060d00410021060c010b200020022903a005370300200041186a200241a0056a41186a290300370300200041106a200241a0056a41106a290300370300200041086a200241a0056a41086a290300370300200720082903003703002003200529030037030020042013290300370300200241f0046a41086a201241086a280200360200200220022903283703c803200220122902003703f004200241a8016a41386a200241c8036a41386a290300370300200241a8016a41306a200241c8036a41306a290300370300200241a8016a41286a200241c8036a41286a290300370300200241a8016a41206a2000290300370300200241a8016a41186a2007290300370300200241a8016a41106a2003290300370300200241a8016a41086a2004290300370300200220022903c8033703a8010b024020060d002011200141206a2201470d010c030b0b20024198026a41386a2208200241a8016a41386a29030037030020024198026a41306a2205200241a8016a41306a29030037030020024198026a41286a2214200241a8016a41286a29030037030020024198026a41206a2215200241a8016a41206a29030037030020024198026a41186a2219200241a8016a41186a29030037030020024198026a41106a221a200241a8016a41106a29030037030020024198026a41086a221b200241a8016a41086a2213290300370300200241d0046a41086a221c200241f0046a41086a280200360200200220022903a80137039802200220022903f0043703d004200241f0026a41086a221d201b290300370300200241f0026a41106a221b201a290300370300200241f0026a41186a221a2019290300370300200241f0026a41206a22192015290300370300200241f0026a41286a22152014290300370300200241f0026a41306a22142005290300370300200241f0026a41386a22052008290300370300200241e0046a41086a2208201c28020036020020022002290398023703f002200220022903d0043703e0042004201d2903003703002003201b2903003703002007201a29030037030020002019290300370300200241c8036a41286a22192015290300370300200241c8036a41306a22152014290300370300200241c8036a41386a22142005290300370300200220022903f0023703c80320132008280200360200200220022903e0043703a8010240201620022802c404470d00200241c0046a2016410110d60420022802c00421170b200141206a21052017201641d0006c6a220820022903c803370300200329030021092007290300210a2000290300210b2019290300210c2015290300211e2014290300211f2004290300212020082006360240200841086a2020370300200820022903a801370244200841cc006a2013280200360200200841386a201f370300200841306a201e370300200841286a200c370300200841206a200b370300200841186a200a370300200841106a20093703002002201641016a22163602c80420182001470d000b0b02402010450d00201041ffffff3f71450d00200f102c0b20022802c404210020022802c00421010b200220163602a805200220003602a405200220013602a005200241c8036a200241a0056a10db0441002101024020022802c8034101460d0020024180056a41106a200241e0036a28020036020020024180056a41086a200241c8036a41106a2903003703002002200241c8036a41086a29030037038005200241e4036a2802002101200241f0026a200241e8036a41d80010c9081a0b200241a0056a41086a220020024180056a41086a290300370300200241a0056a41106a220620024180056a41106a28020036020020022002290380053703a005200241c8036a200241f0026a41d80010c9081a0240024002402001450d00200241a8016a41106a2006280200360200200241a8016a41086a2000290300370300200220022903a0053703a80120024198026a200241c8036a41d80010c9081a200241bc016a2001360200200241a8016a41186a20024198026a41d80010c9081a200241c8036a41186a20024188016a41186a290300370300200241c8036a41106a20024188016a41106a290300370300200241c8036a41086a20024188016a41086a29030037030020022002290388013703c803200241f0026a200241a8016a41e2c289ab06200241c8036a10820620022902f402210920022802f0022106200241a8016a10dd0420060d010b41002101200241003602a8010c010b200241d0036a2009370300200220163602d803200220063602cc032002200d4100200e1b3602c803200241a8016a200241c8036a10ba012009a7210702402009422088a72201450d002001410c6c21002006210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b02402007450d002007410c6c450d002006102c0b024020022802a80122010d00410021010c010b200241b0016a280200210320022802ac0121040b410110322200450d00200242013702cc03200220003602c803200241c8036a41004101102f20022802c803220020022802d00322066a21070240024020010d00200741003a0000200641016a21060c010b200741013a00002002200641016a3602d00320012003200241c8036a10bb0120022802d003210620022802c80321002001450d002004450d002001102c0b200241d0056a24002006ad4220862000ad840f0b1039000b200241003a00e8030b200241b4016a4104360200200241dc036a4102360200200242023702cc0320024194c7c3003602c803200241043602ac01200241dccdc3003602a801200241003602f402200241c4b5c8003602f0022002200241a8016a3602d8032002200241f0026a3602b001200241c8036a41a4c7c3001046000b960d03027f027e057f230041f00b6b2202240020024280808080802037020c2002200136021c2002200041c4b5c80020011b3602182002200241186a36020820024198066a200241086a108706024002400240200241a4066a280200450d0020024190046a20024198066a41880210c9081a200241a0086a200241086a10c60420022802a00822030d012002419c046a102b2002418c056a102b0b200241206a20024198026a41f80110c9081a0c010b20022902a408210420024190046a410c6a28020021012002290390042105200228029804210020024198026a20024190046a41106a41f80110c9081a200241206a20024198026a41f80110c9081a2001450d00200241b0086a410c6a22062001360200200220003602b808200220053703b008200241b0086a41106a200241206a41f80110c9082100200241bc0a6a2004370200200220033602b80a2004a72107024002402002280208280204450d002006102b200241ac096a102b410021012007450d012003102c0c010b20024198026a41086a200241b0086a41086a280200360200200220022903b0083703980220024198066a200041f80110c9081a0b2001450d00200241a0086a41086a220020024198026a41086a28020036020020022002290398023703a00820024190046a20024198066a41f80110c9081a20024198066a41086a2000280200360200200241a4066a22082001360200200220022903a00837039806200241a8066a20024190046a41f80110c9081a200220033602980220022004422088a7220136029c02410021060240024020014104490d002003280000210020022001417c6a36029c022002200341046a36029802200241b0086a20024198026a10840520022802b0082209450d0020022902b40821040240200228029c02220a41044f0d0002402004422088a72201450d002001410c6c21002009210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b2004a72201450d012001410c6c450d012009102c0c020b200228029802220628000021012002200a417c6a36029c022002200641046a36029802200921060c010b0b02402007450d002003102c0b024002402006450d00200241e4096a2001360200200241dc096a2004370200200241d8096a2006360200200241d4096a2000360200200241d0096a4102360200200241013602c8092002420237039809200241e8096a20024198066a41880210c9081a2002200241b0086a36029802200241206a20024198026a10810220024198026a41086a200241206a41086a280200360200200220022903203703980220024198026a1082022101200241c8096a10830241002802d8d24821000240024020010d0020004103490d0120024123360224200241dc9ec80036022041002802d4d248210141002802d0d248210041002802dcd2482103200241f0086a419801360200200241e8086a42e480808010370300200241e4086a41989fc800360200200241dc086a4219370200200241d8086a41ff9ec800360200200241d0086a4201370300200241c0086a4201370300200241b8086a4119360200200241cc086a20024198026a360200200241b4b5c8003602bc08200241ff9ec8003602b408200241033602b0082002410436029c02200141e0a3c000200341024622031b28021021012002200241206a36029802200041f8a3c00020031b200241b0086a2001110300410121010c030b2000450d002002412336029c022002200241206a3602980241002802d4d248210141002802d0d248210041002802dcd2482103200241f0086a419901360200200241e8086a42e480808010370300200241e4086a41989fc800360200200241dc086a4219370200200241d8086a41ff9ec800360200200241d0086a4201370300200241c0086a4201370300200241b8086a4119360200200241cc086a20024198026a360200200241a4a0c8003602bc08200241ff9ec8003602b408200241013602b008200041f8a3c000200341024622031b200241b0086a200141e0a3c00020031b2802101103000b410121010c010b2008102b20024194076a102b410021010b200241b0086a200110c50320023502b808210420023502b0082105200241f00b6a240020052004422086840f0b2002419c046a4104360200200241c4086a4102360200200242023702b40820024194c7c3003602b0082002410436029404200241a4cdc3003602900420024100360224200241c4b5c800360220200220024190046a3602c0082002200241206a36029804200241b0086a41a4c7c3001046000beb0402057f017e230041c0046b2202240041002103200241003a00b003024002400240024002400340200128020022042802042205450d0120024190036a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a00b00320034120470d000b200241a0026a41186a20024190036a41186a290300220737030020024180026a41086a20024190036a41086a29030037030020024180026a41106a20024190036a41106a29030037030020024180026a41186a20073703002002200229039003370380022001280200220328020422044108490d022003280200220529000021072003200441786a3602042003200541086a36020020024190036a200110ab05200228029403450d03200241a0026a20024190036a41f00010c9081a20024190036a200110ab05200228029403450d01200241206a20024190036a41f00010c9081a200241086a220320024180026a41086a290300370300200241106a220420024180026a41106a290300370300200241186a220520024180026a41186a290300370300200220022903800237030020024190016a200241a0026a41f00010c9081a20002007370300200041086a20024190016a41f00010c9081a200041f8006a200241206a41f00010c9081a20004180026a2005290300370300200041f8016a2004290300370300200041f0016a2003290300370300200041e8016a20022903003703000c040b0240200341ff0171450d00200241003a00b0030b2000410036020c0c030b2000410036020c200241a0026a410472102b0c020b2000410036020c0c010b2000410036020c0b200241c0046a24000b900301067f230041306b2202240002400240024020010d00200241186a108906200228022022014105744104722203417f4c0d0120022802182104200310322205450d0220024100360208200220033602042002200536020020022001108f010240024020010d0020022802082103200228020021060c010b2001410574210520022802082103200421010340200220034120102f20022802002206200228020822076a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200741206a2203360208200141206a2101200541606a22050d000b0b0240200228021c41ffffff3f71450d002004102c0b200241306a24002003ad4220862006ad840f0b200241246a4104360200200241146a41023602002002420237020420024194c7c3003602002002410436021c200241b4cec3003602182002410036022c200241c4b5c8003602282002200241186a3602102002200241286a360220200241a4c7c3001046000b103b000b1039000bb40302047f017e23004180016b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a4195ddc700411210c501200141e8006a41a7edc300410410c5012002200141e8006a41086a290000370300200320012900683703002001412036022c2001200141086a360228200141306a200141086a412010b30102400240200128023022030d00410021020c010b200128023421042001200141306a41086a28020036024420012003360240200141e8006a200141c0006a10800502400240200128026822020d004100210220014100360250200142013703482001410f36025c2001200141286a3602582001200141c8006a360264200141fc006a41013602002001420137026c200141b4bcc3003602682001200141d8006a360278200141e4006a41dcb7c000200141e8006a103e1a200135025042208620013502488410000240200128024c450d002001280248102c0b0c010b200129026c21050b2004450d002003102c0b0240024020020d0020004100360208200042013702000c010b20002005370204200020023602000b20014180016a24000bd51304017f017e137f017e230041a0036b220224002002428080808080203702e402200220013602c4022002200041c4b5c80020011b22003602c0022002200241c0026a3602e00202402001450d0020022001417f6a22013602c4022002200041016a3602c00202400240024020002d00000e020100030b2002200241e0026a10c60420022802002200450d022002290204210320022802c402450d012003a7450d022000102c0c020b20010d01410021000b024002400240024020000d0041002101200241003602e0020c010b2003422088a72201417f4c0d010240024020010d00410121040c010b200110322204450d030b200241e8026a22054100360200200220013602e402200220043602e002200241e0026a4100200110c80120022802e002200528020022046a2000200110c9081a2005200420016a360200200021010b200241086a200241e0026a41086a280200360200200220022903e002370300200241c0016a41e7e485f3062002108b060240024020000d00200241003602e0020c010b2003422088a72200417f4c0d010240024020000d00410121040c010b200010322204450d030b200241e8026a22054100360200200220003602e402200220043602e002200241e0026a4100200010c80120022802e002200528020022046a2001200010c9081a2005200420006a3602000b200241086a200241e0026a41086a280200360200200220022903e002370300200241e0016a41e2c289ab062002108c060240024020010d0041002100200241003602e0020c010b2003422088a72200417f4c0d010240024020000d00410121040c010b200010322204450d030b200241e8026a22054100360200200220003602e402200220043602e002200241e0026a4100200010c80120022802e002200528020022046a2001200010c9081a2005200420006a360200200121000b200241086a200241e0026a41086a280200360200200220022903e00237030020024180026a41e9dabdf3062002108c060240024020010d00200241003602e0020c010b2003422088a72201417f4c0d010240024020010d00410121040c010b200110322204450d030b200241e8026a22054100360200200220013602e402200220043602e002200241e0026a4100200110c80120022802e002200528020022046a2000200110c9081a2005200420016a3602000b200241086a200241e0026a41086a280200360200200220022903e002370300200241a0026a41f0c2c98b062002108c060240024020000d0041002105200241003602e0020c010b2003422088a72201417f4c0d010240024020010d00410121040c010b200110322204450d030b200241e8026a22054100360200200220013602e402200220043602e002200241e0026a4100200110c80120022802e002200528020022046a2000200110c9081a2005200420016a360200200021050b200241086a200241e0026a41086a280200360200200220022903e002370300200241c0026a41e1e69df3062002108c060240024020000d0020024100360280030c010b2003422088a72201417f4c0d010240024020010d00410121040c010b200110322204450d030b20024188036a220041003602002002200136028403200220043602800320024180036a4100200110c801200228028003200028020022046a2005200110c9081a2000200420016a3602000b20024190036a41086a20024180036a41086a280200360200200220022903800337039003200241e0026a41e1ea91cb0620024190036a108c06200241086a2200200241c0016a41086a290300370300200241106a2204200241c0016a41106a290300370300200241186a2206200241c0016a41186a290300370300200241286a2207200241e0016a41086a290300370300200241306a2208200241e0016a41106a290300370300200241386a2209200241e0016a41186a290300370300200241d8006a220a20024180026a41186a290300370300200241d0006a220b20024180026a41106a290300370300200241c8006a220c20024180026a41086a290300370300200220022903c001370300200220022903e0013703202002200229038002370340200241f8006a220d200241a0026a41186a290300370300200241f0006a220e200241a0026a41106a290300370300200241e8006a220f200241a0026a41086a29030037030020024188016a2210200241c0026a41086a29030037030020024190016a2211200241c0026a41106a29030037030020024198016a2212200241c0026a41186a290300370300200241a8016a2213200241e0026a41086a290300370300200241b0016a2214200241e0026a41106a290300370300200241b8016a2215200241e0026a41186a290300370300200220022903a002370360200220022903c00237038001200220022903e0023703a0012002420137039003200241003602980320024190036a41004120102f20022802900320022802980322166a22012002290300370000200141086a2000290300370000200141106a2004290300370000200141186a20062903003700002002201641206a22013602980320024190036a20014120102f20022802900320022802980322006a22012002290320370000200141086a2007290300370000200141106a2008290300370000200141186a20092903003700002002200041206a22013602980320024190036a20014120102f20022802900320022802980322006a22012002290340370000200141086a200c290300370000200141106a200b290300370000200141186a200a2903003700002002200041206a22013602980320024190036a20014120102f20022802900320022802980322006a22012002290360370000200141086a200f290300370000200141106a200e290300370000200141186a200d2903003700002002200041206a22013602980320024190036a20014120102f20022802900320022802980322006a2201200229038001370000200141086a2010290300370000200141106a2011290300370000200141186a20122903003700002002200041206a22013602980320024190036a20014120102f200228029003220420022802980322006a220120022903a001370000200141086a2013290300370000200141106a2014290300370000200141186a20152903003700002002200041206a3602980302402005450d002003a7450d002005102c0b200220024190036a109b0220023502082103200235020021170240200228029403450d002004102c0b200241a0036a240020034220862017840f0b103b000b1039000b200241ec026a4104360200200241146a41023602002002420237020420024194c7c300360200200241043602e402200241c8cec3003602e002200241003602c402200241c4b5c8003602c0022002200241e0026a3602102002200241c0026a3602e802200241a4c7c3001046000bff0101067f230041c0006b2203240020032001360204200341086a200210b008200341206a41186a2204200341046a200341086a41106a200341086a41086a2205200328020822064101461b2903001007220141186a290000370300200341206a41106a2207200141106a290000370300200341206a41086a2208200141086a290000370300200320012900003703202001102c200041186a2004290300370000200041106a2007290300370000200041086a20082903003700002000200329032037000002402006450d002005280200450d00200328020c102c0b024020022802002200450d00200241046a280200450d002000102c0b200341c0006a24000bff0101067f230041c0006b2203240020032001360204200341086a200210b008200341206a41186a2204200341046a200341086a41106a200341086a41086a2205200328020822064101461b290300100b220141186a290000370300200341206a41106a2207200141106a290000370300200341206a41086a2208200141086a290000370300200320012900003703202001102c200041186a2004290300370000200041106a2007290300370000200041086a20082903003700002000200329032037000002402006450d002005280200450d00200328020c102c0b024020022802002200450d00200241046a280200450d002000102c0b200341c0006a24000b890e03037f017e017f230041c0036b220224002002428080808080203702e401200220013602242002200041c4b5c80020011b3602202002200241206a3602e001200241086a200241e0016a10b0030240024002400240024020022802080d0020022802242200200228020c2201490d002001417f4c0d020240024020010d00410121030c010b200110372203450d04200228022421000b024020002001490d0020032002280220200110c9082100200228022422042001490d052002200420016b3602242002200228022020016a3602202000450d012001ad2205422086200584210520022802e001280204450d022005a7450d010b2003102c0b2002412c6a4104360200200241f4016a4102360200200242023702e40120024194c7c3003602e00120024104360224200241e8cec300360220200241003602b403200241c4b5c8003602b0032002200241206a3602f0012002200241b0036a360228200241e0016a41a4c7c3001046000b200220054220883e02ac03200220003602a803200241e0016a200241a8036a10d8040240024020022d00e0014101470d00200241003602100c010b200241206a200241e0016a41017241c00110c9081a200241e0016a200241206a41c00110c9081a200241186a410036020020024204370310412010322201450d02200242203702b403200220013602b003200241b0036a200241e0016a108e060240200228021822012002280214470d00200241106a108f06200228021821010b200228021020014104746a220120022903b003370200200141e7e485f30636020c200141086a200241b0036a41086a2802003602002002200228021841016a360218412010322201450d02200242203702b403200220013602b003200241b0036a200241e0016a41206a108e060240200228021822012002280214470d00200241106a108f06200228021821010b200228021020014104746a220120022903b003370200200141e2c289ab0636020c200141086a200241b0036a41086a2802003602002002200228021841016a360218412010322201450d02200242203702b403200220013602b003200241b0036a200241a0026a108e060240200228021822012002280214470d00200241106a108f06200228021821010b200228021020014104746a220120022903b003370200200141e9dabdf30636020c200141086a200241b0036a41086a2802003602002002200228021841016a360218412010322201450d02200242203702b403200220013602b003200241b0036a200241c0026a108e060240200228021822012002280214470d00200241106a108f06200228021821010b200228021020014104746a220120022903b003370200200141f0c2c98b0636020c200141086a200241b0036a41086a2802003602002002200228021841016a360218412010322201450d02200242203702b403200220013602b003200241b0036a200241e0026a108e060240200228021822012002280214470d00200241106a108f06200228021821010b200228021020014104746a220120022903b003370200200141e1e69df30636020c200141086a200241b0036a41086a2802003602002002200228021841016a360218412010322201450d02200242203702b403200220013602b003200241b0036a20024180036a108e060240200228021822012002280214470d00200241106a108f06200228021821010b200228021020014104746a220120022903b003370200200141e1ea91cb0636020c200141086a200241b0036a41086a2802003602002002200228021841016a3602180b02402005a7450d002000102c0b0240024020022802100d00410121010c010b200241186a2802004104744105722201417f4c0d010b200110322200450d01200241003602e801200220013602e401200220003602e00120022802102101200241e0016a41004101102f20022802e001220320022802e80122006a21040240024020010d00200441003a00002002200041016a22043602e8010c010b200441013a00002002200041016a3602e80120022802102101200241e0016a200241106a41086a2802002200108f01024020000d0020022802e801210420022802e00121030c010b200120004104746a210603402001280200200141086a280200200241e0016a10bb01200241e0016a20022802e8014104102f20022802e001220320022802e80122006a2001410c6a2800003600002002200041046a22043602e801200141106a22012006470d000b0b024020022802102201450d000240200241186a2802002200450d002000410474210003400240200141046a280200450d002001280200102c0b200141106a2101200041706a22000d000b0b20022802104100200228021422011b2200450d00200141ffffffff0071450d002000102c0b200241c0036a24002004ad4220862003ad840f0b103b000b1039000b200120044194afc0001058000b820201037f02400240200041046a2802002202200041086a28020022036b4120490d00200028020021020c010b0240024002400240200341206a22042003490d00200241017422032004200320044b1b22034108200341084b1b22034100480d002000280200410020021b2204450d012002450d0120042002200310352202450d020c030b103b000b2003103222020d010b1039000b20002002360200200041046a2003360200200041086a28020021030b200220036a22032001290000370000200341186a200141186a290000370000200341106a200141106a290000370000200341086a200141086a290000370000200041086a2200200028020041206a3602000bd80101047f024002400240200041046a28020020002802082201470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1b220241ffffffff007122042002470d02200241047422034100480d0220042002464102742104024002400240024002402000280200410020011b22020d002003450d010c030b200141047422010d0120030d020b200421010c020b200220012003103522010d010c030b200310322201450d020b20002001360200200041046a20034104763602000b0f0b2004450d001039000b103b000bc90c02067f047e230041e0016b22022400200241003a00800102402001450d002002200041c4b5c80020011b22002d00003a0060200241013a008001024020014101460d00200220002d00013a0061200241023a00800120014102460d00200220002d00023a0062200241033a00800120014103460d00200220002d00033a0063200241043a00800120014104460d00200220002d00043a0064200241053a00800120014105460d00200220002d00053a0065200241063a00800120014106460d00200220002d00063a0066200241073a00800120014107460d00200220002d00073a0067200241083a00800120014108460d00200220002d00083a0068200241093a00800120014109460d00200220002d00093a00692002410a3a0080012001410a460d00200220002d000a3a006a2002410b3a0080012001410b460d00200220002d000b3a006b2002410c3a0080012001410c460d00200220002d000c3a006c2002410d3a0080012001410d460d00200220002d000d3a006d2002410e3a0080012001410e460d00200220002d000e3a006e2002410f3a0080012001410f460d00200220002d000f3a006f200241103a00800120014110460d00200220002d00103a0070200241113a00800120014111460d00200220002d00113a0071200241123a00800120014112460d00200220002d00123a0072200241133a00800120014113460d00200220002d00133a0073200241143a00800120014114460d00200220002d00143a0074200241153a00800120014115460d00200220002d00153a0075200241163a00800120014116460d00200220002d00163a0076200241173a00800120014117460d00200220002d00173a0077200241183a00800120014118460d00200220002d00183a0078200241193a00800120014119460d00200220002d00193a00792002411a3a0080012001411a460d00200220002d001a3a007a2002411b3a0080012001411b460d00200220002d001b3a007b2002411c3a0080012001411c460d00200220002d001c3a007c2002411d3a0080012001411d460d00200220002d001d3a007d2002411e3a0080012001411e460d00200220002d001e3a007e2002411f3a0080012001411f460d00200241106a2203200241e0006a41106a2204290300370300200241086a2205200241e0006a41086a2206290300370300200220002d001f3a007f200241186a2200200241e0006a41186a2207290300370300200241203a0080012002200229036022083703202002200837030020014120470d01200241206a41186a20002903002208370300200241206a41106a20032903002209370300200241206a41086a2005290300220a37030020022002290300220b37032020072008370300200420093703002006200a3703002002200b370360200241c0016a41c1dcc700410610c501200241acc8c700410710c501200241d0016a200241e0006a10d5020240024020022802d801220141206a2200417f4c0d000240024020000d00410121030c010b200010322203450d020b200241003602b801200220003602b401200220033602b001200241b0016a4100411010c80120022802b00120022802b80122006a220320022900c001370000200341086a200241c0016a41086a2900003700002002200041106a22003602b801200241b0016a2000411010c80120022802b00120022802b80122006a22032002290000370000200341086a200241086a2900003700002002200041106a22033602b80120022802d0012100200241b0016a2003200110c80120022802b001220320022802b80122046a2000200110c9081a2002200420016a22013602b801024020022802d401450d002000102c0b200241e0006a2003200110d602200241a8016a280200210120022903602108024020022802b401450d002003102c0b410410322200450d012002420437026420022000360260200241e0006a41004104102f20022802602200200228026822036a2001410020084201511b360000200241e0016a2400200341046aad4220862000ad840f0b103b000b1039000b200241003a0080010b2002412c6a4104360200200241f4006a41023602002002420237026420024194c7c3003602602002410436022420024184cfc30036022020024100360204200241c4b5c8003602002002200241206a36027020022002360228200241e0006a41a4c7c3001046000ba40604017f017e027f027e230041e0116b22022400200242808080808020370214200220013602242002200041c4b5c80020011b3602202002200241206a360210200241a00e6a200241106a10af03420321030240024020022903880f4203510d00200241e00a6a200241a00e6a41c00310c9081a02402002280210220028020422044104490d0020002802002205280000210120002004417c6a3602042000200541046a360200200241f8096a200241e00a6a41e80010c9081a20022903c80b2103200241a8076a200241d00b6a41d00210c9081a0c020b200241f80b6a108302420321030b0b200241c0066a200241f8096a41e80010c9081a200241f0036a200241a8076a41d00210c9081a0240024020034203510d00200241286a200241c0066a41e80010c9081a200220033703900120024198016a200241f0036a41d00210c9082100200220013602e803024002402002280210280204450d00200241c0016a108302420321030c010b200241a8076a200241286a41e80010c9081a200241a00e6a200041d00210c9081a0b20034203520d010b200241ec0a6a41043602002002413c6a41023602002002420237022c20024194c7c300360228200241043602e40a2002419ccfc3003602e00a200241003602f403200241c4b5c8003602f0032002200241e00a6a3602382002200241f0036a3602e80a200241286a41a4c7c3001046000b200241f0036a200241a8076a41e80010c9081a200241e00a6a200241a00e6a41d00210c9081a200241286a200241f0036a41e80010c9081a200220033703900120024198016a200241e00a6a41d00210c9081a200241a00e6a200241c0016a220010b7022002200120022903a00e22034200420020022d00a90e41004720022d00a80e2204109206200241086a29030021062002290300210720001083022002410036023020024201370328200241286a41004108102f2002280228200228023022016a20033700002002200141086a360230200241286a20041031200241286a20022802304110102f20022802282201200228023022006a2204200637000820042007370000200241e0116a2400200041106aad4220862001ad840bf70404017f017e017f047e230041c0036b22072400024020050d00200741186a2001ad42004280c2d72f420010ce0820074188026a109b01200741c0006a2007290390022208200220082002541b109108200741c0006a41086a290300210220072903402108200741a0026a2201420037030020074188026a41106a2205420037030020074188026a41086a22094200370300200742003703880220074188026a41dce2c700411210c501200741d0006a41a0e4c700411110c5012001200741d0006a41086a29000037030020052007290050370300200741286a20074188026a10fb0420074188026a200729033042808090bbbad6adf00d200728022822011b200741286a41106a290300420020011b2008200242808090bbbad6adf00d4200109c06200741186a41086a29030021082007290318210a024002402007280288024101470d00427f210b427f210c0c010b2005290300210c2009290300210b0b200741d0006a109b010240024002400240200641ff01710e03010200010b200741d0016a21050c020b200741e0006a21050c010b20074198016a21050b2005290300210220074188026a109b01200741086a200729039002220d2002200d2002541b109108427f427f427f200741106a290300220220087c20072903082208200a7c220a2008542205ad7c22082005200820025420082002511b22051b2202200c7c427f200a20051b2208200b7c220a2008542205ad7c22082005200820025420082002511b22051b220220047c427f200a20051b220420037c22082004542205ad7c22032005200320025420032002511b22051b2104427f200820051b21030b2000200337030020002004370308200741c0036a24000b130020004101360204200041ccd0c3003602000b3400200041cbdcc70036020420004100360200200041146a4102360200200041106a41c8d6c300360200200041086a42093702000b1300200041013602042000418cd9c3003602000b4a01017f02404108103222020d001039000b2000420837020420002002360200200041004108102f2000280200200041086a220028020022026a42b8173700002000200241086a3602000b2f01017f02402000280200450d00200041086a2802002201450d0020002802042200450d002001450d002000102c0b0bbe4404087f017e047f0d7e230041a0046b22012400200141a0026a2202420037030020014198026a2203420037030020014188026a41086a4200370300200142003703880220014188026a419ee3c300411510c501200141e8016a418ce4c300410810c5012002200141e8016a41086a290000370300200320012900e801370300200141e8016a20014188026a412010b3010240024002400240024002400240024020012802e8012202450d00024020012802ec01450d002002102c0b20014188026a412010b401200141a0026a2202420037030020014198026a2204420037030020014188026a41086a220342003703002001420037038802200141a0016a41b4f0c500410f10c5012003200141a0016a41086a2205290000370300200120012900a00137038802200141a0016a41c3f0c500410d10c50120022005290000370300200420012900a0013703002001412036029401200120014188026a36029001200141e0006a20014188026a412010b30102400240200128026022020d00410221030c010b200128026421062001200141e0006a41086a28020022033602c401200120023602c0010240024020034104490d00200228000021052001200241046a3602c00120012003417c6a22073602c40120074104490d00200228000421072001200341786a3602c4012001200241086a3602c001200141e8016a200141c0016a10fd0520012802e8012208450d0020012902ec01210941002103024020012802c401220a0d000c020b20012802c001220b2d0000210c2001200a417f6a220d3602c4012001200b41016a3602c0010240200c4101460d000c020b0240200d41044f0d000c020b200b280001210c2001200a417b6a3602c4012001200b41056a3602c001410121030c010b200141003602a801200142013703a0012001410f3602d401200120014190016a3602d0012001200141a0016a36028001200141fc016a4101360200200142013702ec01200141b4bcc3003602e8012001200141d0016a3602f80120014180016a41dcb7c000200141e8016a103e1a20013502a80142208620013502a001841000024020012802a401450d0020012802a001102c0b410221030b2006450d002002102c0b024020034102460d0020014180026a200c360200200141f4016a2009370200200120033602fc01200120083602f001200120073602ec01200120053602e801200141f0016a2108024020052000470d00024020034101460d0020014188026a2008109906200141b0016a2007360200200141a0016a410c6a20014188026a41086a2202280200360200200141003602a00120012001290388023702a40120014188026a200141a0016a10a903200141eb006a2002280200360000200120012903880237006320014188026a410c6a200141e7006a290000370000200141c6a4b9da0436008902200141023a0088022001200129006037008d0220014188026a109a06200141a0016a41086a2802002202450d01200241286c450d0120012802a401102c0c010b20014188026a2008109906200141b4016a2007360200200141a0016a41086a200129038802370300200141b0016a20014188026a41086a22022802003602002001200c3602a401200141013602a00120014188026a200141a0016a10a903200141eb006a2002280200360000200120012903880237006320014188026a410c6a200141e7006a290000370000200141c6a4b9da0436008902200141023a0088022001200129006037008d0220014188026a109a06200141a0016a410c6a2802002202450d00200241286c450d0020012802a801102c0b024020012802ec0120012802e8016a2000470d00200141f8016a28020041286c4105722202417f4c0d06200210322203450d0720014100360290022001200236028c02200120033602880220014188026a41004101102f20012802880220012802900222026a41013a00002001200241016a3602900220012802f001210220014188026a20012802f8012203108f010240024020030d00200128028802210520012802900221030c010b2002200341286c6a21072001280290022103034020014188026a20034120102f20012802880220012802900222056a22032002290000370000200341086a200241086a290000370000200341106a200241106a290000370000200341186a200241186a2900003700002001200541206a220336029002200241206a290300210920014188026a20034108102f200128028802220520012802900222036a20093700002001200341086a2203360290022007200241286a2202470d000b0b41d0f0c50041142005200310a7020240200128028c02450d002005102c0b20014188026a41086a2202200829020037030020014198026a2203200841086a280200360200200142063703880220014188026a10c802200141a0026a420037030020034200370300200242003703002001420037038802200141a0016a41b4f0c500410f10c5012002200141a0016a41086a2203290000370300200120012900a00137038802200141a0016a41c3f0c500410d10c501200441086a2003290000370000200420012900a00137000020014188026a412010b4010c010b20012802f4012202450d00200241286c450d0020012802f001102c0b200141a0026a420037030020014198026a420037030020014188026a41086a220242003703002001420037038802200141a0016a41b4f0c500410f10c5012002200141a0016a41086a2203290000370300200120012900a00137038802200141a0016a41e4f0c500410510c501200441086a2003290000370000200420012900a001370000200141203602c401200120014188026a3602c001200141e0006a20014188026a412010b30120012802602202450d0320012802642105024002400240200141e0006a41086a2802002207450d004100210302400240024020022d00000e0405000102030b2007417f6a4108490d0220022900012109410121030c040b410221030c020b2007417f6a4108490d0020022900012109410321030c020b200141003602a801200142013703a0012001410f3602d4012001200141c0016a3602d0012001200141a0016a36029001200141fc016a4101360200200142013702ec01200141b4bcc3003602e8012001200141d0016a3602f80120014190016a41dcb7c000200141e8016a103e1a20013502a80142208620013502a001841000024020012802a401450d0020012802a001102c0b410421030b0b02402005450d002002102c0b2003417f6a0e03020301030b41d3dec30041304184dfc300103c000b2009422088a7210202402009a722032000470d00200141043602e801200120023602ec0120014188026a200141e8016a10a903200141eb006a20014190026a280200360000200120012903880237006320014194026a200141e7006a290000370000200141c6a4b9da0436008902200141023a0088022001200129006037008d0220014188026a109a060b200220036a2000470d01200141a0026a420037030020014198026a420037030020014188026a41086a220242003703002001420037038802200141a0016a41b4f0c500410f10c5012002200141a0016a41086a2203290000370300200120012900a00137038802200141a0016a41e4f0c500410510c501200441086a2003290000370000200420012900a001370000200141e8016a410020012001109b0620014188026a412020012802e801220220012802f00110a702024020012802ec01450d002002102c0b20014286808080203703880220014188026a10c8020c010b2009422088a7210202402009a722032000470d00200141033602e801200120023602ec0120014188026a200141e8016a10a903200141eb006a20014190026a280200360000200120012903880237006320014194026a200141e7006a290000370000200141c6a4b9da0436008902200141023a0088022001200129006037008d0220014188026a109a060b200220036a2000470d00200141a0026a420037030020014198026a420037030020014188026a41086a220242003703002001420037038802200141a0016a41b4f0c500410f10c5012002200141a0016a41086a2203290000370300200120012900a00137038802200141a0016a41e4f0c500410510c501200441086a2003290000370000200420012900a001370000200141e8016a410220012001109b0620014188026a412020012802e801220220012802f00110a702024020012802ec01450d002002102c0b20014286808080103703880220014188026a10c8020b20014188026a41186a2205420037030020014188026a41106a2202420037030020014188026a41086a220342003703002001420037038802200141a0016a41e6dcc700410710c5012003200141a0016a41086a2207290000370300200120012900a00137038802200141a0016a4188bbc200410910c50120052007290000370300200220012900a001370300200141e8016a20014188026a10cb03024020012903e801427f7c4202540d00200141e8016a41106a2903002109200141a0016a41186a22044200370300200141a0016a41106a2200420037030020074200370300200142003703a001200141c0016a41cbdcc700410910c5012007200141c0016a41086a290000370300200120012900c0013703a001200141e8016a41f8d7c300410310c5012004200141e8016a41086a290000370300200020012900e801370300200141d0006a200141a0016a10cf02200141c0006a2001290358420020012802501b220e42e80780420042e807420010ce08200120093703f801200142013703e80120012001290340220f200e42e807827c220e427f200141c0006a41086a290300200e200f54ad7c501b3703f0012005420037030020024200370300200342003703002001420037038802200141a0016a41e6dcc700410710c50120032007290000370300200120012900a00137038802200141a0016a4188bbc200410910c501200241086a2007290000370000200220012900a001370000200141003602a801200142013703a001200141a0016a41004104102f20012802a00120012802a80122076a20093e00002001200741046a3602a801200141a0016a200141e8016a109f0420014188026a412020012802a001220720012802a80110a70220012802a401450d002007102c0b2005420037030020024200370300200342003703002001420037038802200141e8016a41dcdcc700410a10c5012003200141e8016a41086a2207290000370300200120012900e80137038802200141e8016a41cddec400410610c50120052007290000370300200220012900e80137030020014188026a412010b4012005420037030020024200370300200342003703002001420037038802200141e8016a41dcdcc700410a10c50120032007290000370300200120012900e80137038802200141e8016a41b0e4c400410c10c50120052007290000370300200220012900e80137030020014188026a412010b4012005420037030020024200370300200342003703002001420037038802200141e8016a41dce2c700411210c50120032007290000370300200120012900e80137038802200141e8016a41a0e4c700411110c50120052007290000370300200220012900e801370300200141286a20014188026a10fb04200141286a41106a2903002110200129033021112001280228210320014188026a4201420042808090bbbad6adf00d4200428094ebdc034200109c06024002402001280288024101470d00427f210f427f21090c010b20014198026a290300210920014190026a290300210f0b20014188026a109b0120014188026a41086a200141b8026a200141b0026a290300501b290300210e200141b8016a22054200370300200141a0016a41106a22074200370300200141a0016a41086a22044200370300200142003703a001200141c0016a41c1dcc700410610c5012004200141c0016a41086a290000370300200120012900c0013703a001200141e8016a41c4ccc600410b10c5012005200141e8016a41086a2204290000370300200720012900e801370300200141e8016a200141a0016a10850320012903f001211220012903e8012113200141e8016a4203420042808090bbbad6adf00d420042a08d064200109c06200e2012420020134201511b22122012200e561b21120240024020012802e8014101470d00427f2113427f21140c010b200141e8016a41106a2903002114200429030021130b200141186a200e42808090bbbad6adf00d8222154200428080e4ceceb58bbc03420010ce08200141086a2001290318200141186a41086a29030042808090bbbad6adf00d420010c708200141e8016a2012200e42808090bbbad6adf00d80428080e4ceceb58bbc037e20154202882001290308428080c89d9deb96f80656200141086a41086a29030022154200522015501bad7c7c2215201220155622051b22162015201220051b22177d42002016201754ad7d42808090bbbad6adf00d4200200e4201200e4201561b4200109c060240024020012802e8014101470d00427f210e427f21160c010b200141f8016a2903002116200141e8016a41086a290300210e0b200141e8016a200e2016200e201642808090bbbad6adf00d4200109c060240024020012802e8014101470d00427f2117427f21180c010b200141f8016a2903002118200141f0016a29030021170b200141e8016a201320142013201442808090bbbad6adf00d4200109c060240024020012802e8014101470d00427f2119427f211a0c010b200141f8016a290300211a200141f0016a29030021190b200141e8016a2019201a42808090bbbad6adf00d4200428080a0f6f4acdbe01b4200109c0620012802e8014101460d02200f201142808090bbbad6adf00d20031b221954210520092010420020031b221051210320092010542107200141f8016a22042903002111200141f0016a2200290300211a200141e8016a20132014200e201642808090bbbad6adf00d4200109c060240024020012802e8014101470d00427f2116427f21140c010b20042903002114200029030021160b2005200720031b2103200141e8016a201a20112017201842808090bbbad6adf00d4200109c060240024020012802e8014101470d00427f2111427f21170c010b200141f8016a2903002117200141f0016a29030021110b2010200920031b210e2019200f20031b211302400240201220155a0d00200141e8016a4200201620117d22122012201656201420177d2016201154ad7d221220145620122014511b22031b4200201220031b2013200e42808090bbbad6adf00d4200109c060240024020012802e8014101470d00427f2112427f21140c010b200141f8016a2903002114200141f0016a29030021120b4200200e20147d2013201254ad7d2214201320127d22122013562014200e562014200e511b22031b220e20094200201220031b2212200f56200e200956200e2009511b22031b21092012200f20031b210e0c010b427f2115200141e8016a427f201620117c221220122016542203201420177c2003ad7c221220145420122014511b22031b427f201220031b2013200e42808090bbbad6adf00d4200109c060240024020012802e8014101470d00427f21120c010b200141f8016a2903002112200141f0016a29030021150b427f200e20127c201320157c22142013542203ad7c221220032012200e542012200e511b22031b220e2009427f201420031b2212200f56200e200956200e2009511b22031b21092012200f20031b210e0b200141a0026a2207420037030020014188026a41106a2204420037030020014188026a41086a220342003703002001420037038802200141e8016a41dce2c700411210c5012003200141e8016a41086a2205290000370300200120012900e80137038802200141e8016a41a0e4c700411110c501200241086a2005290000370000200220012900e801370000200120093703f0012001200e3703e80120014188026a4120200141e8016a411010a7022007420037030020044200370300200342003703002001420037038802200141e8016a41cbdcc700410910c50120032005290000370300200120012900e80137038802200141e8016a4194d8c300410910c50120072005290000370300200420012900e80137030020014188026a412010dc0241ff017122024102460d0320014188026a412010b4012002410171450d03200141e8016a41186a22034200370300200141e8016a41106a22024200370300200141e8016a41086a22054200370300200142003703e80120014188026a41c7dcc700410410c501200520014188026a41086a220729000037030020012001290088023703e80120014188026a4198dac500410b10c50120032007290000370300200220012900880237030020014188026a200141e8016a10fa04024020012d00880222034102460d00200141e8016a412010b401200141e0006a41086a20014191026a290000370300200141e0006a41106a20014188026a41116a290000370300200141e0006a41186a200141a1026a29000037030020012001290089023703600240200341037122034103460d0020030e03010001010b200141a0016a41186a200141e0006a41186a290300370300200141a0016a41106a200141e0006a41106a290300370300200141a0016a41086a200141e0006a41086a290300370300200120012903603703a001200141e8016a41186a4200370300200141e8016a41106a4200370300200141e8016a41086a22034200370300200142003703e80120014188026a41c7dcc700410410c501200320014188026a41086a220529000037030020012001290088023703e80120014188026a41f0d8c500410c10c501200241086a200529000037000020022001290088023700002001200141e8016a412010c6012001280204210320012802002105200141c0016a41c7dcc700410410c501200141e8016a41d4d9c500411110c50120012003410020051b22003602800120014190016a20014180016a410410c70120014188026a410c6a20014180016a41046a360200200120014190016a41086a36028c02200120014180016a36029002200120014190016a36028802200141d0016a20014188026a107e20012802d801220341206a2205417f4c0d010240024020050d00410121070c010b200510322207450d030b20014100360290022001200536028c02200120073602880220014188026a4100411010c80120012802880220012802900222056a220720012900c001370000200741086a200141c0016a41086a2900003700002001200541106a22053602900220014188026a2005411010c80120012802880220012802900222056a220720012900e801370000200741086a200141e8016a41086a2900003700002001200541106a22073602900220012802d001210520014188026a2007200310c801200128028802220420012802900222076a2005200310c9081a2001200720036a220336029002024020012802d401450d002005102c0b200141e8016a200420031081050240024020012802e80122050d00410021072001410036028801200142013703800141012105410021030c010b200120012902ec0122093702840120012005360280012009422088a721032009a721070b0240200128028c02450d002004102c0b024002402003418002490d00412010322203450d04200320012903a001370000200341186a200141a0016a41186a290300370000200341106a200141a0016a41106a290300370000200341086a200141a0016a41086a2903003700002001428180808010370294012001200336029001200141c0016a41c7dcc700410410c501200141e8016a41d4d9c500411110c5012001200041016a22083602dc01200141e0016a200141dc016a410410c70120014194026a200141dc016a41046a3602002001200141e0016a41086a36028c022001200141dc016a360290022001200141e0016a36028802200141d0016a20014188026a107e20012802d801220441206a2200417f4c0d030240024020000d004101210c0c010b20001032220c450d050b20014100360290022001200036028c022001200c3602880220014188026a4100411010c80120012802880220012802900222006a220c20012900c001370000200c41086a200141c0016a41086a2900003700002001200041106a22003602900220014188026a2000411010c80120012802880220012802900222006a220c20012900e801370000200c41086a200141e8016a41086a2900003700002001200041106a220c3602900220012802d001210020014188026a200c200410c801200128028802220c20012802900222066a2000200410c9081a2001200620046a220436029002024020012802d401450d002000102c0b200c200420014190016a1089050240200128028c02450d00200c102c0b2003102c20014180026a4200370300200141f8016a4200370300200141e8016a41086a22034200370300200142003703e80120014188026a41c7dcc700410410c501200320014188026a41086a220429000037030020012001290088023703e80120014188026a41f0d8c500410c10c501200241086a200429000037000020022001290088023700002001200836028802200141e8016a412020014188026a410410a7020c010b20014188026a41186a2204200141a0016a41186a29030037030020014188026a41106a220c200141a0016a41106a29030037030020014188026a41086a2208200141a0016a41086a290300370300200120012903a00137038802024020032007470d0020014180016a2003108205200128028001210520012802880121030b200520034105746a2207200129038802370000200741186a2004290300370000200741106a200c290300370000200741086a2008290300370000410121042001200341016a36028801200141c0016a41c7dcc700410410c501200141e8016a41d4d9c500411110c501200120003602e00120014190016a200141e0016a410410c70120014194026a200141e0016a41046a360200200120014190016a41086a36028c022001200141e0016a36029002200120014190016a36028802200141d0016a20014188026a107e20012802d801220341206a2207417f4c0d0202402007450d00200710322204450d040b20014100360290022001200736028c02200120043602880220014188026a4100411010c80120012802880220012802900222076a220420012900c001370000200441086a200141c0016a41086a2900003700002001200741106a22073602900220014188026a2007411010c80120012802880220012802900222076a220420012900e801370000200441086a200141e8016a41086a2900003700002001200741106a22043602900220012802d001210720014188026a2004200310c801200128028802220420012802900222006a2007200310c9081a2001200020036a220336029002024020012802d401450d002007102c0b2004200320014180016a1089050240200128028c02450d002004102c0b20012802840121070b200741ffffff3f71450d002005102c0b20014180026a22074200370300200141f8016a22044200370300200141e8016a41086a22034200370300200142003703e80120014188026a41c7dcc700410410c501200320014188026a41086a220529000037030020012001290088023703e80120014188026a41d4dac500411310c501200241086a220020052900003700002002200129008802370000200141e8016a412010b401200742003703002004420037030020034200370300200142003703e80120014188026a41c7dcc700410410c5012003200529000037030020012001290088023703e80120014188026a4190dbc500410810c501200020052900003700002002200129008802370000200141e8016a412010b401200141a0046a24000f0b103b000b1039000b109d06000b41aecfc300412b41dccfc300103c000ba10204017f017e027f037e0240024020012802082202ad42287e2203422088a70d002003a72204417f4c0d00200128020021014108210502402004450d00200410322205450d020b20002005360200200041086a22054100360200200041046a200441286e36020020004100200210f2042005280200210402402002450d00200241286c21052000280200200441286c6a21020340200141086a2903002103200141106a2903002106200141186a290300210720012903002108200241206a200141206a290300370300200241186a2007370300200241106a2006370300200241086a200337030020022008370300200241286a2102200441016a2104200141286a2101200541586a22050d000b0b200041086a20043602000f0b103b000b1039000b850301047f230041f0006b22012400200141086a41206a200041206a280200360200200141086a41186a200041186a290200370300200141086a41106a200041106a290200370300200141086a41086a2202200041086a29020037030020012000290200370308200141306a41186a22004200370300200141306a41106a22034200370300200141306a41086a420037030020014200370330200141306a41c1dcc700410610c501200141e0006a419ca4c600410610c5012000200141e0006a41086a220429000037030020032001290060370300200141d0006a200141086a1084022004200141d0006a41086a28020036020020012001290350370360200141306a4120200141e0006a10f4020240024002400240024020012d00080e050400010204030b200141146a280200450d03200141106a280200102c0c030b200141146a280200450d02200141106a280200102c0c020b200141146a280200450d01200141106a280200102c0c010b2002280200450d00200128020c102c0b200141f0006a24000bd70201017f20004201370200200041086a22044100360200024002400240024020010e0400010203000b200041004101102f2000280200200428020022006a41003a00002004200041016a3602000f0b200041004101102f2000280200200428020022016a41013a00002004200141016a2201360200200020014104102f2000280200200428020022016a20023600002004200141046a2201360200200020014104102f2000280200200428020022006a20033600002004200041046a3602000f0b200041004101102f2000280200200428020022006a41023a00002004200041016a3602000f0b200041004101102f2000280200200428020022016a41033a00002004200141016a2201360200200020014104102f2000280200200428020022016a20023600002004200141046a2201360200200020014104102f2000280200200428020022006a20033600002004200041046a3602000bde2e05017f027e017f027e1c7f230041f0026b22072400024002400240024002402001200284500d002003200484500d004201210842002109200741f8006a200320012003200156200420025620042002511b220a1b220b20042002200a1b220c20054201200542015620064200522006501b220d1b220520064200200d1b220610c70820022004200a1b210220012003200a1b21042007290378200741f8006a41086a29030084500d01200741e8006a200420022005200610c7082007290368200741e8006a41086a29030084500d0220052108200621090c030b20004100360200200041106a4200370300200041086a42003703000c030b200741c8006a200b200c2005200610c808200741c8006a41086a290300210c2007290348210b0c010b200741d8006a200420022005200610c808200741e0006a29030021024200210942012108200729035821040b200741186a200c42002004420010ce08200741286a20024200200b420010ce08200741386a200b42002004420010ce0802400240024002400240024002400240024002400240200c420052200242005271200729032042005272200729033042005272200741386a41086a2903002201200729031820072903287c7c2203200154724101470d0041101032220a450d092007420437028c022007200a3602880220074188026a4100410410a90820074188016a41086a200728029002220a41046a360200200728028802200a4102746a220a200b3e020c200a200b4220883e0208200a200c3e0204200a200c4220883e020020072007290388023703880120074188016a10aa0841101032220a450d092007420437028c022007200a3602880220074188026a4100410410a90820074198016a41086a200728029002220a41046a360200200728028802200a4102746a220a20043e020c200a20044220883e0208200a20023e0204200a20024220883e020020072007290388023703980120074198016a10aa0841101032220a450d092007420437028c022007200a3602880220074188026a4100410410a908200741a8016a41086a200728029002220a41046a360200200728028802200a4102746a220a2008a7220e36020c200a20084220883e0208200a20093e0204200a20094220883e020020072007290388023703a801200741a8016a10aa08200741f8016a41086a20074198016a41086a28020036020020072007290398013703f80120074188026a41086a20074188016a41086a280200360200200720072903880137038802200741b8016a20074188026a200741f8016a10e206024020072802fc0141ffffffff0371450d0020072802f801102c0b200741b8016a10aa0820072802c001210a20072802bc01210f20072802b801211020072802b001220d0e020602010b200741086a200729033820032008200910c80820004100360200200041106a200741086a41086a290300370300200041086a20072903083703000c0a0b20072802a801220e2802000d010c040b200a4101200a41014b1b221141ffffffff03712011470d012011410274220d417f4c0d0102400240200d0d00410421120c010b200d10372212450d070b200720113602f001200720123602e8012007200d4102763602ec010240200a450d0020122011410274200a4102746b6a210d4100200a6b210a200e4101200e41014b1bad2102420021042010210e0240034020112011200a6a22124d0d01200d2004422086200e3502008422042002803e0200200a417f460d02200e41046a210e200d41046a210d200a41016a210a200420028221040c000b0b2012201141b0aec800103f000b200f41ffffffff0371450d052010102c0c050b200a450d012010280200450d02200a200d4d0d022007200d3602c401200a200d6b221341016a22144101201441014b1b221541ffffffff03712015470d0020154102742216417f4c0d000240024020160d00410421170c010b201610372217450d060b200d4101200d41014b1b221841ffffffff03712018470d0020184102742219417f4c0d0020191037221a450d05410121114102210d024002400240200e28020067221b0e020201000b4102210d201b210e410121110340200d4101200e4101711b20116c2111200e41034b2112200d200d6c210d200e410176210e20120d000b0b200d20116c21110b2007200a360280022007200f3602fc01200720103602f80141041032220a450d05200a2011360200200742818080801037028c022007200a36028802200741c8016a200741f8016a20074188026a10e206200a102c200741f8016a200741a8016a10a80841041032220a450d05200a2011360200200742818080801037028c022007200a36028802200741d8016a200741f8016a20074188026a10e206200a102c0240201420072802c4016a220a20072802d001220d4d0d002007410036028002200742043703f801200741f8016a4100200a200d6b220d10a908200728028002210a0240200d450d0020072802f801200a4102746a4100200d41027410cb081a200a200d6a210a0b2007200a3602800220072802c801210e200741f8016a200a20072802d001220d10a90820072802f801200728028002220a4102746a200e200d41027410c9081a2007200a200d6a220a3602800220074188026a41086a220d200a360200200720072903f80137038802024020072802cc0141ffffffff0371450d0020072802c801102c0b200741c8016a41086a200d28020036020020072007290388023703c8010b2016410276211c2019410276211d200741d8016a10aa080240024002400240024002400240024002400240034020072013221e3602e401024020072802d001220a20072802c401220d201e6a220e417f736a2211200a490d002011200a4188adc800103f000b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200a200a200e6b220e4d0d0020072802e001220a200a200d6b220d4d0d0120072802d801200d4102746a35020022024200510d02201e201e4100476b211320072802c801220a20114102746a3502002104200a200e4102746a3502002101200741003602e8012007200120044220868422042002803703f0012007200420028237038002200741003602f8012007200741e4016a36029c022007200741c8016a360298022007200741c4016a360294022007200741d8016a360290022007200741f8016a36028c022007200741e8016a3602880220074188026a10ab081a034020072802f801220a41016a41004c0d042007200a3602f801024020072903800242ffffffff0f560d0020074188026a10ab080d010b0b20072903f00121024100210e200741003602a802200742043703a002024020072802c401221620072802e401220d6a220a2016490d00201641016a220e20164f0d004104210f4100210e41002112034020072802d0012211200a417f736a221020114f0d06200d200a4f2111200a200d200a496b210a20072802c80120104102746a28020021100240201220072802a402470d00200741a0026a2012417f41004100417f200a200d6b220f41016a22162016200f491b20111b200a200d491b220f41016a22162016200f491b10a90820072802a002210f0b200f200e6a20103602002007201241016a22123602a802200e41046a210e200a200d49201172450d000c0b0b0b200741a0026a4100200e10a90820072802a8022112200a200d490d0820072802a00220124102746a2111200a200d4d0d05200a417f73210e0340200e20072802d001220f6a2210200e4f0d07201120072802c80120104102746a280200360200200e41016a210e201141046a2111200d200a417f6a220a490d000b201620126a21120c070b200e200a4188adc800103f000b200d200a4188adc800103f000b41d0aec800411941ecaec800103c000b41fcaec8004118200741e0026a4194afc80041a4afc8001040000b201020114188adc800103f000b2016450d010c020b2010200f4188adc800103f000b20072802d001220a200d417f736a220d200a4f0d02201120072802c801200d4102746a280200360200201241016a21120b200720123602a8020b200741d0026a200741d8016a10a80841081032220a450d22200a2002a7221f360204200a20024220883e020020074282808080203702e4022007200a3602e002200741b0026a200741d0026a200741e0026a10e206200a102c201220072802b8022220201220204b1b220f4101200f41014b1b221041ffffffff03712010470d1d20104102742221417f4c0d1d20072802a402212220072802a00221230240024020210d00410421240c010b202110372224450d230b02400240200f450d002010417f6a210d2020417f6a222520204b21142012417f6a222620124b2127202420216a417c6a210e410021114200210420072802b002212803404100210a024020270d004100210a2012202620116b22164d0d004100210a201620264b0d00202320164102746a280200210a0b200aad21024100210a024020140d002020202520116b22164d0d00201620254b0d00202820164102746a280200210a0b024002402002200aad22037d22012002560d00200120047d22062001560d00200642ffffffff0f832102420021044101210a0c010b20024280808080108420047d20037d2102420121044100210a0b2010200d4d0d04200e20023e0200200e417c6a210e200d417f6a210d200f201141016a2211470d000b41012116200a450d010b410021160b0240202241ffffffff0371450d002023102c0b20072802c401220e20072802e401220d6a2214200e490d06200d20144f0d02200d417f73210a034020102010200d6a200a6a22114d0d04200a20072802d00122126a220d200a4f0d0520072802c801200d4102746a202420114102746a280200360200200a417f6a210a20072802e401210d200e417f6a220e0d000c060b0b200d200a4188adc800103f000b200d201041b0aec800103f000b200e450d020c030b200f4101200f41014b1b200d6a200a6a20104188adc800103f000b200d201241b0aec800103f000b200d2014417f73220a6a220d20106a220e200d4f0d0120072802d001220d200a6a220a200d4f0d0220072802c801200a4102746a2024200e4102746a28020036020020072802e401210d0b2015200d417f736a220a20154f0d022017200a4102746a201f3602002016450d0a201520072802e401417f736a220a20154f0d032017200a4102746a220a200a280200417f6a3602004100210e200741003602e802200742043703e002024020072802c401220f20072802e401220d6a220a200f490d00200f41016a220e200f4f0d004104210f410021114100210e034020072802d0012212200a417f736a221020124f0d06200d200a4f2112200a200d200a496b210a20072802c80120104102746a28020021100240200e20072802e402470d00200741e0026a200e417f41004100417f200a200d6b220f41016a22162016200f491b20121b200a200d491b220f41016a22162016200f491b10a90820072802e002210f0b200f20116a20103602002007200e41016a220e3602e802201141046a2111200a200d49201272450d000c0b0b0b200741e0026a4100200e10a90820072802e8022116200a200d490d0820072802e00220164102746a2111200a200d4d0d05200a417f73210e0340200e20072802d00122106a2212200e4f0d07201120072802c80120124102746a280200360200200e41016a210e201141046a2111200d200a417f6a220a490d000b200f20166a21160c070b200e20104188adc800103f000b200a200d41b0aec800103f000b200a201541b0aec800103f000b200a20154188adc800103f000b201020124188adc800103f000b200f450d010c020b201220104188adc800103f000b20072802d001220a200d417f736a220d200a4f0d04201120072802c801200d4102746a280200360200201641016a21160b200720163602e8020b200741c0026a41086a200741e0026a41086a280200360200200720072903e0023703c002200741e0026a200741d8016a10a808200741d0026a200741e0026a200741c0026a10ac08024020072802c401220a20072802e40122106a220d200a490d00024002402010200d4f0d00200d417f73210a20072802d002210f20072802d802210e201021110340200e200e20116a200a6a22114d0d07200a20072802d00122166a2212200a4f0d0820072802c80120124102746a200f20114102746a280200360200200a41016a210a20072802e40121112010200d417f6a220d490d000c020b0b200a0d0120072802d802210e201021110b200e20112010417f73220a6a6a220d200e4f0d0620072802d001220e200a6a220a200e4f0d0720072802c801200a4102746a20072802d002200d4102746a2802003602000b024020072802d40241ffffffff0371450d0020072802d002102c0b20072802c40241ffffffff0371450d0020072802c002102c0b02402021450d002024102c0b024020072802b40241ffffffff0371450d0020072802b002102c0b201e0d000b02400240201b0d004100210a20072802d001211820072802cc01211d20072802c801210e2019450d01201a102c0c010b024020072802c401220a4101460d004100200a6b2110201b411f71210f4100201b6b411f7121162018410274201a6a417c6a210d417f210a0340200a20072802d00122116a220e200a4f0d0a2011200e417f6a22124d0d0b20182018200a6a22114d0d0c200d20072802c801221120124102746a2802002016742011200e4102746a280200200f7672360200200d417c6a210d2010200a417f6a220a470d000b20072802c401210a0b20072802d001220d200d200a6b220e4d0d0620182018200a6b220a4d0d07201a200a4102746a20072802c801200e4102746a280200201b411f71763602004101210a201a210e0b024020072802dc0141ffffffff0371450d0020072802d801102c0b200a450d0d20072802cc0141ffffffff0371450d0d20072802c801102c0c0d0b200d200a4188adc800103f000b2011200e4188adc800103f000b2012201641b0aec800103f000b200d200e4188adc800103f000b200a200e41b0aec800103f000b200e200d4188adc800103f000b200a201841b0aec800103f000b200e20114188adc800103f000b200e417f6a20114188adc800103f000b2011201841b0aec800103f000b103b000b4100410041c0aec800103f000b410021170240200f41ffffffff03710d000c010b2010102c0b41041032220a450d01200a410036020041041032220d450d01200d41003602000240024020170d00410121184101211d410121154101211c0c010b200a102c200d102c200e210d2017210a0b200720153602e8022007201c3602e4022007200a3602e00220072018360280022007201d3602fc012007200d3602f80120074188026a200741f8016a10ad082007280288024101460d02024020074188026a41086a29030020084201882009423f86845620074188026a41106a2903002202200942018822045620022004511b450d00200741e8016a41086a200741e0026a41086a280200360200200720072903e0023703e80141101032220a450d022007420437028c022007200a3602880220074188026a4100410410a90820074180026a200728029002220a41046a360200200728028802200a4102746a220a428080808010370208200a420037020020072007290388023703f801200741f8016a10aa08200741e0026a200741e8016a200741f8016a10ac0820072802fc0141ffffffff0371450d0020072802f801102c0b200741e8016a41086a200741e0026a41086a280200360200200720072903e0023703e8010b200741e8016a10aa08200741f8016a41086a200741e8016a41086a280200360200200720072903e8013703f80120074188026a200741f8016a10ad084101210a024002402007280288024101470d00200041fca5c800360204200041086a41193602000c010b200041106a20074188026a41106a290300370300200041086a20074188026a41086a2903003703004100210a0b2000200a36020020072802ac0141ffffffff0371450d0220072802a801102c0c020b1039000b2007200729028c023703f80141aca5c800412f200741f8016a41dca5c80041eca5c8001040000b200741f0026a24000b11004192b1c800411f41b4b1c800103c000b8c590a077f017e057f017e067f017e097f017e117f037e230041f00c6b22022400200241c00a6a41186a22034200370300200241c00a6a41106a22044200370300200241c00a6a41086a22054200370300200242003703c00a200241d8086a41968dc700410d10c5012005200241d8086a41086a2206290000370300200220022900d8083703c00a200241d0026a418893c700410a10c5012003200241d0026a41086a2207290000370300200420022900d002370300200241d0026a200241c00a6a10ff0420022802d002210820022902d4022109200342003703002004420037030020054200370300200242003703c00a200241d8086a41968dc700410d10c50120052006290000370300200220022900d8083703c00a200241d0026a41bc93c700411310c50120032007290000370300200420022900d002370300200241106a200241c00a6a412010c6012002280214210a2002280210210b200241d0026a41186a22034200370300200241d0026a41106a220c420037030020074200370300200242003703d002200241d8076a41ac95c400410d10c5012007200241d8076a41086a2204290000370300200220022900d8073703d002200241d8086a41c695c400410c10c50120032006290000370300200c20022900d808370300200241c00a6a200241d0026a10f50220022802800b210520022802980b210d20034200370300200c420037030020074200370300200242003703d002200241d8076a41f1ddc700410510c50120072004290000370300200220022900d8073703d002200241d8086a41c4fec000410a10c50120032006290000370300200c20022900d808370300200241c00a6a200241d0026a412010b90302400240024002400240024002400240024041002005200d4102461b20022902c40a420020022802c00a220e1b220f422088a76a22100d00410421114104210341002112410421134100211441002115410121050c010b20104104201041044b1bad42b0027e2216422088a70d052016a722074100480d05200710322203450d04200741b0026e2114200241ac0c6a2104200241e8006a41046a211720024198086a41086a2118200241d0026a41106a2106200241d0026a41186a2119200241e8006a41286a2113200241e8006a41306a211a200241e8006a41386a211b4100211c4104211d200321074100210d03402019420037030020064200370300200241d0026a41086a221e4200370300200242003703d002200241c00a6a41bee8c700410d10c501201e200241c00a6a41086a2205290000370300200220022900c00a3703d002200241c00a6a4188eec700411110c501200641086a2005290000370000200620022900c00a370000200241c00a6a200241d0026a10eb0420022802c00a2211410420111b211f410121150240200d20022902c40a420020111b2216422088a74f0d004101211502400240201f201d6a2211417c6a280200417f6a0e020102000b20112802002105410021150c010b2019420037030020064200370300201e4200370300200242003703d002200241d8076a41f1ddc700410510c501201e200241d8076a41086a290000370300200220022900d8073703d002200241d8086a41c4fec000410a10c501200c41086a200241d8086a41086a290000370000200c20022900d808370000200241c00a6a200241d0026a412010b903200d20022902c40a420020022802c00a22051b2220422088a722114f0d032005410420051b221e201c6a2802002105410021152020a72211450d00201141ffffffff0371450d00201e102c0b02402016a72211450d002011412c6c450d00201f102c0b41002111024020150d00200241d8076a41968dc700410d10c501200241d8086a41a38dc700411310c5012002200536026820024198086a200241e8006a410410c701200220173602dc02200220183602d4022002200241e8006a3602d802200220024198086a3602d002200241b0056a200241d0026a107e20022802b805221141206a2215417f4c0d070240024020150d004101211e0c010b20151032221e450d070b200241003602a0082002201536029c082002201e3602980820024198086a4100411010c80120022802980820022802a00822156a221e20022900d807370000201e41086a200241d8076a41086a2900003700002002201541106a22153602a00820024198086a2015411010c80120022802980820022802a00822156a221e20022900d808370000201e41086a200241d8086a41086a2900003700002002201541106a221e3602a00820022802b005211520024198086a201e201110c801200228029808221e20022802a008221f6a2015201110c9081a2002201f20116a22113602a008024020022802b405450d002015102c0b200241c00a6a201e201110f304200241d0026a200241c00a6a41e80110c9081a200241b0056a41086a2211200441086a290200370300200241b0056a41106a2215200441106a290200370300200241b0056a41186a221f200441186a290200370300200241b0056a41206a2221200441206a290200370300200241b0056a41286a2212200441286a290200370300200241b0056a41306a2222200441306a290200370300200241b0056a41386a2223200441386a280200360200200220042902003703b005024020022802a80c2224450d00200241d8086a200241d0026a41e80110c9081a201b2023280200360200201a202229030037030020132012290300370300200241e8006a41206a2021290300370300200241e8006a41186a201f290300370300200241e8006a41106a2015290300370300200241e8006a41086a2011290300370300200220022903b0053703680b0240200228029c08450d00201e102c0b410121110b20072011360200200741046a2005360200200741086a200241d8086a41e80110c9081a200741f0016a2024360200200741f4016a2002290368370200200741fc016a200241e8006a41086a29030037020020074184026a200241e8006a41106a2903003702002007418c026a200241e8006a41186a29030037020020074194026a200241e8006a41206a2903003702002007419c026a2013290300370200200741a4026a201a290300370200200741ac026a201b280200360200200741b0026a2107201c41046a211c201d412c6a211d2010200d41016a220d470d000b41012115024020104109490d0041024101201041786a22074107711b20074103766a21150b201510322205450d042003201041b0026c6a211120102112200321130b200220153602702002410036026c2002200536026802402012450d00410021070340410021042003280200410146200341f0016a28020041004771210d20074103762106024002402007450d0020064107712204454103742004724108470d0141012104200741c100490d0041024101200641786a22044107711b20044103766a21040b200220053602c00a200220153602c40a200220043602c80a024020042015470d00200241c00a6a2015410110c80120022802c80a210420022802c00a21050b200520046a41003a0000200220022802c00a220536026820022802c40a21150b4101200520074178461b41002007410676200741c000491b6a21044101200641077174210602400240200d0d0020042d00002006417f737121060c010b20042d000020067221060b200741086a2107200420063a0000200341b0026a22032011470d000b200220153602702002200736026c0b200241d0026a41186a22074200370300200241d0026a41106a22034200370300200241d0026a41086a22044200370300200242003703d002200241d8076a41c1dcc700410610c5012004200241d8076a41086a290000370300200220022900d8073703d002200241d8086a41a2a4c600410a10c5012007200241d8086a41086a2205290000370300200320022900d808370300200241c00a6a200241d0026a412010c90120022d00c00a21062007200241d90a6a2900003703002003200241d10a6a2900003703002004200241c90a6a290000370300200220022900c10a3703d0020240024020064101460d00200241d8086a41186a4200370300200241d8086a41106a420037030020054200370300200242003703d8080c010b200241d8086a41186a2007290300370300200241d8086a41106a200329030037030020052004290300370300200220022903d0023703d8080b2009420020081b21162008410120081b2117200e4104200e1b2125200241b0056a41086a2218200241d8086a41086a290300370300200241b0056a41106a2208200241d8086a41106a290300370300200241b0056a41186a220e200241d8086a41186a290300370300200220022903d8083703b005200128020022262001280208222741d0006c6a21242027450d02200a4100200b1b210a2016422088a72122410121072026211f0240034002400240024002400240201f41046a221a2802004103762010470d002007201f410c6a2219280200220420034b72410171450d01200420224f0d03200241d8086a200241e8006a10cb05200241d0026a201f10cb0520022802d808211b20022802d802212320022802d002212120022802dc082206410376221d0d02410021040c040b200241c00a6a410110a505200041013602002000410c6a200241c80a6a280200360200200020022903c00a3702040c070b200241c00a6a410210a505200041013602002000410c6a200241c80a6a280200360200200020022903c00a3702040c060b201b410120061b211e2006410771211c4100210420022802d402210720212105034020074108490d02200241c00a6a2005200710970720022802cc0a210720022802c80a210d201e4100201c20046a220541037620054108491b6a21034101200541077174210502400240024020022802c00a410120022802c40a22111b2d0000201141077176410171450d00200520032d00007141ff01710d010b20032d00002005417f737121110c010b20032d000020057221110b200d410120071b2105200320113a0000201d200441016a2204460d020c000b0b200241c00a6a410310a505200041013602002000410c6a200241c80a6a280200360200200020022903c00a3702040c040b02402023450d002021450d002021102c0b0240201d20044d0d00200241d8086a200410b20620022802dc08210620022802d808211b0b20022802e008211102400240201a280200220720067341074b0d00201f2802002104201b210303404101210520064108490d02200241c00a6a2003200610970720074108490d0220022802cc0a210620022802c80a210320022802c00a410120022802c40a22051b2d0000210d200241c00a6a2004200710970720022802cc0a210720022802c80a2104200d20054107717641017120022802c00a410120022802c40a22051b2d0000200541077176410171460d000b0b410021050b02402011450d00201b450d00201b102c0b024020050d00200241c00a6a410d10a505200041013602002000410c6a200241c80a6a280200360200200020022903c00a3702040c040b2019280200220320224f0d0141002107200241003602e008200242013703d808201f2802002104201a280200410376200241d8086a10770240201a28020022064103762205450d00410121072005410820064107716b22064d0d0041024101200520066b22074107711b20074103766a21070b200241d8086a20022802e0082007102f20022802d80820022802e00822056a2004200710c9081a2002200520076a22053602e008200241003602d802200242013703d002200241d0026a41004104102f20022802d00220022802d80222076a200a3600002002200741046a22043602d802412010322207450d0520034105742106200242203702c40a200220073602c00a200241c00a6a41004120102f20022802c00a220320022802c80a220d6a220720022903b005370000200741086a2018290300370000200741106a2008290300370000200741186a200e2903003700002002200d41206a22073602c80a200241d0026a20042007102f20022802d002220420022802d802220d6a2003200710c9081a2002200d20076a22073602d802024020022802c40a450d002003102c0b201720066a210620022802d402210d200241d8086a2005200710c80120022802d808220320022802e00822056a2004200710c9081a2002200520076a22073602e0080240200d450d002004102c0b201f41106a200320072006102d2107024020022802dc08450d002003102c0b02402007450d002019280200210341002107201f41d0006a221f2024470d010c050b0b200241c00a6a410410a505200041013602002000410c6a200241c80a6a280200360200200020022903c00a3702040c020b20032022419096c700103f000b200d201141b0fcc700103f000b20022802682107200241013602682002410036026c02402015450d002007102c0b02402012450d00201241b0026c21044100210303400240201320036a2207280200450d00200741f0016a22052802002206450d0020054101360200200741f4016a41003602000240200741f8016a280200450d002006102c0b20074180026a4100360200200741fc016a220528020021062005410136020020074184026a280200450d002006102c0b2004200341b0026a2203470d000b0b02402014450d00201441b0026c450d002013102c0b0240200f42ffffffff0383500d002025102c0b02402016a72207450d00200741ffffff3f71450d002017102c0b024020012802082203450d0020012802002207200341d0006c6a21040340200741046a410036020020072802002103200741013602000240200741086a280200450d002003102c0b200741d0006a22072004470d000b0b20012802042207450d04200741d0006c450d042001280200102c0c040b20022802682107200241013602682002410036026c02402015450d002007102c0b200241e8026a4200370300200241d0026a41106a4200370300200241d0026a41086a221a4200370300200242003703d002200241d8076a41c1dcc700410610c501201a200241d8076a41086a290000370300200220022900d8073703d002200241d8086a4196a4c600410610c501200c41086a200241d8086a41086a221b290000370000200c20022900d808370000200241086a200241d0026a412010c6012001280204210c2026210d024002402027450d00200228020c410020022802081b211e201341d07d6a211c200241d8076a41046a211920024198086a41086a21212026210702400340200741d0006a210d20072802002211450d02200728020c211d2007280208211541002104201121052007280204221f21070340201c200441b0026c6a21030240024002400240034020074108490d01200241c00a6a2005200710970720022802cc0a210720022802c80a2105200341b0026a2103200441016a210420022802c00a410120022802c40a22061b2d0000200641077176410171450d000b20122004417f6a4d0d0320032802004101470d06200341f0016a2802002206450d04200341f4016a2802002203410376201d4d0d042006410120031b210620034107712203410048201d20036a2203201d48460d0120034107712122200341037621230c020b2002201e3602bc05200220153602b8052002201f3602b405200220113602b005200241d8086a41968dc700410d10c501200241d0026a418091c700411510c5012002201d3602d80720024198086a200241d8076a410410c701200220193602cc0a200220213602c40a2002200241d8076a3602c80a200220024198086a3602c00a200241e8006a200241c00a6a107e2002280270220741206a2203417f4c0d090240024020030d00410121040c010b200310322204450d090b200241003602a0082002200336029c08200220043602980820024198086a4100411010c80120022802980820022802a00822036a220420022900d808370000200441086a201b2900003700002002200341106a22033602a00820024198086a2003411010c80120022802980820022802a00822036a220420022900d002370000200441086a201a2900003700002002200341106a22043602a0082002280268210320024198086a2004200710c801200228029808220420022802a00822056a2003200710c9081a2002200520076a22053602a0080240200228026c450d002003102c0b200241003602c80a200242013703c00a200241c00a6a200241b0056a10e305200241c00a6a20022802c80a4104102f20022802c00a220720022802c80a22036a201e3600002002200341046a22033602c80a200420052007200310a702024020022802c40a450d002007102c0b0240200228029c08450d002004102c0b200242013703b00502402015450d002011102c0b200d2107200d2024470d040c070b024020034108490d0020034107712122200341037521230c010b41002123200321220b200620236a220320032d00004101202241077174723a00000c010b0b0b2004417f6a201241a096c700103f000b41b096c70041d600418897c700105c000b2024200d460d000340200d41046a4100360200200d2802002107200d41013602000240200d41086a280200450d002007102c0b200d41d0006a220d2024470d000b0b0240200c450d00200c41d0006c450d002026102c0b2016421f88a7417e7122074103702105200741036e2106201041ffffffff03712010470d0120104102742207417f4c0d010240024020070d00410421030c010b200710322203450d010b20024100360220200220033602182002200741027636021c2013201241b0026c22076a2104024020120d00201321030c030b200620056a2128201320076a41d07d6a2129200241c80c6a212a20024198076a41046a212b20024198086a41086a2122200241d0026a41e8016a210e200241c00a6a410472212c200241d0026a4104722108200241ec0c6a41046a212d200241f0046a41086a2105200241c00a6a41f4016a2127200241ac0c6a2101200241c00a6a41e8016a210b200241f0046a41386a2106200241f0046a41306a210d200241f0046a41286a2111200241f0046a41206a2115200241f0046a41186a211d200241f0046a41106a211e20132103034020032107024002400340200741046a280200211220072802002103200241b0056a200741086a41e80110c9081a200741f0016a280200211c2006200741ac026a280200360200200d200741a4026a29020037030020112007419c026a290200370300201520074194026a290200370300201d2007418c026a290200370300201e20074184026a2902003703002005200741fc016a2902003703002002200741f4016a2902003703f00420034102460d01200241d0026a200241b0056a41e80110c9081a200241d8076a41386a22242006280200360200200241d8076a41306a2210200d290300370300200241d8076a41286a221a2011290300370300200241d8076a41206a221b2015290300370300200241d8076a41186a2219201d290300370300200241d8076a41106a2221201e290300370300200241d8076a41086a221f2005290300370300200220022903f0043703d807024020034101470d00200241c00a6a200241d0026a41e80110c9081a20024198086a41386a2203202428020036020020024198086a41306a2223201029030037030020024198086a41286a2210201a29030037030020024198086a41206a221a201b29030037030020024198086a41186a221b201929030037030020024198086a41106a221920212903003703002022201f290300370300200220022903d80737039808201c0d03200241d8086a410041e80110cb081a20024198076a41386a410036020020024198076a41306a420037030020024198076a41286a420037030020024198076a41206a420037030020024198076a41186a420037030020024198076a41106a420037030020024198076a41086a420037030020024200370398070b200741b0026a22072004470d000b200421030c050b200741b0026a21030c040b200241d8086a200241c00a6a41e80110c9081a20024198076a41386a2224200328020036020020024198076a41306a2203202329030037030020024198076a41286a2221201029030037030020024198076a41206a220c201a29030037030020024198076a41186a2218201b29030037030020024198076a41106a222e201929030037030020024198076a41086a222f2022290300370300200220022903980837039807200241e8006a200241d8086a41e80110c9081a200241286a41386a22302024280200360200200241286a41306a22242003290300370300200241286a41286a22032021290300370300200241286a41206a2221200c290300370300200241286a41186a220c2018290300370300200241286a41106a2218202e290300370300200241286a41086a222e202f2903003703002002200229039807370328200241c00a6a200241e8006a41e80110c9081a200141386a2030280200360200200141306a2024290300370200200141286a2003290300370200200141206a2021290300370200200141186a200c290300370200200141106a2018290300370200200141086a202e290300370200200120022903283702002002201c3602a80c02400240024002400240024002400240024020022802ac0c22214103762224450d000240024020244108202141077122036b220c4d0d00410241012024200c6b2218410771220c1b20184103766a212f200c45410374200c7221300c010b200320246a21304101212f0b4101212e02402024410820214107716b220c4d0d00410241012024200c6b22244107711b20244103766a212e0b201c410120211b210c4100211802400240024020030d00203041ff01714108470d00200c2124202e210a4100212e0c010b203041ff017122244108460d0120030d03200c202e417f6a220a6a212e200c2124203021310b4100210c4100212f0c040b200c4180807c71212f200c41807e712118202e417f6a210a200c41016a21244100212e0c020b410021244100212e4100210c410021184100212f0c020b202f4101460d020240202e4101470d00419bf8c600412b41c8f8c600105c000b200c4180807c71212f200c41807e712118200c41016a2224202e417e6a220a6a212e203021310b200321260b410021210240202f20184180fe037172200c41ff0171722203450d00202641ff017141074b0d0020032d00002118410021212026210303402021201841ff01712003410771764101716a2121200341ff0171210c200341016a2103200c4107490d000b0b2024450d03200a0d01410021030c020b024020032024490d0041002121200c21260c040b200c2d000021184100212103402021201841ff01712003410771764101716a2121200341016a220341ff01712024490d000b200c21260c030b41002103200a210c0340200320242d0000696a2103202441016a2124200c417f6a220c0d000b0b200320216a21210b202e450d0002400240203141ff0171220c0d00410021240c010b202e2d00002118410021244100210303402024201841ff01712003410771764101716a2124200341016a220341ff0171200c490d000b0b202420216a21210b02400240202120284f0d00200241d8076a41968dc700410d10c501200241d8086a41a38dc700411310c501200220123602980720024198086a20024198076a410410c7012002202b3602dc02200220223602d402200220024198076a3602d802200220024198086a3602d002200241b0056a200241d0026a107e20022802b805220341206a2224417f4c0d040240024020240d00410121100c010b202410322210450d040b200241003602a0082002202436029c08200220103602980820024198086a4100411010c80120022802980820022802a00822246a221020022900d807370000201041086a201f2900003700002002202441106a221f3602a00820024198086a201f411010c80120022802980820022802a008221f6a222420022900d808370000202441086a200241d8086a41086a2900003700002002201f41106a22243602a00820022802b005211f20024198086a2024200310c801200228029808222420022802a00822106a201f200310c9081a2002201020036a22033602a008024020022802b405450d00201f102c0b200241003602d802200242013703d00220022802c00a211f200241d0026a41004104102f20022802d00220022802d8026a201f360000200220022802d80241046a3602d802200241d0026a202a10e405200241d0026a202c10c804200241d0026a200b10e305200241d0026a202710e30520022802c00c211f200241d0026a20022802d8024104102f20022802d00220022802d8026a201f360000200220022802d80241046a221f3602d80220022802c40c2110200241d0026a201f4104102f20022802d00220022802d8026a2010360000200220022802d80241046a221f3602d8022024200320022802d002201f10a702024020022802d402450d0020022802d002102c0b0240200228029c08450d002024102c0b200242013703a80c024020022802b00c450d00201c102c0b200241003602b80c20022802b40c2103200241013602b40c20022802bc0c450d012003102c0c010b200241d8076a41968dc700410d10c501200241d8086a41a38dc700411310c501200220123602980720024198086a20024198076a410410c7012002202b3602dc02200220223602d402200220024198076a3602d802200220024198086a3602d002200241b0056a200241d0026a107e20022802b805220341206a2224417f4c0d030240024020240d00410121210c010b202410322221450d030b200241003602d802200220243602d402200220213602d002200241d0026a4100411010c80120022802d00220022802d80222246a222120022900d807370000202141086a201f2900003700002002202441106a22243602d802200241d0026a2024411010c80120022802d00220022802d80222216a222420022900d808370000202441086a200241d8086a41086a22242900003700002002202141106a220c3602d80220022802b0052121200241d0026a200c200310c80120022802d002220c20022802d80222186a2021200310c9081a2002201820036a22033602d802024020022802b405450d002021102c0b200c200310b401024020022802d402450d00200c102c0b200241d8076a41968dc700410d10c501200241d8086a41bc92c700411e10c501200220123602ec0c200241f0046a200241ec0c6a410410c7012002202d3602dc02200220053602d4022002200241ec0c6a3602d8022002200241f0046a3602d00220024198076a200241d0026a107e20022802a007220341206a2221417f4c0d030240024020210d00410121120c010b202110322212450d030b200241003602f804200220213602f404200220123602f004200241f0046a4100411010c80120022802f00420022802f80422216a221220022900d807370000201241086a201f2900003700002002202141106a221f3602f804200241f0046a201f411010c80120022802f00420022802f804221f6a222120022900d808370000202141086a20242900003700002002201f41106a221f3602f8042002280298072121200241f0046a201f200310c80120022802f004221f20022802f80422126a2021200310c9081a2002201220036a22123602f8040240200228029c07450d002021102c0b200241d0026a201f201210ee040240024020022802d0022203450d00201f201210b401200241d8086a41306a200841306a2802002221360200200241d8086a41286a200841286a2902002220370300200241d8086a41206a200841206a2902002209370300200241d8086a41186a200841186a2902002232370300200241d8086a41106a200841106a29020022333703002024200841086a2902002234370300200241b0056a41086a2034370300200241b0056a41106a2033370300200241b0056a41186a2032370300200241b0056a41206a2009370300200241b0056a41286a2020370300200241b0056a41306a20213602002002200829020022203703d808200220203703b0050c010b200241d8086a41306a200841306a280200360200200241d8086a41286a200841286a290200370300200241d8086a41206a200841206a290200370300200241d8086a41186a200841186a290200370300200241d8086a41106a200841106a2902003703002024200841086a290200370300200220082902003703d808410021030b024020022802f404450d00201f102c0b02402003450d002023200241b0056a41306a2802003602002010200241b0056a41286a290300370300201a200241b0056a41206a290300370300201b200241b0056a41186a2903003703002019200241b0056a41106a2903003703002022200241b0056a41086a221c290300370300200220022903b0053703980820022802c00c211f200241d0026a202c41e40110c9081a200e200229039808370200200e41086a2022290300370200200e41106a2019290300370200200e41186a201b290300370200200e41206a201a290300370200200e41286a2010290300370200200e41306a2023280200360200200220033602b404201c202741086a280200360200200220272902003703b0052024200b41086a2802003602002002200b2902003703d808201f200241d0026a200241b0056a200241d8086a10840820022802c00a211c024020022802202203200228021c470d00200241186a20034101109502200228022021030b200228021820034102746a201c3602002002200341016a3602200c010b024041002802d8d2484102490d00200241a4013602dc072002419897c7003602d80741002802d4d248210341002802d0d248211c41002802dcd248211f200241e10236029003200242ca8080801037038803200241c4f9c60036028403200242263702fc02200241bc98c7003602f802200242013703f002200242013703e002200241b4b5c8003602dc02200241263602d802200241bc98c7003602d402200241043602dc08200241023602d002200341e0a3c000201f410246221f1b28021021032002200241d8086a3602ec022002200241d8076a3602d808201c41f8a3c000201f1b200241d0026a200311030020022802a80c211c0b200242013703a80c024020022802b00c450d00201c102c0b200241003602b80c20022802b40c2103200241013602b40c20022802bc0c450d002003102c0b200741b0026a210320292007470d000b200421030c020b1039000b103b000b024020042003460d0003402003220741b0026a210302402007280200450d00200741f0016a22052802002206450d00200542013702000240200741f8016a280200450d002006102c0b20074180026a4100360200200741fc016a220528020021062005410136020020074184026a280200450d002006102c0b20042003470d000b0b02402014450d00201441b0026c450d002013102c0b20002002290318370204200041003602002000410c6a200241206a2802003602000240200f42ffffffff0383500d002025102c0b2016a72207450d00200741ffffff3f71450d002017102c0b200241f00c6a24000bae0501057f230041e0046b220524002005200436020c20052003360208024002400240200241074b0d0041002802d8d248450d0120054126360214200541e59ec00036021041002802d4d248210241002802d0d248210341002802dcd2482104200541f8026a41e900360200200541f0026a42df80808010370300200541ec026a419e9fc000360200200541e4026a4213370200200541e0026a418b9fc000360200200541d8026a4201370300200541c8026a4201370300200541c0026a4113360200200541d4026a200541d0006a360200200541b4b5c8003602c4022005418b9fc0003602bc02200541013602b80220054104360254200241e0a3c000200441024622041b28021021022005200541106a360250200341f8a3c00020041b200541b8026a20021103000c010b2002417c714108460d0020012800082102200541b8026a200541086a10f404200541d0006a200541b8026a41e80110c9081a200541106a41086a200541ac046a290200370300200541206a2203200541b4046a290200370300200541286a2204200541bc046a290200370300200541306a2201200541c4046a290200370300200541386a2206200541cc046a290200370300200541c0006a2207200541d4046a290200370300200541c8006a2208200541dc046a280200360200200520052902a404370310024020052802a0042209450d0020002002360200200041046a200541d0006a41e80110c9081a200020093602ec01200020052903103702f001200041f8016a200541186a29030037020020004180026a200329030037020020004188026a200429030037020020004190026a200129030037020020004198026a2006290300370200200041a0026a2007290300370200200041a8026a20082802003602000c020b200041003602ec010c010b200041003602ec010b200541e0046a24000b960101017f410121030240200041b8016a28020020014d0d0020002802b0012001412c6c6a28020022014102460d00024020014101460d004100210320002802bc01200028025022014f0d01410020002802c001220020026b2203200320004b1b20014f0f0b4100210320002802bc01200028024c22014f0d00410020002802c001220020026b2203200320004b1b20014f21030b20030b2c01017f0240200041b4016a2802002201450d0020002802b0012200450d002001412c6c450d002000102c0b0bd60103037f017e017f024002400240200041046a28020020002802082201470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1bad42387e2204422088a722030d022004a722024100480d022003454102742105024002400240024002402000280200410020011b22030d002002450d010c030b200141386c22010d0120020d020b200521010c020b200320012002103522010d010c030b200210322201450d020b20002001360200200041046a200241386e3602000b0f0b2005450d001039000b103b000bf00203027f017e037f230041306b220124000240024020002802002202450d0020002902042103200141186a22004200370300200141106a22044200370300200141086a2205420037030020014200370300200141206a41bee8c700410d10c5012005200141206a41086a220629000037030020012001290020370300200141206a41fcefc700410910c5012000200629000037030020042001290020370300200141206a20022003422088a710a7062001412020012802202200200128022810a70202402001280224450d002000102c0b2003a72200450d01200041346c450d012002102c0c010b200141186a22004200370300200141106a22024200370300200141086a2204420037030020014200370300200141206a41bee8c700410d10c5012004200141206a41086a220529000037030020012001290020370300200141206a41fcefc700410910c50120002005290000370300200220012900203703002001412010b4010b200141306a24000bec0301057f230041d0006b22012400200141086a22022000410c6a280200360200200120002902043703000240024020002802002200450d0020012000360210200120012903003702142001200228020036021c200141386a22024200370300200141306a22034200370300200141206a41086a2204420037030020014200370320200141c0006a41bee8c700410d10c5012004200141c0006a41086a220529000037030020012001290040370320200141c0006a41b4edc700410f10c50120022005290000370300200320012900403703002001410036024820014201370340200141c0006a200141106a108f05200128021c2103200141c0006a20012802484104102f20012802402202200128024822046a20033600002001200441046a2203360248200141206a41202002200310a70202402001280244450d002002102c0b20012802142202450d012002412c6c450d012000102c0c010b200141386a22004200370300200141306a22024200370300200141206a41086a2203420037030020014200370320200141c0006a41bee8c700410d10c5012003200141c0006a41086a220429000037030020012001290040370320200141c0006a41b4edc700410f10c5012000200429000037030020022001290040370300200141206a412010b4010b200141d0006a24000bf00203027f017e037f230041306b220124000240024020002802002202450d0020002902042103200141186a22004200370300200141106a22044200370300200141086a2205420037030020014200370300200141206a41bee8c700410d10c5012005200141206a41086a220629000037030020012001290020370300200141206a4188eec700411110c5012000200629000037030020042001290020370300200141206a20022003422088a710e4042001412020012802202200200128022810a70202402001280224450d002000102c0b2003a72200450d012000412c6c450d012002102c0c010b200141186a22004200370300200141106a22024200370300200141086a2204420037030020014200370300200141206a41bee8c700410d10c5012004200141206a41086a220529000037030020012001290020370300200141206a4188eec700411110c50120002005290000370300200220012900203703002001412010b4010b200141306a24000bc07a07077f017e067f017e1e7f047e557f230041f00d6b220324000240024002400240200141086a2802002204200241086a28020022054b0d0020050d0120004280808080c000370200200041086a42003702000c020b200341f8036a410510a505200041013602002000410c6a200341f8036a41086a280200360200200020032903f8033702040c010b200341f8036a41186a22064200370300200341f8036a41106a22074200370300200341f8036a41086a22084200370300200342003703f803200341e80a6a41968dc700410d10c5012008200341e80a6a41086a2209290000370300200320032900e80a3703f803200341e80a6a418893c700410a10c50120062009290000370300200720032900e80a370300200341c0086a200341f8036a10ff0420032802c008210620032902c408210a200341d00c6a41186a22084200370300200341d00c6a41106a22094200370300200341d00c6a41086a220b4200370300200342003703d00c200341900d6a41c1dcc700410610c501200b200341900d6a41086a290000370300200320032900900d3703d00c200341b00d6a41a2a4c600410a10c5012008200341b00d6a41086a290000370300200920032900b00d370300200341f8036a200341d00c6a412010c90120032d00f8032108200341f00c6a41186a220920034191046a290000370300200341f00c6a41106a220b20034189046a290000370300200341f00c6a41086a220c20034181046a290000370300200320032900f9033703f00c0240024020084101460d00200341186a41186a4200370300200341186a41106a4200370300200341186a41086a4200370300200342003703180c010b200341186a41186a2009290300370300200341186a41106a200b290300370300200341186a41086a200c290300370300200320032903f00c3703180b200341f00c6a41186a22084200370300200341f00c6a41106a220d4200370300200341f00c6a41086a22094200370300200342003703f00c200341900d6a41c1dcc700410610c5012009200341900d6a41086a220b290000370300200320032900900d3703f00c200341b00d6a4196a4c600410610c5012008200341b00d6a41086a220c290000370300200d20032900b00d370300200341106a200341f00c6a412010c6012003280214210e2003280210210f20084200370300200d420037030020094200370300200342003703f00c200341900d6a41ac95c400410d10c5012009200b290000370300200320032900900d3703f00c200341b00d6a41c695c400410c10c5012008200c290000370300200d20032900b00d370300200341f8036a200341f00c6a10f50220032802d0042109200341c0086a200341f8036a41d80010c9081a200341e80a6a200341f8036a41dc006a41d40010c9081a4100210b200e4100200f1b21080240024020094102470d00200341f8006a4200370300200341f0006a4200370300200341e8006a4200370300200341386a41086a4200370300200341386a41106a4200370300200341386a41186a4200370300200341386a41206a420037030020034200370360200342808080801037039801200342013703880120034281808080103703800120034200370338200341a0016a410041c80010cb081a0c010b200341386a200341c0086a41d80010c9081a200341386a41dc006a200341e80a6a41d40010c9081a2009210b0b2003200b36029001200320083602e80120032008417f6a3602ec01024002400240200441ffffffff00712004470d0020044104742208417f4c0d004104211002402008450d00200810322210450d020b200a420020061b21112006410120061b2112200341c0086a41186a2213200341186a41186a290300370300200341c0086a41106a2214200341186a41106a290300370300200341c0086a41086a2215200341186a41086a290300370300200320032903183703c008200341f8036a41186a22164200370300200341f8036a41106a22174200370300200341f8036a41086a22184200370300200342003703f803200341e80a6a41968dc700410d10c5012018200341e80a6a41086a2219290000370300200320032900e80a3703f803200341e80a6a41bc93c700411310c501200741086a2019290000370000200720032900e80a370000200341086a200341f8036a412010c60120034190026a410c6a2015290300370200200341a4026a2014290300370200200341ac026a2013290300370200200320032903c008370294022003200328020c410020032802081b360290022008410476211a0240024020040d004100211b41002107410021060c010b2001280200221c200441b4026c6a211d201c41cf006a211e2011422088a7211f200341f8036a4101722108200341f8036a41e4016a2120200341f8036a41a4016a2121200341fc046a2122200341f8036a41e4006a2123200341f8036a41c4006a2124200341f8036a41246a2125200341f8036a4104722126200341e0066a41046a2127200341c0086a41206a2128410021294100210741002109024002400240024002400240024003402007212a20032029221b36028008201c2205280200210e200341a0086a201f10b4060240024002400240024002400240200341186a200541046a222b460d00202b200341186a412010cc080d010b20052802002104200341f8036a41206a410041c40010cb08212c2016202b41186a222d2900003703002017202b41106a222e2900003703002018202b41086a222f290000370300200541dc006a290000210a200541d4006a2900002130200541cc006a2900002131202b29000021322005290044213320242005290064370000202441086a2234200541ec006a290000370000202441106a2235200541f4006a290000370000202441186a2236200541fc006a29000037000020252033370000202541086a22372031370000202541106a22382030370000202541186a2239200a370000200320323703f8032003200436029804200541a4016a223a200341f8036a41e400200541246a223b102d450d01200341e0066a200341386a200e20054190026a280200200541fc016a20052802940220052802e40120052802ec0120052802980220052802f00120052802f80110eb0520032802e0064107460d05200341e80a6a41106a200341e0066a41106a280200360200200341e80a6a41086a200341e0066a41086a290300370300410041002802dcd2482204410120041b3602dcd248200320032903e0063703e80a20040e020203040b200341f8036a410c10a505200041013602002000410c6a20034180046a280200360200200020032903f8033702040c0b0b200341f8036a411110a505200041013602002000410c6a20034180046a280200360200200020032903f8033702040c0a0b41004180a0c0003602d4d248410041c4b5c8003602d0d248410041023602dcd2480c010b034041002802dcd2484101460d000b0b410041053602d8d248024041000d00200341d4086a4122360200200341cc086a4102360200200341023602c4082003200e3602d00d2003200341e80a6a3602d0082003200341d00d6a3602c808200320034180086a3602c00841002802d4d248210441002802d0d248210541002802dcd2482107200341b8046a41ce03360200200341b0046a42ca80808010370300200341ac046a41c4f9c600360200200341a4046a4226370200200341a0046a41bc98c70036020020034198046a420337030020034188046a420337030020034180046a411c360200200341f8036a411c6a200341c0086a360200200341f498c70036028404200341c899c7003602fc03200341043602f803200541f8a3c000200741024622071b200341f8036a200441e0a3c00020071b2802101103000b41172104024002400240024002400240024020032802e80a0e0700010203040506000b410921040c050b410a21040c040b410b21040c030b411421040c020b411521040c010b411621040b200341f8036a200410a505200041013602002000410c6a20034180046a280200360200200020032903f8033702040c070b200241086a2802002204202a490d01200541b4026a211c201b41016a2129200541e4006a213c200541c4006a213d200541e4016a213e200441346c202a41346c22046b210f2002280200223f20046a214041002104202a2107024003400240200f2004470d00200341f8036a410510a505200041013602002000410c6a20034180046a280200360200200020032903f8033702040c090b204020046a220b28020021060240024002402009450d002006200c4d0d010b200320082900003703c0082003200841076a2800003600c7082006210c0c010b200341f8036a410810a505200320082900003703c0082003200841076a2800003600c70820032d00f80322064104470d020b200441346a210441012109200741016a2107200e200b41046a280200470d000b0240204020046a224141546a2d00004101470d00201e202a414c6c6a203f6b2004460d00204141556a203b412010cc08450d00200341f8036a410710a505200041013602002000410c6a20034180046a280200360200200020032903f8033702040c080b200341f8036a200e10b703024020032802f8030d0020004280808080c000370200200041086a42003702000c080b200341c0086a41386a200341f8036a41386a290300370300200341c0086a41306a200341f8036a41306a290300370300200341c0086a41286a200341f8036a41286a2903003703002028202c290300370300201320162903003703002014201729030037030020152018290300370300200320032903f8033703c008200341003602e806200342013703e00620032802c008220b2015280200200341e0066a10bb0120032802cc082104200341e0066a20032802e8064104102f20032802e00620032802e80622066a20043600002003200641046a3602e806200341e0066a201410b805412010322204450d0b200342203702ec0a200320043602e80a200341e80a6a41004120102f20032802e80a220620032802f00a22096a22042028290000370000200441086a202841086a290000370000200441106a202841106a290000370000200441186a202841186a2900003700002003200941206a22043602f00a200341e0066a20032802e8062004102f20032802e00620032802e80622096a2006200410c9081a2003200920046a22043602e806024020032802ec0a450d002006102c0b20032802dc082106200341e0066a20044104102f20032802e006220420032802e80622096a20063600002003200941046a22063602e806200341f00c6a20042006109a012016200341f00c6a41186a22402903003703002017200341f00c6a41106a222c2903003703002018200341f00c6a41086a220f290300370300200320032903f00c3703f803024020032802e406450d002004102c0b024002400240200341f8036a203d460d00200341f8036a203d412010cc080d010b024020032802c408450d00200b102c0b024020032802d4082204450d00200441246c450d0020032802d008102c0b200341900d6a41968dc700410d10c501200341b00d6a41a38dc700411310c5012003200e3602e006200341e80a6a200341e0066a410410c7012003202736028404200320193602fc032003200341e0066a360280042003200341e80a6a3602f803200341c0086a200341f8036a107e20032802c808220441206a2206417f4c0d0c0240024020060d00410121090c010b200610322209450d0e0b200341003602f00a200320063602ec0a200320093602e80a200341e80a6a4100411010c80120032802e80a20032802f00a22066a220920032900900d370000200941086a200341900d6a41086a22092900003700002003200641106a22063602f00a200341e80a6a2006411010c80120032802e80a20032802f00a22066a220b20032900b00d370000200b41086a200341b00d6a41086a220b2900003700002003200641106a222a3602f00a20032802c0082106200341e80a6a202a200410c80120032802e80a222a20032802f00a223f6a2006200410c9081a2003203f20046a22043602f00a024020032802c408450d002006102c0b200341f8036a202a200410f30420032802e005210420032802e805210620032802ec05213f20032802f4052142024020032802ec0a450d00202a102c0b2006204320041b2143203f204420041b21442042204520041b21452004450d0102402043450d002004102c0b2045450d082044450d082044102c0c080b200341e80a6a411210a505200041013602002000410c6a200341f00a6a280200360200200020032903e80a370204024020032802c408450d00200b102c0b20032802d4082204450d08200441246c450d0820032802d008102c0c080b200341900d6a41968dc700410d10c501200341b00d6a41bc92c700411e10c5012003200e3602e006200341e80a6a200341e0066a410410c7012003202736028404200320193602fc032003200341e0066a360280042003200341e80a6a3602f803200341c0086a200341f8036a107e20032802c808220441206a2206417f4c0d0a0240024020060d004101210e0c010b20061032220e450d0c0b200341003602f00a200320063602ec0a2003200e3602e80a200341e80a6a4100411010c80120032802e80a20032802f00a22066a220e20032900900d370000200e41086a20092900003700002003200641106a22063602f00a200341e80a6a2006411010c80120032802e80a20032802f00a22066a220e20032900b00d370000200e41086a200b2900003700002003200641106a220e3602f00a20032802c0082106200341e80a6a200e200410c80120032802e80a220e20032802f00a222a6a2006200410c9081a2003202a20046a22043602f00a024020032802c408450d002006102c0b200341f8036a200e200410ee040240024020032802f80322040d00410021040c010b20032802fc032146200328028004214720032802840421482003280288042149200328028c04214a200328029004214b200328029404214c200328029c04214d20032802a004214e0b024020032802ec0a450d00200e102c0b02402004450d0002402047450d002047410c6c21072004210503400240200541046a280200450d002005280200102c0b2005410c6a2105200741746a22070d000b0b02402046450d002046410c6c450d002004102c0b0240204a450d00204a4104742105204841046a210403400240200441046a280200450d002004280200102c0b200441106a2104200541706a22050d000b0b02402049450d002048450d00204941ffffffff0071450d002048102c0b0240204b450d00204c450d00204b102c0b204e450d07204d450d07204d102c0c070b2041417c6a280200210620404200370300202c4200370300200f4200370300200342003703f00c200341900d6a41bee8c700410d10c501200f2009290000370300200320032900900d3703f00c200341b00d6a41dcecc700410f10c501200d41086a200b290000370000200d20032900b00d370000200341f8036a200341f00c6a10e90420032802f8032204410420041b210e02400240200620032902fc03420020041b220a422088a72204490d004100213f200341003602c0080c010b200e2006410c6c6a223f280208220641ffffffff03712006470d0b2006410274222a417f4c0d0b203f280200214202400240202a0d004104213f0c010b202a1032223f450d0d0b200341003602c8082003203f3602c0082003202a4102763602c408200341c0086a4100200610950220032802c008223f20032802c808224f4102746a2042202a10c9081a2003204f20066a3602c8080b02402004450d002004410c6c2106200e210403400240200441046a28020041ffffffff0371450d002004280200102c0b2004410c6a2104200641746a22060d000b0b0240200aa72204450d002004410c6c450d00200e102c0b203f450d0320032802c408214f20052802ac0241037620032802c808222a470d04200541a4026a2242280200202a4b0d042041414c6a2150202f290000210a202e2900002130202d2900002131202b2900002132200341d00d6a41086a2204203d41086a290000370300200341d00d6a41106a2206203d41106a290000370300200341d00d6a41186a220e203d41186a2900003703002005280200212b20402031370300202c2030370300200f200a370300200341d00c6a41086a222d203b41086a290200370300200341d00c6a41106a222e203b41106a290200370300200341d00c6a41186a222f203b41186a2902003703002003203d2900003703d00d200320323703f00c2003203b2902003703d00c200341b00d6a41186a2241203c41186a290000370300200341b00d6a41106a2251203c41106a290000370300200b203c41086a290000370300200341900d6a41186a22522005419c016a290000370300200341900d6a41106a225320054194016a29000037030020092005418c016a290000370300200341e80a6a41386a2254203a41386a290000370300200341e80a6a41306a2255203a41306a290000370300200341e80a6a41286a2256203a41286a290000370300200341e80a6a41206a2257203a41206a290000370300200341e80a6a41186a223d203a41186a290000370300200341e80a6a41106a223b203a41106a2900003703002019203a41086a2900003703002003203c2900003703b00d20032005290084013703900d2003203a2900003703e80a200341c0086a203e109901202620032903f00c370200202641086a200f290300370200202641106a202c290300370200202641186a2040290300370200202520032903d00c3702002037202d2903003702002038202e2903003702002039202f290300370200202420032903d00d37020020342004290300370200203520062903003702002036200e2903003702002003202b3602f803202341186a2041290300370200202341106a2051290300370200202341086a200b290300370200202320032903b00d370200202241186a2052290300370200202241106a2053290300370200202241086a2009290300370200202220032903900d370200202141386a2054290300370200202141306a2055290300370200202141286a2056290300370200202141206a2057290300370200202141186a203d290300370200202141106a203b290300370200202141086a2019290300370200202120032903e80a370200202041186a2013290300370000202041106a2014290300370000202041086a2015290300370000202020032903c008370000200341e0066a200341f8036a10c704200528029c022240204228020041c1006c6a41c19ff0877c6c204041bfe08ff8036c6a213a203f417c6a212b20052802ac02210420052802a802210b410021064100210f0340202b20064102746a21090240024002400240034020044108490d01200341f8036a200b20041097072003280284042104200328028004210b200941046a2109200641016a210620032802f803410120032802fc03220e1b2d0000200e41077176410171450d000b200f203a470d01203a210f0b200f2042280200460d010c080b202a2006417f6a4b0d01200341c0086a41186a200341f8036a41186a290000370300200341c0086a41106a200341f8036a41106a290000370300200341c0086a41086a200341f8036a41086a290000370300200320032900f8033703c0080c070b0240200f410174202a4b0d00200341f8036a410f10a505200041013602002000410c6a20034180046a280200360200200020032903f8033702040c080b20032802a008410120032802a40822041b21402004410771210e2004410376210f20052802ac02210420052802a802210941002105024002400340202b20054102746a2106024002400240024002400240034020044108490d01200341f8036a2009200410970720032802840421042003280280042109200641046a2106200541016a210520032802f803410120032802fc03220b1b2d0000200b41077176410171450d000b202a2005417f6a4d0d052003200628020022063602e0062003200f3602e80a200f20064d0d02200e4100482006200e6a220b200648460d01200b4107712106200b410376213a0c040b2018200341a0086a41086a280200360200200320032903a0083703f80320502802002105201b201a470d07201b4101742204201b41016a2206200420064b1b22044104200441044b1b220441ffffffff00712004470d1441000d14200441047422044100480d14201b4104742058201b1b21580240024020104100201b1b22060d0020040d01410421100c080b024020580d0020040d01410421100c080b20062058200410352210450d160c070b2004103222100d060c150b200b4108490d01200b4107712106200b410375213a0c020b200341cc086a41023602002003418c046a4102360200200342023702fc03200341c4efc4003602f803200341023602c4082003200341c0086a360288042003200341e80a6a3602c8082003200341e0066a3602c008200341f8036a41d4efc4001046000b4100213a200b21060b2040203a6a220b200b2d00004101200641077174723a00000c010b0b419c99c700411a41b899c700105c000b2004410476211a0b2010201b4104746a22042005360200200420032903f8033702042004410c6a20182802003602000240204f450d00203f450d00204f41ffffffff0371450d00203f102c0b201e41b4026a211e41012109201d201c460d0a0c030b0240024020092802002209201f4f0d00201220094105746a2209290000210a200941186a2900002130200941106a29000021312019200941086a290000370300203b2031370300203d20303703002003200a3703c0082003200a3703e80a2013200341e0066a41186a2903003703002014200341e0066a41106a2903003703002015200341e0066a41086a290300370300200320032903e0063703c0080240024020402d00004101470d00200820032903c008370000200841086a2015290300370000200841106a2014290300370000200841186a2013290300370000200341013a00f803200320034190026a36029c04200341d00d6a200341f8036a10fd070c010b200820032903c008370000200841086a2015290300370000200841106a2014290300370000200841186a2013290300370000200341003a00f803200320034190026a36029c04200341d00d6a200341f8036a10fd070b204041016a20032802d00d220920032802d80d200341e80a6a102d0d0120032802d40d450d072009102c0c070b200341c0086a41186a200341f8036a41186a290000370300200341c0086a41106a200341f8036a41106a290000370300200341c0086a41086a200341f8036a41086a290000370300200320032900f8033703c0080c060b024020032802d40d450d002009102c0b204041c1006a2140200f41016a210f0c000b0b0b200020063a0004200020032903c008370005200041013602002000410c6a20032800c7083600000c050b202a2004418c99c7001058000b200341f8036a410e10a505200041013602002000410c6a20034180046a280200360200200020032903f8033702040c030b200341f8036a411010a505200041013602002000410c6a20034180046a280200360200200020032903f8033702040b204f450d01203f450d01204f41ffffffff0371450d01203f102c0c010b200341f8036a410610a505200041013602002000410c6a20034180046a280200360200200020032903f8033702040b200341003602a40820032802a0082104200341013602a00820032802a808450d042004102c0c040b410121060240200241086a28020022052007490d002029211b0c010b2007200541e498c7001058000b024020072005460d00200541346c200741346c22046b2107200228020020046a2104200341f8036a410172220841076a210902400340200428020021050240024002402006450d002005200c4d0d010b200320082900003703c008200320092800003600c7082005210c0c010b200341f8036a410810a505200320082900003703c008200320092800003600c70820032d00f80322054104470d020b200441346a2104410121062007414c6a22070d000c020b0b200020053a0004200020032903c008370005200041013602002000410c6a20032800c7083600000c030b200341003602f801200342043703f001200341f0016a4100201b10950220032802f80121070240201b450d00201b410474210620032802f00120074102746a210420102105034020042005280200360200200741016a2107200441046a2104200541106a2105200641706a22060d000b0b200320073602f8012010201b4104746a21592001280200225a200141086a28020041b4026c6a21372011422088a7215b200341c0086a41186a2158200341a0086a41046a2141200341d00c6a41086a212b200341c0086a41e8016a2138200341c0086a4188026a2118200341c0086a41e4016a2121200341c0086a41a4016a210f200341c0086a4184016a2116200341c0086a41e4006a2117200341c0086a41c4006a2129200341c0086a41246a213d200341c0086a410472212a200341c0086a418c026a211d200341c0086a41ec016a2128200341ec096a2140200341cc096a213b200341ac096a213c2003418c096a211f200341ec086a2120200341c0086a410c6a2122200341f8036a41a4016a210c200341f8036a4184016a2119200341f8036a41e4006a2114200341f8036a41c4006a2115200341f8036a41246a211c200341f8036a4104722113200341f8036a4190026a2146200341c0086a41f4016a215c200341f8036a41e4016a210e2001280204215d20102106205a210703400240024020072037470d0041002105203721070c010b200341c0086a200741e40110c9081a200341d00d6a41086a20074198026a280200360200200320074190026a2902003703d00d200741b0026a280200215e200741ac026a280200215f200741a4026a2802002160200741a0026a28020021612007418c026a280200216220074188026a280200216320074184026a280200216420074180026a2802002165200741fc016a2802002166200741f8016a2802002167200741f4016a2802002168200741f0016a2802002169200741ec016a280200216a200741e8016a280200216b20072802a802216c200728029c02216d20072802e4012105200741b4026a21070b200341f8036a200341c0086a41e40110c9081a200341e0066a41086a2208200341d00d6a41086a223a280200360200200320032903d00d3703e006024002402005450d00200341e80a6a200341f8036a41e40110c9081a200341b00d6a41086a22042008280200360200200320032903e0063703b00d0240024020062059470d00205921060c010b200641106a214a2006280204223e0d02204a21060b0240206a450d00206a410c6c21082005210403400240200441046a280200450d002004280200102c0b2004410c6a2104200841746a22080d000b0b0240206b450d00206b410c6c450d002005102c0b02402067450d0020674104742105206941046a210403400240200441046a280200450d002004280200102c0b200441106a2104200541706a22050d000b0b02402068450d002069450d00206841ffffffff0071450d002069102c0b02402066450d002065450d002066102c0b02402062450d002063450d002063102c0b02402061450d00206d450d00206141c1006c450d00206d102c0b205e450d00206c450d00206c102c0b024020372007460d0003400240200741ec016a2802002205450d0020072802e40121042005410c6c210503400240200441046a280200450d002004280200102c0b2004410c6a2104200541746a22050d000b0b0240200741e8016a2802002204450d002004410c6c450d0020072802e401102c0b0240200741f8016a2802002204450d0020044104742105200741f0016a28020041046a210403400240200441046a280200450d002004280200102c0b200441106a2104200541706a22050d000b0b0240200741f4016a28020041ffffffff0071450d0020072802f001102c0b0240200741fc016a2802002204450d0020074180026a280200450d002004102c0b02402007418c026a280200450d0020074188026a280200102c0b0240200741a0026a2802002204450d00200441c1006c450d00200728029c02102c0b200741b4026a2104200741ac026a410036020020072802a8022105200741013602a8020240200741b0026a280200450d002005102c0b2004210720042037470d000b0b0240205d450d00205d41b4026c450d00205a102c0b024020592006460d002010201b4104746a21070340200641086a4100360200200641046a2204280200210520044101360200200641106a210402402006410c6a280200450d002005102c0b2004210620072004470d000b0b0240201a450d00201a41ffffffff0071450d002010102c0b200020032903f001370204200041003602002000410c6a200341f8016a28020036020002402011a72204450d00200441ffffff3f71450d002012102c0b20022802042204450d06200441346c450d062002280200102c0c060b200641086a290200210a2006280200213920034190026a200341e80a6a41e40110c9081a20034180026a41086a22062004280200360200200320032903b00d37038002200341f8036a20034190026a41e40110c9081a2046200329038002370200204641086a200628020036020020032062360284062003206336028006200320643602fc05200320653602f805200320663602f405200320673602f005200320683602ec05200320693602e8052003206a3602e4052003206b3602e005200320053602dc052003205e3602a8062003205f3602a4062003206c3602a0062003206036029c0620032061360298062003206d3602940620032802f803213f200341b0066a205b10b406200341f00c6a41086a2223201341086a2247290200370300200341f00c6a41106a2226201341106a2248290200370300200341f00c6a41186a2244201341186a224b290200370300202b201c41086a2249290200370300200341d00c6a41106a2245201c41106a224d290200370300200341d00c6a41186a2243201c41186a224e290200370300200320132902003703f00c2003201c2902003703d00c20032802f803214c200341d00d6a41186a221e201541186a2242290200370300200341d00d6a41106a2227201541106a224f290200370300203a201541086a22512902003703002004201441086a2252290200370300200341b00d6a41106a222c201441106a2253290200370300200341b00d6a41186a222d201441186a2254290200370300200341900d6a41086a2206201941086a2255290200370300200341900d6a41106a222e201941106a2256290200370300200341900d6a41186a222f201941186a2257290200370300200320152902003703d00d200320142902003703b00d200320192902003703900d200341e80a6a41386a2234200c41386a2250290200370300200341e80a6a41306a2209200c41306a226e290200370300200341e80a6a41286a220b200c41286a226f290200370300200341e80a6a41206a2201200c41206a2270290200370300200341e80a6a41186a220d200c41186a2271290200370300200341e80a6a41106a2224200c41106a2272290200370300200341e80a6a41086a2225200c41086a22732902003703002003200c2902003703e80a200341c0066a200e109901200341a0086a41186a22742044290300370300200341a0086a41106a22752026290300370300200341a0086a41086a2276202329030037030020034180086a41086a2277202b29030037030020034180086a41106a2278204529030037030020034180086a41186a22792043290300370300200341e0076a41086a227a203a290300370300200341e0076a41106a227b2027290300370300200341e0076a41186a227c201e290300370300200320032903f00c3703a008200320032903d00c37038008200320032903d00d3703e007200341c0076a41186a227d202d290300370300200341c0076a41106a227e202c290300370300200341c0076a41086a227f2004290300370300200341a0076a41086a2280012006290300370300200341a0076a41106a228101202e290300370300200341a0076a41186a228201202f29030037030020082025290300370300200341e0066a41106a22352024290300370300200341e0066a41186a2236200d290300370300200341e0066a41206a2283012001290300370300200341e0066a41286a228401200b290300370300200341e0066a41306a2285012009290300370300200341e0066a41386a2286012034290300370300200320032903b00d3703c007200320032903900d3703a007200320032903e80a3703e0062003280288062205417f4c0d012003280280062187010240024020050d0041012188010c010b20051032228801450d030b200341003602f00a200320053602ec0a20032088013602e80a200341e80a6a4100200510c80120032802e80a20032802f00a2288016a208701200510c9081a200320880120056a3602f00a202220032903a008370200202241086a2076290300370200202241106a2075290300370200202241186a20742903003702002020200329038008370200202041086a2077290300370200202041106a2078290300370200202041186a20792903003702002003204c3602c808200342083703c008201f41186a207c290300370200201f41106a207b290300370200201f41086a207a290300370200201f20032903e007370200203c20032903c007370200203c41086a207f290300370200203c41106a207e290300370200203c41186a207d290300370200203b20032903a007370200203b41086a208001290300370200203b41106a208101290300370200203b41186a208201290300370200204041386a208601290300370200204041306a208501290300370200204041286a208401290300370200204041206a208301290300370200204041186a2036290300370200204041106a2035290300370200204041086a2008290300370200204020032903e006370200202841186a200341c0066a41186a290200370200202841106a200341c0066a41106a290200370200202841086a200341c0066a41086a290200370200202820032902c006370200201d41086a20032802f00a360200201d20032902e80a370200200341c0086a10c80220232047290200370300202620482902003703002044204b290200370300202b20492902003703002045204d2902003703002043204e290200370300200320132902003703f00c2003201c2902003703d00c20032802f8032105201e20422902003703002027204f290200370300203a205129020037030020042052290200370300202c2053290200370300202d205429020037030020062055290200370300202e2056290200370300202f2057290200370300200320152902003703d00d200320142902003703b00d200320192902003703900d203420502902003703002009206e290200370300200b206f29020037030020012070290200370300200d207129020037030020242072290200370300202520732902003703002003200c2902003703e80a200341e0066a200e109901202a20032903f00c370200202a41086a2023290300370200202a41106a2026290300370200202a41186a2044290300370200203d20032903d00c370200203d41086a202b290300370200203d41106a2045290300370200203d41186a2043290300370200202920032903d00d370200202941086a203a290300370200202941106a2027290300370200202941186a201e290300370200200320053602c008201741186a202d290300370200201741106a202c290300370200201741086a2004290300370200201720032903b00d370200201620032903900d370200201641086a2006290300370200201641106a202e290300370200201641186a202f290300370200200f20032903e80a370200200f41086a2025290300370200200f41106a2024290300370200200f41186a200d290300370200200f41206a2001290300370200200f41286a200b290300370200200f41306a2009290300370200200f41386a2034290300370200202141186a2036290300370000202141106a2035290300370000202141086a2008290300370000202120032903e006370000200341e0066a200341c0086a10c7042009200e41306a290200370300200b200e41286a2902003703002001200e41206a290200370300200d200e41186a2902003703002024200e41106a2902003703002025200e41086a2902003703002003200e2902003703e80a200320393602c00820032802ec01213a20032802e8012123201820032903e006370000201841086a2008290300370000201841106a2035290300370000201841186a2036290300370000202a200341f8036a41e40110c9082144203841086a200341b0066a41086a280200360200203820032903b006370200200320233602c40a2003203a3602c00a2003200a3703b80a2003203e3602b40a200341900d6a41968dc700410d10c501200341b00d6a41a38dc700411310c5012003203f3602a008200341d00c6a200341a0086a410410c701200320413602dc0d2003202b3602d40d2003200341a0086a3602d80d2003200341d00c6a3602d00d200341f00c6a200341d00d6a107e20032802f80c220541206a2208417f4c0d010240024020080d00410121260c010b200810322226450d030b200341003602d80c200320083602d40c200320263602d00c200341d00c6a4100411010c80120032802d00c20032802d80c22086a222620032900900d370000202641086a20062900003700002003200841106a22083602d80c200341d00c6a2008411010c80120032802d00c20032802d80c22086a222620032900b00d370000202641086a20042900003700002003200841106a22263602d80c20032802f00c2108200341d00c6a2026200510c80120032802d00c222620032802d80c22456a2008200510c9081a2003204520056a22053602d80c024020032802f40c450d002008102c0b200341003602d80d200342013703d00d200341d00d6a41004104102f20032802d00d20032802d80d6a2039360000200320032802d80d41046a3602d80d200341d00d6a201810e405200341d00d6a204410c804200341d00d6a203810e305200341d00d6a205c10e305200341d00d6a20032802d80d4104102f20032802d00d20032802d80d6a203a360000200320032802d80d41046a22083602d80d200341d00d6a20084104102f20032802d00d20032802d80d6a2023360000200320032802d80d41046a22083602d80d2026200520032802d00d200810a702024020032802d40d450d0020032802d00d102c0b024020032802d40c450d002026102c0b20032802a80a2105200341013602a80a200341003602ac0a024020032802b00a450d002005102c0b200342013702b40a0240200a428080808010540d00203e102c0b200341c0086a41306a2009290300370300200341c0086a41286a200b290300370300200341c0086a41206a20012903003703002058200d290300370300200341c0086a41106a2024290300370300200341c0086a41086a2025290300370300200320032903e80a3703c008200341900d6a41968dc700410d10c501200341b00d6a41bc92c700411e10c5012003203f3602a008200341d00c6a200341a0086a410410c701200320413602dc0d2003202b3602d40d2003200341a0086a3602d80d2003200341d00c6a3602d00d200341f00c6a200341d00d6a107e20032802f80c220541206a2208417f4c0d010240024020080d00410121090c010b200810322209450d030b200341003602d80c200320083602d40c200320093602d00c200341d00c6a4100411010c80120032802d00c20032802d80c22086a220920032900900d370000200941086a20062900003700002003200841106a22063602d80c200341d00c6a2006411010c80120032802d00c20032802d80c22066a220820032900b00d370000200841086a20042900003700002003200641106a22063602d80c20032802f00c2104200341d00c6a2006200510c80120032802d00c223a20032802d80c22066a2004200510c9081a2003200620056a22233602d80c024020032802f40c450d002004102c0b200341003602d80d200342013703d00d20032802c0082125200341d00d6a20032802c8082201108f012001410c6c210502402001450d00202520056a21062025210403402004280200200441086a280200200341d00d6a10bb012004410c6a22042006470d000b0b20032802cc082124200341d00d6a20032802d408220d108f01200d41047421060240200d450d00202420066a210b20242104034020042802002108200341d00d6a20032802d80d4104102f20032802d00d20032802d80d22096a20083600002003200941046a3602d80d200441046a2802002004410c6a280200200341d00d6a10bb01200441106a2204200b470d000b0b200341d00d6a205810b60520032802e408220b20032802ec08200341d00d6a10bb0120032802f0082104200341d00d6a20032802d80d4104102f20032802d00d20032802d80d22086a20043600002003200841046a22043602d80d20032802f4082108200341d00d6a20044104102f20032802d00d220420032802d80d22096a20083600002003200941046a22083602d80d203a20232004200810a702024020032802d40d450d002004102c0b024020032802d40c450d00203a102c0b02402001450d002025210403400240200441046a280200450d002004280200102c0b2004410c6a2104200541746a22050d000b0b024020032802c4082204450d002004410c6c450d002025102c0b0240200d450d00202441046a210403400240200441046a280200450d002004280200102c0b200441106a2104200641706a22060d000b0b024020032802d00841ffffffff0071450d002024102c0b024020032802d8082204450d0020032802dc08450d002004102c0b024020032802e808450d00200b102c0b02402003280298062204450d00200441c1006c450d00200328029406102c0b200341003602a40620032802a0062104200341013602a006024020032802a806450d002004102c0b204a21060c000b0b103b000b1039000b0240201b450d00201b41047421052010410c6a210403402004417c6a4100360200200441786a220728020021062007410136020002402004280200450d002006102c0b200441106a2104200541706a22050d000b0b0240201a450d002010450d00201a41ffffffff0071450d002010102c0b2011a72204450d00200441ffffff3f71450d002012102c0b024020022802042204450d00200441346c450d002002280200102c0b200110c2020b200341f00d6a24000bfb0301037f02400240200241346c41046a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b2000200336020420002004360200200041086a2203410036020020002002108f0102402002450d002001200241346c6a210520032802002102034020012802002104200020024104102f2000280200200328020022026a20043600002003200241046a2202360200200141046a2802002104200020024104102f2000280200200328020022026a20043600002003200241046a220236020002400240200141086a2d00004101460d00200020024101102f2000280200200328020022026a41003a0000200241016a21020c010b200020024101102f2000280200200328020022026a41013a00002003200241016a2202360200200020024120102f2000280200200328020022046a2202200141096a290000370000200241086a200141116a290000370000200241106a200141196a290000370000200241186a200141216a2900003700002003200441206a22023602002001412c6a2802002104200020024104102f2000280200200328020022026a2004360000200241046a21020b20032002360200200141306a2802002104200020024104102f2000280200200328020022026a20043600002003200241046a2202360200200141346a22012005470d000b0b0f0b103b000b1039000bd34907027f017e087f1d7e287f017e017f23002202210320024180126b41607122022400420021040240024002400240024020002802000e050401020300040b200241f00c6a200041086a10e706200241c00a6a200041c0006a10e706200241a00f6a200041f8006a10e70620024198086a200041b0016a10e706420421040c030b200241f00c6a200041086a10e706420121040c020b200241f00c6a200041086a10e706200241c00a6a200041c0006a10e706420221040c010b200241f00c6a200041086a10e706200241c00a6a200041c0006a10e706200241a00f6a200041f8006a10e706420321040b200241c0006a41c0006a20022903c00a370300200241c0006a41106a200241f00c6a41086a290300370300200241c0006a41186a200241f00c6a41106a290300370300200241c0006a41206a200241f00c6a41186a2205290300370300200241c0006a41286a200241f00c6a41206a2206290300370300200241c0006a41306a200241f00c6a41286a2207290300370300200241c0006a41386a200241f00c6a41306a2208290300370300200241c0006a41c8006a200241c00a6a41086a290300370300200241c0006a41d0006a200241c00a6a41106a290300370300200241c0006a41d8006a200241c00a6a41186a290300370300200241c0006a41e0006a200241c00a6a41206a290300370300200241c0006a41e8006a200241c00a6a41286a290300370300200241c0006a41f0006a200241c00a6a41306a29030037030020022004370340200220022903f00c370348200241c0006a41a8016a200241a00f6a41306a290300370300200241c0006a41a0016a200241a00f6a41286a290300370300200241c0006a4198016a200241a00f6a41206a290300370300200241c0006a4190016a200241a00f6a41186a290300370300200241c0006a4188016a200241a00f6a41106a290300370300200241c0006a4180016a200241a00f6a41086a290300370300200241c0006a41f8006a20022903a00f370300200241c0006a41e0016a20024198086a41306a290300370300200241c0006a41d8016a20024198086a41286a290300370300200241c0006a41d0016a20024198086a41206a290300370300200241c0006a41c8016a20024198086a41186a290300370300200241c0006a41c0016a20024198086a41106a290300370300200241c0006a41b8016a20024198086a41086a290300370300200241c0006a41b0016a200229039808370300200241c0006a41e8016a200141f00110c9082109024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d00a8020e0702030406050001060b200241c0006a41f0016a2903004201520d0541012105200241b8026a2d00004101470d05200241ac026a2802002101200241cc0a6a200241bc026a280200360200200241013a00c80a200242013703c00a200220013602f40c200241063a00f00c200241f80c6a200241c0006a41e80110c9081a200241c00a6a200241f00c6a10e806410021064101210a4101210b0c1c0b200241ac026a280200210c20024198046a200241c0006a41e80110c9081a200241f00c6a200241c0006a41f0016a41e80110c9081a20022903f00c210d4200210e200242003703f00c200241f00c6a41386a290300210f200829030021102007290300211120062903002112200241f00c6a41d8006a2903002113200241f00c6a41d0006a2903002114200241f00c6a41c8006a2903002115200241f00c6a41c0006a2903002116200241f00c6a41f8006a2903002117200241f00c6a41f0006a2903002118200241f00c6a41e8006a2903002119200241f00c6a41e0006a290300211a200241f00c6a4198016a290300211b200241f00c6a4190016a290300211c200241f00c6a4188016a290300211d200241f00c6a4180016a290300211e200241f00c6a41b8016a290300211f200241f00c6a41b0016a2903002120200241f00c6a41a8016a2903002121200241f00c6a41a0016a2903002122200241f00c6a41d8016a2903002123200241f00c6a41d0016a2903002124200241f00c6a41c8016a2903002125200241f00c6a41c0016a2903002126200241f00c6a41e0016a290300212720022903f80c210420022903800d21282002200529030022293703b80f200220283703b00f200220043703a80f2002200d3703a00f2004a7210141092105024002400240024002400240200da70e050501020300050b2002419a086a20022d00ab0f3a0000200220022f00a90f3b0198084203210e0c030b2002419a086a20022d00ab0f3a0000200220022f00a90f3b0198080c020b2002419a086a20022d00ab0f3a0000200220022f00a90f3b0198084201210e0c010b2002419a086a20022d00ab0f3a0000200220022f00a90f3b0198084202210e0b200121050b200241a00f6a41306a2206200241c00a6a41306a222a290300370300200241a00f6a41286a2207200241c00a6a41286a222b290300370300200241a00f6a41206a2208200241c00a6a41206a222c290300370300200241a00f6a41186a220a200241c00a6a41186a222d290300370300200241a00f6a41106a220b200241c00a6a41106a222e290300370300200241a00f6a41086a222f200241c00a6a41086a223029030037030020024180066a41026a223120024198086a41026a22322d00003a0000200220022f0198083b018006200220022903c00a3703a00f200241f00c6a10a201200241900e6a22332023370300200241880e6a22342024370300200241800e6a22352025370300200241f80d6a22362026370300200241f00d6a2237201f370300200241e80d6a22382020370300200241e00d6a22392021370300200241d80d6a223a2022370300200241d00d6a223b201b370300200241c80d6a223c201c370300200241c00d6a223d201d370300200241b80d6a223e201e370300200241a80d6a223f2018370300200241f00c6a41306a22402019370300200241f00c6a41286a2241201a370300200241f00c6a41206a22422013370300200241f00c6a41186a22432014370300200241f00c6a41106a22442015370300200241980e6a22452027370300200241a00e6a220120022903a00f370300200241a80e6a2246202f290300370300200241b00e6a200b290300370300200241b80e6a2247200a290300370300200241c00e6a22482008290300370300200241c80e6a22492007290300370300200241d00e6a2006290300370300200220163703f80c200220173703b00d2002200e3703f00c200541ff01714109460d172028422088a7214a2004422088a7214b2028a7214c200241a00f6a410972214d200241c00a6a410172214e0340200241d8116a41026a20312d0000224f3a0000200220022f01800622503b01d811200241a00f6a41026a2251204f3a0000200220503b01a00f0240200541ff01710d00410521050c1a0b204e20022f01a00f3b0000202c2011370300202b2010370300204e41026a20512d00003a0000202a200f370300200220123703d80a200220053a00c00a200220293703d00a2002204a3602cc0a2002204c3602c80a2002204b3602c40a024020024198046a200241c00a6a10e906450d00410a21050c1a0b20022903f00c210d4200210e200242003703f00c203f290300210f2040290300211020412903002111203c2903002113203d2903002114203e29030021152038290300211720392903002118203a2903002119203429030021162035290300211b2036290300211c2046290300211f20012903002120204529030021212049290300211d2048290300211e2047290300212320022903900d211220022903b00d212420022903d00d211a20022903f00d212520022903900e212220022903b00e212620022903d00e212720022903f80c210420022903800d21282002204329030022523703b80f200220283703b00f200220043703a80f2002200d3703a00f2028422088a7214f2004422088a721502028a721512004a7215341092105024002400240024002400240200da70e050501020300050b2032204d41026a2d00003a00002002204d2f00003b0198084203210e20522129204f214a2051214c2050214b0c030b2032204d41026a2d00003a00002002204d2f00003b01980820522129204f214a2051214c2050214b0c020b2032204d41026a2d00003a00002002204d2f00003b0198084201210e20522129204f214a2051214c2050214b0c010b2032204d41026a2d00003a00002002204d2f00003b0198084202210e20522129204f214a2051214c2050214b0b205321050b2006202a2903003703002007202b2903003703002008202c290300370300200a202d290300370300200b202e290300370300202f2030290300370300203120322d00003a0000200220022f0198083b018006200220022903c00a3703a00f200241f00c6a10a2012033201d3703002034201e370300203520233703002037201f37030020392021370300203b2016370300203c201b370300203d201c370300203f201837030020402019370300204220133703002043201437030020442015370300200120022903a00f370300200141086a202f290300370300200141106a200b290300370300200141186a200a290300370300200141206a2008290300370300200141286a2007290300370300200141306a2006290300370300200220263703f80d200220203703e80d200220223703d80d200220253703b80d2002201a3703980d200220243703f80c200220273703980e200220173703b00d2002200e3703f00c200541ff01714109470d000c180b0b20024198046a200241c0006a41e80110c9081a200241c0026a2802002107200241bc026a2802002108200241b8026a280200212c200241c0006a41f0016a280200212b200241ac026a280200212a200241b4026a2802002105200241ec116a4100360200200242003703e011200241003602d811202a20054198026c6a210a202a21012005450d14200241d8116a410c6a2134200241c60a6a2131200241f00c6a410272210b20024198086a410472212f202a21010240034020012802002105200241f00c6a200141046a41940210c9081a02402005410c470d0020014198026a21010c170b20024180066a200241f00c6a41940210c9081a2002200536029808202f20024180066a41940210c9081a200241f00c6a20024198086a20024198046a10ea0620022d00f10c210520022d00f00c2106200241c00a6a200b419e0210c9081a20064101460d01200241a00f6a203141980210c9081a200241f00c6a200241a00f6a41980210c9081a200241d8116a200241f00c6a10eb0620024198086a10ec0620014198026a2201200a470d000b200a21010c150b20024198086a10ec0620014198026a2201200a20016b4198026d10c3020240202b450d00202b4198026c450d00202a102c0b200241c00a6a41086a2201200241d8116a41086a280200360200200220022903d8113703c00a200241f00c6a200241c00a6a10ed06200241f00c6a10ee062001203441086a280200360200200220342902003703c00a200241f00c6a200241c00a6a10ef06200241f00c6a10f006202c200710c40202402008450d00202c450d0020084188026c450d00202c102c0b20024198046a10a2014100210b4101210a0c190b200241f00c6a200241c0006a41e80110c9081a200241c0026a2802002107200241bc026a2802002108200241b8026a2802002101200241c0006a41f0016a2802002106200241ac026a2802002105200241b4026a280200220a450d0f2001200710c40202402008450d002001450d0020084188026c450d002001102c0b2005200a10c30202402006450d002005450d0020064198026c450d002005102c0b200241f00c6a10a201410021014101210a410621054101210b4101210641012107410121080c1c0b200241f00c6a200241c0006a41e80110c9081a200241c0026a2802002107200241bc026a2802002108200241b8026a2802002105200241b4026a2802002101200241c0006a41f0016a280200210a200241ac026a2802002106200241003602a80f200242013703a00f2002412436029c082002200241f00c6a360298082002200241a00f6a36028006200241d40a6a4101360200200242013702c40a200241c0cfc4003602c00a200220024198086a3602d00a20024180066a41dcb7c000200241c00a6a103e1a20023502a80f42208620023502a00f841000024020022802a40f450d0020022802a00f102c0b02402001450d002005200710c40202402008450d002005450d0020084188026c450d002005102c0b2006200110c3020240200a450d002006450d00200a4198026c450d002006102c0b200241f00c6a10a201410021084101210a410721054101210b41012106410121070c1b0b4100212f200241003602c80a2002200a3602c40a200220063602c00a200241186a200241c00a6a10f206200241386a2007360200200241346a200836020020022005360230200241f00c6a10a201200241306a21014101210b0c0f0b20024180066a200241c0006a41e80110c9081a200241c0006a41f0016a2802002106200241a9026a2d00002105200241ac026a28020021012002200241b4026a28020036029c042002200136029804200241a00f6a20024198046a10f30620022802a00f4119460d01200241f00c6a41066a200241a00f6a41a80210c9081a200241c00a6a200241f00c6a41ae0210c9081a20024198086a200241c00a6a41066a41a80210c9081a200241c00a6a20024180066a41e80110c9081a200241f00c6a200241c00a6a200510a703024020022802f00c4101470d00200241c00a6a200241f00c6a41086a41e80110c9081a200241c00a6a10a201410c21052002280298080e1803041010100506100708091010100a101010101010100b0c0d0b200241a00f6a410a6a200241fc0c6a290200370100200241a00f6a41126a200241840d6a290200370100200241a00f6a411a6a2002418c0d6a290200370100200241a00f6a41226a200241940d6a290200370100200220022902f40c3701a20f20024198046a41086a200241a00f6a41086a220529010037030020024198046a41106a200241a00f6a41106a220729010037030020024198046a41186a200241a00f6a41186a220829010037030020024198046a41206a200241a00f6a41206a220a29010037030020024198046a41286a200241a00f6a41286a2f01003b0100200220022901a00f37039804200241d8116a41206a220b20024198046a41226a290100370300200241d8116a41186a222f20024198046a411a6a290100370300200241d8116a41106a223120024198046a41126a290100370300200241d8116a41086a222a20024198046a410a6a2901003703002002200229019a043703d811200241f00c6a20024198086a41a80210c9081a200a200b2903003703002008202f290300370300200720312903003703002005202a290300370300200220022903d8113703a00f200241c00a6a200241f00c6a200241a00f6a10bf02410d21050c0f0b200241c0006a10a2014101210a410321054101210b0c150b02402006450d002001450d002001102c0b20024180066a10a201410b21050c0e0b02400240024002400240024020024198086a41086a280200417e6a0e080012010212030405120b200241a8086a280200450d11410c210520024198086a410c6a280200102c0c110b200241a8086a280200450d10410c210520024198086a410c6a280200102c0c100b200241a8086a280200450d0f410c210520024198086a410c6a280200102c0c0f0b410c210520024198086a410c6a10c1020c0e0b410c21050240200241ac086a2802002208450d0020024198086a410c6a28020021072008410c6c210803400240200741046a280200450d002007280200102c0b2007410c6a2107200841746a22080d000b0b200241a8086a2802002207450d0d2007410c6c450d0d20022802a408102c0c0d0b200241a8086a280200450d0c410c210520024198086a410c6a280200102c0c0c0b0240024020024198086a41086a2802000e020d00010b200241c4086a102b200241b4096a102b0240200241b0086a2802002207450d00200241a8086a28020021052007410c6c210703400240200541046a280200450d002005280200102c0b2005410c6a2105200741746a22070d000b0b410c2105200241ac086a2802002207450d0c2007410c6c450d0c20022802a808102c0c0c0b200241c4086a102b200241b4096a102b0240200241b0086a2802002207450d00200241a8086a28020021052007410c6c210703400240200541046a280200450d002005280200102c0b2005410c6a2105200741746a22070d000b0b410c2105200241ac086a2802002207450d0b2007410c6c450d0b20022802a808102c0c0b0b410c2105024020024198086a410c6a2802002207450d00200741f0006c2108200228029c0841046a210703402007102b200741f0006a2107200841907f6a22080d000b0b200241a0086a2802002207450d0a200741f0006c450d0a200228029c08102c0c0a0b0240024002400240024020024198086a41086a2d00000e180e0e0e0e0e0e000e0e0e0e0e0e0e0e010e0e020e0e0e0e03040b200241a8086a28020041ffffff3f71450d0d410c210520024198086a410c6a280200102c0c0d0b200241a8086a28020041ffffff3f71450d0c410c210520024198086a410c6a280200102c0c0c0b200241ac086a28020041ffffffff0371450d0b200241a8086a280200102c0c0b0b0240200241a8086a28020041808080807872418080808078460d00200241a4086a280200102c0b200241b0086a10e9010c0a0b0240200241a8086a28020041808080807872418080808078460d00200241a4086a280200102c0b200241b0086a10e9010c090b200228029c082207450d08200241a0086a280200450d082007102c0c080b0240024020024198086a41086a280200417f6a0e020001090b0240200241b0086a2802002207450d00200241a8086a28020021052007410c6c210703400240200541046a280200450d002005280200102c0b2005410c6a2105200741746a22070d000b0b410c2105200241ac086a2802002207450d082007410c6c450d0820022802a808102c0c080b0240200241b0086a2802002207450d00200241a8086a28020021052007410c6c210703400240200541046a280200450d002005280200102c0b2005410c6a2105200741746a22070d000b0b410c2105200241ac086a2802002207450d072007410c6c450d0720022802a808102c0c070b0240200241a4086a280200450d00200241a0086a280200102c0b0240200241b4086a2802002207450d00200241ac086a28020021052007410c6c210703400240200541046a280200450d002005280200102c0b2005410c6a2105200741746a22070d000b0b410c2105200241b0086a2802002207450d062007410c6c450d0620022802ac08102c0c060b0240200241a4086a2802002207450d00200228029c082205200741d0006c6a21080340200541046a410036020020052802002107200541013602000240200541086a280200450d002007102c0b200541d0006a22052008470d000b0b0240200241a0086a2802002205450d00200541d0006c450d00200228029c08102c0b200241a8086a10c202410c21050c050b200228029c084101470d040240200241a8086a280200450d00200241a4086a280200102c0b200241b4086a280200450d04200241b0086a280200102c0c040b0240024020024198086a41086a280200417f6a0e03000501050b0240200241ac086a280200450d00200241a8086a280200102c0b200241b8086a280200450d04200241b4086a280200102c0c040b200241a8086a10f7020c030b02400240024020024198086a41086a2d00000e0405000105020b410c210520024198086a410c6a22072802001083022007280200102c0c040b410c210520024198086a410c6a22072802001083022007280200102c0c030b200241c4086a22072802001083022007280200102c0c020b4100210b200241003602c80a200220063602c40a200220053602c00a200241186a200241c00a6a10f206200241386a2007360200200241346a200836020020022001360230200241f00c6a10a201200241306a21014101212f0b410121050c030b2006450d002001450d002001102c0b410021074101210a4101210b410121060c070b2001200a20016b4198026d10c3020240202b450d00202b4198026c450d00202a102c0b200241386a2007360200200241346a2008360200200241186a41106a200241d8116a41106a290300370300200241186a41086a200241d8116a41086a290300370300200220022903d8113703182002202c36023020024198046a10a201200241306a2101410021054101210b4101212f0b200241c00a6a41106a200241186a41106a290300370300200241c00a6a41086a200241186a41086a290300370300200220022903183703c00a2001280200210a0240024002400240024002400240024020022d00a8020e0701020306040005060b200241b0026a10a201200241ac026a220128020010c5022001280200102c0c060b2005450d05200241ac026a280200200241b4026a28020010c3020240200241b0026a2802002201450d0020014198026c450d0020022802ac02102c0b200241b8026a280200200241c0026a28020010c402200241bc026a2802002201450d0520014188026c450d0520022802b802102c0c050b200b450d04200241ac026a280200200241b4026a28020010c3020240200241b0026a2802002201450d0020014198026c450d0020022802ac02102c0b200241b8026a280200200241c0026a28020010c402200241bc026a2802002201450d0420014188026c450d0420022802b802102c0c040b202f450d03200241ac026a280200200241b4026a28020010c3020240200241b0026a2802002201450d0020014198026c450d0020022802ac02102c0b200241b8026a280200200241c0026a28020010c402200241bc026a2802002201450d0320014188026c450d0320022802b802102c0c030b200241b0026a280200450d02200241ac026a280200102c0c020b200241b0026a10a201200241ac026a220128020010c5022001280200102c0c010b200910f7020b200a20074188026c6a2106200a210102402007450d00200241c0006a4104722107200a21010240034020012802002105200241c0006a200141046a41840210c9081a024020054107470d0020014188026a21010c030b200241f00c6a200241c0006a41840210c9081a200220053602402007200241f00c6a41840210c9081a200241c00a6a200241c0006a10f406220541ff0171410d470d0120014188026a22012006470d000b200621010c010b20014188026a2201200620016b4188026d10c40202402008450d0020084188026c450d00200a102c0b200241f00c6a41086a2201200241c00a6a41086a280200360200200220022903c00a3703f00c200241c0006a200241f00c6a10ed06200241c0006a10ee062001200241d40a6a280200360200200220022902cc0a3703f00c200241c0006a200241f00c6a10ef06200241c0006a10f0060c090b2001200620016b4188026d10c40202402008450d0020084188026c450d00200a102c0b200241f00c6a41086a2201200241c00a6a41086a280200360200200220022903c00a3703f00c200241c0006a200241f00c6a10ed06200241c0006a10ee062001200241d40a6a280200360200200220022902cc0a3703f00c200241c0006a200241f00c6a10ef06200241c0006a10f006200010a20120032400410d0f0b200241f00c6a10f50620024180066a20024198046a41e80110c9081a200c2d00002101200241c00a6a200c41016a41ef0110c9081a02402001410a460d00200241a00f6a200241c00a6a41ef0110c9081a20024198086a200241a00f6a41ef0110c9081a200220013a00f00c200241f00c6a41017220024198086a41ef0110c9081a20024180066a200241f00c6a10a80641ff017121050c020b20024198086a200241a00f6a41ef0110c9081a20024180066a10a201410221050c010b200241f00c6a10f50620024198046a10a201200c10f7020b200c102c4101210b4100210a0b410121060b410121070b410121080b410121010b024002400240024002400240024020022d00a8020e0700010206030405060b200b450d06200241ac026a280200200241b4026a28020010c3020240200241b0026a2802002201450d0020014198026c450d0020022802ac02102c0b200241b8026a280200200241c0026a28020010c402200241bc026a2802002201450d0620014188026c450d0620022802b802102c0c060b2001450d05200241ac026a280200200241b4026a28020010c3020240200241b0026a2802002201450d0020014198026c450d0020022802ac02102c0b200241b8026a280200200241c0026a28020010c402200241bc026a2802002201450d0520014188026c450d0520022802b802102c0c050b2008450d04200241ac026a280200200241b4026a28020010c3020240200241b0026a2802002201450d0020014198026c450d0020022802ac02102c0b200241b8026a280200200241c0026a28020010c402200241bc026a2802002201450d0420014188026c450d0420022802b802102c0c040b2007450d03200241b0026a280200450d03200241ac026a280200102c0c030b200241b0026a10a2012006450d02200241ac026a220228020010c5022002280200102c0c020b200a450d01200241b0026a10a201200241ac026a220228020010c5022002280200102c0c010b200910f7020b200010a2012003240020050ba90302087f037e230041306b2202240002400240024020012802182203450d0020012003417f6a36021820012802042204450d0220012802002105024002402001280208220620042f01ba024f0d00200421030c010b034002400240200428020022030d00410021030c010b200541016a210520042f01b80221060b2004102c20032104200620032f01ba024f0d000b0b200320064102746a41046a2802002107200241186a41106a22082003200641186c6a220441c0006a290200370300200241186a41086a2209200441386a2902003703002002200441306a290200370318200641016a210402402005450d00200320044102746a41bc026a280200210302402005417f6a2204450d00034020032802bc0221032004417f6a22040d000b0b410021040b200241106a2008290300220a370300200241086a2009290300220b37030020022002290318220c370300200020073602002000200c3702042000410c6a200b370200200041146a200a3702002001200436020820012003360204200141003602000c010b2000410036020c0b200241306a24000f0b41ecd0c800412b4198d1c800103c000b8a0201057f2000410c6a28020021012000280208210202400240024020002802042203200028020022044f0d0020032105200120044f0d0141b4a0c700412341d8a0c700103c000b4100210520012003490d01200321010b024020012004460d002001410c6c2004410c6c22016b2104200220016a210103400240200141046a280200450d002001280200102c0b2001410c6a2101200441746a22040d000b0b02402005450d002005410c6c210103400240200241046a280200450d002002280200102c0b2002410c6a2102200141746a22010d000b0b02402000410c6a2802002202450d0020002802082201450d002002410c6c450d002001102c0b0f0b2003200141e8a0c700104f000b130020004101360204200041c4e0c3003602000b130020004101360204200041b8e1c3003602000b34002000419ee3c30036020420004100360200200041146a4101360200200041106a41b4e3c300360200200041086a42153702000b890301077f41012102024002402001280208220341016a2204200128020422054d0d000c010b0240024002400240200320054f0d002001280200220620036a2d00002107200120043602080240200741037122084103460d0002400240024020080e03000102000b20074102762108410021020c070b0240200341026a220320054d0d000c070b200120033602082004417f460d03200620046a2d0000410874200772220141ffff0371418002490d06200141fcff03714102762108410021020c060b200341046a220320054b0d05200120033602082004417d4f0d03200620046a22012f0000200141026a2d000041107472410874200772220141808004492102200141027621080c050b0240200741034d0d000c050b200341056a220320054b0d04200120033602082004417c4f0d03200620046a28000022084180808080044921020c040b200320054190c0c800103f000b417f20034198bfc8001059000b200420034198bfc8001059000b200420034198bfc8001059000b20002008360204200020023602000bd00101037f200041ffff03200041ffff03491b22032000413e2003413e491b22006b21042003413f20032000461b20016a2103200241086a2100410121010340024002400240200141ff01714102470d00200321050c010b410021052001410171450d00410021010c010b024002402004450d002004418002490d01200441817e6a210441ff012103410221010c020b0f0b2004417f6a210341022101410021040b200220002802004101102f200228020020002802006a20033a00002000200028020041016a360200200521030c000b0bdd0202057f017e230041206b22022400200241086a2001108702024002402002280208450d00200041003602000c010b024020012802042203200228020c220441076a4103762205490d00024002400240024020050d00410121060c010b200510372206450d01200128020421030b0240024020032005490d0020062001280200200510c90821032001280204220620054f0d01200520064194afc0001058000b2006410020051b2201450d032005450d032001102c0c030b2001200620056b3602042001200128020020056a3602002003450d02200241106a200341c4b5c8002005ad22074220862007842207422088a722011b200110b10620022802144103762004490d01200241106a200410b206200041086a200241106a41086a280200360200200020022903103702002007a7450d032003102c0c030b1039000b41e8e8c30041264190e9c300103c000b200041003602000b200241206a24000be20401037f230041e0006b22032400024002400240024002402002417f4c0d000240024020020d00410121040c010b200210322204450d020b200341003602102003200236020c20032004360208200341086a4100200210c80120032802082204200328021022056a2001200210c9081a2003200520026a220236021020032002360218200241818080204f0d0220032002410374220536021c20024180808020460d034100210102400240024020020e020201000b200541786a41037641016a21010c010b410121010b200320013602202003200420016a220136022420012004490d042000200328020c36020820002002410674220236020420002004410120021b360200200341e0006a24000f0b103b000b1039000b200341346a4102360200200341d4006a41023602002003420237024420034198ecc30036024020034194ecc3003602302003410236022c2003200341286a3602502003200341186a360228200341c0006a41a8ecc3001046000b200341346a4102360200200341d4006a410236020020034202370244200341d4dbc400360240200341d0dbc4003602302003410236022c2003200341286a36025020032003411c6a360228200341c0006a41e4dbc4001046000b200341c0006a41146a4125360200200341c0006a410c6a4126360200200341286a41146a4103360200200341286a410c6a41033602002003418cdcc4003602302003410336022c200341f4dbc400360228200341253602442003200436025c2003200341c0006a3602382003200341246a3602502003200341206a3602482003200341dc006a360240200341286a41ecdcc4001046000ba20201027f230041306b220224002002200136020002400240200141ffffffff014b0d000240200041086a280200220341ffffffff01712003470d00200220034103742203360204200320014f0d022002412c6a41023602002002411c6a41023602002002420237020c200241d0eac300360208200241023602242002200241206a3602182002200241046a36022820022002360220200241086a41e0eac3001046000b4185eac300411841a0eac300105c000b2002412c6a41023602002002411c6a41023602002002420237020c200241b0eac300360208200241d0dbc400360228200241023602242002200241206a36021820022002360220200241086a41c0eac3001046000b20002000280204410771200141037472360204200241306a24000be70202067f017e230041206b22022400200241086a200110b003024002402002280208450d00200041003602000c010b0240200128020022032802042204200228020c220541076a4103762206490d00024002400240024020060d00410121070c010b200610372207450d012001280200220328020421040b0240024020042006490d0020072003280200200610c90821012003280204220420064f0d01200620044194afc0001058000b2007410020061b2201450d032006450d032001102c0c030b2003200420066b3602042003200328020020066a3602002001450d02200241106a200141c4b5c8002006ad22084220862008842208422088a722061b200610b10620022802144103762005490d01200241106a200510b206200041086a200241106a41086a280200360200200020022903103702002008a7450d032001102c0c030b1039000b41e8e8c30041264190e9c300103c000b200041003602000b200241206a24000bbe0101027f02400240024020010d0041012102410021030c010b41012103024020014109490d0041024101200141786a22034107711b20034103766a21030b200310322202450d010b2000200336020820002002360200200041046a220341003602002000200110b2060240200328020022034103762201450d00200028020021024101210002402001410820034107716b22034d0d0041024101200120036b22004107711b20004103766a21000b20024100200010cb081a0b0f0b1039000be00f03067f017e027f23004190016b2202240020012802202103200241f0006a22044200370300200241e8006a22054200370300200241d8006a41086a2206420037030020024200370358200241c0006a41ffdcc700410710c5012006200241c0006a41086a220729000037030020022002290040370358200241c0006a418893c700410a10c5012004200729000037030020052002290040370300200241c0006a200241d8006a10e10120022802402204410120041b21060240024002400240024002400240024020032002290244420020041b2208422088a7490d002008a72203450d01200341ffffff3f71450d012006102c0c010b2003200620034105746a10b606210302402008a72204450d00200441ffffff3f71450d002006102c0b20030d010b200241f0006a4200370300200241e8006a4200370300200241d8006a41086a2203420037030020024200370358200241c0006a41ffdcc700410710c5012003200241c0006a41086a220429000037030020022002290040370358200241c0006a41b8b3c300410c10c501200541086a200429000037000020052002290040370000200241086a200241d8006a412010c601200128021c200228020c410020022802081b2204470d01200241106a10ec02200228021822052001280224470d022005200128022022034b0d0320004180083b0001200041013a0000200041036a41003a00000c040b20004180063b0001200041013a0000200041036a41003a00000c040b20004180063b0001200041013a0000200041036a41003a00000c030b200041800e3b0001200041013a0000200041036a410a3a00000c010b200141286a21072002280210220920034105746a2106200241003602602002420137035820012802002105200241d8006a41004104102f2002280258200228026022036a20053600002002200341046a36026020012802042001410c6a280200200241d8006a10bb01200141106a2802002105200241d8006a200141186a2802002203108f0102402003450d0020052003410c6c6a210303402005280200200541086a280200200241d8006a10bb012005410c6a22052003470d000b0b200128021c2105200241d8006a20022802604104102f2002280258200228026022036a20053600002002200341046a220536026020012802202103200241d8006a20054104102f2002280258200228026022056a20033600002002200541046a220536026020012802242101200241d8006a20054104102f20022802582205200228026022036a20013600002002200341046a22013602602007200520012006102d21010240200228025c450d002005102c0b024002402001450d002002418c016a4108360200200241f8006a4200370300200241f0006a4280808080c0003703002002418dddc70036028801200241013a008001200242043703682002427f370360200242ffffffffffffffffff00370358411010322205450d01200242103702342002200536023020022802880121070240024002400240200228028c01220541c000490d00200541808001490d012005418080808004490d02200241306a41004101102f2002280230200228023822016a41033a00002002200141016a2201360238200241306a20014104102f2002280230200228023822016a20053600002002200141046a220a360238200241306a21010c030b200241306a41004101102f2002280230200228023822016a20054102743a00002002200141016a220a360238200241306a21010c020b200241306a41004102102f2002280230200228023822016a20054102744101723b00002002200141026a220a360238200241306a21010c010b200241306a41004104102f2002280230200228023822016a20054102744102723600002002200141046a220a360238200241306a21010b20024181016a21032001200a2005102f20022802302002280238220a6a2007200510c9081a2002200a20056a2205360238200120054104102f2002280230200228023822056a20043600002002200541046a2205360238200120054120102f2002280230200228023822016a22052006290000370000200541186a200641186a290000370000200541106a200641106a290000370000200541086a200641086a2900003700002002200141206a3602380240200228027c22052002280278470d00200241f4006a2005410110ec01200228027c21050b20022802742005410c6c6a22052002290330370200200541086a200241306a41086a280200360200200241c0006a41086a2205200241d8006a41186a2903003703002002200228027c41016a36027c200241c0006a41106a2201200241d8006a41206a29030037030020022002290368370340200220032900003703302002200341076a29000037003720022903582108200241d8006a41106a22032001290300370300200241d8006a41086a22012005290300370300200220022903403703582002200229003737002720022002290330370320200041106a42ac02370300200041086a2008370300200041306a41013a0000200041186a2002290358370300200041206a2001290300370300200041286a2003290300370300200041003a0000200041316a2002280220360000200041346a2002280023360000200228021441ffffff3f71450d032009102c0c030b20004180083b0001200041013a0000200041036a41003a00000c010b1039000b200228021441ffffff3f71450d002002280210102c0b20024190016a24000bf00501047f23004180016b22022400200241e0006a22034200370300200241d8006a22044200370300200241c8006a41086a420037030020024200370348200241c8006a41ffdcc700410710c501200241ec006a41b8b3c300410c10c5012003200241ec006a41086a2900003703002004200229006c370300200241106a200241c8006a412010c601200241c8006a2002280214410020022802101b2204200010eb0220022802482200200228025010ce0221030240200228024c450d002000102c0b4101210002400240024020030d00200241286a418dddc700410810c501200241ec006a41abedc300410e10c5012002200436027c200241186a200241fc006a410410c701200241d4006a200241fc006a41046a3602002002200241186a41086a36024c2002200241fc006a3602502002200241186a360248200241386a200241c8006a107e200241c8006a200110e40220022802402200200228025022036a41206a2204417f4c0d010240024020040d00410121010c010b200410322201450d030b200241003602202002200436021c20022001360218200241186a4100411010c8012002280218200228022022046a22012002290028370000200141086a200241286a41086a2900003700002002200441106a2204360220200241186a2004411010c8012002280218200228022022046a2201200229006c370000200141086a200241ec006a41086a2900003700002002200441106a220136022020022802382104200241186a2001200010c8012002280218200228022022016a2004200010c9081a2002200120006a220136022020022802482100200241186a2001200310c80120022802182201200228022022056a2000200310c9081a2002200520036a22033602200240200228024c450d002000102c0b0240200228023c450d002004102c0b200241086a2001200310c601200228020c2100200228020821030240200228021c450d002001102c0b200341004720004100477121000b20024180016a240020000f0b103b000b1039000bfa0507017f017e097f017e027f017e017f230041206b2201240002400240101a2202422088a722030d004101210441002103410121050c010b2002a72105410021040b2001200336020c2001200536020802402003450d0020052d0000210620012003417f6a36020c2001200541016a360208024002400240024020060e020001040b200141106a200141086a10af0820012802102207450d03200141186a2802002108200128021421092001200141086a10870220012802000d02024002402001280204220a200128020c410c6e22032003200a4b1bad420c7e2202422088a70d002002a72203417f4c0d000240024020030d00410421060c010b200310322206450d020b2003410c6ead210202400240200a450d000340200141106a200141086a10af0802402001280210220b0d0002402002422088a72203450d002003410c6c210a2006210303400240200341046a280200450d002003280200102c0b2003410c6a2103200a41746a220a0d000b0b2002a72203450d082003410c6c450d082006102c0c080b2001290214210c02402002422088a722032002a7470d00200341016a220d2003490d042003410174220e200d200d200e491b220d4104200d41044b1bad420c7e220f422088a7220e0d04200fa7220d4100480d04200e45410274210e2003410c6c201020031b2110024002400240024002402006410020031b22030d00200d450d010c030b20100d01200d0d020b200e21060c020b20032010200d103522060d010c050b200d10322206450d040b200242808080807083200d410c6ead8421020b20062002422088a7410c6c6a2203200c3702042003200b36020020024280808080107c2102200a417f6a220a0d000b0b2006450d0520070d040c060b200e0d010b103b000b1039000b410021070b2000200936020420002007360200200041106a20023702002000410c6a2006360200200041086a2008360200024020040d002005102c0b200141206a24000f0b2009450d002007102c0b41f2b3c800412e200141106a41a0b4c80041b0b4c8001040000bea0904017f017e067f067e230041d0036b22052400200520013602040240200541046a20022004ad4220862003ad84100d2206422088a72203450d0041002102200541086a21070240024002402006a722082d00000e020100030b41002102200541003a00c8022003417f6a2104200841016a210102400240034020042002460d0120054188026a20026a200120026a2d00003a00002005200241016a22033a00c80220032102200341c000460d020c000b0b200241ff0171450d02200541003a00c8020c020b200541d0026a41086a220220054188026a41086a290300370300200541d0026a41106a220420054188026a41106a290300370300200541d0026a41186a220120054188026a41186a290300370300200541d0026a41206a220920054188026a41206a290300370300200541d0026a41286a220a20054188026a41286a290300370300200541d0026a41306a220b20054188026a41306a290300370300200541d0026a41386a220c20054188026a41386a29030037030020052005290388023703d002200341ff0171413f4d0d01200541c8016a41386a2203200c290300370300200541c8016a41306a200b2903002206370300200541c8016a41286a200a290300220d370300200541c8016a41206a2009290300220e370300200541c8016a41186a2001290300220f370300200541c8016a41106a20042903002210370300200541c8016a41086a20022903002211370300200520052903d00222123703c80120054188016a41306a2202200637030020054188016a41286a2204200d37030020054188016a41206a2201200e37030020054188016a41186a2209200f37030020054188016a41106a220a201037030020054188016a41086a220b201137030020054188016a41386a220c20032903003703002005201237038801200541c8006a41386a2203200c290300370300200541c8006a41306a220c2002290300370300200541c8006a41286a22022004290300370300200541c8006a41206a22042001290300370300200541c8006a41186a22012009290300370300200541c8006a41106a2209200a290300370300200541c8006a41086a220a200b2903003703002005200529038801370348200541086a41386a2003290300370300200541086a41306a200c290300370300200541086a41286a2002290300370300200541086a41206a2004290300370300200541086a41186a2001290300370300200541086a41106a2009290300370300200541086a41086a200a29030037030020052005290348370308410121020b200020023a000020002007290000370001200041096a200741086a290000370000200041116a200741106a290000370000200041196a200741186a290000370000200041216a200741206a290000370000200041296a200741286a290000370000200041316a200741306a290000370000200041396a200741386a2900003700002008102c200541d0036a24000f0b200541c8006a41086a20054188016a41086a290300370300200541c8006a41106a20054188016a41106a290300370300200541c8006a41186a20054188016a41186a290300370300200541c8006a41206a20054188016a41206a290300370300200541c8006a41286a20054188016a41286a290300370300200541c8006a41306a20054188016a41306a2903003703000b41f2b3c800412e20054188026a41a0b4c80041b0b4c8001040000b8d0804057f017e047f017e230041b0016b22022400024002402000410c6a2802002203417f4c0d0020002802002104200028020421050240024020030d00410121060c010b200310322206450d020b200241003602a0012002200336029c01200220063602980120024198016a4100200310c80120022802980120022802a00122066a2005200310c9081a2002200620036a3602a001200041186a2802002203ad420c7e2207422088a70d002007a72205417f4c0d00200028021021060240024020050d00410421080c010b200510322208450d020b2002410036029001200220083602880120022005410c6e36028c0120024188016a4100200310ec01200228029001210802402003450d0020062003410c6c6a21092002280288012008410c6c6a21050340200641086a2802002203417f4c0d022006280200210a0240024020030d004101210b0c010b20031032220b450d040b200241003602102002200336020c2002200b360208200241086a4100200310c80120022802082002280210220b6a200a200310c9081a200541086a200b20036a36020020052002290308370200200841016a21082005410c6a21052006410c6a22062009470d000b0b20024198016a41146a2203200836020020022002290388013702a401200241f0006a41086a20024198016a41086a2903002207370300200241f0006a41106a20024198016a41106a290300220c370300200241086a410c6a2007370200200241086a41146a200c37020020022002290398012207370370200220043602082002200737020c200029021c21072002200028022436022c20022007370224200241086a41e0006a200041e0006a290200370300200241086a41d8006a200041d8006a290200370300200241086a41d0006a200041d0006a290200370300200241086a41c8006a200041c8006a290200370300200241086a41c0006a200041c0006a290200370300200241086a41386a200041386a290200370300200241086a41306a200041306a29020037030020022000290228370330200241f0006a410c6a412736020020024104360274200241b8f2c3003602702001411c6a28020021062002200241086a36027820012802182105200341023602002002420237029c01200241c0f2c300360298012002200241f0006a3602a8012005200620024198016a103e21050240200228020c4100200241086a41086a28020022031b2206450d002003450d002006102c0b0240200241206a2802002206450d00200241086a41106a28020021032006410c6c210603400240200341046a280200450d002003280200102c0b2003410c6a2103200641746a22060d000b0b0240200228021841002002411c6a28020022031b2206450d002003410c6c450d002006102c0b200241b0016a240020050f0b103b000b1039000b1d0020004101472002ad4220862001ad842004ad4220862003ad8410190b980201027f230041206b220224002002200128021841c4b5c80041002001411c6a28020028020c1100003a00102002200136020841012101200241013a00112002410036020c200220003602182002200041286a36021c200241086a200241186a41d0f2c30010662002411c6a41e0f2c30010661a20022d0010210002400240200228020c22030d00200021010c010b0240200041ff01710d00024020034101470d0020022d001141ff0171450d00200228020822002d00004104710d0041012101200028021841fa9dc00041012000411c6a28020028020c1100000d010b2002280208220128021841c5c7c50041012001411c6a28020028020c11000021010b200220013a00100b200241206a2400200141ff01714100470b1c00200128021841d8bdc800410f2001411c6a28020028020c1100000baf0c01107f230041a0036b2202240002400240024020012802082203200128020c460d0020012802102104200241b4026a2105200241e0026a41206a2106200241c8016a4104722107200241d0006a4104722108200241106a41386a2109200241106a41306a210a200241106a41286a210b03402001200341206a36020820082003290000370000200841086a200341086a290000370000200841106a200341106a290000370000200841186a200341186a29000037000020022004360250024002402004200810b606450d002001200128021041016a22043602100c010b200241c8016a41206a200241d0006a41206a280200360200200241c8016a41186a200241d0006a41186a290300370300200241c8016a41106a200241d0006a41106a290300370300200241c8016a41086a200241d0006a41086a290300370300200220022903503703c801200241f0016a41186a2203200741186a220c290000370300200241f0016a41106a220d200741106a220e290000370300200241f0016a41086a220f200741086a2210290000370300200220072900003703f001200241e0026a41186a2204200c290000370300200241e0026a41106a220c200e290000370300200241e0026a41086a220e2010290000370300200220072900003703e00220024190026a200241e0026a10a304200241c0026a41186a22102003290300370300200241c0026a41106a2211200d290300370300200241c0026a41086a220d200f290300370300200220022903f0013703c0020240024020022802b00222030d00410021030c010b2006200229039002370300200641186a20024190026a41186a290300370300200641106a20024190026a41106a290300370300200641086a20024190026a41086a29030037030020042010290300370300200c2011290300370300200e200d290300370300200241f8006a41086a200541086a280200360200200220022903c0023703e0022002200529020037037820024188016a41386a200241e0026a41386a29030037030020024188016a41306a200241e0026a41306a29030037030020024188016a41286a200241e0026a41286a29030037030020024188016a41206a200629030037030020024188016a41186a200429030037030020024188016a41106a200c29030037030020024188016a41086a200e290300370300200220022903e002370388010b0240024020030d0020094200370300200a4200370300200b4200370300200241106a41206a4200370300200241106a41186a4200370300200241106a41106a4200370300200241106a41086a4200370300200241086a410036020020024200370310200242003703000c010b200920024188016a41386a290300370300200a20024188016a41306a290300370300200b20024188016a41286a290300370300200241106a41206a20024188016a41206a290300370300200241106a41186a20024188016a41186a290300370300200241106a41106a20024188016a41106a290300370300200241106a41086a20024188016a41086a290300370300200241086a200241f8006a41086a2802003602002002200229038801370310200220022903783703000b2001200128021041016a220436021020030d030b20012802082203200128020c470d000b0b200041003602400c010b200241e0026a41386a2201200241106a41386a290300370300200241e0026a41306a2208200241106a41306a290300370300200241e0026a41286a2204200241106a41286a290300370300200241e0026a41206a2207200241106a41206a290300370300200241e0026a41186a2206200241106a41186a290300370300200241e0026a41106a220c200241106a41106a290300370300200241e0026a41086a220e200241106a41086a29030037030020024188016a41086a220d200241086a280200360200200220022903103703e0022002200229030037038801200041386a2001290300370300200041306a2008290300370300200041286a2004290300370300200041206a2007290300370300200041186a2006290300370300200041106a200c290300370300200041086a200e290300370300200020022903e002370300200020033602402000200229038801370244200041cc006a200d2802003602000b200241a0036a24000be00304027f017e057f077e230041306b220224000240024020012802082203ad42d0007e2204422088a70d002004a72205417f4c0d00200128020021014108210602402005450d00200510322206450d020b20002006360200200041086a22064100360200200041046a200541d0006e36020020004100200310d6042006280200210502402003450d002001200341d0006c6a21072000280200200541d0006c6a21030340200241106a41086a2206200141086a290300370300200241106a41106a2208200141106a290300370300200241106a41186a2209200141186a29030037030020022001290300370310200141206a2903002104200141286a290300210a200141306a290300210b200141386a290300210c2002200141c0006a10a5022009290300210d2008290300210e2006290300210f20022903102110200341386a200c370300200341306a200b370300200341286a200a370300200341206a2004370300200341086a200f37030020032010370300200341106a200e370300200341186a200d370300200341c0006a2002290300370300200341c8006a200241086a280200360200200341d0006a2103200541016a2105200141d0006a22012007470d000b0b200041086a2005360200200241306a24000f0b103b000b1039000bb20201047f230041106b22022400024002402001280208220341146a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b200241003602082002200436020420022005360200200241004110102f2002280200200228020822046a2205200129000c370000200541086a200141146a2900003700002002200441106a36020820012802002003200210bb01200128021c2101200220022802084120102f2002280200200228020822036a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002002200341206a360208200141206a200210f8032000200228020022012002280208109a0102402002280204450d002001102c0b200241106a24000f0b103b000b1039000b7301027f024020002802042201450d0020002802002202450d002001450d002002102c0b0240200041106a2802002201450d00200028020c2202450d00200141ffffff3f71450d002002102c0b02402000411c6a2802002201450d0020002802182200450d00200141246c450d002000102c0b0b13002000410136020420004198f3c3003602000b34002000418dddc70036020420004100360200200041146a4104360200200041106a41f4f7c300360200200041086a42083702000b130020004102360204200041c484c4003602000bd80101047f024002400240200041046a28020020002802082201470d00200141016a22022001490d02200141017422032002200320024b1b22024104200241044b1b220241ffffffff037122042002470d02200241027422034100480d0220042002464102742104024002400240024002402000280200410020011b22020d002003450d010c030b200141027422010d0120030d020b200421010c020b200220012003103522010d010c030b200310322201450d020b20002001360200200041046a20034102763602000b0f0b2004450d001039000b103b000bdf0101087f0240200028020022020d0041000f0b2000280204210320012d002041ff01712104037f200241346a210020022f01322105410021060240024003400240200520062207470d00200521070c030b02400240024020012000412010cc082206450d00410121082006417f4c0d050c010b2004200041206a2d00002206460d01417f200420064720042006491b21080b200741016a2106200041216a210041012109200841016a0e03030201030b0b410121090b20090f0b024020030d0041000f0b2003417f6a2103200220074102746a41a0036a28020021020c000b0bae0401097f230041a0036b2203240002400240024020012802002204450d00200128020421050c010b41a00310322204450d014100210520044100360200200420032902f002370204200441003b01322004410c6a200341f8026a290200370200200441146a20034180036a2902003702002004411c6a20034188036a290200370200200441246a20034190036a2902003702002004412a6a20034196036a290100370100200441346a200341ec0210c9081a20014100360204200120043602000b20022d002041ff0171210602400340200441346a210720042f013221084100210902400340024020082009220a470d002008210a0c020b02400240024020022007412010cc082209450d004101210b2009417f4c0d040c010b2006200741206a2d00002209460d01417f200620094720062009491b210b0b200a41016a2109200741216a2107200b41016a0e03020001020b0b20002005360204200041106a20013602002000410c6a200a360200200041086a2004360200410121070c020b02402005450d002005417f6a21052004200a4102746a41a0036a28020021040c010b0b4100210720004100360204200041106a20013602002000410c6a200a360200200041086a2004360200200041146a20022900003700002000411c6a200241086a290000370000200041246a200241106a2900003700002000412c6a200241186a290000370000200041346a200241206a2d00003a00000b20002007360200200341a0036a24000f0b1039000bb71a02277f047e230041d0046b22022400200028020821032000280200210420002802042105200241d8006a41206a2206200041306a2d00003a0000200241d8006a41186a2207200041286a290000370300200241e8006a2208200041206a290000370300200241d8006a41086a2209200041186a290000370300200220002900103703580240024002400240024002400240024020052f0132220a410b490d00410521064100210b02400240200341054f0d0041042106200321070c010b41052107024002402003417b6a0e020201000b200341796a21074101210b410621060c010b410021074101210b0b41a0031032220c450d03200c4100360200200c200229028001370204200c41003b0132200c410c6a20024180016a41086a2208290200370200200c41146a20024180016a41106a2209290200370200200c411c6a20024180016a41186a220a290200370200200c41246a20024180016a41206a220d290200370200200c412a6a200241a6016a220e290100370100200c41346a200241b0016a41ec0210c908210f200241306a41086a22102005200641216c6a2203413c6a290000370300200241306a41106a2211200341c4006a290000370300200241306a41186a2212200341cc006a290000370300200241306a41206a2213200341d4006a2d00003a00002002200341346a290000370330200520064102746a221441046a2802002115200f200341d5006a20052f01322006417f736a220341216c10c9081a200c41046a201441086a200341027410c9081a200520063b0132200c20033b0132200c2005200b1b2203200741216c6a220641d5006a200641346a220b20032f013220076b41216c10ca081a200641d4006a200241d8006a41206a22162d00003a0000200641cc006a200241d8006a41186a2217290300370000200641c4006a200241d8006a41106a22182903003700002006413c6a200241d8006a41086a2219290300370000200b2002290358370000200320074102746a220641086a200641046a221a20032f013220076b41027410ca081a201a2001360200200320032f013241016a3b0132200241086a41206a221b20132d00003a0000200241086a41186a221c2012290300370300200241086a41106a221d2011290300370300200241086a41086a221e20102903003703002002200229033037030802400240200528020022030d00410021040c010b410021060340200c211f201521202005210c20032105200c2f013021012016201b2d00003a00002017201c2903003703002018201d2903003703002019201e2903003703002002200229030837035820042006470d0602400240024020052f0132220c410b490d004100212141042107024020014105490d0020012107024002402001417b6a0e020201000b200141796a210141012121410621070c010b4100210141012121410521070b41d0031032220c450d08200441016a210441002103200c4100360200200c200229028001370204200c41003b0132200c410c6a2008290200370200200c41146a2009290200370200200c411c6a200a290200370200200c41246a200d290200370200200c412a6a200e290100370100200c41346a200241b0016a419c0310c9082122200241b0016a41206a220b200541346a2223200741216c6a220641206a2d00003a0000200241b0016a41186a220f200641186a290000370300200241b0016a41106a2214200641106a290000370300200241b0016a41086a2224200641086a290000370300200220062900003703b001200541046a2225200741027422266a28020021152022200641216a20052f013222272007417f736a220641216c10c9082128200c41046a2025202641046a22226a200641027410c9082126200520073b0132200c20063b0132200d200b2d00003a0000200a200f2903003703002009201429030037030020082024290300370300200220022903b00137038001200c41a0036a200520226a41a0036a202720076b41027410c908212202400340200c20034102746a41a0036a280200220720033b01302007200c3602002003200320064922076a220320064b0d0120070d000b0b200b200d2d000022033a0000200f200a290300222937030020142009290300222a37030020242008290300222b3703002002200229038001222c3703b001200d20033a0000200a20293703002009202a3703002008202b3703002002202c370380012021450d012001410274220720226a41086a2022200141016a2203410274220b6a2206200c2f013220016b41027410ca081a2006201f3602002028200141216c6a220641216a2006200c2f013220016b41216c10ca081a200641206a20162d00003a0000200641186a2017290300370000200641106a2018290300370000200641086a2019290300370000200620022903583700002026200b6a202620076a2206200c2f013220016b41027410ca081a20062020360200200c200c2f013241016a22063b01322003200641ffff037122064b0d020340200c20034102746a41a0036a280200220720033b01302007200c360200200320032006496a220720064b0d03200320064f2101200721032001450d000c030b0b20014102742206200541a0036a22076a41086a2007200141016a220341027422086a2207200c20016b2209410274220a10ca081a2007201f3602002005200141216c6a220c41d5006a200c41346a2207200941216c10ca081a200c41d4006a200241f8006a2d00003a0000200c41cc006a200241f0006a290300370000200c41c4006a200241e8006a290300370000200c413c6a200241d8006a41086a29030037000020072002290358370000200541046a220c20086a200c20066a220c200a10ca081a200c2020360200200520052f013241016a220c3b01322001200c41ffff0371220c4f0d050340200520034102746a41a0036a280200220620033b01302006200536020020032003200c496a2206200c4b0d062003200c4f2107200621032007450d000c060b0b20014102742207200541a0036a22066a41086a2006200141016a2203410274220b6a220620052f013220016b41027410ca081a2006201f3602002023200141216c6a220641216a200620052f013220016b41216c10ca081a200641206a20162d00003a0000200641186a2017290300370000200641106a2018290300370000200641086a2019290300370000200620022903583700002025200b6a202520076a220620052f013220016b41027410ca081a20062020360200200520052f013241016a22063b01322003200641ffff037122064b0d000340200520034102746a41a0036a280200220720033b0130200720053602002003200320064922076a220320064b0d0120070d000b0b201b200d2d00003a0000201c200a290300370300201d2009290300370300201e2008290300370300200220022903800137030820042106200528020022030d000b0b2013201b2d000022033a00002012201c29030022293703002011201d290300222a3703002010201e290300222b37030020022002290308222c370330201620033a0000201720293703002018202a3703002019202b3703002002202c370358200028020c2206280200450d0541d00310322203450d03200341003602002003200229028001370204200341003b01322003410c6a20024180016a41086a290200370200200341146a20024180016a41106a2902003702002003411c6a20024180016a41186a290200370200200341246a20024180016a41206a2902003702002003412a6a200241a6016a290100370100200341346a200241b0016a419c0310c9081a2003200628020022073602a0032006200336020020062006280204220541016a360204200741003b013020072003360200200241b0016a41206a200241d8006a41206a2d00003a0000200241b0016a41186a200241d8006a41186a290300370300200241b0016a41106a200241d8006a41106a290300370300200241b0016a41086a200241d8006a41086a290300370300200220022903583703b00120052004470d0620032f01322205410a4b0d072003200541016a22013b01322003200541216c6a220741346a20022903b0013700002007413c6a200241b8016a290300370000200741c4006a200241c0016a290300370000200741cc006a200241c8016a290300370000200741d4006a200241d0016a2d00003a0000200320054102746a41046a2015360200200320014102746a41a0036a200c360200200c2003360200200c20013b01302006200628020841016a3602080c020b2005200341216c6a220c41d5006a200c41346a220d200a20036b41216c10ca081a200c41d4006a20062d00003a0000200c41cc006a2007290300370000200c41c4006a2008290300370000200c413c6a2009290300370000200d2002290358370000200520034102746a220c41086a200c41046a221a20052f013220036b41027410ca081a201a2001360200200520052f013241016a3b01320b200028020c2203200328020841016a3602080b200241d0046a2400201a0f0b1039000b41a5d0c800413541dcd0c800103c000b41ecd0c800412b41bcd2c800103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b5a01017f024020002802002201450d0020012001280200417f6a360200200028020022012802000d002001410c6a10c806200028020041046a22012001280200417f6a3602002000280200220041046a2802000d002000102c0b0bfe08010b7f230041306b22022400200241003602102002420437030820024100360220200242043703180240024002400240200128020041016a220341014d0d0020012003360200200241086a410041011095022002280208200228021022034102746a20013602002002200341016a360210200128020041016a220341014d0d0020012003360200200241186a4100410110950220022802182204200228022022034102746a20013602002002200341016a22053602202001280200220341016a220641014d0d00200120063602002003417d4b0d00200341026a21060340200122072006360200200728020841016a220141004c0d022007200136020802400240200728020c2203450d0020054102742106200341106a210820022802182204210903402006450d020240200928020022012003460d00200128020841016a220a41004c0d072001200a3602082003280208220a41016a220b41004c0d08200941046a21092003200b360208200141106a2008412010cc08210b20012d0030210c2003200a36020820032d0030210a20012001280208417f6a3602082006417c6a2106200b0d01200c41ff0171200a41ff0171470d010b0b20072802002106200728020821010b20072006417f6a220336020020072001417f6a360208024020030d002007410c6a10c806200741046a22012001280200417f6a220136020020010d002007102c0b20002007360200200020022903083702042000410c6a200241106a28020036020002402005450d0020054102742103200421010340200128020022062006280200417f6a3602000240200128020022062802000d002006410c6a10c806200128020041046a22062006280200417f6a3602002001280200220641046a2802000d002006102c0b200141046a21012003417c6a22030d000b0b024020044100200228021c22011b2203450d00200141ffffffff0371450d002003102c0b200241306a24000f0b200728020c220328020041016a220141014d0d0120032001360200024020022802102201200228020c470d00200241086a20014101109502200228021021010b200228020820014102746a20033602002002200141016a360210200728020c220128020041016a220341014d0d012001200336020020072007280200417f6a2203360200024020030d002007410c6a10c806200741046a22032003280200417f6a220336020020030d002007102c0b200128020041016a220341014d0d0120012003360200024020022802202203200228021c470d00200241186a20034101109502200228022021030b2002280218220420034102746a200136020020072007280200417f6a220636020020072007280208417f6a3602082002200341016a2205360220024020060d002007410c6a10c806200741046a22032003280200417f6a220336020020030d002007102c0b200128020041016a220641024f0d000b0b00000b41fcaec8004118200241286a41f8e8c40041d8ebc4001040000b41fcaec8004118200241286a41f8c5c0004198e9c4001040000b41fcaec8004118200241286a41f8c5c00041a8e9c4001040000bab0201057f230041106b22022400410021030240024002402000280208220441016a220541004c0d00200020043602080240200028020c2204450d00200020053602080240024020042001470d00410121030c010b200428020841016a220541004c0d03200420053602082001280208220541016a220341004c0d0420012003360208200441106a200141106a412010cc08210320042d003021062001200536020820012d0030210120042004280208417f6a3602082003452006200146712103200028020821050b20002005417f6a3602080b200241106a240020030f0b41fcaec8004118200241086a41f8e8c4004188e9c4001040000b41fcaec8004118200241086a41f8e8c4004198e9c4001040000b41fcaec8004118200241086a41f8e8c40041a8e9c4001040000bcc0301097f230041306b2202240002400240024020012802182203450d0020012003417f6a36021820012802042204450d0220012802002105024002402001280208220620042f01324f0d00200421030c010b034002400240200428020022030d00410021030c010b200541016a210520042f013021060b2004102c20032104200620032f01324f0d000b0b200241086a41206a22072003200641216c6a220441d4006a2d00003a0000200241086a41186a2208200441cc006a290000370300200241086a41106a2209200441c4006a290000370300200241086a41086a220a2004413c6a2900003703002002200441346a290000370308200641016a2104200320064102746a41046a280200210602402005450d00200320044102746a41a0036a280200210302402005417f6a2204450d00034020032802a00321032004417f6a22040d000b0b410021040b20002002290308370000200041206a20072d00003a0000200041186a2008290300370000200041106a2009290300370000200041086a200a290300370000200120043602082001200336020420014100360200200041246a20063602000c010b200041023a00200b200241306a24000f0b41ecd0c800412b4198d1c800103c000be40b02087f067e230041b0036b2203240020034190036a41186a2204420037030020034190036a41106a2205420037030020034190036a41086a22064200370300200342003703900341062107200341d8016a41c1dcc700410610c5012006200341d8016a41086a2208290000370300200320032900d80137039003200341d8016a41f8ccc600411010c50120042008290000370300200520032900d801370300200341086a20034190036a412010c601410021090240417f200328020c410020032802081b220a20026a22022002200a491b220a418080c002418080f001200141ff017122021b4b0d00200341106a109b012004420037030020054200370300200642003703002003420037039003200341d8016a41c1dcc700410610c50120062008290000370300200320032900d80137039003200341d8016a41c4ccc600410b10c501200541086a2008290000370000200520032900d801370000200341d8016a20034190036a108503200341d8016a41186a290300210b200341d8016a41106a290300210c20032903e001210d20032903d801210e200341d8016a200341106a41b80110c9081a2003200d4200200e42015122061b370390032003200c420020061b3703d0012003200b420020061b3703c801024002400240024020020e03010200010b427f2000200341d8026a22062903007c220b200b2000541b210b0c020b427f200020032903e8017c220b200b2000541b210b200341e8016a21060c010b427f2000200341a0026a22062903007c220b200b2000541b210b0b024002400240024002402006290318220c4201510d0020062903284201520d010b200341c8016a2108024002400240200141ff01710e03010002010b200341d0016a21080c010b20034190036a21080b2008290300220d200b7c220b200d540d022008200b3703000c010b200341c8016a2108024002400240200141ff01710e03010002010b200341d0016a21080c010b20034190036a21080b2008427f2008290300220d200b7c220b200b200d541b3703000b200341c8016a2108024002400240200141ff01710e03000102000b20034190036a21080c010b200341d0016a21080b2008290300210e0240200c4201520d00200e200641206a290300560d010b0240427f427f200329039003220b20032903d001220c7c220d200d200b541b220f20032903c801220d7c22102010200f541b20032903e001580d0020062903284201520d00200e200641306a290300560d010b41002106410021070c010b41062107410121060b20060d00200341d8016a109b010240024002400240200141ff01710e03010200010b200341d8026a21010c020b200341e8016a21010c010b200341a0026a21010b024020012903084201520d0041062107200141106a2903002000540d010b200341a8036a2208420037030020034190036a41106a2207420037030020034190036a41086a220142003703002003420037039003200341d8016a41c1dcc700410610c5012001200341d8016a41086a2206290000370300200320032900d80137039003200341d8016a41f8ccc600411010c501200541086a22042006290000370000200520032900d8013700002003200a3602d80120034190036a4120200341d8016a410410a7022008420037030020074200370300200142003703002003420037039003200341d8016a41c1dcc700410610c50120012006290000370300200320032900d80137039003200341d8016a41c4ccc600410b10c50120042006290000370000200520032900d801370000200341003602e001200342013703d801200341d8016a41004108102f20032802d80120032802e00122056a200b3700002003200541086a22053602e001200341d8016a20054108102f20032802d80120032802e00122056a200c3700002003200541086a22053602e001200341d8016a20054108102f20032802d801220520032802e00122016a200d3700002003200141086a22013602e00120034190036a41202005200110a702024020032802dc01450d002005102c0b410221090b200341b0036a240020074108742009720b9a1508067f027e027f0a7e017f027e027f037e23004180046b2206240002400240024002402002200384500d00200641306a41c1dcc700410610c501200641e8016a41acc8c700410710c50120064180016a200110d502200628028801220741206a2208417f4c0d020240024020080d00410121090c010b200810322209450d040b4100210a200641003602282006200836022420062009360220200641206a4100411010c8012006280220200628022822086a22092006290030370000200941086a200641306a41086a2900003700002006200841106a2208360228200641206a2008411010c8012006280220200628022822086a220920062900e801370000200941086a200641e8016a41086a2900003700002006200841106a22083602282006280280012109200641206a2008200710c801200628022022082006280228220b6a2009200710c9081a2006200b20076a22073602280240200628028401450d002009102c0b200641306a2008200710d6022006290330210c4200210d20064200370330200641fc006a280200210e200641f8006a280200210f02400240200c4201510d004101210b420021104200211142002112420021134200211442002115420021160c010b200641e8006a2903002114200641e0006a2903002113200641d8006a2903002112200641d0006a290300210d200641c8006a290300211020062903402116200629033821154101210a4100210b200629037021110b024002400240024002400240201520027d2217201556201620037d2015200254ad7d221820165620182016511b0d00201720107c221942ffc7afa025562018200d7c2019201754221aad7c221b420052201b501b0d02201520107c221c4280c8afa0255441002016200d7c201c201554ad7c501b0d0220050d02200641e8016a410610d7020c010b200641e8016a410410d7020b20062902ec01211520062802e80121050c010b20064180016a41c1dcc700410610c501200641e8016a41acc8c700410710c501200641d8016a200110d50220062802e001220941206a2205417f4c0d050240024020050d004101211d0c010b20051032221d450d070b200641003602d001200620053602cc012006201d3602c801200641c8016a4100411010c80120062802c80120062802d00122056a221d200629008001370000201d41086a20064180016a41086a2900003700002006200541106a22053602d001200641c8016a2005411010c80120062802c80120062802d00122056a221d20062900e801370000201d41086a200641e8016a41086a2900003700002006200541106a221d3602d00120062802d8012105200641c8016a201d200910c80120062802c801221d20062802d001221e6a2005200910c9081a2006201e20096a22093602d001024020062802dc01450d002005102c0b200641e8016a201d200910d60220062903e801420151210920064198026a290300211520064190026a2903002116200641a8026a290300211f200641a0026a2903002120024020062802cc01450d00201d102c0b2015420020091b211c2016420020091b2121201f420020091b21152020420020091b211602400240024041004102410120044101711b200441ff01714101461b0e03020100020b201c20152021201656201c201556201c2015511b22091b21152021201620091b21160c010b20212116201c21150b2016201756201520185620152018511b450d01200641b8016a410210d70220062d00b80122094104460d0120062902bc01211520062f00b90120062d00bb014110747241087420097221050b20154280807c8321162015420888a721072015a72109410121040c010b200641a8016a22042013370300200641b0016a22052014370300200620103703900120064198016a200d370300200620123703a0012006201737038001200620183703880102400240427f2019201a201b201854201b2018511b22091b22164280c8afa025544100427f201b20091b221b501b0d0020064190016a29030021162005290300210d20042903002110200641a0016a290300211b200629038801211220062903800121134201211520062903980121140c010b0240024020172010842018200d848450450d00420021150c010b42002115200641e8016a41186a22044200370300200641e8016a41106a22054200370300200641e8016a41086a22094200370300200642003703e801200641d8016a41d4dcc700410810c5012009200641d8016a41086a221a290000370300200620062900d8013703e801200641d8016a41bba8c700410d10c5012004201a290000370300200520062900d801370300200641086a200641e8016a412010d301200641086a41106a290300210d200629031021102006280208211d200442003703002005420037030020094200370300200642003703e801200641d8016a41d4dcc700410810c5012009201a290000370300200620062900d8013703e801200641d8016a41bba8c700410d10c5012004201a290000370300200520062900d80137030020064200200d4200201d1b220d201b7d20104200201d1b2210201654ad7d2212201020167d22132010562012200d562012200d511b22041b3703e00120064200201320041b3703d801200641e8016a4120200641d8016a411010a702200641a0026a201b37030020064198026a2016370300200941013a0000200641f9016a200141086a29000037000020064181026a200141106a29000037000020064189026a200141186a290000370000200641023602e801200620012900003700f101200641e8016a10c8020b0b200c4201512109200641d8006a201b370300200641e0006a2010370300200641c0006a2012370300200641e8006a200d370300200641c8006a2016370300200620143703502006201137037020062013370338410021042006200e4100200a1b36027c2006200f4100200a1b360278200620154201512205ad3703300240024020050d002008200710b40142002116410021070c010b20082007200641386a10d80242002116410121070b0b02402006280224450d002008102c0b02400240024020040d000240200741ff01712207450d00200941ff0171450d020b20070d02200941ff0171450d02200641e8016a41086a41043a0000200641f9016a200141086a29000037000020064181026a200141106a29000037000020064189026a200141186a290000370000200641003602e801200620012900003700f101200641e8016a10c8020c020b2000200536020420004101360200200041086a2007ad42ff01834208862009ad42ff0183842016843702000c030b200641e8016a41086a41033a0000200641f9016a200141086a29000037000020064181026a200141106a29000037000020064189026a200141186a290000370000200641003602e801200620012900003700f101200641e8016a10c8020b0240200b450d00200641a0026a201837030020064198026a2017370300200641e8016a41086a41003a0000200641f9016a200141086a29000037000020064181026a200141106a29000037000020064189026a200141186a290000370000200641023602e801200620012900003700f101200641e8016a10c8020b20004100360200200041106a2003370300200041086a20023703000c010b20004100360200200041106a4200370300200041086a42003703000b20064180046a24000f0b103b000b1039000bbc1404077f047e017f057e230041c0036b2203240020012800002104200341106a41186a2001411c6a290000370300200341106a41106a200141146a290000370300200341106a41086a2001410c6a290000370300200320012900043703102002280200210520034190036a41186a2206420037030020034190036a41106a2201420037030020034190036a41086a220742003703002003420037039003200341d0006a41ffdcc700410710c5012007200341d0006a41086a22082900003703002003200329005037039003200341d0006a41b8b3c300410c10c5012006200829000037030020012003290050370300200341086a20034190036a412010c60141002109024002400240024002402005200328020c410020032802081b460d00200341d0006a2005108e07200341c0026a41086a200341d0006a410c6a290200370300200341c0026a41106a200341d0006a41146a290200370300200341c0026a41186a200341d0006a411c6a290200370300200320032902543703c00220032802504101470d0120034190036a41086a2205200341c0026a41086a290300220a37030020034190036a41106a2206200341c0026a41106a290300220b37030020034190036a41186a2207200341c0026a41186a290300220c370300200320032903c002220d37039003200341f4006a2802002101200341a0026a41186a2208200c370300200341a0026a41106a2209200b370300200341a0026a41086a220e200a3703002003200d3703a00220012002280210470d0220072008290300370300200620092903003703002005200e290300370300200320032903a002370390032002410c6a280200210720022802042108200341c0026a108f0702402007450d0020082007410c6c6a21054100280280a240210641002902f8a140210a20082101034020034180026a41086a20063602002003200a37038002200341d0006a200341c0026a20034180026a2001280200200141086a2802001090072001410c6a22012005470d000b0b200341d0006a200341c0026a41d00010c9081a200341b8016a200341a8036a290300370300200341b0016a200341a0036a290300370300200341a8016a20034190036a41086a29030037030020032003290390033703a0012000200341d0006a2004200341106a109107200341d0006a10dd0402402007450d002007410c6c21002008210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b200241086a2802002201450d042001410c6c450d042008102c0c040b20084120360200200320043602502003200341106a360254200341c0026a200341d0006a10e602200341d0006a20032802c002220520032802c80210c9012007200341d9006a2900003703002001200341e1006a2900003703002006200341e9006a2900003703002003200329005137039003024020032d00504101470d00200341306a41186a20034190036a41186a290300370300200341306a41106a20034190036a41106a290300370300200341306a41086a20034190036a41086a2903003703002003200329039003370330410121090b024020032802c402450d002005102c0b2002410c6a2802002105200241086a2802002107200228020421060240024020090d002000410036024002402005450d002005410c6c21002006210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b2007450d052006450d052007410c6c0d010c050b20022802102104200341c0016a41186a2202200341306a41186a290300220a370300200341c0016a41106a2208200341306a41106a290300220b370300200341c0016a41086a2209200341306a41086a290300220c37030020032003290330220d3703c001200341d0006a41186a200a370300200341d0006a41106a200b370300200341d0006a41086a200c3703002003200d370350200341c0026a200341d0006a10a304200341e0016a41186a220e2002290300370300200341e0016a41106a22022008290300370300200341e0016a41086a2009290300370300200320032903c0013703e001024020032802e00222080d002000410036024002402005450d002005410c6c21002006210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b2007450d052006450d052007410c6c0d010c050b20034180026a41186a200e29030037030020034180026a41106a200229030037030020034180026a41086a200341e0016a41086a290300370300200320032903e00137038002200341a0026a41186a200341c0026a41186a290300370300200341a0026a41106a200341c0026a41106a290300370300200341a0026a41086a200341c0026a41086a290300370300200320032903c0023703a002200341e8026a290300210a20032802e402210220034190036a41186a420037030020034190036a41106a420037030020034190036a41086a220942003703002003420037039003200341d0006a41ffdcc700410710c5012009200341d0006a41086a220e2900003703002003200329005037039003200341d0006a418893c700410a10c501200141086a200e29000037000020012003290050370000200341b0036a20034190036a10e1010240024020032802b00322090d00410021010c010b20032902b403220b422088a72101200ba7220e450d00200e41ffffff3f71450d002009102c0b024020042001470d002000200329038002220b370300200041206a20032903a002220c370300200341d0006a41186a20034180026a41186a290300220d370300200341d0006a41106a20034180026a41106a290300220f370300200341d0006a41086a20034180026a41086a2903002210370300200341d0006a41286a200341a0026a41086a2903002211370300200341d0006a41306a200341a0026a41106a2903002212370300200341d0006a41386a200341a0026a41186a2903002213370300200041086a2010370300200041106a200f370300200041186a200d370300200041286a2011370300200041306a2012370300200041386a20133703002003200b3703502003200c370370200041c8006a200a370300200020023602442000200836024002402005450d002005410c6c21002006210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b2007450d052006450d052007410c6c0d010c050b2000410036024002402002450d00200241306c450d002008102c0b02402005450d002005410c6c21002006210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b2007450d042006450d042007410c6c450d040b2006102c0c030b200041003602400c010b200041003602400b2002280204210502402002410c6a2802002201450d002001410c6c21002005210103400240200141046a280200450d002001280200102c0b2001410c6a2101200041746a22000d000b0b200241086a2802002201450d002001410c6c450d002005102c0b200341c0036a24000ba10304057f027e017f027e230041d0006b2201240002402000290300500d00200141386a22024200370300200141206a41106a22034200370300200141206a41086a2204420037030020014200370320200141c0006a41d4dcc700410810c5012004200141c0006a41086a220529000037030020012001290040370320200141c0006a41bba8c700410d10c5012002200529000037030020032001290040370300200141086a200141206a412010d301200141086a41106a29030021062001290310210720012802082108200041106a29030021092000290308210a20024200370300200342003703002004420037030020014200370320200141c0006a41d4dcc700410810c5012004200529000037030020012001290040370320200141c0006a41bba8c700410d10c5012002200529000037030020032001290040370300200142002006420020081b220620097d2007420020081b2207200a54ad7d22092007200a7d220a200756200920065620092006511b22001b37034820014200200a20001b370340200141206a4120200141c0006a411010a7020b200141d0006a24000bca0803017f037e047f23004190036b22032400200320023703382003200137033042002104024002400240024020012002844200520d00420021020c010b20032000360244200341c8006a2000200341306a200341c4006a10b5040240024020032903484201520d00200341d8006a2903002105200329035021040c010b200341f0006a2903002105200341e8006a290300210420032903504201520d00200341c8006a41106a2903002106200341b0016a200341c8006a41186a290300370300200341a8016a2006370300200341f8006a41086a41003a000020034189016a200041086a29000037000020034191016a200041106a29000037000020034199016a200041186a290000370000200341023602782003200029000037008101200341f8006a10c8020b200520027d2004200154ad7d200220057d2001200454ad7d2004200156200520025620052002511b22001b2102200420017d200120047d20001b210420000d010b20034190016a22004200370300200341f8006a41106a22074200370300200341f8006a41086a2208420037030020034200370378200341c8006a41d4dcc700410810c5012008200341c8006a41086a220929000037030020032003290048370378200341c8006a41bba8c700410d10c50120002009290000370300200720032900483703002003200341f8006a412010d301200341106a2903002101200329030821052003280200210a20004200370300200742003703002008420037030020034200370378200341c8006a41d4dcc700410810c5012008200929000037030020032003290048370378200341c8006a41bba8c700410d10c50120002009290000370300200720032900483703002003420020014200200a1b220120027d20054200200a1b2202200454ad7d2205200220047d2204200256200520015620052001511b22001b37035020034200200420001b370348200341f8006a4120200341c8006a411010a7020c010b20034190016a22004200370300200341f8006a41106a22074200370300200341f8006a41086a2208420037030020034200370378200341c8006a41d4dcc700410810c5012008200341c8006a41086a220929000037030020032003290048370378200341c8006a41bba8c700410d10c5012000200929000037030020072003290048370300200341186a200341f8006a412010d301200341186a41106a2903002101200329032021052003280218210a20004200370300200742003703002008420037030020034200370378200341c8006a41d4dcc700410810c5012008200929000037030020032003290048370378200341c8006a41bba8c700410d10c50120002009290000370300200720032900483703002003427f20014200200a1b220120027c20054200200a1b220220047c22042002542200ad7c22022000200220015420022001511b22001b3703502003427f200420001b370348200341f8006a4120200341c8006a411010a7020b20034190036a24000baa0304017f027e087f027e230041206b22032400200229030021042001290300210520022802102106200141106a200241186a2207280200220810b5082001280210200141186a2209280200220a410c6c6a20062008410c6c10c9081a4100210b200741003602002009200a20086a2208360200200341086a2209200836020020032001290210370300200228021c21072001411c6a200241246a220a280200220810b508200128021c200141246a220c280200220d410c6c6a20072008410c6c10c9081a200a4100360200200c200d20086a2208360200200341106a41086a220a20083602002003200129021c3703102002290308210e2001290308210f024020012d0028450d0020022d0028410047210b0b200020032903003702102000200329031037021c2000200b3a0028200041186a2009280200360200200041246a200a2802003602002000200e200f200f200e561b3703082000427f200520047c220e200e2005541b3703000240200241146a2802002201450d002001410c6c450d002006102c0b0240200241206a2802002201450d002001410c6c450d002007102c0b200341206a24000bee0302037f017e230041d0016b22042400200441206a22054200370300200441086a41106a22064200370300200441086a41086a420037030020044200370308200441086a41c1dcc700410610c501200441c0016a41f8ccc600411010c5012005200441c0016a41086a290000370300200620042900c0013703002004200441086a412010c601024002400240024002400240417f2004280204410020042802001b220520036a220320032005491b418080c002418080f001200241ff017122031b4b0d00200441086a109b01024002400240024020030e03010200010b20044188016a21030c020b200441186a21030c010b200441d0006a21030b024020032903084201520d00200341106a2903002001540d050b42002107200241ff01710e03010203010b200041800c3b0001200041013a0000200041036a41003a00000c040b200121070c010b427f200142ffffffffffffffffbf7f7c220720072001541b21070b200041003a0000200041306a41013a0000200041286a4200370200200041206a4280808080c000370300200041186a4204370300200041106a427f370300200041086a2007370300200041316a2004280008360000200041346a2004410b6a2800003600000c010b200041800c3b0001200041013a0000200041036a41003a00000b200441d0016a24000b1c00200128021841d8bdc800410f2001411c6a28020028020c1100000b130020004101360204200041c094c4003602000b940d02037f027e200028022821022001200141086a22032802004104102f200128020020032802006a20023600002003200328020041046a2202360200200028022c2104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802302104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802342104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802382104200120024104102f200128020020032802006a20043600002003200328020041046a2202360200200028023c2104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802402104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802442104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802482104200120024104102f200128020020032802006a20043600002003200328020041046a2202360200200028024c2104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802502104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802542104200120024104102f200128020020032802006a20043600002003200328020041046a3602002001200041d8006a10be0320002802602102200120032802004104102f200128020020032802006a20023600002003200328020041046a220236020020002802642104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802682104200120024104102f200128020020032802006a20043600002003200328020041046a2202360200200028026c2104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802702104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802742104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802782104200120024104102f200128020020032802006a20043600002003200328020041046a2202360200200028027c2104200120024104102f200128020020032802006a20043600002003200328020041046a22023602002000280280012104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002903002105200120024108102f200128020020032802006a20053700002003200328020041086a22023602002000280284012104200120024104102f200128020020032802006a20043600002003200328020041046a22023602002000280288012104200120024104102f200128020020032802006a20043600002003200328020041046a2202360200200028028c012104200120024104102f200128020020032802006a20043600002003200328020041046a2202360200200041106a290300210520002903082106200120024110102f200128020020032802006a22022005370008200220063700002003200328020041106a2202360200200041206a290300210520002903182106200120024110102f200128020020032802006a22022005370008200220063700002003200328020041106a22023602002000280290012104200120024104102f200128020020032802006a20043600002003200328020041046a22023602002000280294012104200120024104102f200128020020032802006a20043600002003200328020041046a22023602002000280298012104200120024104102f200128020020032802006a20043600002003200328020041046a2202360200200028029c012104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802a0012104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802a4012104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802a8012104200120024104102f200128020020032802006a20043600002003200328020041046a220236020020002802ac012100200120024104102f200128020020032802006a20003600002003200328020041046a3602000b130020004124360204200041d495c4003602000b3400200041ac95c40036020420004100360200200041146a4102360200200041106a4184b8c400360200200041086a420d3702000bb30101017f230041b0016b22022400200241c0006a4200370300200241386a4200370300200241306a4200370300200241086a4200370300200241106a4200370300200241186a4200370300200241206a42003703002002420037032820024280808080103703602002410036025820024201370350200242818080801037034820024200370300200241e8006a410041c80010cb081a20004100360208200042013702002002200010d506200241b0016a24000b850203037f017e037f230041106b21020240024002400240024002400240200128020422034108490d002001280200220429000021052001200341786a22063602042001200441086a22043602002006450d0320042d000021062001200341776a22073602042001200441016a36020041002108024020060e03030200040b410221080c020b200041023a00090f0b410121080b2007450d0320042d000121062001200341766a3602042001200441026a3602004100210120060e020201030b200041023a00090f0b410121010b200020013a0009200020083a0008200020053703002000200228010a36010a2000410e6a2002410e6a2f01003b01000f0b200041023a00090be30101047f230041c0186b22022400024041c018103222030d001039000b2003200241386a41881810c908220341003b018e182003410036028818200320022903083703901820034198186a200241106a290300370300200341a0186a200241186a290300370300200341a8186a200241206a290300370300200341b0186a200241286a290300370300200341b8186a200241306a29030037030020032001280200220436029018200120033602002001200128020441016a2205360204200441003b018c1820042003360288182000200336020420002005360200200241c0186a24000be30101047f230041b0166b22022400024041b816103222030d001039000b2003200241306a41801610c908220341003b0186162003410036028016200320022903003703881620034190166a200241086a29030037030020034198166a200241106a290300370300200341a0166a200241186a290300370300200341a8166a200241206a290300370300200341b0166a200241286a29030037030020032001280200220436028816200120033602002001200128020441016a2205360204200441003b01841620042003360280162000200336020420002005360200200241b0166a24000b4401027f23004190186b220024000240419018103222010d001039000b2001200041086a41881810c908220141003b018e18200141003602881820004190186a240020010b4101027f23004180166b220024000240418816103222010d001039000b2001200041801610c908220141003b018616200141003602801620004180166a240020010b130020004104360204200041c0bfc4003602000b3400200041afdec70036020420004100360200200041146a4101360200200041106a41d0c9c400360200200041086a42043702000b130020004101360204200041fccdc4003602000b870101027f230041106b2203240002404110103222040d001039000b200342043702042003200436020020034100410410a90820002003290300370200200041086a2003280208220441046a360200200328020020044102746a220420013e020c200420014220883e0208200420023e0204200420024220883e0200200010aa08200341106a24000b9c04030d7f017e017f02400240200241086a2802002203200141086a28020022046a22054101200541014b1b220641ffffffff03712006470d0020064102742205417f4c0d0002400240024020050d00410421070c010b200510372207450d010b20002007360200200041086a2006360200200020054102763602042004450d022006417f6a2108200341027420022802006a417c6a2109200641027420076a417c6a210a4100210b200141086a210c2004210d0240034002400240024002400240024002402004200d200b417f736a220e4d0d002001280200200e4102746a220f280200450d06024020030d00410021000c060b420021104100210020092102200a21050340200d200e4d0d022003200320006a2211417f6a4d0d032006200820006a22114d0d0420052002350200200f3502007e20107c20053502007c22103e02002002417c6a21022005417c6a21052010422088211020032000417f6a22006a450d050c000b0b200e20044188adc800103f000b200e200d4188adc800103f000b2011417f6a20034188adc800103f000b201120064188adc800103f000b2010a721000b2006200b20036a417f736a220520064f0d02200720054102746a20003602000b200b41016a220b2004460d04200a417c6a210a2008417f6a2108200c280200210d0c000b0b2005200641b0aec800103f000b1039000b103b000b0240200141046a28020041ffffffff0371450d002001280200102c0b0bd21007037f017e017f017e0c7f027e017f23004180026b22022400200141346a2802002103200141386a2802002104200141086a29030021052001280230210620012903002107200241186a200141d4006a290000370300200241106a200141cc006a290000370300200241086a200141c4006a2900003703002002200129003c37030020022005370328200220073703202006200441d8006c22086a210920062101024002402004450d004100210a20024190016a41086a210b20024190016a41106a210c20024190016a41186a210d024002400340200b2006200a6a2201413c6a290200370300200c200141c4006a290200370300200d200141cc006a29020037030020024190016a41206a220e200141d4006a2802003602002002200141346a29020037039001200141306a280200220f450d02200141286a2903002105200141206a2903002107200241d8016a41206a200e280200360200200241d8016a41186a220e200d290300370300200241d8016a41106a2210200c290300370300200241d8016a41086a2211200b29030037030020022002290390013703d80102400240200720052002290320200241206a41086a29030010b30422120d004100210e0c010b200241b8016a41186a200e290300370300200241b8016a41106a2010290300370300200241b8016a41086a2011290300370300200220022903d8013703b8014101210e201221130b200f200f280200417f6a2210360200024020100d00200f41046a22102010280200417f6a221036020020100d00200f102c0b200e0d012008200a41d8006a220a470d000b200921010c020b200241306a41086a220f200241b8016a41086a290300370300200241306a41106a220b200241b8016a41106a290300370300200241306a41186a220c200241b8016a41186a290300370300200220022903b801220537035020022005370330024002400240412410322208450d002008200229033037020020082013360220200841186a200c290300370200200841106a200b290300370200200841086a200f2903003702002002200936023c2002200141d8006a220b36023820022003360234200220063602302002200241206a360240024002400240200441d8006c41a87f6a200a470d0041012103410121040c010b20024190016a41086a210a20024190016a41106a210c20024190016a41186a210d410121034101210403402002200b220141d8006a220b360238200141306a280200210f200141286a2903002105200141206a2903002107200a2001413c6a290200370300200c200141c4006a290200370300200d200141cc006a29020037030020024190016a41206a220e200141d4006a2802003602002002200141346a2902003703900102400240200f450d00200241d8016a41206a200e280200360200200241d8016a41186a2211200d290300370300200241d8016a41106a2212200c290300370300200241d8016a41086a2206200a29030037030020022002290390013703d80102400240200720052002280240220e290300200e41086a29030010b30422100d004100210e0c010b200241b8016a41186a2011290300370300200241b8016a41106a2012290300370300200241b8016a41086a2006290300370300200220022903d8013703b8014101210e201021130b200f200f280200417f6a2210360200024020100d00200f41046a22102010280200417f6a221036020020100d00200f102c0b200e0d012009200b470d020b200141d8006a210b0c020b200241d0006a41086a200241b8016a41086a2903002205370300200241d0006a41106a200241b8016a41106a2903002207370300200241d0006a41186a200241b8016a41186a2903002214370300200220022903b8012215370350201120143703002012200737030020062005370300200220153703d801024020042003470d00200341016a22012003490d062003410174220f2001200f20014b1b22014104200141044b1bad42247e2205422088a7220f0d062005a722014100480d06200f454102742109200341246c201620031b2116024002400240024002402008410020031b220f0d002001450d010c030b20160d0120010d020b200921080c020b200f20162001103522080d010c050b200110322208450d040b200141246e21030b2008200441246c6a220120022903d80137020020122903002105201129030021072006290300211420012013360220200141086a2014370200200141186a2007370200200141106a2005370200200441016a21042002280238220b200228023c2209470d000b0b2009200b6b220141d8006d210f02402001450d00200f41d8006c210f200b41306a210103402001280200220a200a280200417f6a36020002402001280200220a2802000d00200a41046a220a200a280200417f6a3602002001280200220a41046a2802000d00200a102c0b200141d8006a2101200f41a87f6a220f0d000b0b024020022802304100200228023422011b220f450d00200141d8006c450d00200f102c0b20040d02200041003602002003450d062008450d06200341246c450d062008102c0c060b2009450d020b1039000b2000200336020420002008360200200041086a20043602002000410c6a2002290300370000200041146a200241086a2903003700002000411c6a200241106a290300370000200041246a200241186a2903003700000c030b103b000b200141d8006a21010b024020092001460d000340200141306a220f280200220a200a280200417f6a360200200141d8006a21010240200f280200220a2802000d00200a41046a220a200a280200417f6a360200200f280200220f41046a2802000d00200f102c0b20092001470d000b0b02402003450d00200341d8006c450d002006102c0b200041003602000b20024180026a24000b9c1703067f047e137f230041f0046b22022400200241c0016a41186a200141186a290000370300200241c0016a41106a200141106a290000370300200241c0016a41086a200141086a290000370300200220012900003703c001024002400240024002400240024020002802002203450d00200028020421040c010b41e80210322203450d0141002104200341003b010620034100360200200341086a200241e0016a41e00210c9081a20004100360204200020033602000b02400340200341086a210520032f01062106410021010240034020062001460d01200241c0016a2005412010cc082207450d03200541206a2105200141016a21012007417f4a0d000b2001417f6a21060b02402004450d002004417f6a2104200320064102746a41e8026a28020021030c010b0b200241186a200241c0016a41186a2903002208370300200241106a200241c0016a41106a2903002209370300200241086a200241c0016a41086a290300220a370300200220022903c001220b37030020024180016a41186a2205200837030020024180016a41106a2207200937030020024180016a41086a2204200a3703002002200b370380010240024020032f0106220c410b490d00410521074100210d02400240200641054f0d0041042107200621040c010b41052104024002402006417b6a0e020201000b200641796a21044101210d410621070c010b410021044101210d0b41e80210322205450d034100210e200541003b010620054100360200200541086a200241e0016a41e00210c9082106200241c0016a41086a220c200320074105746a220141106a290000370300200241c0016a41106a220f200141186a290000370300200241c0016a41186a2210200141206a2900003703002002200141086a2900003703c0012006200141286a20032f01062007417f736a220141057410c9081a200320073b0106200520013b0106200241a0016a41186a22112010290300370300200241a0016a41106a2212200f290300370300200241a0016a41086a2213200c290300370300200220022903c0013703a00120052003200d1b220720044105746a220141286a200141086a220620072f010620046b41057410ca081a200141206a20024180016a41186a2214290300370000200141186a20024180016a41106a2215290300370000200141106a20024180016a41086a22162903003700002006200229038001370000200720072f010641016a3b0106200241e0006a41186a20112903002208370300200241e0006a41106a20122903002209370300200241e0006a41086a2013290300220a370300200220022903a001220b370360200241c0006a41186a22172008370300200241c0006a41106a22182009370300200241c0006a41086a2219200a3703002002200b370340024020032802002201450d004100210e03402005211a200321052001210320052f01042104201420172903003703002015201829030037030020162019290300370300200220022903403703800141000d0602400240024020032f01062205410b490d004100211b41042106024020044105490d0020042106024002402004417b6a0e020201000b200441796a21044101211b410621060c010b410021044101211b410521060b41980310322205450d08200e41016a210e41002101200541003b010620054100360200200541086a200241e0016a41900310c908211c2010200341086a220d20064105746a220741186a290000370300200f200741106a290000370300200c200741086a290000370300200220072900003703c001201c200d200641016a221d4105746a20032f0106221e2006417f736a220741057410c908211c200320063b0106200520073b0106201120102903003703002012200f2903003703002013200c290300370300200220022903c0013703a001200541e8026a2003201d4102746a41e8026a201e20066b41027410c908211d02400340200520014102746a41e8026a280200220620013b0104200620053602002001200120074922066a220120074b0d0120060d000b0b200241e0016a41186a20112903002208370300200241e0016a41106a20122903002209370300200241e0016a41086a2013290300220a370300200220022903a001220b3703e00120102008370300200f2009370300200c200a3703002002200b3703c001201b450d012004410274201d6a41086a201d200441016a22014102746a220720052f010620046b41027410ca081a2007201a360200201c20014105746a201c20044105746a220720052f010620046b41057410ca081a200741186a2014290300370000200741106a2015290300370000200741086a20162903003700002007200229038001370000200520052f010641016a22073b01062001200741ffff037122074b0d020340200520014102746a41e8026a280200220620013b010420062005360200200120012007496a220620074b0d03200120074f2104200621012004450d000c030b0b2004410274200341e8026a22076a41086a2007200441016a22014102746a2207200520046b220641027410ca081a2007201a360200200341086a220720014105746a200720044105746a2207200641057410ca081a200741186a20024180016a41186a290300370000200741106a20024180016a41106a290300370000200741086a20024180016a41086a29030037000020072002290380013700002003200541016a22073b0106200420054b0d05200741ffff037121050340200320014102746a41e8026a280200220720013b010420072003360200200120012005496a220720054b0d06200120054f2106200721012006450d000c060b0b2004410274200341e8026a22076a41086a2007200441016a22014102746a220720032f010620046b41027410ca081a2007201a360200200d20014105746a200d20044105746a220720032f010620046b41057410ca081a200741186a2014290300370000200741106a2015290300370000200741086a20162903003700002007200229038001370000200320032f010641016a22073b01062001200741ffff037122074b0d000340200320014102746a41e8026a280200220620013b0104200620033602002001200120074922066a220120074b0d0120060d000b0b201720102903003703002018200f2903003703002019200c290300370300200220022903c001370340200328020022010d000b0b200241206a41186a20172903002208370300200241206a41106a20182903002209370300200241206a41086a2019290300220a37030020022002290340220b37032020102008370300200f2009370300200c200a3703002002200b3703c0012000280200450d0541980310322201450d03200141003b010620014100360200200141086a200241e0016a41900310c9081a2001200028020022073602e8022000200136020020002000280204220641016a360204200741003b010420072001360200200241e0016a41186a200241c0016a41186a290300370300200241e0016a41106a200241c0016a41106a290300370300200241e0016a41086a200241c0016a41086a290300370300200220022903c0013703e0012006200e470d0620012f01062206410a4b0d07200120064105746a220741086a20022903e001370000200741106a200241e0016a41086a290300370000200741186a200241e0016a41106a290300370000200741206a200241e0016a41186a2903003700002001200641016a22073b0106200120074102746a41e8026a200536020020052001360200200520073b01042000200028020841016a3602080c020b200320064105746a220141286a200141086a220f200c20066b41057410ca081a200141206a2005290300370000200141186a2007290300370000200141106a2004290300370000200f200229038001370000200320032f010641016a3b01060b2000200028020841016a3602080b200241f0046a24000f0b1039000b41a5d0c800413541dcd0c800103c000b41ecd0c800412b41bcd2c800103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b911303037f017e107f23004190236b2202240020024190026a200141980210c9081a024002400240024002400240024020002802002201450d00200028020421030c010b41901810322201450d01410021032001200241b8066a41881810c908220441003b018e18200441003602881820004100360204200020043602000b200241b8066a2003200120024190026a108e020240024020022802b8064101460d0020024190026a10e60620022d0080044106490d0120024184046a280200410020024188046a28020022011b2203450d012001450d012003102c0c010b20024190026a41086a28020021042002290390022105200241046a20024190026a410c6a418c0210c9081a200241b8066a410c6a2802002101200241b8066a41086a280200210620022802bc062107200241d0206a200241046a418c0210c9081a0240024020062f018e182208410b490d00410521034100210902400240200141054f0d0041042103200121080c010b41052108024002402001417b6a0e020201000b200141796a210841012109410621030c010b41002108410121090b4190181032220a450d03200a200241b8066a41881810c908220b41003b018e18200b410036028818200620034198026c6a2201280204210c2001280200210d20024190026a200141086a41900210c9081a200b20014198026a20062f018e182003417f736a220e4198026c10c9082101200620033b018e182001200e3b018e182001200620091b220320084198026c6a22014198026a200120032f018e1820086b4198026c10ca081a200141086a2004360200200120053703002001410c6a200241d0206a418c0210c9081a200320032f018e1841016a3b018e18200241c01e6a20024190026a41900210c9081a0240024020062802881822010d00410021070c010b41002103200241f0226a210f200241f8226a211020024180236a211120024188236a21120340200d210e200c2113200a2114200621042001210620042f018c18210b200241d0206a200241c01e6a41900210c9081a20072003470d0602400240024020062f018e182203410b490d0041002109410421080240200b4105490d00200b210802400240200b417b6a0e020201000b200b41796a210b41012109410621080c010b4100210b41012109410521080b41c0181032220a450d08200741016a210741002101200a200241b8066a41881810c908220341003b018e182003410036028818200320022903e0223703901820034198186a200241e0226a41086a290300370300200341a0186a200f290300370300200341a8186a2010290300370300200341b0186a2011290300370300200341b8186a2012290300370300200620084198026c6a2204280204210c2004280200210d200241b8066a200441086a41900210c9081a200320044198026a20062f018e1822152008417f736a22044198026c10c9082103200620083b018e18200320043b018e1820024190026a200241b8066a41900210c9081a20034190186a200841027420066a4194186a201520086b41027410c908211502400340200320014102746a4190186a280200220820013b018c1820082003360288182001200120044922086a220120044b0d0120080d000b0b200241b8066a20024190026a41900210c9081a20024190026a200241b8066a41900210c9081a2009450d01200b41027420156a41086a2015200b41016a22014102746a220420032f018e18200b6b41027410ca081a200420143602002003200b4198026c6a22044198026a200420032f018e18200b6b4198026c10ca081a200420133602042004200e360200200441086a200241d0206a41900210c9081a200320032f018e1841016a22043b018e182001200441ffff037122044b0d020340200320014102746a4190186a280200220820013b018c182008200336028818200120012004496a220820044b0d03200120044f210b20082101200b450d000c030b0b200b41027420064190186a22046a41086a2004200b41016a22014102746a22042003200b6b220841027410ca081a200420143602002006200b4198026c6a22034198026a200320084198026c10ca081a200320133602042003200e360200200341086a200241d0206a41900210c9081a200620062f018e1841016a22033b018e18200b200341ffff037122034f0d050340200620014102746a4190186a280200220420013b018c182004200636028818200120012003496a220420034b0d06200120034f2108200421012008450d000c060b0b200b41027420064190186a22036a41086a2003200b41016a22014102746a220320062f018e18200b6b41027410ca081a200320143602002006200b4198026c6a22034198026a200320062f018e18200b6b4198026c10ca081a200320133602042003200e360200200341086a200241d0206a41900210c9081a200620062f018e1841016a22033b018e182001200341ffff037122034b0d000340200620014102746a4190186a280200220420013b018c1820042006360288182001200120034922046a220120034b0d0120040d000b0b200241c01e6a20024190026a41900210c9081a2007210320062802881822010d000b0b200241a8046a200241c01e6a41900210c9081a20024190026a200241a8046a41900210c9081a2000280200450d0541c01810322201450d032001200241b8066a41881810c908220141003b018e182001410036028818200120022903e0223703901820014198186a200241e8226a290300370300200141a0186a200241f0226a290300370300200141a8186a200241f8226a290300370300200141b0186a20024180236a290300370300200141b8186a20024188236a290300370300200120002802002203360290182000200136020020002000280204220441016a360204200341003b018c182003200136028818200241b8066a20024190026a41900210c9081a20042007470d0620012f018e182203410a4b0d072001200341016a22043b018e18200120034198026c6a2203200c3602042003200d360200200341086a200241b8066a41900210c9081a200120044102746a4190186a200a360200200a20043b018c18200a2001360288182000200028020841016a3602080c020b200620014198026c6a22034198026a2003200820016b4198026c10ca081a200341086a2004360200200320053703002003410c6a200241d0206a418c0210c9081a200620062f018e1841016a3b018e180b2000200028020841016a3602080b20024190236a24000f0b1039000b41a5d0c800413541dcd0c800103c000b41ecd0c800412b41bcd2c800103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b921201027f0240024020002802000d00024002400240024020002802080e0405000102030b0240024002400240200041106a2d0000417e6a0e06000102080803080b200041346a2802004101470d072000413c6a2802002201450d07200041386a2802002200450d072001450d072000102c0f0b200041146a2802004101470d062000411c6a2802002201450d06200041186a2802002200450d062001450d062000102c0f0b200041286a2802004101470d05200041306a2802002201450d052000412c6a2802002200450d052001450d052000102c0f0b200041186a2802002201450d04200041146a2802002200450d042001450d042000102c0f0b02400240024002400240200041106a2d0000417e6a0e06000102040403040b200041346a2802004101470d032000413c6a2802002201450d03200041386a2802002202450d032001450d032002102c0c030b200041146a2802004101470d022000411c6a2802002201450d02200041186a2802002202450d022001450d022002102c0c020b200041286a2802004101470d01200041306a2802002201450d012000412c6a2802002202450d012001450d012002102c0c010b200041186a2802002201450d00200041146a2802002202450d002001450d002002102c0b0240024002400240200041c8006a2d0000417e6a0e06000102070703070b200041ec006a2802004101470d06200041f4006a2802002201450d06200041f0006a2802002200450d062001450d062000102c0f0b200041cc006a2802004101470d05200041d4006a2802002201450d05200041d0006a2802002200450d052001450d052000102c0f0b200041e0006a2802004101470d04200041e8006a2802002201450d04200041e4006a2802002200450d042001450d042000102c0f0b200041d0006a2802002201450d03200041cc006a2802002200450d032001450d032000102c0f0b02400240024002400240200041106a2d0000417e6a0e06000102040403040b200041346a2802004101470d032000413c6a2802002201450d03200041386a2802002202450d032001450d032002102c0c030b200041146a2802004101470d022000411c6a2802002201450d02200041186a2802002202450d022001450d022002102c0c020b200041286a2802004101470d01200041306a2802002201450d012000412c6a2802002202450d012001450d012002102c0c010b200041186a2802002201450d00200041146a2802002202450d002001450d002002102c0b02400240024002400240200041c8006a2d0000417e6a0e06000102040403040b200041ec006a2802004101470d03200041f4006a2802002201450d03200041f0006a2802002202450d032001450d032002102c0c030b200041cc006a2802004101470d02200041d4006a2802002201450d02200041d0006a2802002202450d022001450d022002102c0c020b200041e0006a2802004101470d01200041e8006a2802002201450d01200041e4006a2802002202450d012001450d012002102c0c010b200041d0006a2802002201450d00200041cc006a2802002202450d002001450d002002102c0b024002400240024020004180016a2d0000417e6a0e06000102060603060b200041a4016a2802004101470d05200041ac016a2802002201450d05200041a8016a2802002200450d052001450d052000102c0f0b20004184016a2802004101470d042000418c016a2802002201450d0420004188016a2802002200450d042001450d042000102c0f0b20004198016a2802004101470d03200041a0016a2802002201450d032000419c016a2802002200450d032001450d032000102c0f0b20004188016a2802002201450d0220004184016a2802002200450d022001450d022000102c0f0b02400240024002400240200041106a2d0000417e6a0e06000102040403040b200041346a2802004101470d032000413c6a2802002201450d03200041386a2802002202450d032001450d032002102c0c030b200041146a2802004101470d022000411c6a2802002201450d02200041186a2802002202450d022001450d022002102c0c020b200041286a2802004101470d01200041306a2802002201450d012000412c6a2802002202450d012001450d012002102c0c010b200041186a2802002201450d00200041146a2802002202450d002001450d002002102c0b02400240024002400240200041c8006a2d0000417e6a0e06000102040403040b200041ec006a2802004101470d03200041f4006a2802002201450d03200041f0006a2802002202450d032001450d032002102c0c030b200041cc006a2802004101470d02200041d4006a2802002201450d02200041d0006a2802002202450d022001450d022002102c0c020b200041e0006a2802004101470d01200041e8006a2802002201450d01200041e4006a2802002202450d012001450d012002102c0c010b200041d0006a2802002201450d00200041cc006a2802002202450d002001450d002002102c0b0240024002400240024020004180016a2d0000417e6a0e06000102040403040b200041a4016a2802004101470d03200041ac016a2802002201450d03200041a8016a2802002202450d032001450d032002102c0c030b20004184016a2802004101470d022000418c016a2802002201450d0220004188016a2802002202450d022001450d022002102c0c020b20004198016a2802004101470d01200041a0016a2802002201450d012000419c016a2802002202450d012001450d012002102c0c010b20004188016a2802002201450d0020004184016a2802002202450d002001450d002002102c0b0240024002400240200041b8016a2d0000417e6a0e06000102050503050b200041dc016a2802004101470d04200041e4016a2802002201450d04200041e0016a2802002200450d042001450d042000102c0f0b200041bc016a2802004101470d03200041c4016a2802002201450d03200041c0016a2802002200450d032001450d032000102c0f0b200041d0016a2802004101470d02200041d8016a2802002201450d02200041d4016a2802002200450d022001450d022000102c0f0b200041c0016a2802002201450d01200041bc016a2802002200450d012001450d012000102c0f0b20002802082201450d0020002802042200450d002001450d002000102c0b0b8c0801057f230041106b2202240002400240024002400240024002400240024002400240024020012d00000e09010203040506070800010b200041083a00000c080b200041003a00000c070b200041013a0000200041046a200141046a2802003602000c060b410321030240024002400240200141246a2802000e0400010203000b410021030c020b200141306a2802002204417f4c0d08200141286a2802002105410121034101210602402004450d00200410322206450d0a0b20024100360208200220043602042002200636020020024100200410c8012002280200200228020822066a2005200410c9081a2002200620046a3602080c010b410221030b200041023a0000200041246a2003360200200041286a200229020037020020002001290001370001200041306a200241086a280200360200200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a2900003700000c050b410321030240024002400240200141046a2802000e0400010203000b410021030c020b200141106a2802002204417f4c0d07200141086a2802002105410121034101210602402004450d00200410322206450d090b20024100360208200220043602042002200636020020024100200410c8012002280200200228020822066a2005200410c9081a2002200620046a3602080c010b410221030b200041033a0000200041046a2003360200200041086a2002290200370200200041186a2001290318370300200041106a200241086a2802003602000c040b410321030240024002400240200141186a2802000e0400010203000b410021030c020b200141246a2802002204417f4c0d062001411c6a2802002105410121034101210602402004450d00200410322206450d080b20024100360208200220043602042002200636020020024100200410c8012002280200200228020822066a2005200410c9081a2002200620046a3602080c010b410221030b200041043a0000200041186a20033602002000411c6a200229020037020020002001290001370001200041246a200241086a280200360200200041096a200141096a290000370000200041116a200141116a2800003600000c030b200041053a0000200020012d00013a00010c020b200041063a0000200041106a200141106a290300370300200041086a200141086a2903003703000c010b2001410c6a2802002203417f4c0d01200141046a28020021010240024020030d00410121040c010b200310322204450d030b20024100360208200220033602042002200436020020024100200310c8012002280200200228020822046a2001200310c9081a2000410c6a200420036a360200200041073a0000200041046a20022903003702000b200241106a24000f0b103b000b1039000bc10201017f0240024002400240024002400240024020012d00000e0700010203040506070b200141046a10bd08200141106a220210be08200141146a2802002201450d0620022802002202450d0620014188026c450d062002102c200010a2010f0b200141046a10bd08200141106a220210be08200141146a2802002201450d0520022802002202450d0520014188026c450d052002102c200010a2010f0b200141046a10bd08200141106a220210be08200141146a2802002201450d0420022802002202450d0420014188026c450d042002102c200010a2010f0b200141046a10bd08200010a2010f0b200141086a2802002202450d02200141046a2802002201450d022002450d022001102c200010a2010f0b200141086a10a201200141046a10bf08200010a2010f0b200141086a10a201200141046a10bf080b200010a2010bc31b03017f1c7e337f230041a0026b220224002000290300210320004200370300200041e0016a2903002104200041186a2903002105200041206a2903002106200041286a2903002107200041306a2903002108200041386a2903002109200041c0006a290300210a200041c8006a290300210b200041d0006a290300210c200041d8006a290300210d200041e0006a290300210e200041e8006a290300210f200041f0006a2903002110200041f8006a290300211120004180016a290300211220004188016a290300211320004190016a290300211420004198016a2903002115200041a0016a2903002116200041a8016a2903002117200041b0016a2903002118200041b8016a2903002119200041c0016a290300211a200041c8016a290300211b200041d0016a290300211c2000290308211d2000290310211e200241186a41d8016a221f200041d8016a290300370300200241186a41d0016a2220201c370300200241186a41c8016a2221201b370300200241186a41c0016a201a370300200241186a41b8016a22222019370300200241186a41b0016a22232018370300200241186a41a8016a22242017370300200241186a41a0016a2016370300200241186a4198016a22252015370300200241186a4190016a22262014370300200241186a4188016a22272013370300200241186a4180016a2012370300200241186a41f8006a22282011370300200241186a41f0006a22292010370300200241186a41e8006a222a200f370300200241186a41e0006a200e370300200241186a41d8006a222b200d370300200241186a41d0006a222c200c370300200241186a41c8006a222d200b370300200241186a41c0006a200a370300200241186a41386a222e2009370300200241186a41306a222f2008370300200241186a41286a22302007370300200241186a41206a2006370300200241186a41186a22312005370300200241186a41e0016a20043703002002201e3703282002201d3703202002200337031820024184026a41026a2232200141036a2d00003a0000200220012f00013b018402200141046a2802002133200141086a28020021342001410c6a2802002135200141106a2903002104200141186a28020021362001411c6a2802002137200141206a2802002138200141246a2802002139200141286a280200213a2001412c6a280200213b200141306a290300210920012d0000210102400240024002400240024002402003a7223c0e0400010402030b20024194026a41026a20322d00003a0000200220022f0184023b019402420121032009210b203b213d203a212f2039213e203821302037213f2036212e20042105203521402034214120332142200121310c040b20024194026a41026a200241236a2d00003a000020024190026a41026a20322d00003a0000200220022f00213b019402200220022f0184023b019002202e290300210b200241cc006a280200213d202f280200212f200241186a412c6a280200213e20302802002130200241186a41246a280200213f203129030021052002412c6a2802002140200241186a41106a2802002141200241186a410c6a2802002142420221032002280238212e20022d002021312009210c203b2129203a212a2039212b2038212c2037212d203621432004210d203521282034214420332145200121460c030b20024194026a41026a200241236a2d00003a000020024190026a41026a200241db006a2d00003a0000200220022f00213b019402200220022f00593b019002202e290300210b202d2802002144202c290300210d202b2802002143202a280200212a2029290300210c20282d00002147200228025c2145200228026421282002280274212d200228027c212b20022802840121292002418c026a41026a20024193016a2d00003a000020024188026a41026a20322d00003a0000200220022f0091013b018c02200220022f0184023b0188022006422088a7213f2012422088a72148201d422088a721422007422088a7213e201e422088a721402008422088a7213d2006a7212e200aa72146200ea7212c2012a721202016a7211f201da721312007a72130201ea721412008a7212f20242903002106200241bc016a2802002124200241b4016a280200212320252802002125200241ac016a2802002149202628020021262027290300210720024194016a2802002127420421030c020b2002419c026a41026a2232200241236a2d00003a0000200220022f00213b019c02200241186a410c6a2802002142200241186a41106a28020021412002412c6a280200214020312903002105200241186a41246a280200213f20302802002130200241186a412c6a280200213e202f280200212f200241cc006a280200213d202e290300210b20022d002021312002280238212e20022d0058214620024198026a41026a224a200241db006a2d00003a0000200241106a41026a20024193016a2d00003a0000200220022f00593b019802200220022f0091013b01102029290300210c202a280200212a202b2802002143202c290300210d202d280200214420282d000021472002280284012129200228027c212b2002280278212c2002280274212d20022802642128200228025c21452002410c6a41026a200241cb016a2d00003a0000200220022f00c9013b010c20232d0000213c20242903002106200241bc016a2802002124200241b4016a280200212320252802002125200241ac016a280200214920262802002126202729030021072002419c016a280200214820024194016a2802002127200241f4016a280200214b201f280200214c200241ec016a280200214d2020280200214e200241e4016a280200214f20212802002121200241d4016a280200215020222802002122200241cc016a280200215120022802b801211f200228029801212020022903f801210920022903d8012104200241146a41026a20322d00003a0000200220022f019c023b01142032204a2d00003a0000200220022f0198023b019c024101213202400240024002402001417e6a0e06000102060603060b4101213220394101470d05203a4100203b1b2201450d05203b450d052001102c0c050b4101213220334101470d042034410020351b2201450d042035450d042001102c0c040b4101213220364101470d032037410020381b2201450d032038450d032001102c0c030b2033410020341b2201450d022034450d022001102c0c020b20024194026a41026a200241236a2d00003a000020024190026a41026a200241db006a2d00003a0000200220022f00213b019402200220022f00593b019002200241186a410c6a2802002142200241186a41106a28020021412002412c6a280200214020312903002105200241186a41246a280200213f20302802002130200241186a412c6a280200213e202f280200212f200241cc006a280200213d202e290300210b20022d002021312002280238212e20022d005821462002418c026a41026a20322d00003a0000200220022f0184023b018c022029290300210c202a280200212a202b2802002143202c290300210d202d2802002144420321032002280284012129200228027c212b2002280278212c2002280274212d20022802642128200228025c214520092106203b2124203a211f2039212320382125203721492036212620042107203521482034212020332127200121470b200241146a41026a20024194026a41026a2d00003a00002002419c026a41026a20024190026a41026a2d00003a0000200241106a41026a2002418c026a41026a2d00003a00002002410c6a41026a20024188026a41026a2d00003a0000200220022f0194023b0114200220022f0190023b019c02200220022f018c023b0110200220022f0188023b010c410021320240203c417f6a41024d0d00200241186a10a2010b203b214b203a214c2039214d2038214e2037214f203621212035215020342122203321512001213c0b200010a201200020313a000820002003370300200020463a0040200041386a200b370300200041346a203d360200200041306a202f3602002000412c6a203e360200200041286a2030360200200041246a203f3602002000202e360220200041186a2005370300200041146a2040360200200041106a20413602002000410c6a2042360200200020022f01143b00092000410b6a200241146a41026a2d00003a0000200020022f019c023b0041200041c3006a2002419c026a41026a2d00003a0000200041f8006a20473a0000200041f0006a200c3703002000202936026c200041e8006a202a3602002000202b3602642000202c3602602000202d36025c200041d8006a2043360200200041d0006a200d3703002000202836024c200041c8006a204436020020002045360244200041b0016a203c3a0000200041a8016a2006370300200041a4016a20243602002000201f3602a0012000419c016a202336020020004198016a202536020020004194016a204936020020004190016a202636020020004188016a200737030020004184016a20483602002000202036028001200041fc006a2027360200200020022f01103b0079200041fb006a200241106a41026a2d00003a0000200041b3016a2002410c6a41026a2d00003a0000200020022f010c3b00b101200020093703e001200041dc016a204b360200200041d8016a204c360200200041d4016a204d360200200041d0016a204e360200200041cc016a204f360200200041c8016a2021360200200020043703c001200041bc016a2050360200200041b8016a2022360200200041b4016a2051360200200241a0026a240020320b891806017f037e037f017e017f037e230041d0046b22032400200341206a200110b0010240024002400240024002400240024002400240024002400240024002400240024002402003290320a7450d00200341306a290300210420032903282105200341c0026a200210a80320032d00c0024101470d01200341386a41186a200341d9026a290000370300200341386a41106a200341d1026a290000370300200341386a41086a200341c9026a290000370300200320032900c102370338200341c0026a200341386a200520044102410110cd0620032802c0024101460d0e200341c0026a41106a22022903002106200341c0026a41086a22072903002104200341c0026a41186a220842003703002002420037030020074200370300200342003703c002200341e8006a41d4dcc700410810c5012007200341e8006a41086a2209290000370300200320032900683703c002200341e8006a41bba8c700410d10c5012008200929000037030020022003290068370300200341086a200341c0026a412010d301200341086a41106a29030021052003290310210a2003280208210b200842003703002002420037030020074200370300200342003703c002200341e8006a41d4dcc700410810c50120072009290000370300200320032900683703c002200341e8006a41bba8c700410d10c50120082009290000370300200220032900683703002003420020054200200b1b220520067d200a4200200b1b2206200454ad7d220a200620047d2204200656200a200556200a2005511b22021b37037020034200200420021b370368200341c0026a4120200341e8006a411010a7024100210820012802000e0c0d030405060708090a0b0c020d0b200041013b01000c100b200041013b01000c0f0b200341c0026a200141086a10fd06410021020240024002400240024002400240200141f0016a22072d00000e0706010203040500060b200141fc016a2802002202417f4c0d12200141f4016a28020021010240024020020d00410121070c010b200210322207450d140b200341003602702003200236026c20032007360268200341e8006a4100200210c8012003280268200328027022076a2001200210c9081a200341c3046a200720026a360000200320032903683700bb04410621020c050b200341c7046a20014180026a2903003700002003200141f8016a2903003700bf04410121020c040b200320072800013602b804410221020c030b200320072900013703b804410321020c020b200341b8046a41086a200741096a290000370300200320072900013703b804410421020c010b200341c7046a200741106a290000370000200341b8046a41086a200741096a290000370300200341a8046a41086a20014190026a2d00003a0000200320072900013703b804200320014188026a2902003703a804410521020b200341a0026a41086a200341e8026a290300370300200320032903c0023702b4022003200341e0026a2903003703a002200341d8026a2903002106200341d0026a290300210420032903c802210c200341e8006a200341f0026a41b80110c9081a200341d8006a41086a200341a8046a41086a290300370300200320032903a804370358200c42088820044238868421052004420888210d200341b8046a41086a350200200341c4046a330100200341c6046a3100004210868442208684210e20032903b804210420032900c704210a200ca72107410b21080c0a0b410121080c090b410221080c080b410321080c070b2001410c6a2802002202417f4c0d08200128020421010240024020020d00410121070c010b200210322207450d0a0b200341003602b802200320023602b402200320073602b002200341b0026a4100200210c80120032802b00220032802b80222076a2001200210c9081a2003200720026a3602b802410421080c060b2001410c6a2802002202417f4c0d07200128020421010240024020020d00410121070c010b200210322207450d090b200341003602b802200320023602b402200320073602b002200341b0026a4100200210c80120032802b00220032802b80222076a2001200210c9081a2003200720026a3602b802410521080c050b200341c0026a200141086a10fd06200341a0026a41086a200341e8026a290300370300200320032903c0023702b4022003200341c0026a41206a2903003703a002200341d8026a2903002106200341d0026a290300210420032903c802210a200341e8006a200341f0026a41b80110c9081a200a42088820044238868421052004420888210d200aa72107410621080c040b200341c0026a200141086a10fd06200341a0026a41086a200341e8026a290300370300200320032903c0023702b4022003200341c0026a41206a2903003703a002200341d8026a2903002106200341d0026a290300210420032903c802210a200341e8006a200341f0026a41b80110c9081a200a42088820044238868421052004420888210d200aa72107410721080c030b2001410c6a2802002202417f4c0d04200128020421070240024020020d00410121080c010b200210322208450d060b200341003602b802200320023602b402200320083602b002200341b0026a4100200210c80120032802b00220032802b80222086a2007200210c9081a2003200820026a3602b80220012903102204420888200141186a29030022064238868421052006420888210d2004a72107410821080c020b2001410c6a2802002202417f4c0d03200128020421080240024020020d00410121090c010b200210322209450d050b41002107200341003602c004200320023602bc04200320093602b804200341b8046a4100200210c80120032802b80420032802c00422096a2008200210c9081a2003200920026a3602c0040240024002400240024002400240200141106a22022d00000e0706010203040500060b2001411c6a2802002202417f4c0d09200141146a28020021010240024020020d00410121070c010b200210322207450d0b0b200341003602702003200236026c20032007360268200341e8006a4100200210c8012003280268200328027022076a2001200210c9081a200341cb026a200720026a360000200320032903683700c302410621070c050b200341cf026a200141206a2903003700002003200141186a2903003700c702410121070c040b200320022800013602c002410221070c030b200320022900013703c002410321070c020b200341c8026a200241096a290000370300200320022900013703c002410421070c010b200341cf026a200241106a290000370000200341c0026a41086a200241096a290000370300200341e8006a41086a200141306a2d00003a0000200320022900013703c0022003200141286a290200370368410521070b200341b0026a41086a200341b8046a41086a280200360200200341a0026a41086a200341e8006a41086a290300370300200320032903b8043703b002200320032903683703a002200341c0026a41086a350200200341cc026a330100200341ce026a3100004210868442208684210d20032903c002210520032900cf022106410921080c010b200341c0026a200141086a10fd06200341a0026a41086a200341e8026a290300370300200320032903c0023702b4022003200341c0026a41206a2903003703a002200141f0016a290300210a200141f8016a290300210e200341d8026a2903002106200341d0026a290300210d20032903c802210c200341e8006a200341f0026a41b80110c9081a200a420888200e423886842104200c420888200d423886842105200e420888210e200d420888210d200aa72102200ca72107410a21080b200041086a20083602002000410c6a20032903b002370200200041286a2006370300200041306a20032903a002370300200041146a200341b0026a41086a280200360200200041386a200341a0026a41086a290300370300200041206a200d420886200542388884370300200041186a20054208862007ad42ff018384370300200041c0006a200341e8006a41b80110c9081a20004180026a200e420886200442388884370300200041f8016a20044208862002ad42ff01838437030020004188026a200a370300200041003a000020004190026a200329035837030020004198026a200341d8006a41086a2903003703000c030b200041013b01000c020b103b000b1039000b200341d0046a24000be10d02067f037e230041e01b6b22022400410121034101210441012105410121060240024002400240024002400240024002400240024002400240024002400240024002402001280200220741786a0e0401020003060b200141f8016a2903002108200141f0016a2903002109200241046a200141086a41e80110c9081a200241003602e003200241e0036a410472200241ec0110c9081a0240024020002802002207450d00200028020421030c010b41881610322207450d07410021032007200241e0056a41801610c908220441003b018616200441003602801620004100360204200020043602000b200241d0056a20032007200241e0036a10a3080240024020022802d0054101470d00200241e0036a41086a280200210720022903e003210a200241e0056a200241e0036a410c6a41e40110c9081a200241cc076a200241d0056a410c6a280200360200200220022902d4053702c407200241f0016a200241e0056a41f00110c9081a200241e0056a41086a20073602002002200a3703e005200241e0056a410c6a200241f0016a41f00110c9081a200220003602dc07200241e0056a2009200810c5081a0c010b200241d8056a290300210a200241e0036a10e606200aa7200a422088a74104746a220741d0146a2200427f2000290300220a20097c22092009200a542200200741d8146a2207290300220920087c2000ad7c220820095420082009511b22001b3703002007427f200820001b3703000b4101210441002103410121050c030b200141186a2903002108200141106a2903002109200241e0036a410c6a2001410c6a280200360200200241013602e003200220012902043702e4030240024020002802002207450d00200028020421030c010b41881610322207450d06410021032007200241e0056a41801610c908220441003b018616200441003602801620004100360204200020043602000b200220032007200241e0036a10a3080240024020022802004101470d00200241e0036a41086a280200210720022903e003210a200241e0056a200241e0036a410c6a41e40110c9081a200241cc076a2002410c6a280200360200200220022902043702c407200241f0016a200241e0056a41f00110c9081a200241e0056a41086a20073602002002200a3703e005200241e0056a410c6a200241f0016a41f00110c9081a200220003602dc07200241e0056a2009200810c5081a0c010b200241086a290300210a200241e0036a10e606200aa7200a422088a74104746a220741d0146a2200427f2000290300220a20097c22092009200a542200200741d8146a2207290300220920087c2000ad7c220820095420082009511b22001b3703002007427f200820001b3703000b4100210441012103410121050c020b200241e0056a410c6a2001410c6a280200360200200241d8076a200141186a290300370300200241e0076a200141206a290300370300200241e8076a200141286a290300370300200241f0076a200141306a29030037030041012103200241013602e005200220012902043702e4052002200141106a2903003703d0072000410c6a200241e0056a10a6084100210641012104410121050c020b200241e0036a41046a200141086a41e80110c9081a41002105200241003602e005200241e0056a410472200241e0036a41ec0110c9081a200241e0056a4190026a20014190026a290300370300200241e0056a4188026a20014188026a290300370300200241e0056a4180026a20014180026a290300370300200241e0056a41f8016a200141f8016a2903003703002002200141f0016a2903003703d0072000410c6a200241e0056a10a60841012103410121040b410121060b200128020021070b20070e0c0a0a0a0a0504030209080706010b1039000b200141086a10a201200141f0016a2d00004106490d08200141f8016a2802002207450d08200141f4016a2802002201450d082007450d082001102c0c080b200141086a10a2010c070b200141086a10a2010c060b200141086a2802002207450d0520012802042201450d052007450d052001102c0c050b200141086a2802002207450d0420012802042201450d042007450d042001102c0c040b2005450d03200141086a10a201200141f0016a2d00004106490d03200141f8016a2802002207450d03200141f4016a2802002201450d032007450d032001102c0c030b2003450d02200141086a10a2010c020b2006450d010240200141086a2802002207450d0020012802042200450d002007450d002000102c0b200141106a2d00004106490d01200141186a2802002207450d01200141146a2802002201450d012007450d012001102c0c010b2004450d00200141086a2802002207450d0020012802042201450d002007450d002001102c0b200241e01b6a24000bc10201027f02400240024002400240024002400240024020002802000e0b0808080800010203040506070b200041086a2802002201450d0720002802042200450d072001450d072000102c0f0b200041086a2802002201450d0620002802042200450d062001450d062000102c0f0b200041086a10a2010f0b200041086a10a2010f0b200041086a2802002201450d0320002802042200450d032001450d032000102c0f0b0240200041086a2802002201450d0020002802042202450d002001450d002002102c0b200041106a2d00004106490d02200041186a2802002201450d02200041146a2802002200450d022001450d022000102c0f0b200041086a10a2010c010b200041086a10a201200041f0016a2d00004106490d00200041f8016a2802002201450d00200041f4016a2802002200450d002001450d002000102c0f0b0ba70101047f0240200128020022020d0020004100360204200041106a4100360200200041003602180f0b2001280204210320012802082104200221010240034020022f01861621052003450d012003417f6a2103200220054102746a4188166a280200210220012802881621010c000b0b2000200336020c200041003602082000200136020420002003360200200041146a2005360200200041106a2002360200200020043602180bb00101027f23004180046b220124002001200010f706024020012802004102460d0020014188026a2102034020014180026a200141800210c9081a024002402001280280020d00200210f5060c010b200128028802450d00200128028402102c0b2001200010f70620012802004102470d000b0b024020002802042202450d0020022802801621002002102c2000450d00034020002802801621022000102c2002210020020d000b0b20014180046a24000ba70101047f0240200128020022020d0020004100360204200041106a4100360200200041003602180f0b2001280204210320012802082104200221010240034020022f018e1821052003450d012003417f6a2103200220054102746a4190186a280200210220012802901821010c000b0b2000200336020c200041003602082000200136020420002003360200200041146a2005360200200041106a2002360200200020043602180bcf0101027f230041b0046b220124002001200010f806024020012802004102460d00200141a0026a2102034020014198026a200141980210c9081a024002402001280298020d00200210f5060c010b20012802a002450d00200128029c02102c0b024020012d0088044106490d00200128029004450d00200128028c04102c0b2001200010f80620012802004102470d000b0b024020002802042202450d0020022802881821002002102c2000450d00034020002802881821022000102c2002210020020d000b0b200141b0046a24000bdc0801027f230041106b22022400024002400240024002400240024020002802000e050102030400010b200220012802184181cbc80041022001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a4184cbc800106621012002200041c0006a36020c20012002410c6a4184cbc800106621012002200041f8006a36020c20012002410c6a4184cbc800106621012002200041b0016a36020c20012002410c6a4184cbc80010661a20022d0008210020022802042203450d05200041ff017121014101210020010d04024020034101470d0020022d000941ff0171450d00200228020022012d00004104710d0041012100200128021841fa9dc00041012001411c6a28020028020c1100000d050b2002280200220028021841c5c7c50041012000411c6a28020028020c11000021000c040b20012802184194cbc80041042001411c6a28020028020c11000021000c040b200220012802184198cbc80041022001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a4184cbc80010661a20022d0008210020022802042203450d03200041ff017121014101210020010d02024020034101470d0020022d000941ff0171450d00200228020022012d00004104710d0041012100200128021841fa9dc00041012001411c6a28020028020c1100000d030b2002280200220028021841c5c7c50041012000411c6a28020028020c11000021000c020b20022001280218419acbc80041022001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a4184cbc800106621012002200041c0006a36020c20012002410c6a4184cbc80010661a20022d0008210020022802042203450d02200041ff017121014101210020010d01024020034101470d0020022d000941ff0171450d00200228020022012d00004104710d0041012100200128021841fa9dc00041012001411c6a28020028020c1100000d020b2002280200220028021841c5c7c50041012000411c6a28020028020c11000021000c010b20022001280218419ccbc80041022001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a4184cbc800106621012002200041c0006a36020c20012002410c6a4184cbc800106621012002200041f8006a36020c20012002410c6a4184cbc80010661a20022d0008210020022802042203450d01200041ff017121014101210020010d00024020034101470d0020022d000941ff0171450d00200228020022012d00004104710d0041012100200128021841fa9dc00041012001411c6a28020028020c1100000d010b2002280200220028021841c5c7c50041012000411c6a28020028020c11000021000b200220003a00080b200241106a2400200041ff01714100470b840401067f230041b0046b220224002000420037020820004100360200200041146a410036020020012802002203200128020822044198026c6a21052001280204210620032107024002402004450d0020024198026a41047221042003210103402001280200210720024198026a200141046a41940210c9081a02402007410c470d0020014198026a21070c020b200241046a20024198026a41940210c9081a20022007360298022004200241046a41940210c9081a200020024198026a10eb0620014198026a22012005470d000c020b0b20052007460d000340200722014198026a210702400240024002400240024002400240024020012802000e0b0808080800010203040506070b200141086a280200450d07200141046a280200102c0c070b200141086a280200450d06200141046a280200102c0c060b200141086a10f5060c050b200141086a10f5060c040b200141086a280200450d03200141046a280200102c0c030b0240200141086a280200450d00200141046a280200102c0b200141106a2d00004106490d02200141186a280200450d02200141146a280200102c0c020b200141086a10f5060c010b200141086a10f506200141f0016a2d00004106490d00200141f8016a280200450d00200141f4016a280200102c0b20052007470d000b0b02402006450d0020064198026c450d002003102c0b200241b0046a24000b9ebc0109087f017e027f057e047f037e087f017e017f230041d00f6b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802042203450d00200141046a2104200128020022052d0000210620012003417f6a22073602042001200541016a36020020060e1c01020304051e0607081e090a0b0c1e0d0e0f101112131415161718191e0b200041193602000c300b02402007450d0020052d0001210720012003417e6a22083602042001200541026a360200410a210902400240024002400240024002400240024020070e0a00010203040506070838090b20084104490d082005280002210620012003417a6a3602042001200541066a3602002006418194ebdc034f0d08410121090c370b200241800b6a2001108a0220022802800b2206450d0720022902840b210a410221090c350b20084108490d062005290002210a2001200341766a36020420012005410a6a360200410321090c350b200241800b6a2001108a0220022802800b2206450d0520022902840b210a410421090c330b200241800b6a2001108a0220022802800b2206450d0420022902840b210a410521090c320b200241800b6a200110890220022802800b22064102460d0320022902840b210a410621090c310b200241106a200110870220022802100d0220022802142207200428020041186e2205200520074b1bad42187e220a422088a70d1b200aa72205417f4c0d1b0240024020050d00410421060c010b200510322206450d1d0b41002103200241003602880b200220063602800b2002200541186e3602840b02402007450d000340200241086a20011087020240024020022802080d0020042802002209200228020c2205490d002005417f4c0d1f0240024020050d00410121080c010b200510372208450d21200428020021090b02400240024020092005490d0020082001280200200510c90821092001280204220b20054f0d012005200b4194afc0001058000b2005450d0220050d010c020b2001200b20056b3602042001200128020020056a3602002009450d012005ad220a422086200a84210a20022001108702024020022802000d002004280200220b20022802042205490d002005417f4c0d210240024020050d004101210c0c010b20051037220c450d232004280200210b0b02400240200b2005490d00200c2001280200200510c908210b2001280204220c20054f0d012005200c4194afc0001058000b2005450d012005450d01200c102c0c010b2001200c20056b3602042001200128020020056a360200200b0d030b200aa7450d010b2008102c0b200241800b6a10c1020c050b2005ad220d422086200d84210d0240200320022802840b470d00200241800b6a200310fd0320022802880b210320022802800b21060b2006200341186c6a2205200b36020c2005200a37020420052009360200200541106a200d370200200220022802880b41016a22033602880b2007417f6a22070d000b20022802800b21060b2006450d024107410b20061b210920022902840b210a0c300b200241800b6a200110840520022802800b2206450d0120022902840b210a410821090c2f0b200241800b6a2001108a0220022802800b2206450d0020022902840b210a0240200428020022054104490d0020012802002203280000210b20012005417c6a3602042001200341046a360200410921090c300b200aa7450d002006102c0b200041193602000c2f0b024002402007450d0020052d0001210620012003417e6a3602042001200541026a3602000240024020060e020001020b200241a80d6a200110fe07200241b40d6a280200450d01200241800b6a200241a80d6a41880210c9081a0240200428020022054104490d0020012802002203280000210620012005417c6a3602042001200341046a360200200241a80d6a200110840520022802a80d2203450d0020022902ac0d210a02402004280200220741044f0d000240200a422088a72201450d002001410c6c21052003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200541746a22050d000b0b200aa72201450d012001410c6c450d012003102c0c010b20012802002204280000210520012007417c6a3602042001200441046a36020020030d030b2002418c0b6a102b200241fc0b6a102b0c010b200241a80d6a200110fe07200241b40d6a280200450d00200241800b6a200241a80d6a41880210c9081a0240200428020022054104490d0020012802002203280000210620012005417c6a3602042001200341046a360200200241a80d6a200110840520022802a80d2203450d0020022902ac0d210a02402004280200220741044f0d000240200a422088a72201450d002001410c6c21052003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200541746a22050d000b0b200aa72201450d012001410c6c450d012003102c0c010b20012802002204280000210520012007417c6a3602042001200441046a36020020030d2d0b2002418c0b6a102b200241fc0b6a102b0b200041193602000c2f0b200241e8046a200241800b6a41880210c9081a410121010c2b0b02402007450d0020052d0001210620012003417e6a3602042001200541026a36020020060d00200241186a200110c1042002290318a70d002002290320210a20004102360200200041086a200a370300200041106a200241a80d6a41980210c9081a0c2e0b200041193602000c2d0b2007450d2720052d0001210620012003417e6a22093602042001200541026a3602000240024002400240024002400240024020060e0500010203042f0b20094104490d2e2005280002210b20012003417a6a3602042001200541066a360200410121054100210341002109410021010c060b41002106200241003a00a00b2009411f2009411f491b20056a41036a2108417d21040240034020092006460d01200241800b6a20066a200520066a220741026a2d00003a00002001200320046a3602042001200741036a3602002002200641016a22073a00a00b2004417f6a21042007210620074120470d000b200741ff01714120490d2e200320076b2203417e6a41034d0d2e20022900970b210a2002419f0b6a310000210d2002418f0b6a290000210e20022900870b210f20022800830b210b20022f00810b210620022d00800b21042008280000210920012003417a6a3602042001200520076a41066a3602002002200e3703d8082002200a422888200d42188684a72201ad422886200a42ffffffffff1f83843703e008200141107621032002200f3703d008200f421888a72108200f420888a72107200241df086a290000210d20022900d708210a200fa7210c410221050c050b200641ff0171450d2d200241003a00a00b0c2d0b20094104490d2c2005280002210b20012003417a6a3602042001200541066a360200410321050c020b41002106200241003a00a00b2009411f2009411f491b20056a41036a2108417d2104024002400240034020092006460d01200241800b6a20066a200520066a220741026a2d00003a00002001200320046a3602042001200741036a3602002002200641016a22073a00a00b2004417f6a21042007210620074120470d000b200741ff01714120490d2e200320076b220c417e6a4104490d2e20022900970b210a2002419f0b6a310000210d2002418f0b6a290000210e20022900870b210f20022800830b210b20022f00810b210620022d00800b2104200828000021092001200c417a6a3602042001200520076a220541066a22083602002003417a6a2007460d2e20082d000021032001200c41796a3602042001200541076a3602004100210120030e0202012e0b200641ff0171450d2d200241003a00a00b0c2d0b410121010b200a423888200d42088684a721032002200a422888200d42188684a73b01ec082002200a421888a73b01ea082002200a421088a73a00e9082002200aa73b00e7082002200e3700df082002200f3700d708200f421888a72108200f420888a72107200241e6086a290100210d20022901de08210a200fa7210c410421050c030b20094104490d2a2005280002210b20012003417a6a3602042001200541066a3602004200210a410521054200210d0b0b0b200041003b0126200020013a0025200020073b000d200020063b0006200020043a0005200020053a0004200041033602002000411b6a200d370000200041136a200a370000200041286a2009360200200041236a20033b00002000410f6a20083600002000410c6a200c3a0000200041086a200b3602002000412c6a200241a80d6a41fc0110c9081a0c2c0b02402007450d0020052d0001210620012003417e6a22073602042001200541026a360200024002400240024020060e0400010203040b41002106200241003a00a00b2003417d6a21030240034020072006460d01200241800b6a20066a200520066a220441026a2d00003a0000200120033602042001200441036a3602002002200641016a22043a00a00b2003417f6a21032004210620044120470d000b200441ff01714120490d04200241800b6a410f6a290000210a20022900970b210f20022900870b210d20022800830b210b20022f00810b210820022d00800b210c200241d0086a411f6a200241800b6a411f6a31000022103c0000200241d0086a410f6a200a3700002002200f3700e7082002200d3700d7082002200b3600d308200220083b00d1082002200c3a00d008200241286a200110f7032002290328a70d04200241386a29030021112002290330210e200f423888201042ff0183221042088684a72101200f422888201042188684a72112200f421088a72113200f421888a72114200fa72115410121070c2a0b200641ff0171450d03200241003a00a00b0c030b41002106200241003a00a00b2003417d6a21030240034020072006460d01200241800b6a20066a200520066a220441026a2d00003a0000200120033602042001200441036a3602002002200641016a22043a00a00b2003417f6a21032004210620044120470d000b200441ff01714120490d0320022900970b21162002419f0b6a31000021172002418f0b6a290000210a20022900870b210d20022800830b210b20022f00810b210820022d00800b210c200241d8006a200110f7032002290358a70d03200241d8006a41106a29030021112002290360210e200241c0006a200110f7032002290340a70d032016421888a721142016421088a721132016a72115200241c0006a41106a29030021102002290348210f2016422888201742188684a722124110762101410221070c290b200641ff0171450d02200241003a00a00b0c020b41002106200241003a00a00b410220036b21092003417d6a2107024002400340200920066a450d01200241800b6a20066a200520066a220441026a2d00003a0000200120073602042001200441036a3602002002200641016a22043a00a00b2007417f6a21072004210620044120470d000b200441ff01714120490d0320022900970b220f4228882002419f0b6a31000042188684a72112200f42ffffffffff1f83220a421888a72114200a421088a721132002418f0b6a290000210a20022900870b210d20022800830b210b20022f00810b210820022d00800b210c200fa7211541002106200241003a00a00b200520046a2109200420036b41026a21030340200320066a450d02200241800b6a20066a200920066a220541026a2d00003a0000200120073602042001200541036a3602002002200641016a22053a00a00b2007417f6a21072005210620054120470d000b200541ff01714120490d0320022900970b210f2002419f0b6a310000211020022900870b210e20022800830b210320022f00810b210520022d00800b2106200241b0086a410f6a200241800b6a410f6a29000022113700002002200e3700b708200220033600b308200220053b00b108200220063a00b008200241f0006a200110f7032002290370a70d03200241f0006a41106a290300211720022903782116200f422888201042188684a72207ad422886200f42ffffffffff1f832210421888a7ad4218862010421088a7ad42ff018342108684200fa7ad42ffff03838442ffffffffff1f8384210f201241107621012007411876ad2110410321070c290b200641ff0171450d02200241003a00a00b0c020b200641ff0171450d01200241003a00a00b0c010b41002106200241003a00a00b2003417d6a21030240034020072006460d01200241800b6a20066a200520066a220441026a2d00003a0000200120033602042001200441036a3602002002200641016a22043a00a00b2003417f6a21032004210620044120470d000b200441ff01714120490d0120022900970b210f2002419f0b6a31000021102002418f0b6a290000210a20022900870b210d20022800830b210b20022f00810b210820022d00800b210c20024188016a200110f703200229038801a70d01200f421888a72114200f421088a72113200fa7211520024188016a41106a2903002111200229039001210e200f422888201042188684a722124110762101410421070c270b200641ff0171450d00200241003a00a00b0b200041193602000c2b0b2007450d2320052d0001210620012003417e6a3602042001200541026a36020020060d23200241a0016a200110870220022802a0010d2320022802a4012206200428020041f0006e2205200520064b1bad42f0007e220a422088a70d13200aa72203417f4c0d130240024020030d00410421040c010b200310322204450d150b41002105200241003602880920022004360280092002200341f0006e36028409024002402006450d00200241800b6a41086a21090340200241800b6a200110ac0520022802840b210320022802800b2107200241e8046a200941e80010c9081a2003450d02200241e0026a200241e8046a41e80010c9081a02402005200228028409470d0020024180096a2005109905200228028809210520022802800921040b2004200541f0006c6a2205200336020420052007360200200541086a200241e0026a41e80010c9081a200220022802880941016a2205360288092006417f6a22060d000b20022802800921040b2004450d24200229028409210a2000200436020420004105360200200041086a200a370200200041106a200241a80d6a41980210c9081a0c2b0b20022802800921032005450d22200541f0006c2105200341046a21010c210b02402007450d0020052d0001210720012003417e6a22063602042001200541026a3602004107211202400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070e1800010203040538060708090a0b0c0d0e0f10111213141516180b41002107200241003a00a0092003417d6a21030240024002400240034020062007460d0120024180096a20076a200520076a220941026a2d00003a0000200120033602042001200941036a3602002002200741016a22093a00a0092003417f6a21032009210720094120470d000b200941ff01714120490d1b20024180096a411f6a310000210a200229009709210d200229008709210f200228008309210520022f008109210320022d0080092106200241d0086a410f6a20024180096a410f6a290000370000200241d0086a411f6a200a3c00002002200f3700d7082002200d3700e708200220053600d308200220033b00d108200220063a00d008200241d8086a290300210d200241e8086a290300210f20022903d008211820022903e008210a200241a8016a200110f70320022903a801a70d1b20042802002203450d1b200241b8016a290300211620022903b0012110200128020022072d0000210b20012003417f6a2204360204410121122001200741016a36020041002119200b0e043a0102031b0b200741ff0171450d1a200241003a00a0090c1a0b410121190c380b410221190c370b41002105200241003a00a0092003417e6a21030240034020042005460d0120024180096a20056a200720056a220641016a2d00003a0000200120033602042001200641026a3602002002200541016a22063a00a0092003417f6a21032006210520064120470d000b200641ff01714120490d1820022900970922174228882002419f096a31000042188684a7211a2017421888a7211b2017421088a7211c2002418f096a2900002111200229008709210e200228008309210520022f008109210620022d00800921092017a72115410321190c370b200541ff0171450d17200241003a00a0090c170b200241c0016a200110f70320022903c001a70d16200241c0016a41106a290300210d20022903c801210f200241c0076a41046a20024180096a41046a2f01003b010020022002280180093602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c807200f422088200d42208684210a200d4220882117200fa7210b410221120c360b200241d8016a200110f70320022903d801a70d15200241d8016a41106a290300210d20022903e001210f200241c0076a41046a20024180096a41046a2f01003b010020022002280180093602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c807200f422088200d42208684210a200d4220882117200fa7210b410321120c350b4104211220064104490d142005280002210920012003417a6a3602042001200541066a360200200241c0076a41046a20024180096a41046a2f01003b010020022002280180093602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c8074200210a420021170c340b200241f0016a200110870220022802f0010d1320022802f4012101200241c0076a41046a200241d0086a41046a2f01003b0100200220022801d0083602c0072002418094ebdc0336028409200220013602800920024180096a2001418094ebdc034b4102746a2802002109200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c8074200210a41052112420021170c330b20024180096a200110ca032002280280092209450d12200241c0076a41046a200241d0086a41046a2f01003b0100200220022801d0083602c00720024180096a41086a350200210a200228028409210b200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c80742002117410621120c320b2006450d1120052d0002211420012003417d6a22043602042001200541036a360200410021080240024002400240024020140e0403000102160b410121080c020b410221080c010b41002106200241003a00a0092003417c6a2103034020042006460d0220024180096a20066a200520066a220741036a2d00003a0000200120033602042001200741046a3602002002200641016a22073a00a0092003417f6a21032007210620074120470d000b200741ff01714120490d13200229009709220f4228882002419f096a31000042188684a72106200f421888a72107200f421088a721092002418f096a290000210a200229008709210d200228008309210c20022f008109211220022d0080092113200fa7210b410321080b200241df086a200a370000200241c0076a41046a200241b0086a41046a2f01003b01002002200d3700d7082002200c3600d308200220123b00d108200220133a00d008200220073b01ea08200220093a00e9082002200b3b00e708200220022801b0083602c007200220063601ec08200241ee086a310000210f200241de086a290100210e20022801d208210920022f01d008210c20022901e608210d20022901d6082111200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a29010037030041082112200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c8072011422088200e42208684210a20064118762119200e42208821172011a7210b0c320b200641ff0171450d11200241003a00a0090c110b41002107200241003a00a0092003417d6a21030240034020062007460d0120024180096a20076a200520076a220441026a2d00003a0000200120033602042001200441036a3602002002200741016a22043a00a0092003417f6a21032004210720044120470d000b200441ff01714120490d112002419f096a310000210f2002418f096a290000210e200229009709210d2002290087092111200228008309210920022f008109210c20022d0080092108200241c0076a41046a200241d0086a41046a2f00003b0100200220022800d0083602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290000370100200241c8076a41286a200241800b6a41286a290000370300200241c8076a41206a200241800b6a41206a290000370300200241c8076a41186a200241800b6a41186a290000370300200241c8076a41106a200241800b6a41106a290000370300200241c8076a41086a200241800b6a41086a290000370300200220022900800b3703c8072011422088200e42208684210a200e42208821172011a7210b410921120c310b200741ff0171450d10200241003a00a0090c100b200241f8016a200110870220022802f8010d0f20022802fc012109200241c0076a41046a20024180096a41046a2f01003b010020022002280180093602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c8074200210a410a2112420021170c2f0b20024180026a20011087022002280280020d0e2002280284022109200241c0076a41046a20024180096a41046a2f01003b010020022002280180093602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c8074200210a410b2112420021170c2e0b2006450d0d20052d0002210820012003417d6a3602042001200541036a360200200841e4004b0d0d200241c0076a41046a20024180096a41046a2f01003b010020022002280180093602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c8074200210a410c2112420021170c2d0b410d21120c2c0b410e21120c2b0b20024180096a200110ca032002280280092209450d0a200241c0076a41046a200241d0086a41046a2f01003b0100200220022801d0083602c00720024180096a41086a350200210a200228028409210b200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c80742002117410f21120c2a0b41002107200241003a00a0092006411f2006411f491b20056a41036a2112417d21040240034020062007460d0120024180096a20076a200520076a220941026a2d00003a00002001200320046a3602042001200941036a3602002002200741016a220b3a00a0092004417f6a2104200b2107200b4120470d000b200b41ff01714120490d0a2002418f096a290000210e200229009709210d2002290087092111200228008309210920022f008109210c20022d0080092108200241d0086a41186a2002419f096a310000220f3c00002002200d3703e0082002200e3703d808200220113703d0082003200b6b2203417e6a4104490d0a2012280000211d20012003417a6a36020420012005200b6a41066a360200200241c0076a41046a200241b0086a41046a2f01003b0100200220022801b0083602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a29010037030041102112200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c8072011422088200e42208684210a200e42208821172011a7210b0c2a0b200741ff0171450d09200241003a00a0090c090b411121120c280b20064104490d072005280002210920012003417a6a3602042001200541066a36020020024188026a20011087022002280288020d0720042802002203200228028c024102742205490d072005417f4c0d1a0240024020050d00410121060c010b200510372206450d1c200428020021030b0240024020032005490d0020062001280200200510c90821032001280204220620054f0d01200520064194afc0001058000b2006410020051b2201450d082005450d082001102c0c080b2001200620056b3602042001200128020020056a3602002003450d0702402005ad220a422086200a84220a422088a722010d00200aa721010c250b024020034103710d0020014103710d00200aa722014103710d0020014102762205450d252003450d08200a4202884280808080f0ffffff3f832005ad84210a2003210b0c260b200aa7450d072003102c0c070b41002107200241003a00a0092006411f2006411f491b20056a41036a2112417d21040240034020062007460d0120024180096a20076a200520076a220941026a2d00003a00002001200320046a3602042001200941036a3602002002200741016a220b3a00a0092004417f6a2104200b2107200b4120470d000b200b41ff01714120490d07200229009709210a2002419f096a310000210d200229008709210e200228008309210920022f008109210c20022d0080092108200241b0086a410f6a20024180096a410f6a290000220f3700002002200e3700b708200220093600b3082002200c3b00b108200220083a00b0082003200b6b2203417e6a4104490d072012280000211d20012003417a6a36020420012005200b6a41066a360200200241c0076a41046a200241d0086a41046a2f01003b0100200220022801d0083602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c807200a422888200d42188684a72201ad422886200a42ffffffffff1f8384210d200e422088200f42208684210a200f42208821172001411876ad210f200ea7210b411321120c270b200741ff0171450d06200241003a00a0090c060b20024190026a200110f703200229039002a70d0520024190026a41106a290300210d200229039802210f200241c0076a41046a20024180096a41046a2f01003b010020022002280180093602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c807200f422088200d42208684210a200d4220882117200fa7210b411421120c250b200241b0026a200110870220022802b0020d0420022802b4022109200241a8026a200110870220022802a8020d0420022802ac02210b200241c0076a41046a20024180096a41046a2f01003b010020022002280180093602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c807411521120c240b41002107200241003a00a0092006411f2006411f491b20056a41036a210b417d21090240034020062007460d0120024180096a20076a200520076a220441026a2d00003a00002001200320096a3602042001200441036a3602002002200741016a22043a00a0092009417f6a21092004210720044120470d000b200441ff01714120490d04200320046b2203417e6a41034d0d04200229009709210a2002419f096a310000210d2002418f096a290000210e2002290087092111200228008309210920022f008109210c20022d0080092108200b280000211d20012003417a6a3602042001200520046a41066a360200200241c0076a41046a200241b0086a41046a2f01003b01002002200a423888200d42088684a73b01ee082002200a422888200d42188684a73b01ec082002200a421888a73b01ea082002200a421088a73a00e9082002200aa73b00e708200220093600d3082002200c3b00d108200220083a00d008200220022801b0083602c007200241ef086a310000210f200220113700d7082002200e3700df0820022900e708210d200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c8072011422088200e42208684210a200e42208821172011a7210b411621120c240b200741ff0171450d03200241003a00a0090c030b200241a80d6a200110bd0720022802a80d2209450d02200241b00d6a280200210520022802ac0d210b200241a80d6a200110f9030240024020022802a80d450d00200241800b6a200241a80d6a41c00110c9081a200241a80d6a200110a90420022903a80d4201520d01200241800b6a10e901200b41ffffffff07710d030c040b200b41ffffffff07710d020c030b200241d0086a41286a200241d80d6a290300370300200241d0086a41206a200241a80d6a41286a290300370300200241d0086a41186a200241a80d6a41206a290300370300200241d0086a41106a200241a80d6a41186a290300370300200241d8086a200241a80d6a41106a290300370300200220022903b00d3703d00802400240200428020022034104490d0020012802002206280000211320012003417c6a3602042001200641046a360200200241c0026a200110fa0320022f01c0020d0120022f01c2022114200241b8026a200110870220022802b8020d0120022802bc02211e200241c4076a200241b60b6a2f01003b0100200220022801b20b3602c007200241a10b6a2900002111200241800b6a41106a310000210f200241c00b6a2903002116200241b80b6a2903002110200241ac0b6a2f0100211b200241940b6a280200211d20022900990b210e20022903880b210d20022801ae0b211a20022d00ab0b211c20022f00a90b211520022d00980b211f20022f01920b212020022d00910b211920022903800b210a200241e8046a200241c80b6a41f80010c9081a2002418e096a200241d0086a41086a29030037010020024196096a200241d0086a41106a2903003701002002419e096a200241d0086a41186a290300370100200241a6096a200241d0086a41206a29030037010020024180096a412e6a200241d0086a41286a2903002217370100200241c8076a412e6a2017370100200220022903d00837018609200241c8076a41086a20024180096a41086a290100370300200241c8076a41106a20024180096a41106a290100370300200241c8076a41186a20024180096a41186a290100370300200241c8076a41206a20024180096a41206a290100370300200241c8076a41286a20024180096a41286a29010037030020022002290180093703c807200a4220882117200a4220862005ad84210a411721120c240b200241800b6a10e901200b41ffffffff07710d020c030b200241800b6a10e901200b41ffffffff07710d010c020b200241a80d6a200110bd0720022802a80d2209450d01200241b00d6a280200210520022802ac0d210b200241a80d6a200110f9030240024020022802a80d450d00200241800b6a200241a80d6a41c00110c9081a200241a80d6a200110a90420022903a80d4201520d01200241800b6a10e901200b41ffffffff07710d020c030b200b41ffffffff07710d010c020b200241d0086a41286a200241d80d6a290300370300200241d0086a41206a200241a80d6a41286a290300370300200241d0086a41186a200241a80d6a41206a290300370300200241d0086a41106a200241a80d6a41186a290300370300200241d8086a200241a80d6a41106a290300370300200220022903b00d3703d00802400240200428020022034104490d0020012802002206280000211320012003417c6a3602042001200641046a360200200241d0026a200110fa0320022f01d0020d0120022f01d2022114200241c8026a200110870220022802c8020d0120022802cc02211e200241c4076a200241b60b6a2f01003b0100200220022801b20b3602c007200241a10b6a2900002111200241800b6a41106a310000210f200241c00b6a2903002116200241b80b6a2903002110200241ac0b6a2f0100211b200241940b6a280200211d20022900990b210e20022903880b210d20022801ae0b211a20022d00ab0b211c20022f00a90b211520022d00980b211f20022f01920b212020022d00910b211920022903800b210a200241e8046a200241c80b6a41f80010c9081a2002418e096a200241d0086a41086a29030037010020024196096a200241d0086a41106a290300370100411821122002419e096a200241d0086a41186a290300370100200241a6096a200241d0086a41206a29030037010020024180096a412e6a200241d0086a41286a2903002217370100200241c8076a412e6a2017370100200220022903d00837018609200241c8076a41086a20024180096a41086a290100370300200241c8076a41106a20024180096a41106a290100370300200241c8076a41186a20024180096a41186a290100370300200241c8076a41206a20024180096a41206a290100370300200241c8076a41286a20024180096a41286a29010037030020022002290180093703c807200a4220882117200a4220862005ad84210a0c230b200241800b6a10e901200b41ffffffff07710d010c020b200241800b6a10e901200b41ffffffff0771450d010b2009102c0b200041193602000c290b02402007450d0020012003417e6a3602042001200541026a3602000b200041193602000c280b02402007450d0020052d0001210620012003417e6a3602042001200541026a360200410021050240024020060e020001020b200241e0026a200110d80420022d00e0024101460d0120024180096a200241e0026a41017241c00110c9081a200241e0026a2001108a0220022802e0022205450d01200220022902e4023703a80d200241b00d6a20024180096a41c00110c9081a200241800b6a200241a80d6a41c80110c9081a0b200241e8046a200241800b6a41c80110c9081a2000200536020420004108360200200041086a200241e8046a41c80110c9081a200041d0016a200241c8076a41d80010c9081a0c280b200041193602000c270b2007450d1620052d0001210620012003417e6a22073602042001200541026a36020002400240024020060e03000102190b200241a80d6a200110ad0320022903b00d4202510d18200241800b6a200241a80d6a41800210c9081a200428020022054104490d1820012802002203280000210720012005417c6a3602042001200341046a360200200241a80d6a200110840520022802a80d2206450d1820022902ac0d210a02402004280200220341044f0d000240200a422088a72201450d002001410c6c21052006210103400240200141046a280200450d002001280200102c0b2001410c6a2101200541746a22050d000b0b200aa72201450d192001410c6c450d192006102c0c190b20012802002204280000210520012003417c6a3602042001200441046a36020020060d190c180b200241a80d6a200110ad0320022903b00d4202510d17200241800b6a200241a80d6a41800210c9081a200428020022054104490d1720012802002203280000210720012005417c6a3602042001200341046a360200200241a80d6a200110840520022802a80d2206450d1720022902ac0d210a02402004280200220341044f0d000240200a422088a72201450d002001410c6c21052006210103400240200141046a280200450d002001280200102c0b2001410c6a2101200541746a22050d000b0b200aa72201450d182001410c6c450d182006102c0c180b20012802002204280000210520012003417c6a3602042001200441046a3602002006450d17200241e8046a200241800b6a41800210c9081a410221040c190b20074104490d162005280002210720012003417a6a22063602042001200541066a36020041032104200641034d0d16200528000621062001200341766a36020420012005410a6a360200200241e8046a200241a80d6a41800210c9081a0c180b02402007450d0020052d0001210620012003417e6a22073602042001200541026a36020020060d0020074104490d002005280002210820012003417a6a3602042001200541066a360200200241800b6a2001108a0220022802800b2209450d00200241880b6a280200210c20022802840b210b200241d8026a20011087020240024020022802d8020d0020022802dc0222032004280200410c6e2205200520034b1bad420c7e220a422088a70d11200aa72206417f4c0d110240024020060d00410421070c010b200610322207450d130b41002105200241003602f004200220073602e80420022006410c6e22063602ec0402402003450d00410021050340200241800b6a2001108a02024020022802800b22060d0020022802e804210302402005450d002005410c6c21052003210103400240200141046a280200450d002001280200102c0b2001410c6a2101200541746a22050d000b0b20022802ec042201450d032001410c6c450d032003102c0c030b20022902840b210a0240200520022802ec04470d00200241e8046a2005410110ec0120022802f004210520022802e80421070b20072005410c6c6a2205200a37020420052006360200200220022802f00441016a22053602f0042003417f6a22030d000b20022802ec04210620022802e80421070b20070d010b200b450d012009102c0c010b2009450d0002400240024002400240200428020022044104490d0020012802002213280000211520012004417c6a22033602042001201341046a36020020034104490d012013280004211c2001200441786a22033602042001201341086a36020020034104490d022013280008211b2001200441746a221436020420012013410c6a36020041002103200241003a00c00b200441736a2104034020142003460d04200241800b6a20036a201320036a2212410c6a2d00003a00002001200436020420012012410d6a3602002002200341016a22123a00c00b2004417f6a210420122103201241c000470d000b200241e8046a41086a2201200241800b6a41086a290300370300200241e8046a41106a2203200241800b6a41106a290300370300200241e8046a41186a2204200241800b6a41186a290300370300200241e8046a41206a2213200241800b6a41206a290300370300200241e8046a41286a2214200241800b6a41286a290300370300200241e8046a41306a221a200241800b6a41306a290300370300200241e8046a41386a2219200241800b6a41386a290300370300200220022903800b3703e804201241ff0171413f4d0d04200241e0026a41386a22122019290300370300200241e0026a41306a201a290300220a370300200241e0026a41286a2014290300220d370300200241e0026a41206a2013290300220f370300200241e0026a41186a2004290300220e370300200241e0026a41106a20032903002211370300200241e0026a41086a20012903002210370300200220022903e80422163703e00220024180096a41306a200a37030020024180096a41286a200d37030020024180096a41206a200f37030020024180096a41186a200e37030020024180096a41106a201137030020024180096a41086a201037030020024180096a41386a201229030037030020022016370380092009450d05200241c8076a41386a220120024180096a41386a290300370300200241c8076a41306a220320024180096a41306a290300370300200241c8076a41286a220420024180096a41286a290300370300200241c8076a41206a221220024180096a41206a290300370300200241c8076a41186a221320024180096a41186a290300370300200241c8076a41106a221420024180096a41106a290300370300200241c8076a41086a221a20024180096a41086a29030037030020022002290380093703c807200041286a201b360200200041246a201c360200200041206a20153602002000411c6a2005360200200041186a2006360200200041146a2007360200200041106a200c3602002000410c6a200b360200200041086a2009360200200020083602042000410a3602002000412c6a20022903c807370200200041346a201a2903003702002000413c6a2014290300370200200041c4006a2013290300370200200041cc006a2012290300370200200041d4006a2004290300370200200041dc006a2003290300370200200041e4006a2001290300370200200041ec006a200241a80d6a41bc0110c9081a0c2b0b0240200b450d002009102c0b02402005450d002005410c6c21052007210103400240200141046a280200450d002001280200102c0b2001410c6a2101200541746a22050d000b0b2007410020061b2201450d042006410c6c450d042001102c0c040b0240200b450d002009102c0b02402005450d002005410c6c21052007210103400240200141046a280200450d002001280200102c0b2001410c6a2101200541746a22050d000b0b2007410020061b2201450d032006410c6c450d032001102c0c030b0240200b450d002009102c0b02402005450d002005410c6c21052007210103400240200141046a280200450d002001280200102c0b2001410c6a2101200541746a22050d000b0b2007410020061b2201450d022006410c6c450d022001102c0c020b200341ff0171450d00200241003a00c00b0b0240200b450d002009102c0b02402005450d002005410c6c21052007210103400240200141046a280200450d002001280200102c0b2001410c6a2101200541746a22050d000b0b2007410020061b2201450d002006410c6c450d002001102c0b200041193602000c250b02402007450d0020012003417e6a3602042001200541026a3602000b200041193602000c240b02402007450d0020052d0001210620012003417e6a22073602042001200541026a360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020060e24000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223250b20074104490d242005280002210720012003417a6a3602042001200541066a360200410121060c230b20074104490d232005280002210720012003417a6a3602042001200541066a360200410221060c220b20074104490d222005280002210720012003417a6a3602042001200541066a360200410321060c210b4104210620074104490d212005280002210720012003417a6a3602042001200541066a3602000c200b20074104490d202005280002210720012003417a6a3602042001200541066a360200410521060c1f0b20074104490d1f2005280002210720012003417a6a360204410621062001200541066a3602000c1e0b20074104490d1e2005280002210720012003417a6a3602042001200541066a360200410721060c1d0b20074104490d1d2005280002210720012003417a6a3602042001200541066a360200410821060c1c0b20074104490d1c2005280002210720012003417a6a3602042001200541066a360200410921060c1b0b20074104490d1b2005280002210720012003417a6a3602042001200541066a360200410a21060c1a0b20074104490d1a2005280002210720012003417a6a3602042001200541066a360200410b21060c190b20074104490d192005280002210720012003417a6a3602042001200541066a360200410c21060c180b2007450d1820052d0002210620012003417d6a22093602042001200541036a360200410021070240024020060e0201001a0b20094104490d19200528000321042001200341796a3602042001200541076a360200410121070b2004ad210a4200210d410d21060c170b20074104490d172005280002210720012003417a6a3602042001200541066a360200410e21060c160b20074104490d162005280002210720012003417a6a3602042001200541066a360200410f21060c150b20074104490d152005280002210720012003417a6a3602042001200541066a360200411021060c140b20074104490d142005280002210720012003417a6a3602042001200541066a360200411121060c130b20074104490d132005280002210720012003417a6a3602042001200541066a360200411221060c120b20074104490d122005280002210720012003417a6a3602042001200541066a360200411321060c110b20074104490d112005280002210720012003417a6a3602042001200541066a360200411421060c100b20074104490d102005280002210720012003417a6a3602042001200541066a360200411521060c0f0b20074104490d0f2005280002210720012003417a6a3602042001200541066a360200411621060c0e0b20074108490d0e2005290002210a2001200341766a36020420012005410a6a3602004200210d411721060c0d0b20074104490d0d2005280002210720012003417a6a3602042001200541066a360200411821060c0c0b20074104490d0c2005280002210720012003417a6a3602042001200541066a360200411921060c0b0b20074104490d0b2005280002210720012003417a6a3602042001200541066a360200411a21060c0a0b20074110490d0a2005410a6a290000210d2005290002210a20012003416e6a3602042001200541126a360200411b21060c090b20074110490d092005410a6a290000210d2005290002210a20012003416e6a3602042001200541126a360200411c21060c080b20074104490d082005280002210720012003417a6a3602042001200541066a360200411d21060c070b20074104490d072005280002210720012003417a6a3602042001200541066a360200411e21060c060b20074104490d062005280002210720012003417a6a3602042001200541066a360200411f21060c050b20074104490d052005280002210720012003417a6a3602042001200541066a360200412021060c040b20074104490d042005280002210720012003417a6a3602042001200541066a360200412121060c030b20074104490d032005280002210720012003417a6a3602042001200541066a360200412221060c020b20074104490d022005280002210720012003417a6a3602042001200541066a360200412321060c010b20074104490d012005280002210720012003417a6a3602042001200541066a3602004200210a412421064200210d0b2000410c360200200041186a200d370200200041106a200a3702002000410c6a2007360200200041086a2006360200200041206a200241a80d6a41880210c9081a0c240b200041193602000c230b02402007450d0020012003417e6a3602042001200541026a3602000b200041193602000c220b02402007450d0020052d0001210620012003417e6a3602042001200541026a36020020060d00200241800b6a200110c90520022802800b2204450d00200241800b6a41086a2203280200210520022802840b2109200241800b6a200110ca0520022802800b0d0d02402005450d002004200541d0006c6a2107200421010340200141046a41003602002001280200210620014101360200200141086a2802002205200320051b210302402005450d002003450d002006102c0b200141d0006a22012007470d000b0b2009450d00200941d0006c450d002004102c0b200041193602000c210b02402007450d0020012003417e6a3602042001200541026a3602000b200041193602000c200b02402007450d0020012003417e6a3602042001200541026a3602000b200041193602000c1f0b02402007450d0020012003417e6a3602042001200541026a3602000b200041193602000c1e0b02402007450d0020012003417e6a3602042001200541026a3602000b200041193602000c1d0b02402007450d0020012003417e6a3602042001200541026a3602000b200041193602000c1c0b02402007450d0020052d0001210620012003417e6a22073602042001200541026a360200024002400240024020060e03000102040b20074104490d032005280002210620012003417a6a22073602042001200541066a36020020074104490d03200528000621072001200341766a220436020420012005410a6a36020020044104490d03200528000a21042001200341726a36020420012005410e6a360200410121010c020b20074104490d022005280002210620012003417a6a3602042001200541066a360200410221010c010b20074104490d012005280002210620012003417a6a22073602042001200541066a36020020074104490d01200528000621072001200341766a36020420012005410a6a360200410321010b2000200136020420004114360200200041106a20043602002000410c6a2007360200200041086a2006360200200041146a200241a80d6a41940210c9081a0c1c0b200041193602000c1b0b02402007450d0020012003417e6a3602042001200541026a3602000b200041193602000c1a0b2007450d0820052d0001210b20012003417e6a2208360204410221092001200541026a3602000240024002400240200b0e05000b0102030c0b20084104490d0b2005280002210720012003417a6a3602042001200541066a360200200241800b6a2001108a0220022802800b2206450d0b20022902840b210a200241800b6a2001108a0220022802800b22040d08200aa7450d0b2006102c0c0b0b410321090c090b410421090c080b20084104490d082005280002210720012003417a6a3602042001200541066a360200410521090c070b02402007450d0020052d0001210620012003417e6a22073602042001200541026a3602000240024002400240024020060e0400010203050b20074104490d042005280002210620012003417a6a3602042001200541066a36020020024180096a200110c90320022d0098094102460d04200241880b6a20024194096a2902003703002002200229028c093703800b200228028809210b20022802840921042002280280092107200241900b6a200241a80d6a41d40110c9081a410121090c030b20074104490d032005280002210620012003417a6a3602042001200541066a360200200241800b6a200241a80d6a41e40110c9081a410221090c020b20074104490d022005280002210620012003417a6a3602042001200541066a360200200241a80d6a200110be0420022d00a80d410a460d02200241b00d6a280200210b20022802ac0d210420022802a80d2107200241800b6a200241b40d6a41e40110c9081a410321090c010b20074104490d012005280002210620012003417a6a22073602042001200541066a36020020074104490d01200528000621072001200341766a220436020420012005410a6a360200200441034d0d01200528000a21042001200341726a220b36020420012005410e6a36020041042109200b4104490d01200528000e210b20012003416e6a3602042001200541126a360200200241800b6a200241a80d6a41e40110c9081a0b200241e8046a200241800b6a41e40110c9081a200041186a200b360200200041146a2004360200200041106a20073602002000410c6a2006360200200041086a2009360200200041173602002000411c6a200241e8046a41e40110c9081a200041a0026a20024180036a29030037030020004198026a200241e0026a41186a29030037030020004190026a200241e0026a41106a29030037030020004188026a200241e0026a41086a29030037030020004180026a20022903e0023703000c190b200041193602000c180b02402007450d0020052d0001210620012003417e6a22093602042001200541026a360200024002400240024002400240024020060e0400010203070b200241a80d6a200110f30620022802a80d2101200241800b6a200241a80d6a41047241a40210c9081a20014119460d06200241a80d6a200241800b6a41a40210c9081a41a80210322205450d0820052001360200200541046a200241a80d6a41a40210c9081a20022903b008210d20022903b808210f20022f01c008210720022d00c208210420022f00c308210920022f00c50821084101210b4200210a0c030b200241a80d6a200110f30620022802a80d2103200241800b6a200241a80d6a41047241a40210c9081a20034119460d05200241a80d6a200241800b6a41a40210c9081a41a80210322205450d0720052003360200200541046a200241a80d6a41a40210c9081a200428020022034108490d0420012802002206290000210d2001200341786a3602042001200641086a3602004102210b0c020b41002106200241003a00c80d2003417d6a21030240034020092006460d01200241a80d6a20066a200520066a220741026a2d00003a0000200120033602042001200741036a3602002002200641016a22073a00c80d2003417f6a21032007210620074120470d000b200741ff01714120490d0520022900bf0d220a422888200241c70d6a310000220e42188684a72108200a421888a72109200a421088a72104200241b70d6a290000210f20022900af0d210d20022800ab0d210520022f00a90d210320022d00a80d2106200aa72107200a423888200e42088684a7ad210a4103210b0c020b200641ff0171450d04200241003a00c80d0c040b41002106200241003a00c80d2003417d6a2103034020092006460d02200241a80d6a20066a200520066a220741026a2d00003a0000200120033602042001200741036a3602002002200641016a22073a00c80d2003417f6a21032007210620074120470d000b200741ff01714120490d0320022900bf0d210a200241c70d6a310000210e200241b70d6a290000210f20022900af0d210d20022800ab0d210520022f00a90d210320022d00a80d2106200241a80d6a200110f30620022802a80d210b200241800b6a200241a80d6a41047241a40210c9081a200b4119460d03200241a80d6a200241800b6a41a40210c9081a41a80210322201450d05200a421888a72109200a421088a72104200aa721072001200b3602004104210b200141046a200241a80d6a41a40210c9081a200a422888200e42188684a72208411076ad210a0b200020043a0022200020033b000a200020063a0009200041183602002000412b6a200a4220883c0000200041276a200a3e00002000412c6a2001360200200041256a20083b0000200041236a20093b0000200041206a20073b0100200041186a200f370200200041106a200d3702002000410c6a2005360200200041086a200b3a0000200041306a200241e8046a41f80110c9081a0c1a0b200641ff0171450d01200241003a00c80d0c010b20051083022005102c0b200041193602000c170b103b000b1039000b200241e0026a41086a20032802002201360200200220022903800b220a3703e0022000410c6a2005360200200041086a2009360200200020043602042000410e360200200041106a200a370200200041186a20013602002000411c6a200241a80d6a418c0210c9081a0c140b20022902840b210d410121090c010b200041193602000c120b20002009360204200041163602002000411c6a200d370200200041186a2004360200200041106a200a3702002000410c6a2006360200200041086a2007360200200041246a200241a80d6a41840210c9081a0c110b200041193602000c100b200041193602000c0f0b200241e8046a200241800b6a41800210c9081a410121040b200241e0026a200241e8046a41800210c9081a2000411c6a2005360200200041146a200a370200200041106a20063602002000410c6a2007360200200041086a200436020020004109360200200041206a200241e0026a41800210c9081a0c0d0b4104210b4200210a2001450d002003102c0b200241c0076a41046a20024180096a41046a2f01003b010020022002280180093602c007200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c80742002117411221120c010b2002200a3703c008200241b0086a41186a200f370300200241c0076a41046a200241a2086a41046a2f01003b0100200220183703b0082002200d3703b808200220063b00a908200220093a00a808200220022801a2083602c007200220053600ab08200241bf086a290000211720022801aa08211d20022f01a808212020022900b7082121200241e8046a200241a80d6a41f80010c9081a200241c8076a412e6a200241800b6a412e6a290100370100200241c8076a41286a200241800b6a41286a290100370300200241c8076a41206a200241800b6a41206a290100370300200241c8076a41186a200241800b6a41186a290100370300200241c8076a41106a200241800b6a41106a290100370300200241c8076a41086a200241800b6a41086a290100370300200220022901800b3703c807200a423888200f42088684210d2021422088201742208684210a2005411876211f200f423888210f201742208821172018421888a721092018420888a7210c2018a721082021a7210b0b200241b8076a41046a2201200241c0076a41046a2f01003b0100200220022802c0073602b807200241e0026a200241e8046a41f80010c9081a20024180076a412e6a2205200241c8076a412e6a29010037010020024180076a41286a2203200241c8076a41286a29030037030020024180076a41206a2206200241c8076a41206a29030037030020024180076a41186a2207200241c8076a41186a29030037030020024180076a41106a2204200241c8076a41106a29030037030020024180076a41086a2222200241c8076a41086a290300370300200220022903c80737038007200041396a2011370000200041316a200e370000200041286a200f3c0000200041206a200d370200200041186a2017422086200a42208884370200200041106a200a422086200bad84370200200041c6006a201a360100200041c4006a201b3b01002000201c3a0043200041c1006a20153b0000200041306a201f3a00002000412c6a201d360200200020203b012a200020193a00292000410c6a20093602002000200c3b010a200020083a0009200041086a20123a000020004106360200200041d8006a2016370200200041d0006a2010370200200020022802b80736014a200041ce006a20012f01003b0100200041e0006a200241e0026a41f80010c9081a200041e0016a20143b0100200041dc016a201e360200200041d8016a201336020020002002290380073701e201200041ea016a2022290300370100200041f2016a2004290300370100200041fa016a200729030037010020004182026a20062903003701002000418a026a200329030037010020004190026a200529010037010020004198026a20022903f006370300200041a0026a200241f0066a41086a2903003703000c090b03402001102b200141f0006a2101200541907f6a22050d000b0b2002280284092201450d00200141f0006c450d002003102c0b200041193602000c060b200020053b002a200020063a0029200020133a0022200020083b000a2000200c3a000920004104360200200041d8006a2017370200200041d0006a2016370200200041c8006a2010370200200041c0006a200f370200200041386a2011370200200041306a200e3702002000412c6a2003360000200041276a20013b0000200041256a20123b0000200041236a20143b0000200041206a20153b0000200041186a200a370000200041106a200d3700002000410c6a200b360000200041086a20073a0000200041e0006a200241a80d6a41c80110c9081a0c050b200041193602000c040b200241e8046a200241800b6a41880210c9081a410221010b200241e0026a200241e8046a41880210c9081a2000411c6a2005360200200041146a200a370200200041106a20033602002000410c6a2006360200200041086a200136020020004101360200200041206a200241e0026a41880210c9081a0c020b0b20004100360200200041186a200b360200200041106a200a3702002000410c6a2006360200200041086a2009360200200041206a200241a80d6a41880210c9081a0b200241d00f6a24000bab6909067f017e0a7f017e037f017e0a7f037e037f23004190106b22022400410421034101210441012105024002400240024002400240024002400240024002400240024002400240024020012802002206417f6a0e0600060e0302010e0b2002200141106a41e80110c908220641f80d6a41086a22072001410c6a280200360200200620012902043703f80d200641e8016a2000200641f80d6a10f606200641f80d6a41106a200641e8016a41106a2903003703002007200641e8016a41086a2204290300370300200620062903e80122083703f80d200641e00b6a41086a22032004280200360200200620083703e00b200641a0026a200641e00b6a10ed062003200641f80d6a41146a280200360200200620062902840e3703e00b20064180026a200641e00b6a10ef06200641f0066a410c6a200641a0026a41086a290300370200200641f0066a41146a200641a0026a41106a2903003702002006418c076a200641a0026a41186a28020036020020064194076a22092006290380023702002006419c076a20064180026a41086a290300370200200641a4076a20064180026a41106a290300370200200641ac076a20064180026a41186a280200360200200641013602f006200620062903a0023702f4062006410136029007200641f80d6a41f0016a2104200641f80d6a410472210a20064180056a41046a210b20064180056a410c6a2100200641f80d6a41ec016a210c200641e00b6a41f0016a210d200641e00b6a410472210e200641d8076a41046a210f200641c8096a4104722110200641f0066a4104722111200641c8096a41f8016a211241012105034002400240024020054101460d002006410c3602e00b0c010b200641c8096a201110f7060240024020062802c80922034102460d002012290300210820062903b80b2113200641d8076a201041ec0110c9081a024002402003450d00200a20062902d807370200200641f80d6a41186a200837030041082103200a41086a200641d8076a41086a280200360200200620133703880e0c010b2007200f41e80110c9081a200641f80d6a41f8016a2008370300200620133703e80f410a21030b200620033602f80d200641e00b6a200641f80d6a41980210c9081a0c010b410c21032006410c3602f80d024020062802f006450d00201110ee0620062802f80d21030b201120062902c809370200201141086a200641c8096a41086a290200370200201141106a200641c8096a41106a290200370200201141186a200641c8096a41186a280200360200200641003602f0062006410c3602e00b2003410c460d01200641f80d6a10ec060b20062802e00b2203410c460d0020064180056a200e41ec0110c9081a200641d8046a41206a200d41206a290300370300200641d8046a41186a200d41186a290300370300200641d8046a41106a200d41106a290300370300200641d8046a41086a200d41086a2903003703002006200d2903003703d8040c010b02402006280290074101470d00200641f80d6a200910f8060240024020062802f80d22034102470d00410c21030c010b200641c8096a200a41940210c9081a200641f80d6a200641c8096a41940210c9081a200641d8076a200641c8096a41ec0110c9081a200641b0076a41206a2205200c41206a290200370300200641b0076a41186a2214200c41186a290200370300200641b0076a41106a2215200c41106a290200370300200641b0076a41086a2216200c41086a2902003703002006200c2902003703b00702402003450d00200020062903b00737020020064180056a41086a200641d8076a41086a280200360200200041086a2016290300370200200041106a2015290300370200200041186a2014290300370200200041206a2005290300370200200620062902d80737038005410921030c010b200b200f41e80110c9081a200641d8046a41206a2005290300370300200641d8046a41186a2014290300370300200641d8046a41106a2015290300370300200641d8046a41086a2016290300370300200620062903b0073703d804410b21030b024020062802e00b410c460d00200641e00b6a10ec060b2003410c470d010b024020062802f006450d00201110ee060b0240200628029007450d00200910f0060b200610a201410d21034100210641012104410121054101210c410121140c0d0b200641e8026a20064180056a41ec0110c9081a200641c0026a41206a2205200641d8046a41206a290300370300200641c0026a41186a2214200641d8046a41186a290300370300200641c0026a41106a2215200641d8046a41106a290300370300200641c0026a41086a2216200641d8046a41086a290300370300200620062903d8043703c002200620033602f80d200a200641e8026a41ec0110c9081a200441206a2005290300370300200441186a2014290300370300200441106a2015290300370300200441086a2016290300370300200420062903c002370300200641f80d6a200610f9062103200641f80d6a10ec0620062802f0062105200341ff01712203410d460d000b02402005450d00201110ee060b0240200628029007450d00200910f0060b200610a20141002105410121040c0c0b200141106a290300211720024180056a200141186a41e80110c9081a200141086a28020021182001410c6a28020021192001280204210e200241d8046a41146a4100360200200242003703e004200241003602d8040240024020194198026c2206450d00200e20066a2112200241d8046a410c6a21072000410c6a211a200241e00b6a410c6a211b200241e00b6a4180026a210c200241e00b6a41206a2111200241e00b6a41086a210d200241d8076a411c6a2109200241d8076a41046a2110200241e00b6a410472211c200241f80d6a41046a211d200241e80d6a211e200241d10d6a210b200241f80d6a410372211f200241c8096a4103722120200041146a2121200241e00b6a41f8016a210a200e2115034002400240024002400240024002400240024002400240024002400240201528020022060e0c0d000102030c0b0a090809080d0b02400240200041086a280200450d0020002802002206450d08200241e8026a2000280204200610fa060c010b200241003602f002200241003602e8020b02400240200041146a280200450d00201a2802002206450d07200241f80d6a2000280210200610fb060c010b200241003602800e200241003602f80d0b200241fc026a200241f80d6a41086a280200360200200220022903f80d3702f402200241e00b6a41086a2206200241d8046a41086a280200360200200220022903d8043703e00b200241f80d6a200241e00b6a10ed06200241f80d6a10ee062006200741086a280200360200200220072902003703e00b200241f80d6a200241e00b6a10ef06200241f80d6a10f0060c0f0b02400240200041086a280200450d0020002802002206450d05200241e00b6a2000280204200610fa060c010b200241003602e80b200241003602e00b0b201b2007290200370200201b41086a200741086a280200360200200241c8096a41086a200241d8046a41086a2206280200360200200220022903d8043703c809200241f80d6a200241c8096a10ed06200241f80d6a10ee062006200d290300370300200241d8046a41106a200241e00b6a41106a290300370300200220022903e00b3703d8040c0b0b200d200241d8046a41086a2206280200360200200220022903d8043703e00b024002402021280200450d00201a2802002204450d03200241f80d6a2000280210200410fb060c010b200241003602800e200241003602f80d0b201b20022903f80d370200201b41086a200241f80d6a41086a280200360200200241c8096a41086a200741086a280200360200200220072902003703c809200241f80d6a200241c8096a10ef06200241f80d6a10f0062006200d290300370300200241d8046a41106a200241e00b6a41106a290300370300200220022903e00b3703d8040c0a0b2002200010fc06200241e8026a41186a200241186a2802002206360200200241e8026a41106a200241106a290300370300200241e8026a41086a200241086a290300370300200220022903003703e8022006450d0920022006417f6a36028003200241e8026a410020022802ec021b221428020021030240024020142802082205201428020422042f0186164f0d00200421060c010b0340024020042802801622060d00410021060c020b200341016a210320042f018416210520062104200520062f0186164f0d000b0b200541016a21160240024020030d00200621040c010b200620164102746a4188166a280200210402402003417f6a2203450d00034020042802881621042003417f6a22030d000b0b410021160b2014200436020420144100360200201420163602082006200541f0016c6a2104200620054104746a41d0146a21060340200641086a2903002108200629030021130240024020042802004101470d002004410c6a2802002206417f4c0d1520042802042105410121034101210402402006450d00200610322204450d170b200241003602e007200220063602dc07200220043602d807200241d8076a4100200610c80120022802d807220420022802e00722146a2005200610c9081a2002201420066a3602e0074108210620022902dc07212220132123200821240c010b200241f80d6a200441086a10fd062010200241f80d6a41e80110c9081a200241d8076a41146a290200212420022902e407212320022902dc072122200241e00b6a200941d00110c9081a410a2106410021030b200241c8096a200241e00b6a41d00110c9081a200241b0076a41106a2205200241f0066a41106a290300370300200241b0076a41086a2214200241f0066a41086a290300370300200220022903f0063703b007200241e00b6a41186a2024370300200220233703f00b200220043602e40b200220063602e00b200220223703e80b2011200241c8096a41d00110c9081a200a2008370300200c20022903b007370300200c41086a2014290300370300200c41106a2005290300370300200220133703d00d024002402003450d00201528020c2022422088a72206470d000240201528020422032004460d0020032004200610cc080d010b200241f80d6a200241e00b6a41980210c9081a200241d8046a200241f80d6a10eb060c010b200241e00b6a10ec060b2002280280032206450d0a20022006417f6a36028003200241e8026a410020022802ec021b221428020021030240024020142802082205201428020422042f0186164f0d00200421060c010b0340024020042802801622060d00410021060c020b200341016a210320042f018416210520062104200520062f0186164f0d000b0b200541016a21160240024020030d00200621040c010b200620164102746a4188166a280200210402402003417f6a2203450d00034020042802881621042003417f6a22030d000b0b410021160b2014200436020420144100360200201420163602082006200541f0016c6a2104200620054104746a41d0146a21060c000b0b41ecd0c800412b41bc9ec800103c000b41ecd0c800412b41bc9ec800103c000b41ecd0c800412b41bc9ec800103c000b41ecd0c800412b41bc9ec800103c000b0240024002400240200641776a0e03020001000b41d5a1c80041284198a3c800103c000b200241e00b6a201541086a10fd06201d200241e00b6a41e80110c9081a201541f0016a21034100210441002106024002400240024002400240024020152d00f0010e0706010203040500060b201541fc016a2802002206417f4c0d15201541f4016a28020021030240024020060d00410121050c010b200610322205450d170b200241003602e80b200220063602e40b200220053602e00b200241e00b6a4100200610c80120022802e00b20022802e80b22056a2003200610c9081a202041086a200520066a360000202020022903e00b370000410621060c050b200241c8096a410f6a20154180026a290300370000200220152903f8013700cf09410121060c040b200220032800013602c809410221060c030b200220032900013703c809410321060c020b200241c8096a41086a200341096a290000370300200220032900013703c809410421060c010b200241c8096a410f6a200341106a290000370000200241c8096a41086a200341096a290000370300200241d8076a41086a20154190026a2d00003a0000200220032900013703c80920022015290288023703d807410521060b200241e00b6a200241f80d6a41ec0110c9081a200241e8026a410f6a200241c8096a410f6a290000370000200241e8026a41086a200241c8096a41086a290300370300200241086a200241d8076a41086a290300370300200220022903c8093703e802200220022903d8073703004101210f0c010b2015410c6a2802002206417f4c0d0e201528020421040240024020060d00410121030c010b200610322203450d100b4100210f200241003602e007200220063602dc07200220033602d807200241d8076a4100200610c80120022802d80720022802e00722036a2004200610c9081a2002200320066a3602e007410021060240024002400240024002400240201541106a22042d00000e0706010203040500060b2015411c6a2802002206417f4c0d14201541146a28020021040240024020060d00410121030c010b200610322203450d160b200241003602e80b200220063602e40b200220033602e00b200241e00b6a4100200610c80120022802e00b20022802e80b22036a2004200610c9081a201f41086a200320066a360000201f20022903e00b370000410621060c050b200241f80d6a410f6a201541206a290300370000200220152903183700ff0d410121060c040b200220042800013602f80d410221060c030b200220042900013703f80d410321060c020b200241f80d6a41086a200441096a290000370300200220042900013703f80d410421060c010b200241f80d6a410f6a200441106a290000370000200241f80d6a41086a200441096a290000370300200241c8096a41086a201541306a2d00003a0000200220042900013703f80d200220152902283703c809410521060b200241e00b6a200241d8076a41ec0110c9081a200241e8026a410f6a200241f80d6a410f6a290000370000200241e8026a41086a200241f80d6a41086a290300370300200241086a200241c8096a41086a290300370300200220022903f80d3703e802200220022903c809370300410121040b200241c8096a200241e00b6a41ec0110c9081a200241d8076a41086a2203200241e8026a41086a290300370300200241d8076a410f6a2205200241e8026a410f6a290000370000200241f0066a41086a2214200241086a290300370300200220022903e8023703d807200220022903003703f006200220043602e00b201c200241c8096a41ec0110c9081a200b20022903d807370000200b41086a2003290300370000200b410f6a2005290000370000201e20022903f006370300201e41086a2014290300370300200220063a00d00d0240201a2802002203450d0020002802102116034020032f018e182105410021062003210402400240034020052006460d01200641016a2106200241e00b6a2004108f02211420044198026a21040240201441187441187541016a0e03000301000b0b2006417f6a21050b2016450d022016417f6a2116200320054102746a4190186a28020021030c010b0b200241f80d6a200241e00b6a41980210c9081a2007200241f80d6a10e5060c050b02400240200f450d00200d10a2010c010b20022802e80b2206202520061b212520022802e40b410020061b2206450d002025450d002006102c0b20022d00d00d4106490d0420022802d80d2206202620061b212620022802d40d410020061b2206450d042026450d042006102c0c040b0240024002400240200641786a0e03020001000b41d5a1c80041284188a3c800103c000b200241e00b6a201541086a10fd06201d200241e00b6a41e80110c9081a201541f8016a290300210820152903f0012113200241c8096a200241f80d6a41ec0110c9081a410021040c010b2015410c6a2802002206417f4c0d0d20152802042105410121044101210302402006450d00200610322203450d0f0b200241003602d009200220063602cc09200220033602c809200241c8096a4100200610c80120022802c80920022802d00922036a2005200610c9081a2002200320066a3602d009201541186a2903002108201529031021130b200220043602e00b201c200241c8096a41ec0110c9081a02402000200241e00b6a10fe062206450d00200241f80d6a200241e00b6a41f00110c9081a200241d8046a200241f80d6a20062903002222201320132022562008200641086a29030022225620082022511b22061b2022200820061b10ff060c040b024020022802e00b0d00200d10a2010c040b20022802e80b2206202720061b212720022802e40b410020061b2206450d032027450d032006102c0c030b200241e8026a201a108007200241d8076a41186a200241e8026a41186a280200360200200241d8076a41106a200241e8026a41106a290300370300200241d8076a41086a200241e8026a41086a290300370300200220022903e8023703d807201541086a210f03400240024020022802f0072206450d0020022006417f6a3602f007200241d8076a410020022802dc071b221428020021030240024020142802082205201428020422062f018e184f0d00200621040c010b0340024020062802881822040d00410021040c020b200341016a210320062f018c18210520042106200520042f018e184f0d000b0b200541016a21160240024020030d00200421060c010b200420164102746a4190186a280200210602402003417f6a2203450d00034020062802901821062003417f6a22030d000b0b410021160b201420063602042014410036020020142016360208200241f80d6a200420054198026c6a10810720022802f80d410c460d05200241c8096a200241f80d6a41980210c9081a200241e00b6a200241c8096a41980210c9081a20022802e00b410b470d01200f200d108207450d01200241f80d6a200241e00b6a41980210c9081a200241d8046a200241f80d6a10eb060c020b2002410c3602f80d0c040b200241e00b6a10ec060c000b0b2002200010fc06200241e8026a41186a200241186a2802002206360200200241e8026a41106a200241106a290300370300200241e8026a41086a200241086a290300370300200220022903003703e8022006450d0120022006417f6a36028003200241e8026a410020022802ec021b221428020021030240024020142802082205201428020422042f0186164f0d00200421060c010b0340024020042802801622060d00410021060c020b200341016a210320042f018416210520062104200520062f0186164f0d000b0b200541016a21160240024020030d00200621040c010b200620164102746a4188166a280200210402402003417f6a2203450d00034020042802881621042003417f6a22030d000b0b410021160b201541086a210f2014200436020420144100360200201420163602082006200541f0016c6a2104200620054104746a41d0146a21060340200641086a2903002108200629030021130240024020042802004101470d002004410c6a2802002206417f4c0d0d200428020421050240024020060d00410121030c010b200610322203450d0f0b41002104200241003602e007200220063602dc07200220033602d807200241d8076a4100200610c80120022802d807220320022802e00722146a2005200610c9081a2002201420066a3602e0074108210620022902dc07212220132123200821240c010b200241f80d6a200441086a10fd062010200241f80d6a41e80110c9081a200241d8076a41146a290200212420022902e407212320022902dc072122200241e00b6a200941d00110c9081a410a2106410121040b200241c8096a200241e00b6a41d00110c9081a200241b0076a41106a2205200241f0066a41106a290300370300200241b0076a41086a2214200241f0066a41086a290300370300200220022903f0063703b007200241e00b6a41186a2024370300200220233703f00b200220223703e80b200220033602e40b200220063602e00b2011200241c8096a41d00110c9081a200a2008370300200c20022903b007370300200c41086a2014290300370300200c41106a2005290300370300200220133703d00d024002402004450d00200f200d108207450d00200241f80d6a200241e00b6a41980210c9081a200241d8046a200241f80d6a10eb060c010b200241e00b6a10ec060b2002280280032206450d0220022006417f6a36028003200241e8026a410020022802ec021b221428020021030240024020142802082205201428020422042f0186164f0d00200421060c010b0340024020042802801622060d00410021060c020b200341016a210320042f018416210520062104200520062f0186164f0d000b0b200541016a21160240024020030d00200621040c010b200620164102746a4188166a280200210402402003417f6a2203450d00034020042802881621042003417f6a22030d000b0b410021160b2014200436020420144100360200201420163602082006200541f0016c6a2104200620054104746a41d0146a21060c000b0b200241e8026a201a108007200241d8076a41186a200241e8026a41186a280200360200200241d8076a41106a200241e8026a41106a290300370300200241d8076a41086a200241e8026a41086a290300370300200220022903e8023703d80703400240024020022802f0072206450d0020022006417f6a3602f007200241d8076a410020022802dc071b221428020021030240024020142802082205201428020422062f018e184f0d00200621040c010b0340024020062802881822040d00410021040c020b200341016a210320062f018c18210520042106200520042f018e184f0d000b0b200541016a21160240024020030d00200421060c010b200420164102746a4190186a280200210602402003417f6a2203450d00034020062802901821062003417f6a22030d000b0b410021160b201420063602042014410036020020142016360208200241f80d6a200420054198026c6a10810720022802f80d410c460d03200241c8096a200241f80d6a41980210c9081a200241e00b6a200241c8096a41980210c9081a20022802e00b4109470d01201528020c220620022802ec0b470d0102402015280204220420022802e40b2203460d0020042003200610cc080d020b200241f80d6a200241e00b6a41980210c9081a200241d8046a200241f80d6a10eb060c020b2002410c3602f80d0c020b200241e00b6a10ec060c000b0b20154198026a22152012470d000b0b200241e8026a41106a200241d8046a41106a290300370300200241e8026a41086a200241d8046a41086a290300370300200220022903d8043703e8020b200241f80d6a20024180056a108307200241e8026a200241f80d6a108407200241e00b6a41106a200241e8026a41106a290300370300200241e00b6a41086a200241e8026a41086a2206290300370300200220022903e80222083703e00b200241d8076a41086a22042006280200360200200220083703d807200241c8096a200241d8076a10ed06200241086a2206200241f40b6a2203280200360200200220022902ec0b370300200241d8076a200210ef06200241e00b6a410c6a200241c8096a41086a2903003702002003200241c8096a41106a290300370200200241fc0b6a200241c8096a41186a280200360200200241840c6a20022903d8073702002002418c0c6a2004290300370200200241940c6a200241d8076a41106a2903003702002002419c0c6a200241d8076a41186a28020036020041012104200241013602e00b200220022903c8093702e40b200241013602800c2002200241e00b6a108507200241f80d6a10a201200241e00b6a20024180056a41e80110c9081a200241f80d6a41106a2017370300200241f80d6a410c6a2006280200360200200220022903003702fc0d200241033a00f80d200241e00b6a200241f80d6a10e806200e201910c3024100210c0240200e410020181b2206450d0020184198026c450d002006102c0b410121050c030b200241c8096a200141206a41e80110c9081a200241f0066a41086a2206200141186a2802003602002002200141106a2902003703f006200241f80d6a41086a2001410c6a280200360200200220012902043703f80d200241e8026a2000200241f80d6a10f606200241f80d6a200241c8096a108307200241e8026a200241f80d6a108407200241e00b6a41106a200241e8026a41106a290300370300200241e00b6a41086a200241e8026a41086a2204290300370300200220022903e80222083703e00b20024180056a41086a220320042802003602002002200837038005200241d8076a20024180056a10ed06200241086a2205200241f40b6a2204280200360200200220022902ec0b37030020024180056a200210ef06200241e00b6a410c6a200241d8076a41086a2903003702002004200241d8076a41106a290300370200200241fc0b6a200241d8076a41186a280200360200200241840c6a2002290380053702002002418c0c6a2003290300370200200241940c6a20024180056a41106a2903003702002002419c0c6a20024180056a41186a28020036020041012104200241013602e00b200220022903d8073702e40b200241013602800c2002200241e00b6a108507200241f80d6a10a201200241e00b6a200241c8096a41e80110c9081a200241f80d6a410c6a2005280200360200200241f80d6a41106a20022903f006370300200241f80d6a41186a2006280200360200200220022903003702fc0d200241023a00f80d200241e00b6a200241f80d6a10e806410021050c010b200241c8096a200141206a41e80110c9081a200241f0066a41086a2206200141186a2802003602002002200141106a2902003703f006200241f80d6a41086a2001410c6a280200360200200220012902043703f80d200241e8026a2000200241f80d6a10f606200241f80d6a200241c8096a108307200241e8026a200241f80d6a108407200241e00b6a41106a200241e8026a41106a290300370300200241e00b6a41086a200241e8026a41086a2204290300370300200220022903e80222083703e00b20024180056a41086a220320042802003602002002200837038005200241d8076a20024180056a10ed06200241086a2204200241f40b6a2205280200360200200220022902ec0b37030020024180056a200210ef06200241e00b6a410c6a200241d8076a41086a2903003702002005200241d8076a41106a290300370200200241fc0b6a200241d8076a41186a280200360200200241840c6a2002290380053702002002418c0c6a2003290300370200200241940c6a20024180056a41106a2903003702002002419c0c6a20024180056a41186a28020036020041012105200241013602e00b200220022903d8073702e40b200241013602800c2002200241e00b6a108507200241f80d6a10a201200241e00b6a200241c8096a41e80110c9081a200241f80d6a410c6a2004280200360200200241f80d6a41106a20022903f006370300200241f80d6a41186a2006280200360200200220022903003702fc0d41002104200241003a00f80d200241e00b6a200241f80d6a10e8060b4101210c0b410121140c050b200241e8026a200141206a41e80110c9081a200141186a280200211b200141146a2802002118200141106a2802002119200241f80d6a41086a2001410c6a280200360200200220012902043703f80d200241a0026a2000200241f80d6a10f606200241b0076a200241a0026a10fc06200241d8046a200241a0026a410c6a221c108007200241f0066a410c6a2210200241b0076a41086a290300370200200241f0066a41146a200241b0076a41106a290300370200200241f0066a411c6a200241b0076a41186a28020036020020024194076a220a20022903d8043702002002419c076a2200200241d8046a41086a290300370200200241a4076a200241d8046a41106a290300370200200241ac076a200241d8046a41186a280200360200200241013602f006200220022903b0073702f406200241013602900720024198076a210d200241f80f6a2111200241f80d6a41206a2112200241f80d6a4104722109200241d8076a411c6a210b200241d8076a41046a211a200241f0066a41086a210f200241f0066a410472210e200241f00f6a210741012106034002400240024020064101460d002002410c3602f80d0c010b0240200228028c072206450d0020022006417f6a36028c07200e410020022802f80622061b22142802002103024002402010410820061b22152802002205200f410420061b221628020022042f0186164f0d00200421060c010b0340024020042802801622060d00410021060c020b200341016a210320042f018416210520062104200520062f0186164f0d000b0b200541016a210c0240024020030d00200621040c010b2006200c4102746a4188166a280200210402402003417f6a2203450d00034020042802881621042003417f6a22030d000b0b4100210c0b20162004360200201441003602002015200c360200200620054104746a220441d8146a2903002108200441d0146a2903002113024002402006200541f0016c6a22042802004101470d002004410c6a2802002206417f4c0d06200428020421040240024020060d00410121030c010b200610322203450d080b200241003602e007200220063602dc07200220033602d807200241d8076a4100200610c80120022802d80720022802e00722036a2004200610c9081a4108210420024180026a41086a200320066a2206360200200220063602e007200220022902d807370380020c010b20024180056a200441086a10fd06201a20024180056a41e80110c9081a200220022902dc0737028402200241d8076a41146a290200212420022902e40721172002200b41d00110c9081a410a2104201321222008212320172113202421080b2009200229038002370200200241f80d6a41186a2008370300200941086a20024180026a41086a280200360200200220133703880e200220043602f80d2012200241d00110c9081a20072023370300201120022903c002370300201141086a200241c0026a41086a290300370300201141106a200241c0026a41106a290300370300200220223703e80f200241e00b6a200241f80d6a41980210c9081a0c020b2002410c3602f80d200241003602f0060b02402002280290074101460d002002410c3602e00b0c060b20022802ac072206450d0420022006417f6a3602ac07200a410020022802980722061b22142802002103024002402000410820061b22152802002205200d410420061b221628020022062f018e184f0d00200621040c010b0340024020062802881822040d00410021040c020b200341016a210320062f018c18210520042106200520042f018e184f0d000b0b200541016a210c0240024020030d00200421060c010b2004200c4102746a4190186a280200210602402003417f6a2203450d00034020062802901821062003417f6a22030d000b0b4100210c0b20162006360200201441003602002015200c360200200241e00b6a200420054198026c6a10810720022802f80d410c460d00200241f80d6a10ec060b20022802e00b410c460d04200241c8096a200241e00b6a41980210c9081a200241f80d6a200241c8096a41980210c9081a200241f80d6a200241e8026a10f9062106200241f80d6a10ec060240200641ff01712203410d470d0020022802f00621060c010b0b200241e00b6a41086a2206200241a0026a41086a280200360200200220022903a0023703e00b200241f80d6a200241e00b6a10ed06200241f80d6a10ee062006201c41086a2802003602002002201c2902003703e00b200241f80d6a200241e00b6a10ef06200241f80d6a10f0062019201b10c4024100210402402019410020181b2206450d0020184188026c450d002006102c0b200241e8026a10a201410121050c060b103b000b1039000b2002410c3602e00b0b20024180056a41106a2204200241a0026a41106a29030037030020024180056a41086a2206200241a0026a41086a290300370300200220022903a00237038005200241f80d6a200241e8026a10830720024180056a200241f80d6a108407200241e00b6a41106a2004290300370300200241e00b6a41086a2006290300370300200220022903800522083703e00b200241d8076a41086a22042006280200360200200220083703d807200241c8096a200241d8076a10ed06200241086a2206200241e00b6a41146a2203280200360200200220022902ec0b370300200241d8076a200210ef06200241e00b6a410c6a200241c8096a41086a2903003702002003200241c8096a41106a290300370200200241fc0b6a200241c8096a41186a280200360200200241840c6a20022903d8073702002002418c0c6a2004290300370200200241940c6a200241d8076a41106a2903003702002002419c0c6a200241d8076a41186a28020036020041012104200241013602e00b200220022903c8093702e40b200241013602800c2002200241e00b6a108507200241f80d6a10a201200241e00b6a200241e8026a41e80110c9081a200241f80d6a410c6a2006280200360200200241f80d6a41186a201b360200200241f80d6a41146a2018360200200241f80d6a41106a2019360200200220022903003702fc0d200241013a00f80d200241e00b6a200241f80d6a10e80641002114410121054101210c0b41012106410121030b0240024002400240024002402001280200417f6a0e06000105020304050b2006450d0720012802042001410c6a28020010c3020240200141086a2802002206450d0020012802042204450d0020064198026c450d002004102c0b200141106a10a2010c070b2014450d0620012802042001410c6a28020010c3020240200141086a2802002206450d0020012802042204450d0020064198026c450d002004102c0b200141206a10a201200141106a280200200141186a28020010c402200141146a2802002206450d0620012802102204450d0620064188026c450d062004102c0c060b2004450d0520012802042001410c6a28020010c3020240200141086a2802002206450d0020012802042204450d0020064198026c450d002004102c0b200141206a10a201200141106a280200200141186a28020010c402200141146a2802002206450d0520012802102204450d0520064188026c450d052004102c0c050b2005450d0420012802042001410c6a28020010c3020240200141086a2802002206450d0020012802042204450d0020064198026c450d002004102c0b200141206a10a201200141106a280200200141186a28020010c402200141146a2802002206450d0420012802102204450d0420064188026c450d042004102c0c040b200c450d03200141186a10a20120012802042001410c6a28020010c302200141086a2802002206450d0320012802042204450d0320064198026c450d032004102c0c030b20011086070c020b200128020021060b0240024002400240024002402006417f6a0e06000105020304050b2005450d0520012802042001410c6a28020010c3020240200141086a2802002206450d0020012802042204450d0020064198026c450d002004102c0b200141106a10a2010c050b2004450d0420012802042001410c6a28020010c3020240200141086a2802002206450d0020012802042204450d0020064198026c450d002004102c0b200141206a10a201200141106a280200200141186a28020010c402200141146a2802002206450d0420012802102204450d0420064188026c450d042004102c0c040b20012802042001410c6a28020010c3020240200141086a2802002206450d0020012802042204450d0020064198026c450d002004102c0b200141206a10a201200141106a280200200141186a28020010c402200141146a2802002206450d0320012802102204450d0320064188026c450d032004102c0c030b20012802042001410c6a28020010c3020240200141086a2802002206450d0020012802042204450d0020064198026c450d002004102c0b200141206a10a201200141106a280200200141186a28020010c402200141146a2802002206450d0220012802102204450d0220064188026c450d022004102c0c020b200141186a10a20120012802042001410c6a28020010c302200141086a2802002206450d0120012802042204450d0120064198026c450d012004102c0c010b20011086070b20024190106a240020030b961001027f0240024002400240024020002802000e0404000102030b024002400240024020002d0008417e6a0e06000102070703070b200028022c4101470d06200041346a2802002201450d0620002802302200450d062001450d062000102c0f0b200028020c4101470d05200041146a2802002201450d0520002802102200450d052001450d052000102c0f0b200041206a2802004101470d04200041286a2802002201450d0420002802242200450d042001450d042000102c0f0b200041106a2802002201450d03200028020c2200450d032001450d032000102c0f0b0240024002400240024020002d0008417e6a0e06000102040403040b200028022c4101470d03200041346a2802002201450d0320002802302202450d032001450d032002102c0c030b200028020c4101470d02200041146a2802002201450d0220002802102202450d022001450d022002102c0c020b200041206a2802004101470d01200041286a2802002201450d0120002802242202450d012001450d012002102c0c010b200041106a2802002201450d00200028020c2202450d002001450d002002102c0b0240024002400240200041c0006a2d0000417e6a0e06000102060603060b20002802644101470d05200041ec006a2802002201450d0520002802682200450d052001450d052000102c0f0b20002802444101470d04200041cc006a2802002201450d0420002802482200450d042001450d042000102c0f0b200041d8006a2802004101470d03200041e0006a2802002201450d03200028025c2200450d032001450d032000102c0f0b200041c8006a2802002201450d0220002802442200450d022001450d022000102c0f0b0240024002400240024020002d0008417e6a0e06000102040403040b200028022c4101470d03200041346a2802002201450d0320002802302202450d032001450d032002102c0c030b200028020c4101470d02200041146a2802002201450d0220002802102202450d022001450d022002102c0c020b200041206a2802004101470d01200041286a2802002201450d0120002802242202450d012001450d012002102c0c010b200041106a2802002201450d00200028020c2202450d002001450d002002102c0b02400240024002400240200041c0006a2d0000417e6a0e06000102040403040b20002802644101470d03200041ec006a2802002201450d0320002802682202450d032001450d032002102c0c030b20002802444101470d02200041cc006a2802002201450d0220002802482202450d022001450d022002102c0c020b200041d8006a2802004101470d01200041e0006a2802002201450d01200028025c2202450d012001450d012002102c0c010b200041c8006a2802002201450d0020002802442202450d002001450d002002102c0b0240024002400240200041f8006a2d0000417e6a0e06000102050503050b200028029c014101470d04200041a4016a2802002201450d0420002802a0012200450d042001450d042000102c0f0b200028027c4101470d0320004184016a2802002201450d032000280280012200450d032001450d032000102c0c030b20004190016a2802004101470d0220004198016a2802002201450d022000280294012200450d022001450d022000102c0f0b20004180016a2802002201450d01200028027c2200450d012001450d012000102c0f0b0240024002400240024020002d0008417e6a0e06000102040403040b200028022c4101470d03200041346a2802002201450d0320002802302202450d032001450d032002102c0c030b200028020c4101470d02200041146a2802002201450d0220002802102202450d022001450d022002102c0c020b200041206a2802004101470d01200041286a2802002201450d0120002802242202450d012001450d012002102c0c010b200041106a2802002201450d00200028020c2202450d002001450d002002102c0b02400240024002400240200041c0006a2d0000417e6a0e06000102040403040b20002802644101470d03200041ec006a2802002201450d0320002802682202450d032001450d032002102c0c030b20002802444101470d02200041cc006a2802002201450d0220002802482202450d022001450d022002102c0c020b200041d8006a2802004101470d01200041e0006a2802002201450d01200028025c2202450d012001450d012002102c0c010b200041c8006a2802002201450d0020002802442202450d002001450d002002102c0b02400240024002400240200041f8006a2d0000417e6a0e06000102040403040b200028029c014101470d03200041a4016a2802002201450d0320002802a0012202450d032001450d032002102c0c030b200028027c4101470d0220004184016a2802002201450d022000280280012202450d022001450d022002102c0c020b20004190016a2802004101470d0120004198016a2802002201450d012000280294012202450d012001450d012002102c0c010b20004180016a2802002201450d00200028027c2202450d002001450d002002102c0b0240024002400240200041b0016a2d0000417e6a0e06000102040403040b20002802d4014101470d03200041dc016a2802002201450d0320002802d8012200450d032001450d032000102c0f0b20002802b4014101470d02200041bc016a2802002201450d0220002802b8012200450d022001450d022000102c0f0b200041c8016a2802004101470d01200041d0016a2802002201450d0120002802cc012200450d012001450d012000102c0f0b200041b8016a2802002201450d0020002802b4012200450d002001450d002000102c0f0b0be1a20109227f037e0b7f217e0f7f1c7e027f037e057f23002203210420034180156b416071220324002003412c6a4100360200200342003703202003410036021820022802002205200228020822064198026c6a2107200228020421082005210902402006450d00200341186a410c6a210a2001410c6a210b200341e8126a410472210c200341e8126a41f0016a210220034188096a41ec016a210d200341f0066a41ec016a210e20034188096a41e0016a210f20034188096a4104722110200341e00d6a4104722111200341e8126a4180026a2112200341c00b6a4104722113200341e00d6a41086a2114200341c00b6a41086a2115200341e8126a41086a211620034190106a410472211720034190106a41086a2118200341e0046a4104722119200341e0046a41086a211a20034188096a41086a211b200341f0066a41086a211c200341f0066a410472211d20034188096a41046a211e20034188096a41f0016a211f200341f0066a41106a2120200341e8126a41046a2121200341f0066a41f0016a2122200341c8026a4104722123200341e8126a41f8016a212420052109034020092802002106200341e8126a200941046a41940210c9081a20094198026a21092006410c460d01200341346a200341e8126a41940210c9081a200320063602c8022023200341346a41940210c9081a02400240024002400240024002400240024002400240024002400240024002400240024020060e0c07000102030f040e0b090c08070b200129021021252001410036021420012902082126200142003702082001290200212720014100360200200041106a20253702002000202637020820002027370200200341c8026a10ec062009200720096b4198026d10c30202402008450d0020084198026c450d002005102c0b20034188096a41086a2202200341186a41086a2802003602002003200329031837038809200341e8126a20034188096a10ed06200341e8126a10ee062002200a41086a2802003602002003200a29020037038809200341e8126a20034188096a10ef06200341e8126a10f006200424000f0b200128020821282001410036020820012802042106200120293602042001280200212a20014100360200200320283602f012200320063602ec122003202a3602e812200341e00d6a200341e8126a10ed06200341f0066a41186a200341e00d6a41186a2802003602002020200341e00d6a41106a290300370300201c2014290300370300200320032903e00d3703f006200341e8126a200341f0066a10f706024020032802e8124102460d0003402024290300212520032903d814212620034188096a200341e8126a41f00110c9081a200341186a20034188096a2026202510ff06200341e8126a200341f0066a10f70620032802e8124102470d000b0b200341f0066a10ee06200621290c050b20012802142106200141003602142001280210212a2001202b360210200128020c21282001410036020c200320063602f0122003202a3602ec12200320283602e81220034190106a200341e8126a10ef06200341c00b6a41186a20034190106a41186a280200360200200341c00b6a41106a20034190106a41106a2903003703002015201829030037030020032003290390103703c00b200341e8126a200341c00b6a10f80620032802e81222064102460d03200341e00d6a200c41940210c9081a0340200341f0066a200341e00d6a41940210c9081a20034188096a200341e00d6a41940210c9081a200320063602e812200c200341f0066a41ec0110c9082128200241206a200d41206a290200370200200241186a200d41186a290200370200200241106a200d41106a290200370200200241086a200d41086a2902003702002002200d290200370200200a200341e8126a10a608200341e8126a200341c00b6a10f80620032802e81222064102460d04200341e00d6a202841940210c9081a0c000b0b200341e8126a200341c8026a41980210c9081a0c010b200341e8126a200341c8026a41980210c9081a0b024002400240024020032802e812417c6a0e03020001000b41d5a1c80041284180a2c800103c000b2015201641e80110c9081a410021060c010b2013200c290200370200201341086a200c41086a280200360200410121060b200320063602c00b20012802002106200141003602002001280204212c2001202d36020420012802082128200141003602082003410036028812200341003602801220032028360290092003202c36028c092003200636028809200341e0046a20034188096a10ed0620034190106a41186a200341e0046a41186a28020036020020034190106a41106a200341e0046a41106a2903003703002018201a290300370300200320032903e0043703901020034188096a20034190106a10f70602402003280288094102460d00034020034188096a41f8016a290300212520032903f80a2126200341e00d6a20034188096a41f00110c9081a02400240024020032802e00d220620032802c00b470d00024020060d0020142015108207450d010c020b20032802ec0d220620032802cc0b470d0020032802e40d222820032802c40b222a460d012028202a200610cc08450d010b200341f0066a200341e00d6a41f00110c9081a20034180126a200341f0066a2026202510a2080c010b200341f0066a200341e00d6a41f00110c9081a200341186a200341f0066a2026202510ff060b20034188096a20034190106a10f7062003280288094102470d000b0b20034190106a10ee06201c200141086a2206280200360200200320012902003703f00620034188096a200341f0066a10ed0620034188096a10ee06200620034180126a41086a28020036020020012003290380123702000240024020032802c00b0d00201510a2010c010b20032802c80b2206202e20061b212e20032802c40b410020061b2206450d00202e450d002006102c0b0240024020032802e812417c6a0e03010001000b200341e8126a10ec060b202c212d0c0b0b200341c00b6a10f006202a212b0b200341c8026a10ec060c090b200341f0066a200341c8026a41980210c9081a0c010b200341f0066a200341c8026a41980210c9081a0b024002400240024020032802f00641776a0e03020001000b41d5a1c800412841b0a2c800103c000b2021201c41e80110c9081a200341c00b6a41206a202241206a290300370300200341c00b6a41186a202241186a290300370300200341c00b6a41106a202241106a2903003703002015202241086a290300370300200320222903003703c00b20034188096a200341e8126a41ec0110c9081a410021060c010b201b201d41086a2802003602002015202041086a290300370300200341c00b6a41106a202041106a290300370300200341c00b6a41186a202041186a290300370300200341c00b6a41206a202041206a2903003703002003201d29020037038809200320202903003703c00b410121060b200341e00d6a20034188096a41ec0110c9081a20034190106a41206a2228200341c00b6a41206a29030037030020034190106a41186a222a200341c00b6a41186a222f29030037030020034190106a41106a222c200341c00b6a41106a223029030037030020182015290300370300200320032903c00b3703901020032006360288092010200341e00d6a41ec0110c9081a201f41206a2028290300370300201f41186a202a290300370300201f41106a202c290300370300201f41086a2018290300370300201f200329039010370300024002400240200b2802002206450d00200341a8126a2001280210200620034188096a108e0220032802a8124101460d0020032802b012213120032802b41221320240024020032802ac122206450d002006417f6a2128203120324198026c6a212a203120324102746a4190186a28020021060240034020062f018e18212c2028450d012028417f6a21282006202c4102746a4190186a28020021060c000b0b201620064100202c1b2231202c417f6a4100202c1b22324198026c6a22064188026a290300370300200341e8126a41106a222820064190026a290300370300200320064180026a2903003703e812200641206a2903002133200641286a2903002134200641306a2903002135200641386a2903002136200641e0016a2903002137200641e8016a2903002138200641f0016a2903002139200641f8016a290300213a200641c0016a290300213b200641c8016a290300213c200641d0016a290300213d200641d8016a290300213e200641a0016a290300213f200641a8016a2903002140200641b0016a2903002141200641b8016a290300214220064180016a290300214320064188016a290300214420064190016a290300214520064198016a2903002146200641e0006a2903002147200641e8006a2903002148200641f0006a2903002149200641f8006a290300214a200641c0006a290300214b200641c8006a290300214c200641d0006a290300214d200641d8006a290300214e2006290300214f2006290308212520062903102150200641186a2903002127200620064198026a20312f018e182032417f736a4198026c10ca081a203120312f018e18417f6a3b018e1820034180126a41106a2028290300225137030020034180126a41086a20162903002252370300200320032903e812225337038012202a41186a2206290300212620062027370300202a41106a2206290300212720062050370300202a41086a2206290300215020062025370300202a2903002125202a204f3703002028205137030020162052370300202a41d8006a2206290200214f2006204e370200202a41d0006a2206290200214e2006204d370200202a41c8006a2206290200214d2006204c370200202a290240214c202a204b370240202a41f8006a2206290200214b2006204a370200202a41f0006a2206290200214a20062049370200202a41e8006a2206290200214920062048370200202a2902602148202a2047370260202a4198016a2206290200214720062046370200202a4190016a2206290200214620062045370200202a4188016a2206290200214520062044370200202a290280012144202a204337028001202a41b8016a2206290200214320062042370200202a41b0016a2206290200214220062041370200202a41a8016a2206290200214120062040370200202a2902a0012140202a203f3702a001202a41d8016a2206290200213f2006203e370200202a41d0016a2206290200213e2006203d370200202a41c8016a2206290200213d2006203c370200202a2902c001213c202a203b3702c001202a41f8016a2206290200213b2006203a370200202a41f0016a2206290200213a20062039370200202a41e8016a2206290200213920062038370200202a2902e0012138202a20373702e001202a41386a2206290200213720062036370200202a41306a2206290200213620062035370200202a41286a2206290200213520062034370200202a2902202134202a2033370220200320533703e812200341e0046a41106a2206202a4190026a222c290000370300201a202a4188026a22542900003703002003202a290080023703e004202c202829030037000020542016290300370000202a20032903e812370080022016201a2903002233370300200341a00b6a41106a2006290300370300200341a00b6a41086a2033370300200320032903e0043703a00b20312f018e182106410121550c010b2016203120324198026c6a22064188026a290300370300200341e8126a41106a222820064190026a290300370300200320064180026a2903003703e81220062903002125200641f8016a290300213b200641f0016a290300213a200641e8016a2903002139200641e0016a2903002138200641d8016a290300213f200641d0016a290300213e200641c8016a290300213d200641c0016a290300213c200641b8016a2903002143200641b0016a2903002142200641a8016a2903002141200641a0016a290300214020064198016a290300214720064190016a290300214620064188016a290300214520064180016a2903002144200641f8006a290300214b200641f0006a290300214a200641e8006a2903002149200641e0006a2903002148200641d8006a290300214f200641d0006a290300214e200641c8006a290300214d200641c0006a290300214c200641386a2903002137200641306a2903002136200641286a2903002135200641206a2903002134200641186a2903002126200641106a2903002127200641086a2903002150200620064198026a20312f018e182032417f736a4198026c10ca081a200341a00b6a41086a2016290300370300200341a00b6a41106a2028290300370300203120312f018e18417f6a22063b018e18200320032903e8123703a00b410021550b200341b8126a41106a2256200341a00b6a41106a2257290300370300200341b8126a41086a2258200341a00b6a41086a2259290300370300200320032903a00b3703b8124101215a0240200641ffff037141044b0d004100215b4101215a4101215c2031215403402054280288182206450d010240024020542f018c1822280d00410021282006410020062f018e181b21544100215d0c010b2028417f6a21284101215d200621540b0240024002400240024002400240024002400240024002400240024020544190186a222a202841016a22064102746a222c280200225e2f018e18225f202a202841027422606a2261280200222a2f018e1822626a410b490d00205d0d032016205e4188026a290300370300200341e8126a41106a2260205e4190026a2903003703002003205e290380023703e812205e41f8016a2903002133205e41f0016a2903002151205e41e8016a2903002152205e41d8016a2903002153205e41d0016a2903002163205e41c8016a2903002164205e41b8016a2903002165205e41b0016a2903002166205e41a8016a2903002167205e4198016a2903002168205e4190016a2903002169205e4188016a290300216a205e41f8006a290300216b205e41f0006a290300216c205e41e8006a290300216d205e41d8006a290300216e205e41d0006a290300216f205e41c8006a2903002170205e41386a2903002171205e41306a2903002172205e41286a2903002173205e41186a2903002174205e2903e0012175205e2903c0012176205e2903a0012177205e290380012178205e2903602179205e290340217a205e290320217b205e290310217c205e290308217d205e290300217e205e205e4198026a205f4198026c41e87d6a10ca08215e205b0d01410021620c020b205b41016a215b20542f018e18217f200341e8126a205420284198026c6a22800141980210c9081a208001205420064198026c6a207f2028417f736a4198026c10ca081a202a20624198026c6a200341e8126a41980210c9084198026a205e205f4198026c10c9081a202c206141086a20542f018e182006417f736a41027441046a10ca081a0240200620542f018e1822614f0d00206020546a4194186a212803402028280200222c20063b018c18202c205436028818202841046a21282061200641016a2206470d000b20542f018e1821610b206241016a216220542061417f6a3b018e18202a205f202a2f018e186a41016a3b018e18205b41014d0d0c202a20624102746a4190186a205e4190186a205f41027441046a10c9081a2062205f6a2128206221060340202a20064102746a4190186a280200222c20063b018c18202c202a3602881820062006202849222c6a220620284b0d0d202c450d0d0c000b0b205e280290182162205e4190186a2206205e4194186a205e2f018e1841027410ca081a20624100360288180240205f450d004100212a03402006280200222c202a3b018c18202c205e36028818200641046a2106205f202a41016a222a470d000b0b205b417f6a215f0b205e205e2f018e18417f6a3b018e18200341d0126a41086a2016290300228101370300200341d0126a41106a2060290300228201370300200320032903e8122283013703d0122060208201370300201620810137030020032083013703e812205420284198026c6a220641186a222829030021810120282074370300200629031021742006207c3703102006290308217c2006207d3703082006290300217d2006207e370300200641386a2228290200217e20282071370200200641306a2228290200217120282072370200200641286a2228290200217220282073370200200629022021732006207b370220200641d8006a2228290200217b2028206e370200200641d0006a2228290200216e2028206f370200200641c8006a2228290200216f20282070370200200629024021702006207a370240200641f8006a2228290200217a2028206b370200200641f0006a2228290200216b2028206c370200200641e8006a2228290200216c2028206d3702002006290260216d2006207937026020064198016a222829020021792028206837020020064190016a222829020021682028206937020020064188016a222829020021692028206a370200200629028001216a2006207837028001200641b8016a2228290200217820282065370200200641b0016a2228290200216520282066370200200641a8016a222829020021662028206737020020062902a0012167200620773702a001200641d8016a2228290200217720282053370200200641d0016a2228290200215320282063370200200641c8016a222829020021632028206437020020062902c0012164200620763702c001200641f8016a2228290200217620282033370200200641f0016a2228290200213320282051370200200641e8016a222829020021512028205237020020062902e0012152200620753702e001200341e0046a41106a222a20064190026a2228290000370300201a20064188026a222c29000037030020032006290080023703e00420282060290300370000202c2016290300370000200620032903e81237008002200341d0066a41106a2206202a290300370300200341d0066a41086a222c201a290300370300200320032903e00422753703a00b200320753703d006206128020021280240205b450d00202a2006290300370300201a202c290300370300200320032903d0063703e0042062450d03205b417f6a205f470d0420282f018e182206410a4b0d052028200641016a222c3b018e18202820064198026c6a220620523703e001200620643703c001200620673703a0012006206a370380012006206d3703602006207037034020062073370320200620743703102006207c3703082006207d370300200620032903e00437038002200641f8016a2076370300200641f0016a2033370300200641e8016a2051370300200641d8016a2077370300200641d0016a2053370300200641c8016a2063370300200641b8016a2078370300200641b0016a2065370300200641a8016a206637030020064198016a207937030020064190016a206837030020064188016a2069370300200641f8006a207a370300200641f0006a206b370300200641e8006a206c370300200641d8006a207b370300200641d0006a206e370300200641c8006a206f370300200641386a207e370300200641306a2071370300200641286a2072370300200641186a20810137030020064188026a201a29030037030020064190026a202a2903003703002028202c4102746a4190186a20623602002062202c3b018c1820622028360288180c020b20034180126a41106a222a200629030037030020034180126a41086a2254202c290300370300200320032903d0063703801220282f018e182206410b4f0d052028200641016a3b018e18202820064198026c6a220620523703e001200620643703c001200620673703a0012006206a370380012006206d3703602006207037034020062073370320200620743703102006207c3703082006207d370300200620032903801237038002200641f8016a2076370300200641f0016a2033370300200641e8016a2051370300200641d8016a2077370300200641d0016a2053370300200641c8016a2063370300200641b8016a2078370300200641b0016a2065370300200641a8016a206637030020064198016a207937030020064190016a206837030020064188016a2069370300200641f8006a207a370300200641f0006a206b370300200641e8006a206c370300200641d8006a207b370300200641d0006a206e370300200641c8006a206f370300200641386a207e370300200641306a2071370300200641286a2072370300200641186a20810137030020064188026a205429030037030020064190026a202a2903003703000c010b201620624198026c202a6a41e87d6a22064188026a290300370300200341e8126a41106a225f20064190026a29030037030020032006290380023703e81220062903e001213320062903c001215120062903a00121522006290380012153200629036021632006290340216420062903202165200629031021662006290308216720062903002168200641f8016a2903002169200641f0016a290300216a200641e8016a290300216b200641d8016a290300216c200641d0016a290300216d200641c8016a290300216e200641b8016a290300216f200641b0016a2903002170200641a8016a290300217120064198016a290300217220064190016a290300217320064188016a2903002174200641f8006a2903002175200641f0006a2903002176200641e8006a2903002177200641d8006a2903002178200641d0006a2903002179200641c8006a290300217a200641386a290300217b200641306a290300217c200641286a290300217d200641186a290300217e02400240205b0d00410021610c010b202a20624102746a4190186a2802002261410036028818205b417f6a2160202a2f018e1821620b202a2062417f6a3b018e18200341d0066a41086a2016290300228101370300200341d0066a41106a205f290300228201370300200320032903e8122283013703d006200341d0126a41106a225f208201370300200341d0126a41086a225e20810137030020032083013703d012205420284198026c6a220641186a22282903002181012028207e3703002006290310217e2006206637031020062903082166200620673703082006290300216720062068370300200641386a222829020021682028207b370200200641306a2228290200217b2028207c370200200641286a2228290200217c2028207d3702002006290220217d20062065370220200641d8006a2228290200216520282078370200200641d0006a2228290200217820282079370200200641c8006a222829020021792028207a3702002006290240217a20062064370240200641f8006a2228290200216420282075370200200641f0006a2228290200217520282076370200200641e8006a2228290200217620282077370200200629026021772006206337026020064198016a222829020021632028207237020020064190016a222829020021722028207337020020064188016a222829020021732028207437020020062902800121742006205337028001200641b8016a222829020021532028206f370200200641b0016a2228290200216f20282070370200200641a8016a222829020021702028207137020020062902a0012171200620523702a001200641d8016a222829020021522028206c370200200641d0016a2228290200216c2028206d370200200641c8016a2228290200216d2028206e37020020062902c001216e200620513702c001200641f8016a2228290200215120282069370200200641f0016a222829020021692028206a370200200641e8016a2228290200216a2028206b37020020062902e001216b200620333702e001200341e0046a41106a222a20064190026a2228290000370300201a20064188026a225429000037030020032006290080023703e0042028205f2903003700002054205e290300370000200620032903d012370080022057202a2903003703002059201a290300370300200320032903e004223337038012200320333703a00b202c28020021280240205b450d00202a2057290300370300201a2059290300370300200320032903a00b3703e0042061450d06205b417f6a2060470d0720282f018e182206410a4b0d0820284198026a202820064198026c10ca081a202841f0016a2069370300202841e8016a206a3703002028206b3703e001202841d0016a206c370300202841c8016a206d3703002028206e3703c001202841b0016a206f370300202841a8016a2070370300202820713703a00120284190016a207237030020284188016a20733703002028207437038001202841f0006a2075370300202841e8006a207637030020282077370360202841d0006a2078370300202841c8006a20793703002028207a370340202841306a207b370300202841286a207c3703002028207d3703202028207e3703102028206637030820282067370300202841f8016a2051370300202841d8016a2052370300202841b8016a205337030020284198016a2063370300202841f8006a2064370300202841d8006a2065370300202841386a2068370300202841186a208101370300202820032903e0043703800220284188026a201a29030037030020284190026a202a29030037030020284194186a20284190186a20282f018e1841027441046a10ca081a2028206136029018202820282f018e1841016a22063b018e18200641ffff0371212a410021060340202820064102746a4190186a280200222c20063b018c18202c20283602881820062006202a496a222c202a4b0d022006202a4f2154202c21062054450d000c020b0b20284198026a202820282f018e184198026c10ca081a202841f8016a2051370300202841f0016a2069370300202841e8016a206a3703002028206b3703e001202841d8016a2052370300202841d0016a206c370300202841c8016a206d3703002028206e3703c001202841b8016a2053370300202841b0016a206f370300202841a8016a2070370300202820713703a00120284198016a206337030020284190016a207237030020284188016a20733703002028207437038001202841f8006a2064370300202841f0006a2075370300202841e8006a207637030020282077370360202841d8006a2065370300202841d0006a2078370300202841c8006a20793703002028207a370340202841386a2068370300202841306a207b370300202841286a207c3703002028207d370320202841186a2081013703002028207e3703102028206637030820282067370300202820032903a00b3703800220284188026a205929030037030020284190026a2057290300370300202820282f018e1841016a3b018e180b205c205d71450d0a203220312f018e18490d074100212802400340024020312802881822060d00410021060c020b202841016a212820312f018c18212a20062131202a20062f018e184f0d000b202a41016a21320b024020280d00200621310c0b0b200620324102746a4190186a280200213102402028417f6a2206450d00034020312802901821312006417f6a22060d000b0b410021320c0a0b41ecd0c800412b41a4bfc400103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b41e0cec80041204188bec400103c000b41ecd0c800412b41ccbec400103c000b419ecec800413041dcbec400103c000b41ecbec40041274194bfc400103c000b4101215a203241016a21320c020b205e102c02400240205c417f73205d417f73724101710d00205b4101470d01205420606a4190186a280200213120624100205d1b20326a21320b024020542f018e1822060d004100215a0c030b4100215c20064105490d010c020b0b41d5a1c800412841f8bdc400103c000b02402055450d00203220312f018e18490d0041002128024003402031280288182206450d01202841016a212820312f018c18212a20062131202a20062f018e184f0d000b0b2028450d002028417f6a2206450d0003402006417f6a22060d000b0b201a2058290300370300200341e0046a41106a22062056290300370300200320032903b8123703e004200320253703c00b200320503703c80b200320273703d00b200320263703d80b2016201341086a290200370300200341e8126a41106a2228201341106a290200370300200341e8126a41186a222a201341186a280200360200200320132902003703e81220012001280214417f6a3602140240205a0d00200b280200222c450d0220012802102261450d03202c28029018215420012061417f6a3602102001205436020c2054410036028818202c102c0b202f202a280200360200203020282903003703002015201629030037030020034180126a41086a2228201a29030037030020034180126a41106a222a2006290300370300200320032903e8123703c00b200320032903e004370380122025a722064102460d00200c20032903c00b3702002012200329038012370200200341e8126a41e8016a2039370300200341e8126a41c8016a203d370300200341e8126a41a8016a2041370300200341e8126a4188016a2045370300200341e8126a41e8006a2049370300200341e8126a41c8006a204d370300200341e8126a41286a20353703002002203a370300200341e8126a41d0016a203e370300200341e8126a41b0016a2042370300200341e8126a4190016a2046370300200341e8126a41f0006a204a370300200341e8126a41d0006a204e370300200341e8126a41306a2036370300200c41086a2015290300370200200c41106a2030290300370200200c41186a202f280200360200201241086a2028290300370200201241106a202a2903003702002024203b370300200341e8126a41d8016a203f370300200341e8126a41b8016a2043370300200341e8126a4198016a2047370300200341e8126a41f8006a204b370300200341e8126a41d8006a204f370300200341e8126a41386a2037370300200320383703c8142003203c3703a8142003204037038814200320443703e813200320483703c8132003204c3703a8132003203437038813200320063602e812200a200341e8126a10e5060b024002402003280288090d00201b10a2010c010b200328029009220620840120061b218401200328028c09410020061b2206450d00208401450d002006102c0b024020032d00f80a4106490d0020032802800b220620850120061b21850120032802fc0a410020061b2206450d00208501450d002006102c0b024020032802f00641776a0e03090009000b200341f0066a10ec060c080b41ecd0c800412b41ac9ec800103c000b4198bec400412141bcbec400103c000b200341e8126a200341c8026a41980210c9081a0c010b200341e8126a200341c8026a41980210c9081a0b024002400240024020032802e81241786a0e03020001000b41d5a1c800412841a0a2c800103c000b2024290300212520032903d8142126201e201641e80110c9081a200341e00d6a20034188096a41ec0110c9081a410021060c010b2014200c41086a2802003602002003200c2902003703e00d200341e8126a41186a290300212520032903f8122126410121060b200320063602f006201d200341e00d6a41ec0110c9081a02400240024002400240024002402001200341f0066a10fe062206450d0020062903002250202656200641086a290300222720255620272025511b0d0120012802002206450d03200341d0126a20012802042006200341f0066a10a30820032802d0124101460d0320032802d812213120032802dc12215d0240024020032802d4122206450d002006417f6a21282031205d41f0016c6a212c2031205d4104746a41d0146a21542031205d4102746a4188166a28020021060240034020062f018616212a2028450d012028417f6a21282006202a4102746a4188166a28020021060c000b0b201b20064100202a1b2231202a417f6a4100202a1b225d41f0016c6a220641e8016a2903003703002003200641e0016a29030037038809200641206a2903002125200641286a2903002126200641306a2903002135200641386a2903002136200641c0016a2903002137200641c8016a2903002138200641d0016a2903002139200641d8016a290300213a200641a0016a290300213b200641a8016a290300213c200641b0016a290300213d200641b8016a290300213e20064180016a290300213f20064188016a290300214020064190016a290300214120064198016a2903002142200641e0006a2903002143200641e8006a2903002144200641f0006a2903002145200641f8006a2903002146200641c0006a2903002147200641c8006a2903002148200641d0006a2903002149200641d8006a290300214a2006290300214b2006290308214f2006290310214c200641186a290300214d2006200641f0016a20312f018616205d417f7322286a41f0016c10ca081a2031205d4104746a220641d8146a2903002152200641d0146a222a2903002151202a200641e0146a202820312f0186166a41047410ca081a203120312f018616417f6a3b0186162018201b29030022343703002003200329038809223337039010202c41186a2206290300214e2006204d370300202c41106a2206290300214d2006204c370300202c41086a2206290300214c2006204f370300202c290300214f202c204b370300201b2034370300202c41d8006a2206290200214b2006204a370200202c41d0006a2206290200214a20062049370200202c41c8006a2206290200214920062048370200202c2902402148202c2047370240202c41f8006a2206290200214720062046370200202c41f0006a2206290200214620062045370200202c41e8006a2206290200214520062044370200202c2902602144202c2043370260202c4198016a2206290200214320062042370200202c4190016a2206290200214220062041370200202c4188016a2206290200214120062040370200202c290280012140202c203f37028001202c41b8016a2206290200213f2006203e370200202c41b0016a2206290200213e2006203d370200202c41a8016a2206290200213d2006203c370200202c2902a001213c202c203b3702a001202c41d8016a2206290200213b2006203a370200202c41d0016a2206290200213a20062039370200202c41c8016a2206290200213920062038370200202c2902c0012138202c20373702c001202c41386a2206290200213720062036370200202c41306a2206290200213620062035370200202c41286a2206290200213520062026370200202c2902202134202c20253702202003203337038809201a202c41e8016a22062902003703002003202c2902e0013703e0042006201b290300370200202c2003290388093702e0012015201a290300370300200320032903e0043703c00b2054290300213320542051370300205441086a2206290300215120062052370300201a2015290300370300200320032903c00b3703e00420312f0186162106410121550c010b201b2031205d41f0016c6a220641e8016a2903003703002003200641e0016a290300370388092006290300214f200641d8016a290300213b200641d0016a290300213a200641c8016a2903002139200641c0016a2903002138200641b8016a290300213f200641b0016a290300213e200641a8016a290300213d200641a0016a290300213c20064198016a290300214320064190016a290300214220064188016a290300214120064180016a2903002140200641f8006a2903002147200641f0006a2903002146200641e8006a2903002145200641e0006a2903002144200641d8006a290300214b200641d0006a290300214a200641c8006a2903002149200641c0006a2903002148200641386a2903002137200641306a2903002136200641286a2903002135200641206a2903002134200641186a290300214e200641106a290300214d200641086a290300214c2006200641f0016a20312f018616205d417f7322286a41f0016c10ca081a2031205d4104746a220641d8146a2903002151200641d0146a222a2903002133202a200641e0146a202820312f0186166a41047410ca081a201a201b290300370300203120312f018616417f6a22063b01861620032003290388093703e004410021550b200341d0066a41086a225a201a290300370300200320032903e0043703d00641012130200641ffff037141044b0d024100215b410121304101215c2031215403402054280280162206450d030240024020542f01841622280d00410021282006410020062f0186161b2154410021320c010b2028417f6a212841012132200621540b0240024002400240024002400240024002400240024002400240024020544188166a222a202841016a220641027422626a2261280200225e2f018616225f202a202841027422606a227f280200222a2f018616222c6a410b490d0020320d03201b205e41e8016a2903003703002003205e2903e00137038809205e41d8016a2903002125205e41d0016a2903002126205e41c8016a2903002152205e41b8016a2903002153205e41b0016a2903002163205e41a8016a2903002164205e4198016a2903002165205e4190016a2903002166205e4188016a2903002167205e41f8006a2903002168205e41f0006a2903002169205e41e8006a290300216a205e41d8006a290300216b205e41d0006a290300216c205e41c8006a290300216d205e41386a290300216e205e41306a290300216f205e41286a2903002170205e41186a2903002171205e2903c0012172205e2903a0012173205e290380012174205e2903602175205e2903402176205e2903202177205e2903102178205e2903082179205e290300217a205e205e41f0016a205f41f0016c41907e6a10ca08226141d8146a290300217b20612903d014217c206141d0146a206141e0146a20612f01861641047441706a10ca081a205b0d014100215e0c020b205b41016a215b20542f018616216220034188096a2054202841f0016c6a22800141f00110c9081a2080012054200641f0016c6a20622028417f73222f6a41f0016c10ca081a202a202c41f0016c6a20034188096a41f00110c90841f0016a205e205f41f0016c10c9081a205441d0146a226220284104746a22282903002125202841086a29030021262028206220064104746a202f20542f0186166a41047410ca081a202a41d0146a2228202c4104746a22622026370308206220253703002028202c41016a22624104746a205e41d0146a205f41047410c9081a2061207f41086a20542f0186162006417f736a41027441046a10ca081a0240200620542f01861622614f0d00206020546a418c166a212803402028280200222c20063b018416202c205436028016202841046a21282061200641016a2206470d000b20542f01861621610b20542061417f6a3b018616202a205f202a2f0186166a41016a3b018616205b41014d0d0c202a20624102746a4188166a205e4188166a205f41027441046a10c9081a2062205f6a2128206221060340202a20064102746a4188166a280200222c20063b018416202c202a3602801620062006202849222c6a220620284b0d0d202c450d0d0c000b0b206128028816215e20614188166a22062061418c166a20612f01861641027410ca081a205e4100360280160240205f450d004100212a03402006280200222c202a3b018416202c206136028016200641046a2106205f202a41016a222a470d000b0b205b417f6a212c0b206120612f018616417f6a3b018616200341a00b6a41086a201b290300227d3703002003200329038809227e3703a00b201b207d3703002003207e370388092054202841f0016c6a220641186a222a290300217d202a207137030020062903102171200620783703102006290308217820062079370308200629030021792006207a370300200641386a222a290200217a202a206e370200200641306a222a290200216e202a206f370200200641286a222a290200216f202a20703702002006290220217020062077370220200641d8006a222a2902002177202a206b370200200641d0006a222a290200216b202a206c370200200641c8006a222a290200216c202a206d3702002006290240216d20062076370240200641f8006a222a2902002176202a2068370200200641f0006a222a2902002168202a2069370200200641e8006a222a2902002169202a206a3702002006290260216a2006207537026020064198016a222a2902002175202a206537020020064190016a222a2902002165202a206637020020064188016a222a2902002166202a206737020020062902800121672006207437028001200641b8016a222a2902002174202a2053370200200641b0016a222a2902002153202a2063370200200641a8016a222a2902002163202a206437020020062902a0012164200620733702a001200641d8016a222a2902002173202a2025370200200641d0016a222a2902002125202a2026370200200641c8016a222a2902002126202a205237020020062902c0012152200620723702c001201a200641e8016a222a290200370300200320062902e0013703e004202a201b29030037020020062003290388093702e00120034180126a41086a2206201a290300370300200320032903e00437038012205420284104746a222841d0146a222a2903002172202a207c370300202841d8146a2228290300217c2028207b370300205420606a4188166a28020021280240205b450d002015200629030037030020032003290380123703c00b205e450d03205b417f6a202c470d0420282f018616222a410a4b0d052028202a41016a222c3b0186162028202a41f0016c6a220620523703c001200620643703a00120062067370380012006206a3703602006206d37034020062070370320200620713703102006207837030820062079370300200620032903c00b3703e001200641d8016a2073370300200641d0016a2025370300200641c8016a2026370300200641b8016a2074370300200641b0016a2053370300200641a8016a206337030020064198016a207537030020064190016a206537030020064188016a2066370300200641f8006a2076370300200641f0006a2068370300200641e8006a2069370300200641d8006a2077370300200641d0006a206b370300200641c8006a206c370300200641386a207a370300200641306a206e370300200641286a206f370300200641186a207d370300200641e8016a20152903003703002028202a4104746a220641d8146a207c370300200641d0146a20723703002028202c4102746a4188166a205e360200205e202c3b018416205e2028360280160c020b2015200629030037030020032003290380123703c00b20282f018616222a410b4f0d052028202a41016a3b0186162028202a41f0016c6a220620523703c001200620643703a00120062067370380012006206a3703602006206d37034020062070370320200620713703102006207837030820062079370300200620032903c00b3703e001200641d8016a2073370300200641d0016a2025370300200641c8016a2026370300200641b8016a2074370300200641b0016a2053370300200641a8016a206337030020064198016a207537030020064190016a206537030020064188016a2066370300200641f8006a2076370300200641f0006a2068370300200641e8006a2069370300200641d8006a2077370300200641d0006a206b370300200641c8006a206c370300200641386a207a370300200641306a206e370300200641286a206f370300200641186a207d370300200641e8016a20152903003703002028202a4104746a220641d8146a207c370300200641d0146a20723703000c010b201b202a202c417f6a226141f0016c6a220641e8016a290300370300200320062903e0013703880920062903c001212520062903a00121262006290380012152200629036021532006290340216320062903202164200629031021652006290308216620062903002167202a20614104746a226141d8146a2903002168206141d0146a2903002169200641d8016a290300216a200641d0016a290300216b200641c8016a290300216c200641b8016a290300216d200641b0016a290300216e200641a8016a290300216f20064198016a290300217020064190016a290300217120064188016a2903002172200641f8006a2903002173200641f0006a2903002174200641e8006a2903002175200641d8006a2903002176200641d0006a2903002177200641c8006a2903002178200641386a2903002179200641306a290300217a200641286a290300217b200641186a290300217c02400240205b0d00410021610c010b202a202c4102746a4188166a2802002261410036028016205b417f6a215f202a2f018616212c0b202a202c417f6a3b01861620034180126a41086a201b290300227d3703002003200329038809227e37038012200341a00b6a41086a222a207d3703002003207e3703a00b2054202841f0016c6a220641186a222c290300217d202c207c3703002006290310217c2006206537031020062903082165200620663703082006290300216620062067370300200641386a222c2902002167202c2079370200200641306a222c2902002179202c207a370200200641286a222c290200217a202c207b3702002006290220217b20062064370220200641d8006a222c2902002164202c2076370200200641d0006a222c2902002176202c2077370200200641c8006a222c2902002177202c20783702002006290240217820062063370240200641f8006a222c2902002163202c2073370200200641f0006a222c2902002173202c2074370200200641e8006a222c2902002174202c2075370200200629026021752006205337026020064198016a222c2902002153202c207037020020064190016a222c2902002170202c207137020020064188016a222c2902002171202c207237020020062902800121722006205237028001200641b8016a222c2902002152202c206d370200200641b0016a222c290200216d202c206e370200200641a8016a222c290200216e202c206f37020020062902a001216f200620263702a001200641d8016a222c2902002126202c206a370200200641d0016a222c290200216a202c206b370200200641c8016a222c290200216b202c206c37020020062902c001216c200620253702c001201a200641e8016a222c290200370300200320062902e0013703e004202c202a290300370200200620032903a00b3702e0012018201a290300370300200320032903e00437039010205420284104746a220641d0146a2228290300212520282069370300200641d8146a2206290300216920062068370300205420626a4188166a28020021280240205b450d002015201829030037030020032003290390103703c00b2061450d06205b417f6a205f470d0720282f0186162206410a4b0d08202841f0016a2028200641f0016c10ca081a202841d0016a206a370300202841c8016a206b3703002028206c3703c001202841b0016a206d370300202841a8016a206e3703002028206f3703a00120284190016a207037030020284188016a20713703002028207237038001202841f0006a2073370300202841e8006a207437030020282075370360202841d0006a2076370300202841c8006a207737030020282078370340202841306a2079370300202841286a207a3703002028207b3703202028207c3703102028206537030820282066370300202841d8016a2026370300202841b8016a205237030020284198016a2053370300202841f8006a2063370300202841d8006a2064370300202841386a2067370300202841186a207d370300202820032903c00b3703e001202841e8016a2015290300370300202841e0146a202841d0146a20282f01861641047410ca081a202841d8146a2069370300202820253703d0142028418c166a20284188166a20282f01861641027441046a10ca081a2028206136028816202820282f01861641016a22063b018616200641ffff0371212a410021060340202820064102746a4188166a280200222c20063b018416202c20283602801620062006202a496a222c202a4b0d022006202a4f2154202c21062054450d000c020b0b202841f0016a202820282f01861641f0016c10ca081a202841d8016a2026370300202841d0016a206a370300202841c8016a206b3703002028206c3703c001202841b8016a2052370300202841b0016a206d370300202841a8016a206e3703002028206f3703a00120284198016a205337030020284190016a207037030020284188016a20713703002028207237038001202841f8006a2063370300202841f0006a2073370300202841e8006a207437030020282075370360202841d8006a2064370300202841d0006a2076370300202841c8006a207737030020282078370340202841386a2067370300202841306a2079370300202841286a207a3703002028207b370320202841186a207d3703002028207c370310202820653703082028206637030020282003290390103703e001202841e8016a2018290300370300202841e0146a202841d0146a20282f01861641047410ca081a202841d8146a2069370300202820253703d014202820282f01861641016a3b0186160b205c203271450d0c205d20312f018616490d074100212802400340024020312802801622060d00410021060c020b202841016a212820312f018416212a20062131202a20062f0186164f0d000b202a41016a215d0b024020280d00200621310c0d0b2006205d4102746a4188166a280200213102402028417f6a2206450d00034020312802881621312006417f6a22060d000b0b4100215d0c0c0b41ecd0c800412b41a4bfc400103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b41e0cec80041204188bec400103c000b41ecd0c800412b41ccbec400103c000b419ecec800413041dcbec400103c000b41ecbec40041274194bfc400103c000b41012130205d41016a215d0c040b205e102c02400240205c417f732032417f73724101710d00205b4101470d01205420606a4188166a28020021312062410020321b205d6a215d0b024020542f01861622060d00410021300c050b4100215c20064105490d010c040b0b41d5a1c800412841f8bdc400103c000b024020032802f0060d00201c10a2010c040b20032802f806220620860120061b21860120032802f406410020061b2206450d03208601450d032006102c0c030b024002400240024020032802f0064101470d0020032802fc062206417f4c0d0220032802f406212c410121284101212a02402006450d0020061032222a450d040b200341003602e80d200320063602e40d2003202a3602e00d200341e00d6a4100200610c80120032802e00d20032802e80d222a6a202c200610c9081a201041086a202a20066a360200201020032903e00d3702000c010b200341e00d6a201c10fd06201b200341e00d6a41e80110c9081a410021280b2003202836028809200120034188096a205020267d202720257d2050202654ad7d10a20820034188096a200341f0066a41f00110c9081a200341186a20034188096a2026202510ff060c040b103b000b1039000b02402055450d00205d20312f018616490d0041002128024003402031280280162206450d01202841016a212820312f018416212a20062131202a20062f0186164f0d000b0b2028450d002028417f6a2206450d0003402006417f6a22060d000b0b2015205a290300370300200320032903d0063703c00b2003204f3703e00d2003204c3703e80d2003204d3703f00d2003204e3703f80d201b201141086a29020037030020034188096a41106a2206201141106a29020037030020034188096a41186a2228201141186a280200360200200320112902003703880920012001280208417f6a360208024020300d002001280200222a450d0320012802042254450d04202a28028816212c20012054417f6a3602042001202c360200202c410036028016202a102c0b200341e00d6a41186a222a2028280200360200200341e00d6a41106a222820062903003703002014201b2903003703002018201529030037030020032003290388093703e00d200320032903c00b37039010204fa722064102460d00201020032903e00d370200200f20032903901037020020034188096a41c8016a203937030020034188096a41a8016a203d37030020034188096a4188016a204137030020034188096a41e8006a204537030020034188096a41c8006a204937030020034188096a41286a203537030020034188096a41d0016a203a37030020034188096a41b0016a203e37030020034188096a4190016a204237030020034188096a41f0006a204637030020034188096a41d0006a204a37030020034188096a41306a2036370300201041086a2014290300370200201041106a2028290300370200201041186a202a280200360200200f41086a201829030037020020034188096a41d8016a203b37030020034188096a41b8016a203f37030020034188096a4198016a204337030020034188096a41f8006a204737030020034188096a41d8006a204b37030020034188096a41386a2037370300200320383703c80a2003203c3703a80a200320403703880a200320443703e809200320483703c809200320343703a809200320063602880920034188096a41f8016a2051370300200320333703f80a20034188096a10e6060b20034188096a200341f0066a41f00110c9081a200341186a20034188096a2050202710ff060b024020032802e81241786a0e03060006000b200341e8126a10ec060c050b41ecd0c800412b41ac9ec800103c000b4198bec400412141bcbec400103c000b20034188096a200341c8026a41980210c9081a0c010b20034188096a200341c8026a41980210c9081a0b0240024002400240200328028809417b6a0e03020001000b41d5a1c80041284190a2c800103c000b201a201b41e80110c9081a410021060c010b20192010290200370200201941086a201041086a280200360200410121060b200320063602e004200128020c21062001410036020c2001280210215f20012087013602102001280214212820014100360214200341003602d812200341003602d012200320283602f0122003205f3602ec12200320063602e812200341d0066a200341e8126a10ef06200341a00b6a41186a200341d0066a41186a280200360200200341a00b6a41106a200341d0066a41106a290300370300200341a00b6a41086a200341d0066a41086a290300370300200320032903d0063703a00b200341e8126a200341a00b6a10f806024020032802e81222064102460d00200341c00b6a200c41940210c9081a0340200341e00d6a200341c00b6a41940210c9081a200341f0066a200341c00b6a41940210c9081a20032006360290102017200341e00d6a41ec0110c9081a20034180126a41206a2228200e41206a29020037030020034180126a41186a222a200e41186a29020037030020034180126a41106a222c200e41106a29020037030020034180126a41086a2254200e41086a2902003703002003200e2902003703801202400240024020032802e0042006470d00024020064101460d00201a2018108207450d010c020b20032802ec042206200328029c10470d0020032802e40422612003280294102231460d0120612031200610cc08450d010b200341e8126a20034190106a41f00110c9081a200241206a2028290300370300200241186a202a290300370300200241106a202c290300370300200241086a20542903003703002002200329038012370300200341d0126a200341e8126a10e5060c010b200341e8126a20034190106a41f00110c9081a200241206a2028290300370300200241186a202a290300370300200241106a202c290300370300200241086a20542903003703002002200329038012370300200a200341e8126a10a6080b200341e8126a200341a00b6a10f80620032802e81222064102460d01200341c00b6a200c41940210c9081a0c000b0b200341a00b6a10f006201c200b41086a22062802003602002003200b2902003703f006200341e8126a200341f0066a10ef06200341e8126a10f0062006200341d0126a41086a280200360200200b20032903d0123702000240024020032802e0040d00201a10a2010c010b20032802e804220620880120061b21880120032802e404410020061b2206450d00208801450d002006102c0b02400240200328028809417b6a0e03010001000b20034188096a10ec060b205f2187010b20092007470d000b200721090b2009200720096b4198026d10c30202402008450d0020084198026c450d002005102c0b20002003290318370200200041106a200341186a41106a290300370200200041086a200341186a41086a290300370200200424000bf60202057f027e230041f0036b2202240002400240024020012802182203450d0020012003417f6a36021820012802042204450d0220012802002105024002402001280208220620042f0186164f0d00200421030c010b03400240024020042802801622030d00410021030c010b200541016a210520042f01841621060b2004102c20032104200620032f0186164f0d000b0b20024180026a2003200641f0016c6a41f00110c9081a200641016a2104200320064104746a220641d8146a2903002107200641d0146a290300210802402005450d00200320044102746a4188166a280200210302402005417f6a2204450d00034020032802881621032004417f6a22040d000b0b410021040b20002002410c6a41046a20024180026a41f00110c90841f00110c908220641f8016a2007370300200641f0016a20083703002001200436020820012003360204200141003602000c010b200041023602000b200241f0036a24000f0b41ecd0c800412b4198d1c800103c000bbe0201057f230041c0046b2202240002400240024020012802182203450d0020012003417f6a36021820012802042204450d0220012802002105024002402001280208220620042f018e184f0d00200421030c010b03400240024020042802881822030d00410021030c010b200541016a210520042f018c1821060b2004102c20032104200620032f018e184f0d000b0b200241a8026a200320064198026c6a41980210c9081a200641016a210402402005450d00200320044102746a4190186a280200210302402005417f6a2204450d00034020032802901821032004417f6a22040d000b0b410021040b2000200241106a200241a8026a41980210c90841980210c9081a2001200436020820012003360204200141003602000c010b200041023602000b200241c0046a24000f0b41ecd0c800412b4198d1c800103c000bba0605017f037e037f017e017f230041b0036b22022400200241186a200010b0014100210002402002290318a7450d00200241286a29030021032002290320210420024198016a200110a80320022d0098014101470d00200241306a41186a200241b1016a290000370300200241306a41106a200241a9016a290000370300200241306a41086a200241a1016a2900003703002002200229009901370330200220043703502002200337035802400240200420038450450d0042002104420021050c010b2002200241306a360264200241e8006a200241306a200241d0006a200241e4006a10b504024020022903684201520d00200241f8006a2903002105200229037021040c010b20024190016a290300210520024188016a290300210420022903704201520d00200241e8006a41106a2903002103200241d0016a200241e8006a41186a290300370300200241c8016a200337030020024198016a41086a41003a0000200241a9016a200241306a41086a290300370000200241b1016a200241306a41106a290300370000200241b9016a200241306a41186a2903003700002002410236029801200220022903303700a10120024198016a10c8020b20024198016a41186a2201420037030020024198016a41106a2206420037030020024198016a41086a220742003703002002420037039801200241e8006a41d4dcc700410810c5012007200241e8006a41086a22082900003703002002200229006837039801410d2100200241e8006a41bba8c700410d10c5012001200829000037030020062002290068370300200220024198016a412010d301200241106a2903002103200229030821092002280200210a2001420037030020064200370300200742003703002002420037039801200241e8006a41d4dcc700410810c501200720082900003703002002200229006837039801200241e8006a41bba8c700410d10c50120012008290000370300200620022900683703002002427f20034200200a1b220320057c20094200200a1b220520047c22092005542201ad7c22042001200420035420042003511b22011b3703702002427f200920011b37036820024198016a4120200241e8006a411010a7020b200241b0036a240020000bda0503097f027e037f23004190046b220324000240024002400240024002402001450d00200341106a2001417f6a220420022802881610fa06024020032802100d0010dd06210120034100360214200320013602100b200341086a200341106a10db06024020022f018616450d002002418c166a2105200241d0146a2106200328020c220741d0146a21082003280208417f6a21094100210a2002210b0340200341206a200b10a408200641086a290300210c2006290300210d20034190026a2004200528020010fa06200328029802210e200328029402210f2003280290022101200341a0026a200341206a41f00110c9081a024020010d004100210f10dd0621010b2009200f470d0620072f018616220f410a4b0d072007200f41016a22103b0186162007200f41f0016c6a200341a0026a41f00110c9081a2008200f4104746a220f200c370308200f200d370300200720104102746a4188166a2001360200200120103b01841620012007360280162003200e20032802186a41016a360218200541046a2105200b41f0016a210b200641106a2106200a41016a220a20022f018616490d000b0b20002003290310370200200041086a200341106a41086a2802003602000c010b10dd062206450d0141002105024020022f018616450d00200241d0146a2101200641d0146a210b410021052002210f0340200341a0026a200f10a40820062f0186162207410b4f0d04200141086a290300210c2001290300210d2006200741016a3b0186162006200741f0016c6a200341a0026a41f00110c9081a200b20074104746a2207200c3703082007200d370300200f41f0016a210f200141106a2101200541016a220520022f018616490d000b0b2000200536020820004100360204200020063602000b20034190046a24000f0b41ecd0c800412b41cc9ec800103c000b41e0cec80041204188bec400103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000bd00b010f7f230041e0046b220324000240024002400240024002402001450d00200341106a2001417f6a220420022802901810fb06024020032802100d0010dc06210120034100360214200320013602100b200341086a200341106a10da0602400240024020022f018e18450d00200328020c210520024194186a21062003280208417f6a2107200341206a41f4016a2108200341206a41f1016a220941086a210a200941186a210b200941106a210c200221014100210d0340200341206a200110a40802400240024002400240024002400240200141f0016a2d00000e0701020304050600010b200141fc016a280200220e417f4c0d0e200141f4016a280200210f02400240200e0d00410121100c010b200e10322210450d100b200341003602d0022003200e3602cc02200320103602c802200341c8026a4100200e10c80120032802c80220032802d00222106a200f200e10c9081a200841086a2010200e6a360200200820032903c802370200200341063a0090020c060b200341003a0090020c050b200341206a4180026a20014180026a290300370300200341013a0090022003200141f8016a290300370398020c040b200341023a0090022003200141f1016a280000360091020c030b200341033a0090022003200141f1016a290000370091020c020b200a200141f9016a2900003700002009200141f1016a290000370000200341043a0090020c010b200b20014189026a290000370000200c20014181026a290000370000200a200141f9016a2900003700002009200141f1016a290000370000200341053a0090020b200341b8026a2004200628020010fb0620032802c002211120032802bc02210f20032802b802210e200341c8026a200341206a41980210c9081a0240200e0d004100210f10dc06210e0b2007200f470d0220052f018e18220f410a4b0d032005200f41016a22103b018e182005200f4198026c6a200341c8026a41980210c9081a200520104102746a4190186a200e360200200e20103b018c18200e2005360288182003201120032802186a41016a360218200641046a210620014198026a2101200d41016a220d20022f018e18490d000b0b20002003290310370200200041086a200341106a41086a2802003602000c030b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b10dc06220e450d0141002106024020022f018e18450d00200341c8026a41f4016a2110200341c8026a41f1016a220f41086a210d200f41186a2107200f41106a210920022101410021060340200341c8026a200110a40802400240024002400240024002400240200141f0016a2d00000e0701020304050600010b200141fc016a2802002205417f4c0d0b200141f4016a28020021110240024020050d00410121040c010b200510322204450d0d0b200341003602282003200536022420032004360220200341206a4100200510c8012003280220200328022822046a2011200510c9081a201041086a200420056a36020020102003290320370200200341063a00b8040c060b200341003a00b8040c050b200341c8026a4180026a20014180026a290300370300200341013a00b8042003200141f8016a2903003703c0040c040b200341023a00b8042003200141f1016a2800003600b9040c030b200341033a00b8042003200141f1016a2900003700b9040c020b200d200141f9016a290000370000200f200141f1016a290000370000200341043a00b8040c010b200720014189026a290000370000200920014181026a290000370000200d200141f9016a290000370000200f200141f1016a290000370000200341053a00b8040b200e2f018e182205410b4f0d06200e200541016a3b018e18200e20054198026c6a200341c8026a41980210c9081a20014198026a2101200641016a220620022f018e18490d000b0b20002006360208200041003602042000200e3602000b200341e0046a24000f0b41ecd0c800412b41cc9ec800103c000b103b000b1039000b41e0cec80041204188bec400103c000ba30101047f0240200128020022020d0020004100360204200041106a4100360200200041003602180f0b20012802042103200221040240034020022f01861621052003450d012003417f6a2103200220054102746a4188166a280200210220042802881621040c000b0b2000200336020c200041003602082000200436020420002003360200200041146a2005360200200041106a2002360200200020012802083602180b9c0c01017f230041e0016b2202240002400240024002400240024020012802000e050102030400010b2002200141086a10e706200241386a200141c0006a10e706200241f0006a200141f8006a10e706200241a8016a200141b0016a10e706200041386a200241306a290300370300200041306a200241286a290300370300200041286a200241206a290300370300200041206a200241186a290300370300200041186a200241106a290300370300200041106a200241086a29030037030020002002290300370308200041c0006a2002290338370300200041c8006a200241386a41086a290300370300200041d0006a200241386a41106a290300370300200041d8006a200241386a41186a290300370300200041e0006a200241386a41206a290300370300200041e8006a200241386a41286a290300370300200041f0006a200241386a41306a290300370300200041a8016a200241f0006a41306a290300370300200041a0016a200241f0006a41286a29030037030020004198016a200241f0006a41206a29030037030020004190016a200241f0006a41186a29030037030020004188016a200241f0006a41106a29030037030020004180016a200241f0006a41086a290300370300200041f8006a2002290370370300200041e0016a200241a8016a41306a290300370300200041d8016a200241a8016a41286a290300370300200041d0016a200241a8016a41206a290300370300200041c8016a200241a8016a41186a290300370300200041c0016a200241a8016a41106a290300370300200041b8016a200241a8016a41086a290300370300200041b0016a20022903a801370300200042043703000c040b200042003703000c030b200241a8016a200141086a10e70620004201370300200041386a200241a8016a41306a290300370300200041306a200241a8016a41286a290300370300200041286a200241a8016a41206a290300370300200041206a200241a8016a41186a290300370300200041186a200241a8016a41106a290300370300200041106a200241a8016a41086a290300370300200020022903a8013703080c020b200241f0006a200141086a10e706200241a8016a200141c0006a10e706200041386a200241f0006a41306a290300370300200041306a200241f0006a41286a290300370300200041286a200241f0006a41206a290300370300200041206a200241f0006a41186a290300370300200041186a200241f0006a41106a290300370300200041106a200241f0006a41086a29030037030020002002290370370308200041c0006a20022903a801370300200041c8006a200241a8016a41086a290300370300200041d0006a200241a8016a41106a290300370300200041d8006a200241a8016a41186a290300370300200041e0006a200241a8016a41206a290300370300200041e8006a200241a8016a41286a290300370300200041f0006a200241a8016a41306a290300370300200042023703000c010b200241386a200141086a10e706200241f0006a200141c0006a10e706200241a8016a200141f8006a10e706200041386a200241386a41306a290300370300200041306a200241386a41286a290300370300200041286a200241386a41206a290300370300200041206a200241386a41186a290300370300200041186a200241386a41106a290300370300200041106a200241386a41086a29030037030020002002290338370308200041c0006a2002290370370300200041c8006a200241f0006a41086a290300370300200041d0006a200241f0006a41106a290300370300200041d8006a200241f0006a41186a290300370300200041e0006a200241f0006a41206a290300370300200041e8006a200241f0006a41286a290300370300200041f0006a200241f0006a41306a29030037030020004203370300200041a8016a200241a8016a41306a290300370300200041a0016a200241a8016a41286a29030037030020004198016a200241a8016a41206a29030037030020004190016a200241a8016a41186a29030037030020004188016a200241a8016a41106a29030037030020004180016a200241a8016a41086a290300370300200041f8006a20022903a8013703000b200241e0016a24000ba20101067f0240200028020022020d0041000f0b20002802042103034020022f01861621044100210520022100024002400340200420052206460d01200641016a210520012000108b022107200041f0016a21000240200741187441187541016a0e03000301000b0b2005417f6a21040b024020030d0041000f0b2003417f6a2103200220044102746a4188166a28020021020c010b0b200220064104746a41d0146a0baf0302037f017e230041f0196b22042400200441f0016a200141f00110c9081a02400240024020002802002201450d00200028020421050c010b41881610322201450d01410021052001200441f0036a41801610c908220641003b018616200641003602801620004100360204200020063602000b200441e0036a20052001200441f0016a10a3080240024020042802e0034101470d00200441f0016a41086a280200210520042903f0012107200441f0036a200441f0016a410c6a41e40110c9081a200441dc056a200441e0036a410c6a280200360200200420042902e4033702d4052004200441f0036a41f00110c908220141f0036a41086a2005360200200120073703f003200141f0036a410c6a200141f00110c9081a200120003602ec05200141f0036a2002200310c5081a0c010b200441e8036a2903002107200441f0016a10e6062007a72007422088a74104746a220041d0146a2201427f2001290300220720027c220220022007542201200041d8146a2200290300220220037c2001ad7c220320025420032002511b22011b3703002000427f200320011b3703000b200441f0196a24000f0b1039000bad0103037f017e017f02400240200128020022020d004100210241002103410021010c010b20012802042204ad4220862105200221030240034020022f018e1821062004450d0120054280808080707c21052004417f6a2104200220064102746a4190186a280200210220032802901821030c000b0b200128020821010b20002001360218200020053702082000200336020420002004360200200041146a2006360200200041106a20023602000b870a01057f23004180046b22022400024002400240024020012802004101470d002001410c6a2802002203417f4c0d02200128020421040240024020030d00410121050c010b200310322205450d040b410021062002410036020c2002200336020820022005360204200241046a4100200310c8012002280204200228020c22056a2004200310c9081a2002200520036a220336020c200241f0016a41086a22042003360200200220022902043703f001024002400240024002400240024020012d00f0010e0706010203040500060b200141fc016a2802002203417f4c0d08200141f4016a28020021010240024020030d00410121060c010b200310322206450d0a0b20024100360288022002200336028402200220063602800220024180026a4100200310c80120022802800220022802880222066a2001200310c9081a200241a3026a200620036a360000200220022903800237009b02410621060c050b200241a7026a20014180026a2903003700002002200141f8016a29030037009f02410121060c040b2002200141f1016a28000036029802410221060c030b2002200141f1016a29000037039802410321060c020b20024198026a41086a200141f9016a2900003703002002200141f1016a29000037039802410421060c010b200241a7026a20014180026a29000037000020024198026a41086a200141f9016a29000037030020024180026a41086a20014190026a2d00003a00002002200141f1016a29000037039802200220014188026a29000037038002410521060b200020022903f001370204200020022903980237001120004109360200200041106a20063a0000200041286a2002290380023703002000410c6a2004280200360200200041196a20024198026a41086a290300370000200041206a200241a7026a290000370000200041306a20024180026a41086a2903003703000c010b20024198026a200141086a10fd0620024198026a200241086a20024198026a41e80110c90841e80110c9081a41002103024002400240024002400240024020012d00f0010e0706010203040500060b200141fc016a2802002203417f4c0d07200141f4016a28020021010240024020030d00410121060c010b200310322206450d090b200241003602f801200220033602f401200220063602f001200241f0016a4100200310c80120022802f00120022802f80122066a2001200310c9081a2002418b026a200620036a360000200220022903f00137008302410621030c050b2002418f026a20014180026a2903003700002002200141f8016a29030037008702410121030c040b2002200141f1016a28000036028002410221030c030b2002200141f1016a29000037038002410321030c020b20024180026a41086a200141f9016a2900003703002002200141f1016a29000037038002410421030c010b2002418f026a20014180026a29000037000020024180026a41086a200141f9016a290000370300200241f0016a41086a20014190026a2d00003a00002002200141f1016a29000037038002200220014188026a2900003703f001410521030b200041086a20024198026a41e80110c9081a200041f0016a20033a00002000410b36020020002002290380023700f101200041f9016a20024180026a41086a29030037000020004180026a2002418f026a29000037000020004188026a20022903f00137030020004190026a200241f0016a41086a2903003703000b20024180046a24000f0b103b000b1039000bed0101027f0240200028020022022001280200470d0041012103024002400240024002402002417f6a0e0404020100030b200041086a200141086a10a708450d04200041c0006a200141c0006a10a708450d0441002103200041f8006a200141f8006a10a708450d02200041b0016a200141b0016a10a70821030c020b200041086a200141086a10a708450d0341002103200041c0006a200141c0006a10a708450d01200041f8006a200141f8006a10a7080f0b41002103200041086a200141086a10a708450d00200041c0006a200141c0006a10a7080f0b20030f0b200041086a200141086a10a7080f0b41000bb53005037f017e207f1c7e077f23002202210320024180046b416071220224002002420037031802400240024002400240024020012802000e050102030400010b20024198026a200141086a10e706200241d0026a200141c0006a10e70620024188036a200141f8006a10e706200241c0036a200141b0016a10e706200041386a20024198026a41306a290300370300200041306a20024198026a41286a290300370300200041286a20024198026a41206a290300370300200041206a20024198026a41186a290300370300200041186a20024198026a41106a290300370300200041106a20024198026a41086a2903003703002000200229039802370308200041c0006a20022903d002370300200041c8006a200241d0026a41086a290300370300200041d0006a200241d0026a41106a290300370300200041d8006a200241d0026a41186a290300370300200041e0006a200241d0026a41206a290300370300200041e8006a200241d0026a41286a290300370300200041f0006a200241d0026a41306a290300370300200041a8016a20024188036a41306a290300370300200041a0016a20024188036a41286a29030037030020004198016a20024188036a41206a29030037030020004190016a20024188036a41186a29030037030020004188016a20024188036a41106a29030037030020004180016a20024188036a41086a290300370300200041f8006a200229038803370300200041e0016a200241c0036a41306a290300370300200041d8016a200241c0036a41286a290300370300200041d0016a200241c0036a41206a290300370300200041c8016a200241c0036a41186a290300370300200041c0016a200241c0036a41106a290300370300200041b8016a200241c0036a41086a290300370300200041b0016a20022903c003370300200042043703000c040b200042003703000c030b200241c0036a200141086a10e70620004201370300200041386a200241c0036a41306a290300370300200041306a200241c0036a41286a290300370300200041286a200241c0036a41206a290300370300200041206a200241c0036a41186a290300370300200041186a200241c0036a41106a290300370300200041106a200241c0036a41086a290300370300200020022903c0033703080c020b20024188036a200141086a10e706200241c0036a200141c0006a10e706200041386a20024188036a41306a290300370300200041306a20024188036a41286a290300370300200041286a20024188036a41206a290300370300200041206a20024188036a41186a290300370300200041186a20024188036a41106a290300370300200041106a20024188036a41086a2903003703002000200229038803370308200041c0006a20022903c003370300200041c8006a200241c0036a41086a290300370300200041d0006a200241c0036a41106a290300370300200041d8006a200241c0036a41186a290300370300200041e0006a200241c0036a41206a290300370300200041e8006a200241c0036a41286a290300370300200041f0006a200241c0036a41306a290300370300200042023703000c010b200241d0026a200141086a10e70620024188036a200141c0006a10e706200241c0036a200141f8006a10e706200041386a200241d0026a41306a290300370300200041306a200241d0026a41286a290300370300200041286a200241d0026a41206a290300370300200041206a200241d0026a41186a290300370300200041186a200241d0026a41106a290300370300200041106a200241d0026a41086a290300370300200020022903d002370308200041c0006a200229038803370300200041c8006a20024188036a41086a290300370300200041d0006a20024188036a41106a290300370300200041d8006a20024188036a41186a290300370300200041e0006a20024188036a41206a290300370300200041e8006a20024188036a41286a290300370300200041f0006a20024188036a41306a29030037030020004203370300200041a8016a200241c0036a41306a290300370300200041a0016a200241c0036a41286a29030037030020004198016a200241c0036a41206a29030037030020004190016a200241c0036a41186a29030037030020004188016a200241c0036a41106a29030037030020004180016a200241c0036a41086a290300370300200041f8006a20022903c0033703000b410421040240024002400240024020012903002205a722060e050001020304000b410021040c030b410121040c020b410221040c010b410321040b02402004417f6a220720044b0d000240024002400240024002400240024002400240024002400240024020070e040001020c0e0b2006417f6a0e04020304050d0b2006417e6a0e030506070c0b2006417d6a0e0207080b0b200141086a21040c090b200141086a21040c080b200141086a21040c070b200141086a21040c060b200141c0006a21040c050b200141c0006a21040c040b200141c0006a21040c030b200141f8006a21040c020b200141f8006a21040c010b20054204520d01200141b0016a21040b200141086a2108200141c0006a2109200141f8006a210a200141b0016a210b200041086a210c200041c0006a210d200041f8006a210e200041b0016a210f200241186a41b0016a2106200241c0036a410972211041002111200241d0006a2112200241186a41306a2113200241186a41286a2114200241f0006a2115200241e8006a2116200241e0006a211720024188016a211820024180016a2119200241b0016a211a200241a8016a211b200241a0016a211c200241d0016a211d200241c0016a211e200241f0016a211f200241e8016a2120200241e0016a2121200241186a41186a2122200241b8016a212320024198016a2124200241f8006a2125034041002107024020042d00000d002002290318210542002126200242003703182012290300212720132903002128201429030021292015290300212a2016290300212b2017290300212c200241186a41f8006a290300212d2018290300212e2019290300212f201a2903002130201b2903002131201c2903002132201d290300213320062903002134201e2903002135201f29030021362020290300213720212903002138200229033821392002290358213a2002290378213b200229039801213c20022903b801213d20022903d801213e20022903f801213f2002290320214020022903282141200220222903003703d803200220413703d003200220403703c803200220053703c0032040a72104410921070240024002400240024002402005a70e050501020300050b200241d0026a410f6a2010410f6a290000370000200241d0026a41086a201041086a290000370300200220102900003703d002420321260c030b200241d0026a410f6a2010410f6a290000370000200241d0026a41086a201041086a290000370300200220102900003703d0020c020b200241d0026a410f6a2010410f6a290000370000200241d0026a41086a201041086a290000370300200220102900003703d002420121260c010b200241d0026a410f6a2010410f6a290000370000200241d0026a41086a201041086a290000370300200220102900003703d002420221260b200421070b20024188036a41306a2242200241c0036a41306a29030037030020024188036a41286a2243200241c0036a41286a29030037030020024188036a41206a2244200241c0036a41206a29030037030020024188036a41186a2245200241c0036a41186a29030037030020024188036a41106a2246200241c0036a41106a29030037030020024188036a41086a2204200241c0036a41086a29030037030020024198026a41086a2247200241d0026a41086a29030037030020024198026a410f6a2248200241d0026a410f6a290000370000200220022903d00237039802200220022903c00337038803200241186a10a20120232036370300201a2037370300201b203837030020242033370300201820353703002025203037030020152031370300201620323703002012202e3703002013202f370300200241186a41206a202a3703002022202b370300200241186a41106a202c3703002006200229038803370300200641086a2004290300370300200641106a2046290300370300200641186a2045290300370300200641206a2044290300370300200641286a2043290300370300200641306a20422903003703002002203e3703a00120022034370390012002203d370380012002203c3703602002203b3703402002203a3703202002203f3703c0012002202d370358200220263703180240200741ff01714109470d0020024188036a410f6a200241c0036a410f6a2900003700004108210720024188036a41086a200241c0036a41086a290000370300200220022900c003370388030c010b20024188036a410f6a2048290000370000200420472903003703002002200229039802370388030b20024180026a410f6a220420024188036a410f6a29000037000020024180026a41086a224220024188036a41086a2903003703002002200229038803220537038002200241c0036a410f6a22432004290000370000200241c0036a41086a22442042290300370300200220053703c00302400240024002400240024020110e0403000102050b200d21042000280200417e6a41034f0d040c030b200e21042000280200417d6a41024f0d030c020b200f210420002903004204510d010c020b200c21042000280200417f6a41044f0d010b0240024002400240024020042d0000417e6a0e06000102040403040b200441246a2802004101470d032004412c6a2802002242450d03200441286a2802002245450d032042450d032045102c0c030b200441046a2802004101470d022004410c6a2802002242450d02200441086a2802002245450d022042450d022045102c0c020b200441186a2802004101470d01200441206a2802002242450d012004411c6a2802002245450d012042450d012045102c0c010b200441086a2802002242450d00200441046a2802002245450d002042450d002045102c0b200420073a0000200420022903c003370001200441206a2029370000200441186a2039370000200441286a2028370000200441096a2044290300370000200441106a2043290000370000200441306a2027370000410421040240024002400240024020012903002205a722420e050001020304000b410021040c030b410121040c020b410221040c010b410321040b2004201141026a22116b220720044b0d020240024002400240024020070e0400010203070b200821042042417f6a41044f0d060c030b200921042042417e6a41034f0d050c020b200a21042042417d6a41024f0d040c010b200b210420054204520d030b2011417f6a21110c010b0b41a79dc800412f41d89dc800105c000b0240024002400240024020022802180e0404000102030b024002400240024020022d0020417e6a0e06000102070703070b20022802444101470d06200241c8006a2802004100200241cc006a28020022021b2204450d062002450d062004102c200324000f0b20022802244101470d05200241286a28020041002002412c6a28020022021b2204450d052002450d052004102c200324000f0b200241386a2802004101470d04200228023c4100200241c0006a28020022021b2204450d042002450d042004102c200324000f0b20022802244100200241286a28020022021b2204450d032002450d032004102c200324000f0b0240024002400240024020022d0020417e6a0e06000102040403040b20022802444101470d03200241c8006a2802004100200241cc006a28020022041b2200450d032004450d032000102c0c030b20022802244101470d02200241286a28020041002002412c6a28020022041b2200450d022004450d022000102c0c020b200241386a2802004101470d01200228023c4100200241c0006a28020022041b2200450d012004450d012000102c0c010b20022802244100200241286a28020022041b2200450d002004450d002000102c0b0240024002400240200241d8006a2d0000417e6a0e06000102060603060b200228027c4101470d0520024180016a280200410020024184016a28020022021b2204450d052002450d052004102c200324000f0b200228025c4101470d04200241e0006a2802004100200241e4006a28020022021b2204450d042002450d042004102c200324000f0b200241f0006a2802004101470d0320022802744100200241f8006a28020022021b2204450d032002450d032004102c200324000f0b200228025c4100200241e0006a28020022021b2204450d022002450d022004102c200324000f0b0240024002400240024020022d0020417e6a0e06000102040403040b20022802444101470d03200241c8006a2802004100200241cc006a28020022041b2200450d032004450d032000102c0c030b20022802244101470d02200241286a28020041002002412c6a28020022041b2200450d022004450d022000102c0c020b200241386a2802004101470d01200228023c4100200241c0006a28020022041b2200450d012004450d012000102c0c010b20022802244100200241286a28020022041b2200450d002004450d002000102c0b02400240024002400240200241d8006a2d0000417e6a0e06000102040403040b200228027c4101470d0320024180016a280200410020024184016a28020022041b2200450d032004450d032000102c0c030b200228025c4101470d02200241e0006a2802004100200241e4006a28020022041b2200450d022004450d022000102c0c020b200241f0006a2802004101470d0120022802744100200241f8006a28020022041b2200450d012004450d012000102c0c010b200228025c4100200241e0006a28020022041b2200450d002004450d002000102c0b024002400240024020024190016a2d0000417e6a0e06000102050503050b20022802b4014101470d04200241b8016a2802004100200241bc016a28020022021b2204450d042002450d042004102c200324000f0b2002280294014101470d0320024198016a28020041002002419c016a28020022021b2204450d032002450d032004102c200324000f0b200241a8016a2802004101470d0220022802ac014100200241b0016a28020022021b2204450d022002450d022004102c200324000f0b200228029401410020024198016a28020022021b2204450d012002450d012004102c200324000f0b0240024002400240024020022d0020417e6a0e06000102040403040b20022802444101470d03200241c8006a2802004100200241cc006a28020022041b2200450d032004450d032000102c0c030b20022802244101470d02200241286a28020041002002412c6a28020022041b2200450d022004450d022000102c0c020b200241386a2802004101470d01200228023c4100200241c0006a28020022041b2200450d012004450d012000102c0c010b20022802244100200241286a28020022041b2200450d002004450d002000102c0b02400240024002400240200241d8006a2d0000417e6a0e06000102040403040b200228027c4101470d0320024180016a280200410020024184016a28020022041b2200450d032004450d032000102c0c030b200228025c4101470d02200241e0006a2802004100200241e4006a28020022041b2200450d022004450d022000102c0c020b200241f0006a2802004101470d0120022802744100200241f8006a28020022041b2200450d012004450d012000102c0c010b200228025c4100200241e0006a28020022041b2200450d002004450d002000102c0b0240024002400240024020024190016a2d0000417e6a0e06000102040403040b20022802b4014101470d03200241b8016a2802004100200241bc016a28020022041b2200450d032004450d032000102c0c030b2002280294014101470d0220024198016a28020041002002419c016a28020022041b2200450d022004450d022000102c0c020b200241a8016a2802004101470d0120022802ac014100200241b0016a28020022041b2200450d012004450d012000102c0c010b200228029401410020024198016a28020022041b2200450d002004450d002000102c0b0240024002400240200241c8016a2d0000417e6a0e06000102040403040b20022802ec014101470d03200241f0016a2802004100200241f4016a28020022021b2204450d032002450d032004102c200324000f0b20022802cc014101470d02200241d0016a2802004100200241d4016a28020022021b2204450d022002450d022004102c200324000f0b200241e0016a2802004101470d0120022802e4014100200241e8016a28020022021b2204450d012002450d012004102c200324000f0b20022802cc014100200241d0016a28020022021b2204450d002002450d002004102c0b200324000bb30a06027f017e0b7f017e027f017e230041901f6b22022400200028020821032000410036020820002902002104200041003602002002200336024820022004370340200241106a200241c0006a10ed062002410036020820024100360200200241c0166a41186a2205200241106a41186a2206280200360200200241c0166a41106a2207200241106a41106a2208290300370300200241c0166a41086a2209200241106a41086a220a290300370300200220022903103703c016200241881b6a200241c0166a10f7060240024020022802881b4102460d00200241c0006a410c6a210b200241c0006a41e4016a210c200241306a410472210d200241f0186a410c6a210e200241801d6a210f0340200f290300210420022903f81c2110200241c0006a200241881b6a41f00110c9081a200241c0006a200110c208200241a01d6a200241c0006a41f00110c9081a200241f0186a200241a01d6a41f00110c9081a0240024020022802002203450d00200228020421110c010b41881610322203450d03410021112003200241c0006a41801610c908221241003b018616201241003602801620024100360204200220123602000b200241306a20112003200241f0186a10a3080240024020022802304101470d0020022903f018211320022802f8182103200241c0006a200e41e40110c9081a200c41086a200d41086a280200360200200c200d290200370200200241dc166a200241c0006a41f00110c9081a2002200336024820022013370340200b200241dc166a41f00110c9081a200220023602bc02200241c0006a2010200410c5081a0c010b200228023c210320022802382111200241f0186a10e606201120034104746a220341d8146a2004370300200341d0146a20103703000b200241881b6a200241c0166a10f70620022802881b4102470d000b0b200241c0166a10ee06200241881b6a41086a200041086a2203280200360200200220002902003703881b200241c0006a200241881b6a10ed06200241c0006a10ee062003200241086a28020036020020002002290300370200200041146a2203280200211120034100360200200029020c21042000410036020c2002201136024820022004370340200241106a200241c0006a10ef06200241003602382002410036023020052006280200360200200720082903003703002009200a290300370300200220022903103703c0162000410c6a210f200241c0006a200241c0166a10f8060240200228024022124102460d00200241dc166a200241c0006a410472220d41940210c9081a200241c0006a41ec016a2103200241881b6a41f0016a2111200241a01d6a410472210c0340200241f0186a200241dc166a41940210c9081a200241c0006a200241dc166a41940210c9081a200220123602a01d200c200241f0186a41ec0110c9081a200241a01d6a200110c208200241881b6a200241a01d6a41f00110c9081a201141206a200341206a290200370200201141186a200341186a290200370200201141106a200341106a290200370200201141086a200341086a29020037020020112003290200370200200241c0006a200241881b6a41980210c9081a200241306a200241c0006a10a608200241c0006a200241c0166a10f806200228024022124102460d01200241dc166a200d41940210c9081a0c000b0b200241c0166a10f006200241881b6a41086a200f41086a22032802003602002002200f2902003703881b200241c0006a200241881b6a10ef06200241c0006a10f0062003200241306a41086a280200360200200f2002290330370200200241901f6a24000f0b1039000b8e0703027f017e037f230041c0056b22022400200241386a200141386a290200370300200241306a200141306a290200370300200241286a200141286a290200370300200241206a200141206a290200370300200241186a200141186a290200370300200241106a200141106a290200370300200241086a200141086a2902003703002002200129020037030020024190016a200210bf070240024002400240200228029001410c460d00200241a8036a20024190016a41980210c9081a200228022021030240024020022802004101460d00410021012003450d012002413c6a28020021010c010b2002411c6a28020021012003450d00417f20012002413c6a2802006a220320032001491b21010b417f200141016a220320032001491bad4298027e2204422088a70d022004a72201417f4c0d02200110322205450d032005200241a8036a41980210c908210320024101360248200220014198026e220636024420022003360240200241d0006a41386a200241386a290300370300200241d0006a41306a200241306a290300370300200241d0006a41286a200241286a290300370300200241d0006a41206a200241206a290300370300200241d0006a41186a200241186a290300370300200241d0006a41106a200241106a290300370300200241d0006a41086a200241086a2903003703002002200229030037035020024190016a200241d0006a10bf070240200228029001410c460d004198022103410121010340200241a8036a20024190016a41980210c9081a024020012006470d00200228027021070240024020022802504101460d00200228028c01410020071b21050c010b200228026c21052007450d00417f2005200228028c016a220720072005491b21050b200241c0006a2006417f200541016a220720072005491b109305200228024021050b200520036a200241a8036a41980210c9081a2002200141016a220136024820024190016a200241d0006a10bf07200228029001410c460d0120034198026a2103200228024421060c000b0b20024190016a10c00702402002280250450d00200241d0006a41047210ee060b02402002280270450d00200241f4006a10f0060b20002002290340370200200041086a200241c0006a41086a2802003602000c010b200041003602082000420837020002402002280200450d00200241047210ee060b2002280220450d00200241246a10f0060b200241c0056a24000f0b103b000b1039000bf90401027f024002400240024002400240024020002802000e06060001020304050b20002802042000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041106a10a2010f0b20002802042000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041206a10a201200041106a280200200041186a28020010c402200041146a2802002201450d0420002802102200450d0420014188026c450d042000102c0f0b20002802042000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041106a280200200041186a28020010c302200041146a2802002201450d0320002802102200450d0320014198026c450d032000102c0f0b20002802042000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041206a10a201200041106a280200200041186a28020010c402200041146a2802002201450d0220002802102200450d0220014188026c450d022000102c0f0b20002802042000410c6a28020010c3020240200041086a2802002201450d0020002802042202450d0020014198026c450d002002102c0b200041206a10a201200041106a280200200041186a28020010c402200041146a2802002201450d0120002802102200450d0120014188026c450d012000102c0c010b200041186a10a20120002802042000410c6a28020010c302200041086a2802002201450d0020002802042200450d0020014198026c450d002000102c0f0b0b130020004103360204200041a0d1c4003602000b130020004104360204200041d0d3c4003602000bb40302047f017e23004180016b22012400200141206a22024200370300200141186a22034200370300200141086a41086a420037030020014200370308200141086a41c1dcc700410610c501200141e8006a419ca4c600410610c5012002200141e8006a41086a290000370300200320012900683703002001412036022c2001200141086a360228200141306a200141086a412010b30102400240200128023022030d00410021020c010b200128023421042001200141306a41086a28020036024420012003360240200141e8006a200141c0006a10860202400240200128026822020d004100210220014100360250200142013703482001410f36025c2001200141286a3602582001200141c8006a360264200141fc006a41013602002001420137026c200141b4bcc3003602682001200141d8006a360278200141e4006a41dcb7c000200141e8006a103e1a200135025042208620013502488410000240200128024c450d002001280248102c0b0c010b200129026c21050b2004450d002003102c0b0240024020020d0020004100360208200042043702000c010b20002005370204200020023602000b20014180016a24000b130020004101360204200041b0e0c4003602000b3400200041dcdcc70036020420004100360200200041146a4103360200200041106a41bce1c400360200200041086a420a3702000b0b0020004104410010fd020b130020004107360204200041a4e5c4003602000bed0401057f23004180016b22022400200241386a41ffdcc700410710c501200241d8006a41ddecc400411210c5012002200136027c200241286a200241fc006a410410c7012002410c6a200241fc006a41046a3602002002200241306a3602042002200241fc006a3602082002200241286a360200200241c8006a2002107e024002402002280250220141206a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b200241003602302002200336022c20022004360228200241286a4100411010c8012002280228200228023022036a22042002290038370000200441086a200241386a41086a2900003700002002200341106a2203360230200241286a2003411010c8012002280228200228023022036a22042002290058370000200441086a200241d8006a41086a22052900003700002002200341106a220436023020022802482103200241286a2004200110c80120022802282204200228023022066a2003200110c9081a2002200620016a22013602300240200228024c450d002003102c0b20022004200110dc0420052002410c6a290200370300200241d8006a41106a200241146a290200370300200241f0006a22012002411c6a290200370300200241f8006a2203200241246a280200360200200220022902043703580240024020022802004101460d00200041003602000c010b20004101360200200020022903583702042000410c6a200241e0006a290300370200200041146a200241e8006a2903003702002000411c6a2001290300370200200041246a20032802003602000b0240200228022c450d002004102c0b20024180016a24000f0b103b000b1039000bad0202027f027e230041306b2201240002404101103222020d001039000b200142013702042001200236020020014100410110c8012001280200200128020822026a41003a0000410041003502ccd248200141106aad7c42adfed5e4d485fda8d8007e42218922033e02ccd2482001200241016a360208200141106a41a789c5004101109a01200041186a4200370300200041146a41c08ec100360200200041003602102000200341ccd2c800ad22047c37030820002003200485220320044218898520034210868520034225897c3703002000200129001037002c200041346a200141186a2900003700002000413c6a200141206a290000370000200041c4006a200141106a41186a29000037000020002001290300370220200041286a2001280208360200200141306a24000ba30401047f230041e0006b22052400024002402004417f4c0d000240024020040d00410121060c010b200410322206450d020b41002107200541003602282005200436022420052006360220200541206a4100200410c80120052802202206200528022822086a2003200410c9081a2005200820046a220836022802402008200141286a280200470d000240200128022022072006470d00410121070c010b20062007200810cc084521070b02402005280224450d002006102c0b0240024020070d00200520032004109a01200541206a41186a200541186a2207290000370300200541206a41106a200541106a2206290000370300200541206a41086a200541086a220829000037030020052005290000370320200541c0006a41086a200241086a280200360200200520022902003703400240024020040d00410121020c010b200410322202450d040b200541003602582005200436025420052002360250200541d0006a4100200410c8012005280250200528025822026a2003200410c9081a2005200220046a3602582001200541206a200541c0006a200541d0006a10a107200041186a2007290000370000200041106a2006290000370000200041086a2008290000370000200020052900003700000c010b2000200129002c370000200041186a200141c4006a290000370000200041106a2001413c6a290000370000200041086a200141346a2900003700000b200541e0006a24000f0b103b000b1039000b860e04037f017e057f077e230041b0026b2204240002400240024002400240200141d0006a22052001412c6a412010cc08450d0020044180016a41186a200541186a29000037030020044180016a41106a200541106a29000037030020044180016a41086a200541086a29000037030020042005290000370380010240200120044180016a1092072206450d00200628020c41004a0d010b200441e0006a41086a2201200541086a290000370300200441e0006a41106a2202200541106a290000370300200441e0006a41186a2203200541186a29000037030020042005290000370360413010322205450d01200541003a0000200520042903603700012005200429008001370021200541096a2001290300370000200541116a2002290300370000200541196a2003290300370000200541286a20044187016a29000037000002400240024020052d00000e0402020002010b20052802082201450d0120052802042202450d012001450d012002102c0c010b20052802282201450d0020052802242202450d002001450d002002102c0b2005102c200041003602400c040b2004410036021420042005360210200441f0ecc40036020c20042001360208412410322205450d002004422437021c20042005360218200441186a41004104102f2004280218200428022022056a20023600002004200541046a36022020034120200441186a10ca0420044180016a200441086a2004280218220520042802201093070240200428021c450d002005102c0b0240024002400240024002402004280280014101460d002004280284012205450d010240024020044188016a2903002207422088a741044f0d00410021010c010b20052800002102410121010b02402007a7450d002005102c0b2001450d012004200236021820044180016a200441086a200441186a41041093072004280280014101470d0220042802840122052d00000e0405050305040b02400240024020042802840122052d00000e0402020002010b200541086a2802002201450d01200541046a2802002202450d012001450d012002102c0c010b200541286a2802002201450d00200541246a2802002202450d002001450d002002102c0b2005102c200041003602400c080b200041003602400c070b024020042802840122030d00200041003602400c070b200420044188016a2903002207422088a7220636025c2004200336025841002105200441003a00382006417f6a21010240034020062005460d01200441186a20056a200320056a22022d00003a00002004200241016a3602582004200541016a22023a00382004200136025c2001417f6a21012002210520024120460d060c000b0b0240200541ff0171450d00200441003a00380b410021050c050b200541086a2802002201450d01200541046a2802002202450d012001450d012002102c0c010b200541286a2802002201450d00200541246a2802002202450d002001450d002002102c0b2005102c200041003602400c030b1039000b200441c0016a41086a2205200441186a41086a290300370300200441c0016a41106a2201200441186a41106a290300370300200441c0016a41186a2206200441186a41186a290300370300200420042903183703c0010240200241ff0171411f4b0d00410021050c010b200441e0006a41086a2005290300370300200441e0006a41106a2001290300370300200441e0006a41186a2006290300370300200420042903c001370360200441c0016a200441d8006a10f603024020042802e00122050d00410021050c010b20044180016a41186a2201200441e0006a41186a29030037030020044180016a41106a2202200441e0006a41106a29030037030020044180016a41086a2206200441e0006a41086a29030037030020044180016a41286a2208200441c0016a41086a29030037030020044180016a41306a2209200441c0016a41106a29030037030020044180016a41386a220a200441c0016a41186a290300370300200441f0016a41086a220b200441ec016a2802003602002004200429036037038001200420042903c0013703a0012004200441e4016a2902003703f001200441186a41386a220c200a290300370300200441186a41306a2009290300220d370300200441186a41286a2008290300220e370300200441186a41206a20042903a001220f370300200441186a41186a20012903002210370300200441186a41106a20022903002211370300200441186a41086a2006290300221237030020042004290380012213370318200041306a200d370300200041286a200e370300200041206a200f370300200041186a2010370300200041106a2011370300200041086a201237030020002013370300200041386a200c290300370300200020042903f001370244200041cc006a200b2802003602000b200020053602402007a7450d002003102c0b200441b0026a24000bb70303017f027e097f230041106b220224002002200029030042adfed5e4d485fda8d8007e220342a0cbbf9599b5a19f0a7c2204200129001885200129000020048542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852001290008200342efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852001290010200342bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010ce0820002802102205200041086a2903002203200241086a29030020022903007c85200389a72206712107200641197641818284086c2108200041146a28020021094100210a0340200920076a280000220b2008732200417f73200041fffdfb776a71418081828478712100200a41046a220a20076a200571210c02400340024020000d00200c2107200b200b4101747141808182847871450d034100210d0c020b20012009410020006841037620076a2005716b41306c6a220d41506a2206460d012000417f6a200071210020012006412010cc080d000b0b0b200241106a2400200d41706a4100200d1b0bbf1903037f037e1b7f23004180046b2204240020012802042105200128020021062001280208220141086a2900002107200141106a290000210820012900002109200441186a220a200141186a290000370300200441106a220b2008370300200441086a220c2007370300200420093703002003410174210d2004410772210e200441d3036a210f200441c8016a41186a2110200441c8016a410c6a2111200441c8016a41206a211241002113410021144100211502400240024002400240024002400240024002400240024002400240024002400240034020154101762101024002402015410171450d00200120034b0d03200120034f0d05200441013a00d001200420023602c801200420013602cc012004200220016a2d000041f001713a00d1010c010b200120034b0d03200441003a00d001200420013602cc01200420023602c8010b200441a8036a20062004200441c8016a200528020c11060002400240024020042802a80322160d00200441c8016a41086a2213200441086a290300370300200441c8016a41106a2203200441106a290300370300200441c8016a41186a2217200441186a290300370300200420042903003703c8014130103222010d010c140b20042802ac032118200441c8016a201620042802b00310a00320042d00c8014101460d10201441016a21140c010b200120042903c80137000120012004290020370021200120144100473a0000200141096a2013290300370000200141116a2003290300370000200141196a2017290300370000200141286a200441276a29000037000020004101360200200020013602040c110b034020042802e401211920042802e001211a20042802dc01211b20042802d801211c20042802d401211720042802d001211d20042802cc012101200441206a201241a80110c9081a200428029403211e200428029003211f024002400240024020010e051210000102120b4100210102402017410174201c6b2220200d20136b221e201e20204b1b2221450d000340201320016a221e410176221f20034f0d0a201c20016a2222410176222320174f0d0b2002201f6a2d0000221f410f71201f41f00171410476201e4101711b201d20236a2d0000221e410f71201e41047620224101711b470d012021200141016a2201470d000b202121010b024020012020460d002000420037020020180d140c150b202021010c020b200420193602dc012004201a3602d8012004201b3602d4012004201c3602d001200420173602cc012004201d3602c8012010200441206a41a80110c9081a02400240200d2013460d002013410176220120034f0d0b200441c8016a200220016a2d00002201410f71200141047620134101711b410c6c6a2201280200221b4102470d012000420037020020180d140c150b02400240201f0d00200441003602a8030c010b201e417f4c0d1102400240201e0d00410121130c010b201e10322213450d170b200441b0036a220141003602002004201e3602ac03200420133602a803200441a8036a4100201e10c80120042802a803200128020022136a201f201e10c9081a20012013201e6a3602000b200020042903a803370204200041003602002000410c6a200441b0036a28020036020020180d130c140b2001280204211a200141086a280200211941012120410121010c010b20042802a0032121200428029c0321202004280298032101200420193602d0012004201a3602cc012004201b3602c8012011200441206a41a80110c9081a20042001360284032004201e360280032004201f3602fc024100210102402017410174201c6b2219200d20136b221b201b20194b1b221a450d000340201320016a221e410176221f20034f0d0b201c20016a2222410176222320174f0d0c2002201f6a2d0000221f410f71201f41f00171410476201e4101711b201d20236a2d0000221e410f71201e41047620224101711b470d01201a200141016a2201470d000b201a21010b20012019470d0b02400240201b2019460d00201320196a2201410176221720034f0d0e200441c8016a200220176a2d00002217410f71201741047620014101711b410c6c6a2217280200221b4102470d012000420037020020180d130c140b0240024020200d00200441003602a8030c010b2021417f4c0d100240024020210d00410121130c010b202110322213450d160b200441b0036a22014100360200200420213602ac03200420133602a803200441a8036a4100202110c80120042802a803200128020022136a2020202110c9081a2001201320216a3602000b200020042903a803370204200041003602002000410c6a200441b0036a28020036020020180d120c130b201941016a2120201941016a21012017280204211a201741086a28020021190b200120156a2115201320206a21130240201b450d00200441c8016a201a201910a00320042d00c8014101460d100c010b0b0240024020194120460d00200441c8016a41086a2217200c290300370300200441c8016a41106a221c200b2903003703002010200a290300370300200420042903003703c8012019417f4c0d0e0240024020190d00410121010c010b201910322201450d140b200441003602f803200420193602f403200420013602f003200441f0036a4100201910c80120042802f00320042802f80322016a201a201910c9081a200f41086a200120196a360000200f20042903f003370000413010322201450d13200141043a0000200120042903c801370001200120042900d003370021200141096a2017290300370000200141116a201c290300370000200141196a2010290300370000200141286a200441d0036a41076a290000370000410121170c010b41002117200441c8016a41026a41003a0000200441003b01c801201a2f0000211c200441f0036a41026a201a41026a2d00003a0000201a411f6a2d0000211d201a41176a2900002107201a2800032101201a2900072108200441d0036a41086a221e201a410f6a290000370300200441d0036a41106a221f2007370300200441d0036a41186a2222201d3a00002004201c3b01f003200420083703d003201020222d00003a0000200441c8016a41106a201f290300370300200441c8016a41086a201e290300370300200420042903d0033703c8010b200441cc036a41026a221c200441f0036a41026a2d00003a0000200441a8036a41086a221d200441c8016a41086a290300370300200441a8036a41106a221e200441c8016a41106a290300370300200441a8036a41186a221f2010280200360200200420042f01f0033b01cc03200420042903c8013703a803024020170d00200e20042903a803370000200e41086a201d290300370000200e41106a201e290300370000200e41186a201f2d00003a0000200420042f01cc033b0100200420013600032004201c2d00003a00022018202420181b21242018450d012024450d012016102c0c010b0b20004101360200200020013602042018450d0f0c0e0b2001200341b8c4c800104f000b2001200341c8c4c800104f000b2001200341d8c4c800103f000b201f200341f8c3c800103f000b2023201741f8c3c800103f000b2001200341f8c3c800103f000b201f200341f8c3c800103f000b2023201741f8c3c800103f000b2000420037020020180d050c060b2017200341f8c3c800103f000b410021190240024002402017410174201c6b200d20136b2215470d004100211941002101024002402015450d00410021010340201c20016a221e410176221f20174f0d04201320016a2222410176222320034f0d05201d201f6a2d0000221f410f71201f41f00171410476201e4101711b200220236a2d0000221e410f71201e41047620224101711b470d012015200141016a2201470d000c020b0b20012015470d010b201a417f4c0d0302400240201a0d00410121010c010b201a10322201450d090b200441003602d0012004201a3602cc01200420013602c801200441c8016a4100201a10c80120042802c801221920042802d00122016a201b201a10c9081a20042001201a6a3602d00120042902cc0121070b2000201936020420004100360200200041086a200737020020180d050c060b201f201741f8c3c800103f000b2023200341f8c3c800103f000b103b000b2000420037020020180d010c020b20042d00c9012113200441a8036a41086a2203200441086a290300370300200441a8036a41106a2217200441106a290300370300200441a8036a41186a221c200441186a290300370300200420042903003703a803413010322201450d02200141033a0000200120042903a803370001200120133a0021200120042901d003370122200141096a2003290300370000200141116a2017290300370000200141196a201c290300370000200141286a200441d6036a29010037010020004101360200200020013602042018450d010b2016102c0b20044180046a24000f0b1039000bc02d03157f0c7e047f23002201210220014180056b41607122032400200041146a220128020022042802002105200141c08ec1003602002000280210210620004100360210200041186a42003703002003200036021c2004200641016a22076a2108200441046a21012005417f73418081828478712109200341a0026a410572210a200341a0026a41276a210b200341a0026a41206a210c20042105024002400240024002400240024002400240024002400240024002400240024002400340024002400240024020090d000340024020012008490d004100210d0c040b200541c07d6a210520012802002109200141046a220e21012009418081828478712209418081828478460d000b2009418081828478732209417f6a200971210d200e21010c010b2009417f6a200971210d2005450d010b20034180046a41186a220f200541002009684103766b41d0006c6a221041b07f6a220941186a29020037030020034180046a41106a2211200941106a29020037030020034180046a41086a2212200941086a2902003703002003200929020037038004201041506a280200210e201041546a2d00002110200b200941cc006a280000360000200c200941c5006a290000370300200341a0026a41186a22132009413d6a290000370300200341a0026a41106a2214200941356a290000370300200341a0026a41086a22152009412d6a290000370300200320092900253703a00220104102470d010b0240034002400240200d0d000340200120084f0d04200541c07d6a210520012802002109200141046a220e21012009418081828478712209418081828478460d000b200941808182847873220d417f6a200d712109200e21010c010b2005450d02200d417f6a200d7121090b200d68210e2009210d20054100200e4103766b41d0006c6a220e41506a28020041244d0d00200e41586a280200102c2009210d0c000b0b0240024020060d00410021010c010b200441ff01200641056a10cb081a20062101200641074d0d00200741037641076c21010b200020063602102000411c6a4100360200200041186a2001360200200041146a2004360200200328021c22052d00484101460d0f200541cc006a28020021010240200541386a220e28020022092009417f6a2208200541306a220d28020022092005412c6a220a2802006b716b4101470d00200a109003200e280200417f6a2108200d28020021090b200d2008200941016a71360200200541346a28020020094102746a2001360200200541286a280200220920014d0d032005280220200141fc006c6a22012902102116200120032903b00237021020012902082117200120032903a802370208200341003a00a002200341003602a40220012902002118200120032903a002370200200141186a22092902002119200920032903b802370200200341206a41086a2209200141e8006a290200370300200341206a41106a2208200141f0006a290200370300200341206a41186a220d200141f8006a2802003602002003201637039001200320173703880120032018370380012003200129026037032020032019370398012001290240211a200141c8006a290200211b200141d0006a290200211c200141d8006a290200211d2001290220211e200141286a290200211f200141306a29020021202003200141386a2902002221370378200320203703702003201f3703682003201e3703602003201d3703582003201c3703502003201b3703482003201a3703402018a741ff01714101470d02200341a8016a41176a220e2003290098012218370000200341a8016a41106a220a2003290091012217370300200341a8016a41086a221020032900890122163703002005280244220120032900810122193700002001201ea7220f3a001f200141086a2016370000200141106a2017370000200141176a2018370000200320193703a801200341a0026a41d8006a201d370300200341a0026a41d0006a201c370300200341a0026a41c8006a201b370300200341e0026a201a370300200341dc026a200328027c360200200341d4026a2003290274370200200341cc026a200329026c370200200320032902643702c40220034180036a2003290320370300200341a0026a41e8006a2009290300370300200341a0026a41f0006a2008290300370300200341a0026a41f8006a200d280200360200200341a9026a2010290300370000200341b1026a200a290300370000200341a0026a41186a200e290000370000200320032903a8013700a102200341c0026a200f3a0000200341013a00a002200541206a200341a0026a1099032101200328021c220341003a0048200341cc006a20013602000c0f0b200341b8036a41186a2209200f290300370300200341b8036a41106a22222011290300370300200341b8036a41086a22232012290300370300200341a8016a41086a22242015290300370300200341a8016a41106a22152014290300370300200341a8016a41186a22142013290300370300200341a8016a41206a2213200c290300370300200341a8016a41276a2225200b28000036000020032003290380043703b803200320032903a0023703a801200f20092903003703002011202229030037030020122023290300370300200320032903b80337038004200a20032903a801370000200a41086a2024290300370000200a41106a2015290300370000200a41186a2014290300370000200a41206a2013290300370000200a41276a2025280000360000200320103a00a4022003200e3602a002200328021c220941c0006a2802002110200928023c210902400240200e41244b0d00200a210f0c010b20032802ac02210e20032802a802210f0b200320032f01cc023b01c8042003200e3602c4042003200f3602c004200920034180046a200341c0046a201028021c110700024020032802a00241244d0d0020032802a802102c0b200d21090c000b0b2017a721052017422088a72101200341003602d401200341003a00ac01200341003602a801200341e8016a41106a2003280258360200200341e8016a41086a2003290350370300200320032903483703e801201aa72123024002400240024002402018422088a70e050102030400010b200341c0026a201f370300200341b8026a201e370300200341b0026a2019370300200341a8026a2016370300200341c8026a2020370300200320053602a002200320013602a40202400240200141244b0d00200341a9026a210e0c010b2016422088a7210e2019a721010b2005410176210d0240024020054101710d002001200d490d074101210a410021090c010b2001200d4d0d07200e200d6a2d0000410f7121094100210a200d41016a210d0b200141017420056b220541ffff03200541ffff03491b220541017641036a22101032220f450d072001200d6b2108200e200d6a210d200341003602e001200320103602dc012003200f3602d80102402021422088a72225410020251b220e0d002003200536028404200341013b01800420034180046a200341d8016a10910341002105200a450d0b410021010c0e0b200320053602840420034181023b01800420034180046a200341d8016a10910341002105200a450d0b410021010c0c0b410110322201450d06200342013702dc01200320013602d801200341d8016a4100410110c80120032802d80120032802e0016a41003a0000200320032802e00141016a3602e0010c0e0b200341c0026a201f370300200341b8026a201e370300200341b0026a2019370300200341a8026a2016370300200341c8026a2020370300200320053602a002200320013602a40202400240200141244b0d00200341a9026a21080c010b2016422088a721082019a721010b200541017621090240024020054101710d0020012009490d0820034188046a200120096b360200200341003b0180042003200820096a360284040c010b200120094d0d08200341013a00800420034188046a2001200941016a22056b3602002003200820056a360284042003200820096a2d0000410f713a0081040b200341d8016a20034180046a2021a7220120231092030240200141002021422088a722051b2201450d002005450d002001102c0b20032802a40241244d0d0d200341ac026a280200102c0c0d0b200341c0026a201f370300200341b8026a201e370300200341b0026a2019370300200341a8026a2016370300200341c8026a2020370300200320053602a002200320013602a40202400240200141244b0d00200341a9026a21090c010b2016422088a721092019a721010b200320053602e803200320013602e403200320093602e003200341c0046a200341e0036a109303200341a8016a200341e0036a410020011094032101200328021c2105200341b8036a41086a201a370300200341b8036a41106a20032903e801370300200341d0036a200341e8016a41086a290300370300200341d8036a200341e8016a41106a280200360200200320213703b80320034180046a2005200341b8036a200341a8016a108f03200341a8016a2001109503109603000b109703000b2001200941b4f3c000103f000b200d200141f0c2c8001058000b200d20014180c3c800103f000b1039000b2009200141f0c2c8001058000b200920014180c3c800103f000b410121010c020b410121010b03400240024020010e020001010b200520084f0d03200d20056a2d00002109200541016a2105410121010c010b024020032802e001220120032802dc01470d00200341d8016a2001410110c8010b20032802d80120016a20093a00002003200141016a3602e001410021010c000b0b03400240024020010e020001010b200520084f0d02200d20056a2d00002109200541016a2105410121010c010b024020032802e001220120032802dc01470d00200341d8016a2001410110c8010b20032802d80120016a20093a00002003200141016a3602e001410021010c000b0b20032802e001222221010240202220032802dc01470d00200341d8016a2022410110c80120032802e00121010b2021a7212420032802d80120016a41003a0000200320032802e00141016a22013602e0010240200120032802dc01470d00200341d8016a2001410110c80120032802e00121010b202441c0046a211420032802d80120016a41003a0000200320032802e00141016a3602e0010240200e450d00200e201a422088a7200341d8016a10bb010b024002400240024020142024470d0041002110410021010c010b20034180046a4101722109200341a9026a2106200341c0046a41017221054100210a20242101410021104101210e024002400340200341023a00800420012902002118200329039804211a2003290390042117200329038804211e2001200329038004370200200129020821162001201e3702082001290210211e20012017370210200141186a220829020021172008201a370200200320173703d8042003201e3703d004200320163703c804200320183703c004200141206a280200210b20034180046a41176a220f200541176a29000037000020034180046a41106a2208200541106a29000037030020034180046a41086a220d200541086a290000370300200320052900003703800402402018a7220c41ff017122114103470d0020104180fe037141087621010c050b200341e0036a41176a2212200f290000370000200341e0036a41106a220f2008290300370300200341e0036a41086a200d29030022183703002003200329038004221a3703e003200341c0046a41176a22132012290000370000200341c0046a41106a2212200f290300370300200341c0046a41086a220f20183703002003201a3703c00402400240024020114102470d00200341023a00b8030c010b0240024020032802a402221141244b0d00200621150c010b20032802b002211120032802ac0221150b200320032802a0023602f804200320113602f404200320153602f004200341a8016a200341f0046a4101200a1094032111200328021c2115200920032903c004370000200941086a200f290300370000200941106a2012290300370000200941176a20132900003700002003200c3a0080042003200b3602a004200341b8036a201520034180046a200341a8016a108f03200341a8016a201110950320032d00b8034103460d010b20034180046a41206a200341b8036a41206a29030037030020034180046a41186a200341b8036a41186a2903003703002008200341b8036a41106a290300370300200d200341b8036a41086a290300370300200320032903b8032218370380044100210802400240024002402018a741ff0171417f6a0e020103000b20094120200341d8016a10bb010c010b200341c0046a41186a200941186a2900003703002012200941106a290000370300200f200941086a290000370300200320092900003703c00420032802a404220841214f0d04200341c0046a2008200341d8016a10bb010b200e21080b200a41016a210a200e410174210e20082010722110200141246a22012014460d030c010b0b20104180fe037141087621010c040b2008412041bce7c300104f000b20104180fe037141087621010b200341033a00c00420034197046a20032900d80437000020034190046a20032900d10437030020034188046a20032900c904370300200320032900c104370380040b200341033a00b8030b202241026a21052022417d4b0d0220032802e00122092005490d0320032802d80120226a2001410874201041ff0171723b000002402025450d002023450d002025102c0b2024102c20032802a40241244d0d00200341ac026a280200102c0b200328021c220141c0006a2802002105200128023c210120034180046a41086a4100280280a240360200200341002902f8a14037038004200341a0026a200120034180046a20032802d80120032802e0012005280214110400200328021c2201280244220520032903a002370000200541086a200341a0026a41086a290300370000200541106a200341a0026a41106a290300370000200541186a200341a0026a41186a2903003700002001200128026c41016a36026c2001280244220541186a2900002118200541106a290000211a200541086a2900002117200141c9006a2005290000370000200141013a0048200141d1006a2017370000200141d9006a201a370000200141e1006a2018370000024020032802d801410020032802dc0122011b2205450d002001450d002005102c0b20032802a80141244d0d00200341b0016a280200102c0b0240200041286a2802002203450d0020002802202101200341fc006c210303400240024020012d00000d00200141046a1098030c010b200141246a1098030b200141fc006a2101200341847f6a22030d000b0b0240200041246a2802002201450d0020002802202203450d00200141fc006c450d002003102c0b200041386a280200210102400240200041306a28020022032000412c6a28020022054f0d00200120054f0d0141b4a0c700412341d8a0c700103c000b20012003490d030b02402001450d0020002802342203450d00200141ffffffff0371450d002003102c0b024020002802102205450d00200041146a280200220341046a2101200520036a41016a21092003280200417f73418081828478712105024003400240024020050d000340200120094f0d04200341c07d6a210320012802002105200141046a220821012005418081828478712205418081828478460d000b2005418081828478732205417f6a200571210d200821010c010b2003450d022005417f6a200571210d0b2005682108200d21052003410020084103766b41d0006c6a220841506a28020041244d0d00200841586a280200102c200d21050c000b0b200041146a280200200028021041016aad42d0007ea76b102c0b200224000f0b2022200541cce7c3001059000b2005200941cce7c300104f000b2003200141e8a0c700104f000ba71d03037f037e1c7f23004180046b2205240020012802042106200128020021072001280208220141086a2900002108200141106a29000021092001290000210a200541186a220b200141186a290000370300200541106a220c2009370300200541086a220d20083703002005200a3703002003410174210e2005410772210f200541d3036a2110200541c8016a41186a2111200541c8016a410c6a2112200541c8016a41206a211341002114410021154100211602400240024002400240024002400240024002400240024002400240034020164101762101024002400240024002400240024002400240024002402016410171450d00200120034b0d02200120034f0d04200541013a00d001200520023602c801200520013602cc012005200220016a2d000041f001713a00d1010c010b200120034b0d02200541003a00d001200520013602cc01200520023602c8010b200541a8036a20072005200541c8016a200628020c110600024020052802a80322170d00200541c8016a41086a2214200541086a290300370300200541c8016a41106a2203200541106a290300370300200541c8016a41186a2218200541186a290300370300200520052903003703c801413010322201450d17200120052903c80137000120012005290020370021200120154100473a0000200141096a2014290300370000200141116a2003290300370000200141196a2018290300370000200141286a200541276a29000037000020004101360200200020013602040c160b20052802b003210120052802ac032119200428020c20154b0d062001417f4c0d170240024020010d00410121180c010b200110322218450d170b200541003602282005200136022420052018360220200541206a4100200110c8012005280220200528022822186a2017200110c9081a200541c8016a41086a221a200d290300370300200541c8016a41106a221b200c2903003703002011200b2903003703002005201820016a360228200520052903003703c80120042802082218200441046a221c280200470d05201841016a221d2018490d172018410174221e201d201e201d4b1b221d4104201d41044b1bad42307e2208422088a7221e0d172008a7221d4100480d17201e45410274211e201841306c201f20181b211f0240024002402004280200410020181b22180d00201d450d010c060b201f0d01201d0d050b201e21180c050b2018201f201d103522180d040c070b2001200341b8c4c800104f000b2001200341c8c4c800104f000b2001200341d8c4c800103f000b201d10322218450d030b20042018360200201c201d41306e360200200428020821180b2004280200201841306c6a2218200529032037020420182015360200201820052903c8013702102018410c6a200541206a41086a280200360200201841186a201a290300370200201841206a201b290300370200201841286a20112903003702002004200428020841016a3602080b200541c8016a2017200110a00320052d00c8014101460d0c201541016a21150c010b201e0d0e0c0f0b034020052802e401212020052802e001212120052802dc01212220052802d801211a20052802d401211820052802d001211b20052802cc012101200541206a201341a80110c9081a200528029403211d200528029003211c024002400240024020010e050e0d0001020e0b4100210102402018410174201a6b2223200e20146b221d201d20234b1b2224450d000340201420016a221d410176221c20034f0d07201a20016a221e410176222520184f0d082002201c6a2d0000221c410f71201c41f00171410476201d4101711b201b20256a2d0000221d410f71201d410476201e4101711b470d012024200141016a2201470d000b202421010b024020012023460d002000420037020020190d100c110b202321010c020b200520203602dc01200520213602d801200520223602d4012005201a3602d001200520183602cc012005201b3602c8012011200541206a41a80110c9081a02400240200e2014460d002014410176220120034f0d08200541c8016a200220016a2d00002201410f71200141047620144101711b410c6c6a220128020022224102470d012000420037020020190d100c110b02400240201c0d00200541003602a8030c010b201d417f4c0d1302400240201d0d00410121140c010b201d10322214450d130b200541b0036a220141003602002005201d3602ac03200520143602a803200541a8036a4100201d10c80120052802a803200128020022146a201c201d10c9081a20012014201d6a3602000b200020052903a803370204200041003602002000410c6a200541b0036a28020036020020190d0f0c100b20012802042121200141086a280200212041012123410121010c010b20052802a0032124200528029c0321232005280298032101200520203602d001200520213602cc01200520223602c8012012200541206a41a80110c9081a20052001360284032005201d360280032005201c3602fc024100210102402018410174201a6b2220200e20146b2222202220204b1b2221450d000340201420016a221d410176221c20034f0d08201a20016a221e410176222520184f0d092002201c6a2d0000221c410f71201c41f00171410476201d4101711b201b20256a2d0000221d410f71201d410476201e4101711b470d012021200141016a2201470d000b202121010b20012020470d080240024020222020460d00201420206a2201410176221820034f0d0b200541c8016a200220186a2d00002218410f71201841047620014101711b410c6c6a221828020022224102470d012000420037020020190d0f0c100b0240024020230d00200541003602a8030c010b2024417f4c0d120240024020240d00410121140c010b202410322214450d120b200541b0036a22014100360200200520243602ac03200520143602a803200541a8036a4100202410c80120052802a803200128020022146a2023202410c9081a2001201420246a3602000b200020052903a803370204200041003602002000410c6a200541b0036a28020036020020190d0e0c0f0b202041016a2123202041016a210120182802042121201841086a28020021200b200120166a2116201420236a211402402022450d00200541c8016a2021202010a00320052d00c8014101460d0c0c010b0b0240024020204120460d00200541c8016a41086a2218200d290300370300200541c8016a41106a221a200c2903003703002011200b290300370300200520052903003703c8012020417f4c0d100240024020200d00410121010c010b202010322201450d100b200541003602f803200520203602f403200520013602f003200541f0036a4100202010c80120052802f00320052802f80322016a2021202010c9081a201041086a200120206a360000201020052903f003370000413010322201450d0f200141043a0000200120052903c801370001200120052900d003370021200141096a2018290300370000200141116a201a290300370000200141196a2011290300370000200141286a200541d0036a41076a290000370000410121180c010b41002118200541c8016a41026a41003a0000200541003b01c80120212f0000211a200541f0036a41026a202141026a2d00003a00002021411f6a2d0000211b202141176a29000021082021280003210120212900072109200541d0036a41086a221d2021410f6a290000370300200541d0036a41106a221c2008370300200541d0036a41186a221e201b3a00002005201a3b01f003200520093703d0032011201e2d00003a0000200541c8016a41106a201c290300370300200541c8016a41086a201d290300370300200520052903d0033703c8010b200541cc036a41026a221a200541f0036a41026a2d00003a0000200541a8036a41086a221b200541c8016a41086a290300370300200541a8036a41106a221d200541c8016a41106a290300370300200541a8036a41186a221c2011280200360200200520052f01f0033b01cc03200520052903c8013703a803024020180d00200f20052903a803370000200f41086a201b290300370000200f41106a201d290300370000200f41186a201c2d00003a0000200520052f01cc033b0100200520013600032005201a2d00003a00022019202620191b21262019450d012026450d012017102c0c010b0b20004101360200200020013602042019450d0b0c0a0b201c200341f8c3c800103f000b2025201841f8c3c800103f000b2001200341f8c3c800103f000b201c200341f8c3c800103f000b2025201841f8c3c800103f000b2000420037020020190d040c050b2018200341f8c3c800103f000b410021040240024002402018410174201a6b200e20146b2216470d004100210441002101024002402016450d00410021010340201a20016a221d410176221c20184f0d04201420016a221e410176222520034f0d05201b201c6a2d0000221c410f71201c41f00171410476201d4101711b200220256a2d0000221d410f71201d410476201e4101711b470d012016200141016a2201470d000c020b0b20012016470d010b2021417f4c0d080240024020210d00410121010c010b202110322201450d080b200541003602d001200520213602cc01200520013602c801200541c8016a4100202110c80120052802c801220420052802d00122016a2022202110c9081a2005200120216a3602d00120052902cc0121080b2000200436020420004100360200200041086a200837020020190d040c050b201c201841f8c3c800103f000b2025200341f8c3c800103f000b2000420037020020190d010c020b20052d00c9012114200541a8036a41086a2203200541086a290300370300200541a8036a41106a2218200541106a290300370300200541a8036a41186a221a200541186a290300370300200520052903003703a803413010322201450d02200141033a0000200120052903a803370001200120143a0021200120052901d003370122200141096a2003290300370000200141116a2018290300370000200141196a201a290300370000200141286a200541d6036a29010037010020004101360200200020013602042019450d010b2017102c0b20054180046a24000f0b1039000b103b000ba11106077f017e077f017e017f027e230041c0006b22032400024002400240200128020c220441016a22052004490d00200520012802002206200641016a220741037641076c20064108491b22064101764d0d0102400240024002402005200641016a2206200520064b1b22050d0041c08ec100210841002109410021050c010b0240024020054108490d000240200541ffffffff01712005470d00417f2005410374220541076e417f6a677641016a41012005410d4b1b21050c020b41d5edc400411c41f4edc400103c000b4104410820054104491b21050b2005ad42307e220a422088a70d02200aa72206200541046a22096a22082006490d02200810322208450d01200820066a220841ff01200910cb081a2005417f6a2209200541037641076c20094108491b21050b200841506a210b200520046b210c200141046a280200220d41046a210e200d20076a210f200d280200417f7341808182847871211020022802002111034002400240024020100d000340200e200f4f0d02200d41c07e6a210d200e2802002105200e41046a2206210e2005418081828478712205418081828478460d000b2005418081828478732207417f6a20077121102006210e0c020b200d450d00201021072010417f6a20107121100c010b2001200436020c2001200c360208200041003602002001280200210520012009360200200141046a22062802002107200620083602002005450d062007200541016aad42307ea76b102c0c060b410021052003201129030042adfed5e4d485fda8d8007e220a42a0cbbf9599b5a19f0a7c2212200d41002007684103766b41306c6a41506a221329001885201329000020128542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852013290008200a42efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852013290010200a42bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010ce08201141086a290300220a200341086a29030020032903007c85200a89220aa721060340200541046a2205200620097122076a2106200820076a280000418081828478712202450d000b0240200820026841037620076a20097122056a2c00004100480d002008280200418081828478716841037621050b200820056a200aa741197622063a00002005417c6a20097120086a41046a20063a0000200b410020056b41306c6a220541286a201341286a290200370200200541206a201341206a290200370200200541186a201341186a290200370200200541106a201341106a290200370200200541086a201341086a290200370200200520132902003702000c000b0b1039000b41d5edc400411c41f4edc400103c000b41d5edc400411c41f4edc400103c000b4100210641002105024003400240024020064101710d00200520074f0d0320052106200541016a21050c010b200541036a220620054922080d0220062007492209450d022007200541046a20081b200720091b21050b200141046a28020020066a220620062802002206410776417f73418182840871200641fffefdfb07726a360200410121060c000b0b200141046a280200210502400240200128020041016a22064104490d00200520066a20052800003600000c010b200541046a2005200610ca081a0b41002105024020012802002204417f460d0020022802002113200141046a210d4100210503400240200d2802002208200522106a2d0000418001470d00410020106b211102400340200341106a201329030042adfed5e4d485fda8d8007e220a42a0cbbf9599b5a19f0a7c22122008201141306c6a41506a220e29001885200e29000020128542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85200e290008200a42efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85200e290010200a42bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010ce082001280200210941002105201341086a290300220a200341106a41086a29030020032903107c85200a89220aa7220f21060340200541046a2205200620097122076a2106200820076a280000418081828478712202450d000b0240200820026841037620076a20097122056a2c00004100480d002008280200418081828478716841037621050b20052009200f7122066b201020066b732009714104490d01200820056a22062d000021072006200aa741197622023a00002005417c6a20097120086a41046a20023a00000240200741ff01460d00200d280200410020056b41306c6a41506a2205290200210a2005200e290200370200200541186a220629020021122006200e41186a2207290200370200200541106a220629020021142006200e41106a2208290200370200200541086a220629020021152006200e41086a2209290200370200200920153702002008201437020020072012370200200e200a370200200541286a2206290200210a2006200e41286a2207290200370200200529022021122005200e290220370220200e20123702202007200a370200200d28020021080c010b0b200d280200220620106a41ff013a0000200620012802002010417c6a716a41046a41ff013a0000200d280200410020056b41306c6a41506a2205200e290200370200200541086a200e41086a290200370200200541106a200e41106a290200370200200541186a200e41186a290200370200200541206a200e41206a290200370200200541286a200e41286a2902003702000c010b200820106a200aa741197622053a000020092010417c6a7120086a41046a20053a00000b201041016a210520102004470d000b20012802002205200541016a41037641076c20054108491b21050b2000410036020020012005200128020c6b3602080b200341c0006a24000b840201037f230041306b220324002003410136020020032002410376220436020402402004450d000240024020024178714108470d002000420137020820002002360204200020013602000c010b20002001410120021b22043602002000200241077122014108723602042000410c6a200141016a2205410771200241786a417871723602002000410020054103762202200141074622011b20042002410020011b6a723602080b200341306a24000f0b2003412c6a41023602002003411c6a41023602002003420237020c200341fcefc400360208200341023602242003200341206a3602182003200341046a36022820032003360220200341086a418cf0c4001046000b9517010b7f230041b0046b2202240041002103200241003a00a8032001280204417f6a2104024002400240024003402004417f460d01200241e8026a20036a200128020022052d00003a0000200120043602042001200541016a3602002002200341016a22053a00a8032004417f6a210420052103200541c000470d000b200241b0036a41086a2201200241e8026a41086a290300370300200241b0036a41106a2203200241e8026a41106a290300370300200241b0036a41186a2206200241e8026a41186a290300370300200241b0036a41206a2207200241e8026a41206a290300370300200241b0036a41286a2208200241e8026a41286a290300370300200241b0036a41306a2209200241e8026a41306a290300370300200241b0036a41386a220a200241e8026a41386a290300370300200220022903e8023703b003410121040240200541ff017141c000490d0020024180016a41386a200a29030037030020024180016a41306a200929030037030020024180016a41286a200829030037030020024180016a41206a200729030037030020024180016a41186a200629030037030020024180016a41106a200329030037030020024180016a41086a2001290300370300200220022903b00337038001410021040b200241c0006a41086a20024180016a41086a290300370300200241c0006a41106a20024180016a41106a290300370300200241c0006a41186a20024180016a41186a290300370300200241c0006a41206a20024180016a41206a290300370300200241c0006a41286a20024180016a41286a290300370300200241c0006a41306a20024180016a41306a290300370300200241c0006a41386a20024180016a41386a29030037030020022002290380013703402004450d010c020b0240200341ff0171450d00200241003a00a8030b200241c0006a41086a20024180016a41086a290300370300200241c0006a41106a20024180016a41106a290300370300200241c0006a41186a20024180016a41186a290300370300200241c0006a41206a20024180016a41206a290300370300200241c0006a41286a20024180016a41286a290300370300200241c0006a41306a20024180016a41306a290300370300200241c0006a41386a20024180016a41386a29030037030020022002290380013703400c010b200241386a2204200241c0006a41386a290300370300200241306a2201200241c0006a41306a290300370300200241286a2203200241c0006a41286a290300370300200241206a2205200241c0006a41206a290300370300200241186a2206200241c0006a41186a290300370300200241106a2207200241c0006a41106a290300370300200241086a2208200241c0006a41086a22092903003703002002200229034037030020024180016a41186a200429030037030020024180016a41106a200129030037030020024180016a41086a20032903003703002002200529030037038001200241b0036a41186a2006290300370300200241b0036a41106a2007290300370300200241b0036a41086a22012008290300370300200220022903003703b003200241e8026a200241b0036a1075410121040240024020022d00e8024101460d00200241c0006a410f6a200241b0036a410f6a29000037000020092001290000370300200220022900b003370340410221050c010b200241e6026a20022d00eb023a00002009200241f5026a290000370300200241cf006a200241fc026a290000370000200241e0026a200241e8026a41206a2d00003a0000200220022f00e9023b01e402200220022900ed02370340200220024184036a2802003602dc024100210420022d00ec0221050b200241d8026a41026a2206200241e4026a41026a2d00003a0000200241c0026a41086a2201200241c0006a41086a290300370300200241c0026a410f6a2203200241c0006a410f6a290000370000200241b8026a41046a2207200241dc026a41046a2d00003a0000200220022f01e4023b01d802200220022903403703c002200220022802dc023602b8020240024020040d00200241b4026a41026a20062d00003a000020024198026a41086a200129030037030020024198026a410f6a200329000037000020024190026a41046a20072d00003a0000200220022f01d8023b01b402200220022903c00237039802200220022802b80236029002200241b0036a41186a20024180016a41186a290300370300200241b0036a41106a20024180016a41106a290300370300200241b0036a41086a20024180016a41086a29030037030020022002290380013703b003200241e8026a200241b0036a1075410121040240024020022d00e8024101460d00200241c0006a410f6a200241b0036a410f6a290000370000200241c0006a41086a200241b0036a41086a290000370300200220022900b003370340410221010c010b200241e6026a20022d00eb023a0000200241c8006a200241f5026a290000370300200241cf006a200241fc026a290000370000200241e0026a20024188036a2d00003a0000200220022f00e9023b01e402200220022900ed02370340200220024184036a2802003602dc024100210420022d00ec0221010b200241d8026a41026a2207200241e4026a41026a22082d00003a0000200241c0026a41086a2203200241c0006a41086a2209290300370300200241c0026a410f6a2206200241c0006a410f6a220a290000370000200241b8026a41046a220b200241dc026a41046a220c2d00003a0000200220022f01e4023b01d802200220022903403703c002200220022802dc023602b80202402004450d00200241e8026a410f6a2006290000370000200241e8026a41086a2003290300370300200220022903c0023703e80241012104200121050c020b2002418c026a41026a20072d00003a000020092003290300370300200a2006290000370000200c200b2d00003a00002008200241b4026a41026a2d00003a0000200220022f01d8023b018c02200220022903c002370340200220022802b8023602dc02200220022f01b4023b01e402200241e8026a410f6a220420024198026a410f6a290000370000200241e8026a41086a220320024198026a41086a29030037030020022002290398023703e802200241c0026a41046a20024190026a41046a2d00003a000020022002280290023602c002200241b0036a410f6a2004290000370000200241b0036a41086a2003290300370300200220022903e8023703b003410021040c010b200241e8026a410f6a2003290000370000200241e8026a41086a2001290300370300200220022903c0023703e802410121040b20024188026a41026a2203200241e4026a41026a2d00003a0000200241f0016a41086a2206200241b0036a41086a290300370300200241f0016a410f6a2207200241b0036a410f6a290000370000200241e8016a41046a2208200241c0026a41046a2d00003a0000200241e4016a41026a22092002418c026a41026a2d00003a0000200220022f01e4023b018802200220022903b0033703f001200220022802c0023602e801200220022f018c023b01e401200241c8016a410f6a220a200241c0006a410f6a290000370000200241c8016a41086a220b200241c0006a41086a290300370300200241c0016a41046a220c200241dc026a41046a2d00003a0000200220022903403703c801200220022802dc023602c001024020040d00200020022f0188023b0001200041046a20053a0000200041056a20022903f0013700002000411c6a20022802e801360000200041216a20022f01e4013b0000200041036a20032d00003a00002000410d6a2006290300370000200041146a2007290000370000200041206a20082d00003a0000200041236a20092d00003a0000200041246a20013a0000200041003a0000200041256a20022903c8013700002000412d6a200b290300370000200041346a200a2900003700002000413c6a20022802c001360000200041c0006a200c2d00003a00000c020b200041013a00000c010b200041013a00000b200241b0046a24000bed0701057f230041106b2204240002400240024002400240024020012802000e03010203000b200341086a28020021010c030b2003200341086a22052802004101102f200328020020052802006a41003a00002005200528020041016a360200412010322206450d032004422037020420042006360200200441004120102f20042802002207200428020822086a2206200141086a290000370000200641086a200141106a290000370000200641106a200141186a290000370000200641186a200141206a2900003700002004200841206a2206360208200320052802002006102f200328020020052802006a2007200610c9081a2005200528020020066a220636020002402004280204450d002007102c200341086a28020021060b20012802042101200320064104102f2003280200200341086a22052802006a20013600002005200528020041046a22013602000c020b2003200341086a22052802004101102f200328020020052802006a41013a00002005200528020041016a360200412010322206450d022004422037020420042006360200200441004120102f20042802002207200428020822086a2206200141086a290000370000200641086a200141106a290000370000200641106a200141186a290000370000200641186a200141206a2900003700002004200841206a2206360208200320052802002006102f200328020020052802006a2007200610c9081a2005200528020020066a220636020002402004280204450d002007102c200341086a28020021060b20012802042101200320064104102f2003280200200341086a22052802006a20013600002005200528020041046a22013602000c010b2003200341086a22052802004101102f200328020020052802006a41023a00002005200528020041016a360200412010322206450d012004422037020420042006360200200441004120102f20042802002207200428020822086a2206200141086a290000370000200641086a200141106a290000370000200641106a200141186a290000370000200641186a200141206a2900003700002004200841206a2206360208200320052802002006102f200328020020052802006a2007200610c9081a2005200528020020066a220636020002402004280204450d002007102c200341086a28020021060b20012802042101200320064104102f2003280200200341086a22052802006a20013600002005200528020041046a22013602000b200320014108102f2003280200200341086a22012802006a20003700002001200128020041086a2205360200200320054108102f200328020020012802006a20023700002001200128020041086a360200200441106a24000f0b1039000b130020004107360204200041d8f2c4003602000b130020004105360204200041d8f7c4003602000b340020004196dec70036020420004100360200200041146a4104360200200041106a41a484c500360200200041086a42093702000bb00101067f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120103222060d001039000b2000422037020420002006360200200041004120102f2000280200200041086a220628020022076a220020022903003700002006200741206a360200200041086a2005290300370000200041106a2004290300370000200041186a2003290300370000200241206a24000b2501017f230041106b22022400200241003602082000200241086a10e504200241106a24000bac0201097f024002400240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a36020020040e020203010b200041053a00000f0b200041053a00000f0b200041043a00000f0b02402005450d0020032d0001210620012002417e6a22073602042001200341026a360200410121044100210841c4b5c8002109024002400240024020060e0402030001040b410221040c020b2007450d0220032d0002210520012002417d6a2204360204410321082001200341036a3602002004450d0220032d0003210a20012002417c6a3602042001200341046a360200410021090b200821040b200020053a0001200020043a0000200041086a4100360000200041046a2009360000200041026a200a3a00000f0b200041053a00000bff0201027f230041206b2204240002400240024002400240024020022001412c6a2205460d0020022005412010cc08450d00200441186a200241186a290000370300200441106a200241106a290000370300200441086a200241086a290000370300200420022900003703002001200410920722010d010c040b200141286a2802002202417f4c0d01200128022021050240024020020d00410121010c010b200210322201450d030b2000200236020420002001360200200041086a2201410036020020004100200210c8012000280200200128020022006a2005200210c9081a2001200020026a3602000c040b200128020c4101480d0220012802082202417f4c0d00200128020021050240024020020d00410121010c010b200210322201450d020b2000200236020420002001360200200041086a2201410036020020004100200210c8012000280200200128020022006a2005200210c9081a2001200020026a3602000c030b103b000b1039000b200041003602000b200441206a24000b840401057f23004180016b22042400200328020021050240024002400240024020032802082206200041286a280200470d00200520002802202207460d0120052007200610cc08450d010b200441c0006a41186a2206200141186a290000370300200441c0006a41106a2207200141106a290000370300200441c0006a41086a2208200141086a29000037030020042001290000370340200441086a2000200441c0006a10a20720042802084101470d01200441c0006a41286a200441386a290300370300200441c0006a41206a200441086a41286a2903003703002006200441086a41206a2903003703002007200441086a41186a2903003703002008200441086a41106a29030037030020042004290310370340200441f0006a41086a200341086a2802003602002004410136027c20042003290200370370200441c0006a200441f0006a10a3070c030b2003280204450d020c010b0240200428020c2206417c6a2200280200220141004a0d00200641706a2105200441c0006a41086a2207200341086a280200360200200420032902003703400240200641746a2802002203450d0020052802002206450d002003450d002006102c200028020021010b20052004290340370200200541086a20072802003602002000200141016a3602000c020b2000200141016a3602002003280204450d010b2005102c0b20044180016a24000be50403017f027e0a7f230041106b220324002003200129030042adfed5e4d485fda8d8007e220442a0cbbf9599b5a19f0a7c2205200229001885200229000020058542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852002290008200442efcdddd088a580a21e7c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e852002290010200442bed0fb8bf894dfa4327c8542adfed5e4d485fda8d8007e42178942adfed5e4d485fda8d8007e85420042adfed5e4d485fda8d800420010ce0820012802102206200141086a2903002204200341086a29030020032903007c852004892204a72207712108200741197641818284086c2109200141146a280200210a4100210b02400340200a20086a280000220c2009732207417f73200741fffdfb776a71418081828478712107200b41046a220b20086a200671210d0340024020070d00200d2108200c200c4101747141808182847871450d0220004101360200200041106a2001360200200041086a2004370300200041146a20022900003700002000411c6a200241086a290000370000200041246a200241106a2900003700002000412c6a200241186a2900003700000c030b0240200a410020076841037620086a2006716b41306c6a220e41506a220f2002460d002007417f6a2007712107200f2002412010cc080d010b0b0b2000200e360204200041003602002000410c6a41013a0000200041086a20013602002000410d6a2002290000370000200041156a200241086a2900003700002000411d6a200241106a290000370000200041256a200241186a2900003700000b200341106a24000be60403027f017e067f230041d0006b2202240020022000280208220336020c20002903002104200241386a200141086a290200370300200241286a200041246a290200370300200241106a41106a2000411c6a290200370300200241106a41086a200041146a290200370300200220012902003703302002200029020c370310200341106a2105200328021022062004a72207712101200341146a28020021084104210003402001220920006a2006712101200041046a2100200820096a28000041808182847871220a450d000b02402008200a6841037620096a20067122006a2c000022014100480d0020082008280200418081828478716841037622006a2d000021010b200341186a280200210902402001410171220a450d0020090d00200241c0006a20052002410c6a109607200328021022062007712101200341146a28020021084104210003402001220920006a2006712101200041046a2100200820096a280000418081828478712205450d000b0240200820056841037620096a20067122006a2c00004100480d002008280200418081828478716841037621000b200328021821090b20032009200a6b360218200820006a200741197622013a000020062000417c6a7120086a41046a20013a00002008410020006b41306c6a41506a220041286a200241106a41286a290300370200200041206a200241106a41206a290300370200200041186a200241106a41186a290300370200200041106a200241106a41106a290300370200200041086a200241106a41086a290300370200200020022903103702002003411c6a2200200028020041016a360200200241d0006a24000bb70201047f23004180016b22032400024020012000412c6a2204460d0020012004412010cc08450d00200341c0006a41186a2204200141186a290000370300200341c0006a41106a2205200141106a290000370300200341c0006a41086a2206200141086a29000037030020032001290000370340200341086a2000200341c0006a10a207024020032802084101470d00200341c0006a41286a200341386a290300370300200341c0006a41206a200341086a41286a2903003703002004200341086a41206a2903003703002005200341086a41186a2903003703002006200341086a41106a29030037030020032003290310370340200342808080807037037820034201370370200341c0006a200341f0006a10a3070c010b200328020c417c6a22012001280200417f6a3602000b20034180016a24000b8d0101037f230041206b2203240041012104024020012000412c6a2205460d0020012005412010cc08450d00200341186a200141186a290000370300200341106a200141106a290000370300200341086a200141086a2900003703002003200129000037030002402000200310920722010d00410021040c010b200128020c41004a21040b200341206a240020040b1300200041a889c500360204200020013602000b1300200041a889c500360204200020013602000bff0201027f230041206b2204240002400240024002400240024020022001412c6a2205460d0020022005412010cc08450d00200441186a200241186a290000370300200441106a200241106a290000370300200441086a200241086a290000370300200420022900003703002001200410920722010d010c040b200141286a2802002202417f4c0d01200128022021050240024020020d00410121010c010b200210322201450d030b2000200236020420002001360200200041086a2201410036020020004100200210c8012000280200200128020022006a2005200210c9081a2001200020026a3602000c040b200128020c4101480d0220012802082202417f4c0d00200128020021050240024020020d00410121010c010b200210322201450d020b2000200236020420002001360200200041086a2201410036020020004100200210c8012000280200200128020022006a2005200210c9081a2001200020026a3602000c030b103b000b1039000b200041003602000b200441206a24000b8d0101037f230041206b2203240041012104024020012000412c6a2205460d0020012005412010cc08450d00200341186a200141186a290000370300200341106a200141106a290000370300200341086a200141086a2900003703002003200129000037030002402000200310920722010d00410021040c010b200128020c41004a21040b200341206a240020040bea0201027f2000200041086a22042802004101102f200028020020042802006a21050240200141ff017122014104460d00200541013a00002004200428020041016a2205360200024002400240024020010e0400010203000b200020054101102f2000280200200041086a22002802006a41003a00002000200028020041016a3602000f0b200020054101102f2000280200200041086a22002802006a41013a00002000200028020041016a3602000f0b200020054101102f2000280200200041086a22002802006a41023a00002000200028020041016a3602000f0b200020054101102f2000280200200041086a22042802006a41033a00002004200428020041016a2201360200200020014101102f200028020020042802006a20023a00002004200428020041016a2201360200200020014101102f200028020020042802006a20033a00002004200428020041016a3602000f0b200541003a00002004200428020041016a3602000bb00101037f200128020021022000200041086a22032802004104102f200028020020032802006a20023600002003200328020041046a3602002001280204210220002001410c6a2802002204108f0102402004450d0020022004410c6c6a210403402002280200200241086a280200200010bb012002410c6a22022004470d000b0b20012802102102200020032802004104102f200028020020032802006a20023600002003200328020041046a3602000b6601017f2000200041086a22042802004108102f200028020020042802006a20013700002004200428020041086a360200200020021031200020042802004101102f200028020020042802006a200341ff01714101463a00002004200428020041016a3602000be20201037f2001280200210202400240024002402001280208220141c000490d00200141808001490d012001418080808004490d022000200041086a22032802004101102f200028020020032802006a41033a00002003200328020041016a2204360200200020044104102f200028020020032802006a20013600002003200328020041046a22043602000c030b2000200041086a22032802004101102f200028020020032802006a20014102743a00002003200328020041016a22043602000c020b2000200041086a22032802004102102f200028020020032802006a20014102744101723b00002003200328020041026a22043602000c010b2000200041086a22032802004104102f200028020020032802006a20014102744102723600002003200328020041046a22043602000b2000200420014101742201102f2000280200200041086a22002802006a2002200110c9081a2000200028020020016a3602000baf0201027f024002400240024020012d00000e0400010203000b2000200041086a22012802004101102f200028020020012802006a41003a00002001200128020041016a3602000f0b2000200041086a22012802004101102f200028020020012802006a41013a00002001200128020041016a3602000f0b2000200041086a22012802004101102f200028020020012802006a41023a00002001200128020041016a3602000f0b2000200041086a22022802004101102f200028020020022802006a41033a00002002200228020041016a2203360200200020034120102f200028020020022802006a22002001290001370000200041186a200141196a290000370000200041106a200141116a290000370000200041086a200141096a2900003700002002200228020041206a3602000ba60801047f230041106b22022400024002400240024002400240024002400240024020012d00000e09000102030405060708090b2000200041086a22012802004101102f200028020020012802006a41003a00002001200128020041016a3602000c080b2000200041086a22032802004101102f200028020020032802006a41013a00002003200328020041016a2204360200024002400240200141046a280200220541c000490d00200541808001490d012005418080808004490d02200020044101102f2000280200200041086a22032802006a41033a00002003200328020041016a220536020020012802042101200020054104102f200028020020032802006a20013600002003200328020041046a3602000c0a0b200020044101102f200028020020032802006a20054102743a00002003200328020041016a3602000c090b200020044102102f2000280200200041086a22002802006a20054102744101723b00002000200028020041026a3602000c080b200020044104102f2000280200200041086a22002802006a20054102744102723600002000200028020041046a3602000c070b2000200041086a22032802004101102f200028020020032802006a41023a00002003200328020041016a3602002000200141246a10b107200020032802004120102f200028020020032802006a22002001290001370000200041186a200141196a290000370000200041106a200141116a290000370000200041086a200141096a2900003700002003200328020041206a3602000c060b2000200041086a22032802004101102f200028020020032802006a41033a00002003200328020041016a3602002000200141046a10b1072000200141186a10a6010c050b2000200041086a22032802004101102f200028020020032802006a41043a00002003200328020041016a3602002000200141186a10b107200020032802004114102f200028020020032802006a22002001290001370000200041106a200141116a280000360000200041086a200141096a2900003700002003200328020041146a3602000c040b2000200041086a22032802004101102f200028020020032802006a41053a00002003200328020041016a220536020020012d00012101200020054101102f200028020020032802006a20013a00002003200328020041016a3602000c030b2000200041086a22032802004101102f200028020020032802006a41063a00002003200328020041016a3602002002200141086a36020c2002410c6a200010e9030c020b2000200041086a22032802004101102f200028020020032802006a41073a00002003200328020041016a360200200141046a2802002001410c6a280200200010bb010c010b2000200041086a22012802004101102f200028020020012802006a41083a00002001200128020041016a3602000b200241106a24000bce0301027f02400240024020012f0104220241c000490d00200241808001490d012000200041086a22032802004104102f200028020020032802006a20024102744102723600002003200328020041046a22023602000c020b2000200041086a22032802004101102f200028020020032802006a20024102743a00002003200328020041016a22023602000c010b2000200041086a22032802004102102f200028020020032802006a20024102744101723b00002003200328020041026a22023602000b0240024002402001280200220141c000490d00200141808001490d012001418080808004490d02200020024101102f2000280200200041086a22022802006a41033a00002002200228020041016a2203360200200020034104102f200028020020022802006a20013600002002200228020041046a3602000f0b200020024101102f2000280200200041086a22002802006a20014102743a00002000200028020041016a3602000f0b200020024102102f2000280200200041086a22002802006a20014102744101723b00002000200028020041026a3602000f0b200020024104102f2000280200200041086a22002802006a20014102744102723600002000200028020041046a3602000be50101017f024002400240024020012802000e0400010203000b2000200041086a22012802004101102f200028020020012802006a41003a00002001200128020041016a3602000f0b2000200041086a22022802004101102f200028020020022802006a41013a00002002200228020041016a36020020012802042001410c6a280200200010bb010f0b2000200041086a22012802004101102f200028020020012802006a41023a00002001200128020041016a3602000f0b2000200041086a22012802004101102f200028020020012802006a41033a00002001200128020041016a3602000ba50301047f230041106b220224000240412010322203450d002002422037020420022003360200200241004120102f20022802002204200228020822056a22032001290004370000200341086a2001410c6a290000370000200341106a200141146a290000370000200341186a2001411c6a2900003700002002200541206a22053602082000200041086a22032802002005102f200028020020032802006a2004200510c9081a2003200328020020056a220536020002402002280204450d002004102c200328020021050b20012802002104200020054104102f200028020020032802006a20043600002003200328020041046a22053602002000200541c000102f200028020020032802006a22002001290024370000200041386a200141dc006a290000370000200041306a200141d4006a290000370000200041286a200141cc006a290000370000200041206a200141c4006a290000370000200041186a2001413c6a290000370000200041106a200141346a290000370000200041086a2001412c6a2900003700002003200328020041c0006a360200200241106a24000f0b1039000b930201067f230041106b2202240020012802002103200020012802082201108f01024002402001450d00200141057421040340412010322201450d022002422037020420022001360200200241004120102f20022802002205200228020822066a22012003290000370000200141086a200341086a290000370000200141106a200341106a290000370000200141186a200341186a2900003700002002200641206a22013602082000200041086a22062802002001102f200028020020062802006a2005200110c9081a2006200628020020016a36020020022802042201200720011b210702402001450d002007450d002005102c0b200341206a2103200441606a22040d000b0b200241106a24000f0b1039000bde0302017e037f200129030021022000200041086a22032802004108102f200028020020032802006a20023700002003200328020041086a220436020020012903082102200020044101102f200141106a2104200028020020032802006a2105024020024201510d00200541003a00002003200328020041016a220536020020012903102102200020054108102f200028020020032802006a20023700002003200328020041086a2205360200200020054120102f200028020020032802006a2205200141e0016a290000370000200541186a200141f8016a290000370000200541106a200141f0016a290000370000200541086a200141e8016a2900003700002003200328020041206a3602002000200141186a10b2072000200441ec006a10b2070f0b200541013a00002003200328020041016a220536020020012903102102200020054108102f200028020020032802006a20023700002003200328020041086a2205360200200020054120102f200028020020032802006a2205200141e0016a290000370000200541186a200141f8016a290000370000200541106a200141f0016a290000370000200541086a200141e8016a2900003700002003200328020041206a3602002000200141186a10b2072000200441ec006a10b2070be00601047f230041106b220224000240412010322203450d002002422037020420022003360200200241004120102f20022802002204200228020822056a22032001290010370000200341086a200141186a290000370000200341106a200141206a290000370000200341186a200141286a2900003700002002200541206a22033602082000200041086a22052802002003102f200028020020052802006a2004200310c9081a2005200528020020036a36020002402002280204450d002004102c0b02400240024002402001280200220341c000490d00200341808001490d012003418080808004490d022000200041086a22052802004101102f200028020020052802006a41033a00002005200528020041016a2204360200200020044104102f200028020020052802006a20033600002005200528020041046a3602000c030b2000200041086a22052802004101102f200028020020052802006a20034102743a00002005200528020041016a3602000c020b2000200041086a22052802004102102f200028020020052802006a20034102744101723b00002005200528020041026a3602000c010b2000200041086a22052802004104102f200028020020052802006a20034102744102723600002005200528020041046a3602000b412010322203450d002002422037020420022003360200200241004120102f20022802002204200228020822056a22032001290030370000200341086a200141386a290000370000200341106a200141c0006a290000370000200341186a200141c8006a2900003700002002200541206a22033602082000200041086a22052802002003102f200028020020052802006a2004200310c9081a2005200528020020036a36020002402002280204450d002004102c0b412010322203450d002002422037020420022003360200200241004120102f20022802002204200228020822056a22032001290050370000200341086a200141d8006a290000370000200341106a200141e0006a290000370000200341186a200141e8006a2900003700002002200541206a22033602082000200041086a22052802002003102f200028020020052802006a2004200310c9081a2005200528020020036a36020002402002280204450d002004102c0b2000200141046a10aa05200241106a24000f0b1039000b970501037f230041106b220224000240024002400240024002400240024020012d00000e0700010203040506070b2000200041086a22012802004101102f200028020020012802006a41003a00002001200128020041016a3602000c060b2000200041086a22032802004101102f200028020020032802006a41013a00002003200328020041016a3602002002200141086a36020c2002410c6a200010e9030c050b2000200041086a22032802004101102f200028020020032802006a41023a00002003200328020041016a2204360200200020044104102f200028020020032802006a20012800013600002003200328020041046a3602000c040b2000200041086a22032802004101102f200028020020032802006a41033a00002003200328020041016a2204360200200020044108102f200028020020032802006a20012900013700002003200328020041086a3602000c030b2000200041086a22032802004101102f200028020020032802006a41043a00002003200328020041016a2204360200200020044110102f200028020020032802006a22002001290001370000200041086a200141096a2900003700002003200328020041106a3602000c020b2000200041086a22032802004101102f200028020020032802006a41053a00002003200328020041016a2204360200200020044120102f200028020020032802006a22002001290001370000200041186a200141196a290000370000200041106a200141116a290000370000200041086a200141096a2900003700002003200328020041206a3602000c010b2000200041086a22032802004101102f200028020020032802006a41063a00002003200328020041016a360200200141046a2802002001410c6a280200200010bb010b200241106a24000bdb0101047f02400240200128020822024103744104722203417f4c0d0020012802002101200310322204450d012000200336020420002004360200200041086a2203410036020020002002108f0102402002450d00200120024103746a210520032802002102034020012802002104200020024104102f2000280200200328020022026a20043600002003200241046a2202360200200141046a2802002104200020024104102f2000280200200328020022026a20043600002003200241046a2202360200200141086a22012005470d000b0b0f0b103b000b1039000be90301047f02400240200128020822024103744104722203417f4c0d0020012802002101200310322204450d012000200336020420002004360200200041086a22044100360200024002400240200241c000490d00024002400240200241808001490d002002418080808004490d01200041004101102f2000280200200041086a220428020022036a41033a00002004200341016a2203360200200020034104102f2000280200200428020022036a20023600002004200341046a22033602000c020b200041004102102f2000280200200041086a220428020022036a20024102744101723b00002004200341026a22033602000c010b200041004104102f2000280200200041086a220428020022036a20024102744102723600002004200341046a22033602000b200120024103746a21050c010b200041004101102f2000280200200428020022036a20024102743a00002004200341016a22033602002002450d01200120024103746a21050b034020012802002104200020034104102f2000280200200041086a220228020022036a20043600002002200341046a2203360200200141046a2802002104200020034104102f2000280200200228020022036a20043600002002200341046a2203360200200141086a22012005470d000b0b0f0b103b000b1039000bfd0101037f024002402001280208220241ffffff3f712002470d0020024105742203417f4c0d00200128020021010240024020030d00410121040c010b200310322204450d020b20002004360200200041086a22044100360200200041046a200341057636020020004100200210d6012004280200210302402002450d0020024105742102200028020020034105746a2100034020002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a290000370000200341016a2103200041206a2100200141206a2101200241606a22020d000b0b200420033602000f0b103b000b1039000b800603097f017e017f23004180026b220224002002200110b003024002402002280200450d00200041003602000c010b0240024002402002280204220320012802002802044105762204200420034b1b22044105742205417f4c0d004101210602402004450d00200510322206450d020b2001200128020441016a2205360204200241003602102002200436020c2002200636020802400240200520012802084b0d0002402003450d0041002107410021080340200241003a00b801200841016a2108410021040340200128020022052802042209450d0420024198016a20046a2005280200220a2d00003a000020052009417f6a3602042005200a41016a3602002002200441016a22043a00b80120044120470d000b200241f8006a41186a20024198016a41186a290300220b370300200241d8006a41086a220420024198016a41086a290300370300200241d8006a41106a220520024198016a41106a290300370300200241d8006a41186a2209200b3703002002200229039801370358200241386a41186a220a2009290300370300200241386a41106a22092005290300370300200241386a41086a2205200429030037030020022002290358370338200241186a41186a220c200a290300370300200241186a41106a220a2009290300370300200241186a41086a220920052903003703002002200229033837031802402007200228020c470d00200241086a2007410110d60120022802082106200228021021070b200620074105746a22042002290318370000200441186a200c290300370000200441106a200a290300370000200441086a20092903003700002002200741016a220736021020082003470d000b200128020421050b2000200229030837020020012005417f6a360204200041086a200241086a41086a2802003602000c050b200041003602000c030b0240200441ff0171450d00200241003a00b8010b20004100360200200228020c21040c020b103b000b1039000b2006410020041b2205450d00200441ffffff3f71450d002005102c0b20024180026a24000bbc0c04057f027e017f027e230041d0016b2202240002400240024002400240024002400240024002400240024002400240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a36020020050e0701020304050608070b200041073a00000c0d0b200041003a00000c0c0b200241086a200110f70302402002290308a70d00200241086a41106a290300210720022903102108200041013a00002000200228009001360001200041086a2008370300200041186a2002290320370300200041106a2007370300200041046a20024193016a280000360000200041206a200241206a41086a2903003703000c0c0b200041073a00000c0b0b20024190016a2001108802024020022d0090014101460d002000200228009101360001200041023a0000200041056a20022900203700002000410d6a200241286a290000370000200041156a200241306a2900003700002000411d6a200241386a290000370000200041246a2002413f6a2800003600000c0b0b200041073a00000c0a0b200241003a0098012006450d0820042d0001210520012003417e6a22093602042001200441026a360200200241013a009801200220053a00900120090d040c070b20024190016a200110cb04024020022d0090014101460d00200241f0006a41086a20024190016a41096a290000220737030020022002290091012208370370200041043a000020002008370001200041096a2007370000200041116a2002290020370000200041196a200241206a41086a290000370000200041206a2002412f6a2900003700000c090b200041073a00000c080b41002105200241003a00402003417e6a21030240034020062005460d01200241206a20056a200420056a220941016a2d00003a0000200120033602042001200941026a3602002002200541016a22093a00402003417f6a21032009210520094120460d050c000b0b200541ff0171450d04200241003a00400c040b200041073a00000c060b200241f0006a2001108a0202402002280270450d002002419b016a200241f0006a41086a2802003600002002200229037037009301200041063a00002000200229009001370001200041086a20024197016a290000370000200041106a2002290320370300200041186a200241206a41086a290300370300200041206a200241206a41106a2903003703000c060b200041073a00000c050b20042d0002210520012003417d6a22093602042001200441036a360200200241023a009801200220053a0091012009450d0220042d0003210520012003417c6a22093602042001200441046a360200200241033a009801200220053a0092012009450d0220042d0004210520012003417b6a22093602042001200441056a360200200241043a009801200220053a0093012009450d0220042d0005210520012003417a6a22093602042001200441066a360200200241053a009801200220053a0094012009450d0220042d000621052001200341796a22093602042001200441076a360200200241063a009801200220053a0095012009450d0220042d000721052001200341786a22093602042001200441086a360200200241073a009801200220053a0096012009450d0220042d000821052001200341776a3602042001200441096a360200200220053a0097012000200229039001370001200041033a0000200041096a2002290020370000200041116a200241206a41086a290000370000200041196a200241306a290000370000200041206a200241376a2900003700000c040b20024190016a41086a2201200241206a41086a29030037030020024190016a41106a2205200241206a41106a29030037030020024190016a41186a2203200241206a41186a2903003703002002200229032037039001200941ff0171411f4d0d00200241d0006a41086a20012903002207370300200241d0006a41106a20052903002208370300200241d0006a41186a2003290300220a3703002002200229039001220b370350200041053a00002000200b370001200041096a2007370000200041116a2008370000200041196a200a370000200041216a2002280049360000200041246a200241cc006a2800003600000c030b200041073a00000c020b200241003a0098010b200041073a00000b200241d0016a24000b8a1602057f027e230041f0016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020020060e0701020304050608070b200041073a00000c110b200041003a00000c100b2002200110b10302402002290300a70d00200241106a290300210720022903082108200041013a000020002002280070360001200041086a2008370300200041186a2002290318370300200041106a2007370300200041046a200241f3006a280000360000200041206a200241186a41086a2903003703000c100b200041073a00000c0f0b200241003a0074200128020022032802042204450d0d200328020022052d0000210620032004417f6a360204200241013a00742003200541016a360200200220063a00702001280200220328020422040d050c0c0b200241003a0078200128020022032802042204450d0a200328020022052d0000210620032004417f6a3602042003200541016a360200200241013a0078200220063a00702001280200220328020422040d050c090b200241003a008001200128020022032802042204450d07200328020022052d0000210620032004417f6a3602042003200541016a360200200241013a008001200220063a00702001280200220328020422040d050c060b41002103200241003a003802400340200128020022042802042205450d01200241186a20036a200428020022062d00003a000020042005417f6a3602042004200641016a3602002002200341016a22033a003820034120470d000b200241f0006a41186a200241186a41186a2903002207370300200241d0006a41086a2203200241186a41086a290300370300200241d0006a41106a2204200241186a41106a290300370300200241d0006a41186a2201200737030020022002290318370350200041053a000020002002290350370001200041096a2003290300370000200041116a2004290300370000200041196a2001290300370000200041216a2002280040360000200041246a200241c3006a2800003600000c0c0b0240200341ff0171450d00200241003a00380b200041073a00000c0b0b200041073a00000c0a0b200241d0006a200110c60402402002280250450d00200241fb006a200241d0006a41086a28020036000020022002290350370073200041063a000020002002290070370001200041086a200241f7006a290000370000200041106a2002290318370300200041186a200241186a41086a290300370300200041206a200241186a41106a2903003703000c0a0b200041073a00000c090b200328020022052d0000210620032004417f6a3602042003200541016a360200200241023a0074200220063a0071200128020022032802042204450d06200328020022052d0000210620032004417f6a3602042003200541016a360200200241033a0074200220063a0072200128020022032802042204450d06200328020022012d0000210520032004417f6a3602042003200141016a360200200220053a007320002002280270360001200041023a0000200041056a20022900183700002000410d6a200241206a290000370000200041156a200241286a2900003700002000411d6a200241306a290000370000200041246a200241376a2800003600000c080b200328020022052d0000210620032004417f6a3602042003200541016a360200200241023a0078200220063a0071200128020022032802042204450d03200328020022052d0000210620032004417f6a3602042003200541016a360200200241033a0078200220063a0072200128020022032802042204450d03200328020022052d0000210620032004417f6a3602042003200541016a360200200241043a0078200220063a0073200128020022032802042204450d03200328020022052d0000210620032004417f6a3602042003200541016a360200200241053a0078200220063a0074200128020022032802042204450d03200328020022052d0000210620032004417f6a3602042003200541016a360200200241063a0078200220063a0075200128020022032802042204450d03200328020022052d0000210620032004417f6a3602042003200541016a360200200241073a0078200220063a0076200128020022032802042204450d03200328020022012d0000210520032004417f6a3602042003200141016a360200200220053a007720002002290370370001200041033a0000200041096a2002290018370000200041116a200241206a290000370000200041196a200241286a290000370000200041206a2002412f6a2900003700000c070b200328020022052d0000210620032004417f6a3602042003200541016a360200200241023a008001200220063a0071200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200241033a008001200220063a0072200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200241043a008001200220063a0073200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200241053a008001200220063a0074200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200241063a008001200220063a0075200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200241073a008001200220063a0076200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200241083a008001200220063a0077200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200241093a008001200220063a0078200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602002002410a3a008001200220063a0079200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602002002410b3a008001200220063a007a200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602002002410c3a008001200220063a007b200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602002002410d3a008001200220063a007c200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602002002410e3a008001200220063a007d200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a3602002002410f3a008001200220063a007e200128020022032802042204450d00200328020022012d0000210520032004417f6a3602042003200141016a360200200220053a007f200241c0006a41086a2203200241f0006a41086a29030037030020022002290370370340200041043a000020002002290340370001200041096a2003290300370000200041116a2002290018370000200041196a200241186a41086a290000370000200041206a200241186a410f6a2900003700000c060b200241003a0080010b200041073a00000c040b200241003a00780b200041073a00000c020b200241003a00740b200041073a00000b200241f0016a24000b8a0302057f017e230041106b22022400200241086a2001108702024002402002280208450d00200041003602000c010b024020012802042203200228020c4101742204490d0002400240024002402004417f4c0d000240024020040d00410121050c010b200410372205450d02200128020421030b0240024020032004490d0020052001280200200410c90821032001280204220620044f0d01200420064194afc0001058000b2005410020041b2201450d052004450d052001102c0c050b2001200620046b3602042001200128020020046a3602002003450d0402402004ad22074220862007842207422088a722010d002007a721010c030b024020034101710d0020014101710d002007a722014101710d0020014101762204450d032007422188a721060c040b02402007a7450d002003102c0b200041003602000c050b103b000b1039000b4100210602402001450d002003102c0b41002104410221050b2000200436020420002005360200200041086a20063602000c010b200041003602000b200241106a24000b960101047f2000200041086a2202280200200128020420012802006b10c801200228020021030240200128020022042001280204460d00200028020021052001200441016a36020020042d0000210002400340200520036a20003a0000200128020022002001280204460d01200341016a21032001200041016a36020020002d000021000c000b0b200341016a21030b200220033602000bf20603037f027e027f230041e0086b2202240002400240024020012802004101460d002002410c3602080c010b200241086a200141046a220310f70602400240200228020822044102460d00200241086a41f8016a2903002105200241086a41f0016a2903002106200241b4046a200241086a41047241ec0110c9081a024002402004450d00200241b8066a2005370300200241b0066a200637030041082103200241ac066a200241b4046a41086a280200360200200220022902b4043702a4060c010b200241a8066a200241b8046a41e80110c9081a200241a0066a41f8016a2005370300200241a0066a41f0016a2006370300410a21030b200220033602a006200241086a200241a0066a41980210c9081a0c010b2002410c3602a00602402001280200450d00200310ee060b20014100360200200320022902a002370200200341086a200241a0026a41086a290200370200200341106a200241a0026a41106a290200370200200341186a200241a0026a41186a2802003602002002410c360208200241a0066a10c0070b2002280208410c460d002000200241086a41980210c9081a0c010b0240024020012802204101460d002000410c3602000c010b200241a0066a200141246a10f806024020022802a00622014102470d002000410c3602000c010b200241a0026a200241a0066a41047241940210c9081a200241a0066a200241a0026a41940210c9081a200241b4046a200241a0026a41ec0110c9081a200241b8086a41206a2203200241ac086a290200370300200241b8086a41186a2204200241a4086a290200370300200241b8086a41106a22072002419c086a290200370300200241b8086a41086a220820024194086a2902003703002002200229028c083703b80802402001450d00200020022902b404370204200041106a20022903b8083703002000410c6a200241b4046a41086a280200360200200041186a2008290300370300200041206a2007290300370300200041286a2004290300370300200041306a2003290300370300200041093602000c010b200041086a200241b4046a41046a41e80110c9081a20004190026a200329030037030020004188026a200429030037030020004180026a2007290300370300200041f8016a2008290300370300200041f0016a20022903b8083703002000410b3602000b200241086a10c0070b200241e0086a24000bc30201027f02400240024002400240024002400240024020002802000e0d08080808000102030405060708070b200041086a2802002201450d0720002802042200450d072001450d072000102c0f0b200041086a2802002201450d0620002802042200450d062001450d062000102c0f0b200041086a10a2010f0b200041086a10a2010f0b200041086a2802002201450d0320002802042200450d032001450d032000102c0f0b0240200041086a2802002201450d0020002802042202450d002001450d002002102c0b200041106a2d00004106490d02200041186a2802002201450d02200041146a2802002200450d022001450d022000102c0f0b200041086a10a2010c010b200041086a10a201200041f0016a2d00004106490d00200041f8016a2802002201450d00200041f4016a2802002200450d002001450d002000102c0f0b0b8f05010b7f230041d0016b2202240002400240024020012802182203450d0020012003417f6a36021820012802042204450d0220012802002105024002402001280208220620042f01e6024f0d00200421030c010b03400240024020042802e00222030d00410021030c010b200541016a210520042f01e40221060b2004102c20032104200620032f01e6024f0d000b0b200241d0006a41186a2207200320064105746a22044180036a290000370300200241d0006a41106a2208200441f8026a290000370300200241d0006a41086a2209200441f0026a2900003703002002200441e8026a290000370350200241f0006a41186a220a200441186a290300370300200241f0006a41106a220b200441106a290300370300200241f0006a41086a220c200441086a29030037030020022004290300370370200641016a210402402005450d00200320044102746a41c8056a280200210302402005417f6a2204450d00034020032802c80521032004417f6a22040d000b0b410021040b200241306a22062002290370370200200241c8006a2205200a290300370200200241c0006a220a200b290300370200200241386a220b200c290300370200200241286a220c2007290300370200200241206a22072008290300370200200241186a2208200929030037020020022002290350370210200041386a2005290200370200200041306a200a290200370200200041286a200b290200370200200041206a2006290200370200200041186a200c290200370200200041106a2007290200370200200041086a2008290200370200200020022902103702002001200436020820012003360204200141003602000c010b200041003602300b200241d0016a24000f0b41ecd0c800412b4198d1c800103c000b13002000410f360204200041cc8cc5003602000b864105047f017e0b7f017e127f230041f0026b220224002002200036022420024190016a4187dec700410410c50120024198026a41f19ac500411210c50120022000360228200241e8006a200241286a410410c701200241cc016a200241286a41046a3602002002200241f0006a3602c4012002200241286a3602c8012002200241e8006a3602c001200241c8026a200241c0016a107e0240024020022802d002220041206a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b200241003602702002200336026c20022004360268200241e8006a4100411010c8012002280268200228027022036a2204200229009001370000200441086a20024190016a41086a2900003700002002200341106a2203360270200241e8006a2003411010c8012002280268200228027022036a2204200229009802370000200441086a20024198026a41086a2900003700002002200341106a220436027020022802c8022103200241e8006a2004200010c80120022802682204200228027022056a2003200010c9081a2002200520006a2200360270024020022802cc02450d002003102c0b200241c0016a2004200010f70420022902c4012206422088a7410020022802c00122071b220041ffffffff00712000470d0020004104742203417f4c0d004104210402402003450d00200310322204450d020b410021082002410036029801200220043602900120022003410476360294012007410420071b220920004104746a210a02400240024020000d002009210b4100210c0c010b20024198026a41186a210d20024198026a41206a210e200241be026a210f200241e8016a2110410021084100210c2009210b0340200b220041106a210b20002802042211450d01200041086a2902002112024002402000280200220320014d0d0002402002280298012200200228029401470d0020024190016a200010ce0120022802980121000b20022802900120004104746a2204201136020420042003360200200441086a20123702002002200041016a360298010c010b02402012422088a72200450d00201120004102746a2113201121140340201428020021150240200c0d0041341032220c450d0841002116200c4100360200200c200229029802370204200c41003b0132200c410c6a20024198026a41086a290200370200200c41146a20024198026a41106a290200370200200c411c6a200d290200370200200c41246a200e290200370200200c412a6a200f2901003701000b201441046a2114200c21042016211702400340200441046a210320042f013221184100210002400340024020182000470d00201821000c020b20032802002105200341046a2103200041016a21000240417f2005201547200520154b1b41016a0e03000401000b0b2000417f6a21000b02402017450d002017417f6a2117200420004102746a41346a28020021040c010b0b024002400240024002402018410b490d00410021174104210502400240200041054f0d00200021180c010b4105210541052118024002402000417b6a0e020201000b200041796a211841012117410621050c010b41002118410121170b413410322203450d0d41002119200341003602002003200229029802370204200341003b01322003410c6a20024198026a41086a221a290200370200200341146a20024198026a41106a221b2902003702002003411c6a200d290200370200200341246a200e2902003702002003412a6a200f290100370100200420054102746a220041046a280200211c200341046a200041086a20042f01322005417f736a220041027410c9081a200420053b0132200320003b01322003200420171b220020184102746a220541086a200541046a220520002f013220186b41027410ca081a20052015360200200020002f013241016a3b0132024020042802002200450d004100211903402003211d201c211e20042f01302118024002400240200022042f01322203410b490d004100211f41042115024020184105490d0020182115024002402018417b6a0e020201000b201841796a21184101211f410621150c010b410021184101211f410521150b41e40010322203450d12201941016a211941002100200341003602002003200229029802370204200341003b0132200320022902c0013702342003410c6a201a290200370200200341146a201b2902003702002003411c6a200d290200370200200341246a200e2902003702002003412a6a200f2901003701002003413c6a200241c0016a41086a290200370200200341c4006a200241c0016a41106a290200370200200341cc006a200241c0016a41186a290200370200200341d4006a200241c0016a41206a290200370200200341dc006a2010290200370200200441046a2217201541027422056a280200211c200341046a2017200541046a22206a20042f013222212015417f736a220541027410c9082122200420153b0132200320053b0132200341346a200420206a41346a202120156b41027410c908212002400340200320004102746a41346a280200221520003b0130201520033602002000200020054922156a220020054b0d0120150d000b0b201f450d012018410274220520206a41086a2020201841016a220041027422156a221720032f013220186b41027410ca081a2017201d360200202220156a202220056a220520032f013220186b41027410ca081a2005201e360200200320032f013241016a22053b01322000200541ffff037122054b0d020340200320004102746a41346a280200221520003b013020152003360200200020002005496a221520054b0d03200020054f2118201521002018450d000c030b0b20184102742205200441346a22156a41086a2015201841016a220041027422176a2215200320186b410274220310ca081a2015201d360200200441046a221520176a201520056a2205200310ca081a2005201e360200200420042f013241016a22033b01322018200341ffff037122034f0d080340200420004102746a41346a280200220520003b013020052004360200200020002003496a220520034b0d09200020034f2115200521002015450d000c090b0b20184102742205200441346a22156a41086a2015201841016a2200410274221f6a221520042f013220186b41027410ca081a2015201d3602002017201f6a201720056a220520042f013220186b41027410ca081a2005201e360200200420042f013241016a22053b01322000200541ffff037122054b0d000340200420004102746a41346a280200221520003b0130201520043602002000200020054922156a220020054b0d0120150d000b0b200428020022000d000b0b200c450d0141e40010322200450d0d200041003602002000200229029802370204200041003b0132200020022902c0013702342000410c6a201a290200370200200041146a201b2902003702002000411c6a200d290200370200200041246a200e2902003702002000412a6a200f2901003701002000413c6a200241c0016a41086a290200370200200041c4006a200241c0016a41106a290200370200200041cc006a200241c0016a41186a290200370200200041d4006a200241c0016a41206a290200370200200041dc006a20102902003702002000200c360234200c41003b0130200c200036020020162019470d0220002f01322204410a4b0d03201641016a21162000200441016a22053b0132200041046a20044102746a201c360200200020054102746a41346a2003360200200320053b0130200320003602002000210c0c040b200420004102746a220341086a200341046a2203201820006b41027410ca081a20032015360200200420042f013241016a3b01320c030b41ecd0c800412b41bcd2c800103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b200841016a21080b20142013470d000b0b2012a72200450d00200041ffffffff0371450d002011102c0b200b200a470d000c020b0b200a200b460d000340200b41106a21000240200b41086a28020041ffffffff0371450d00200b41046a280200102c0b2000210b200a2000470d000b0b02402006a7410020071b2200450d00200041ffffffff0071450d002009102c0b2002280270210b200228026821140240024020022802900122130d002014200b10b4010c010b2002290294012212422088a722174104744104722200417f4c0d01200010322203450d02200241003602c801200220003602c401200220033602c001200241c0016a2017108f0102402017450d00201320174104746a211820132115034020152802002100200241c0016a20022802c8014104102f20022802c00120022802c80122036a20003600002002200341046a3602c80120152802042100200241c0016a201528020c2203108f01201541106a211502402003450d002003410274210320022802c8012104034020002802002105200241c0016a20044104102f20022802c00120022802c80122046a20053600002002200441046a22043602c801200041046a21002003417c6a22030d000b0b20152018470d000b0b2014200b20022802c001220020022802c80110a702024020022802c401450d002000102c0b02402017450d0020174104742103201341046a210003400240200041046a28020041ffffffff0371450d002000280200102c0b200041106a2100200341706a22030d000b0b2012a72200450d00200041ffffffff0071450d002013102c0b0240200228026c450d002014102c0b02400240200c0d004100210c41002103410021080c010b200c21030340200c2f013221002016450d012016417f6a2116200c20004102746a41346a280200210c200328023421030c000b0b2002413c6a2000360200200241286a41106a200c36020020022008360240200242003703302002200336022c200241003602282002200241246a360244200241186a200241286a10c40702402002280218450d00200228021c210d200241f4016a2123200241f5016a2116200241d8006a41086a210f03402002280244280200210e20024190016a4187dec700410410c50120024198026a41d09ac500411310c501200241003602d002200242013703c802200241c8026a41004104102f20022802c80220022802d00222006a200d3600002002200041046a22003602d002200241c8026a20004104102f20022802c802220020022802d00222036a200e3600002002200341046a22033602d002200241d8006a2000200310c7012002200020036a3602cc01200220003602c8012002200f3602c4012002200241d8006a3602c001200241e8006a200241c0016a107e024020022802cc02450d002000102c0b2002280270220041206a2203417f4c0d020240024020030d00410121040c010b200310322204450d040b200241003602c801200220033602c401200220043602c001200241c0016a4100411010c80120022802c00120022802c80122036a2204200229009001370000200441086a20024190016a41086a22132900003700002002200341106a22033602c801200241c0016a2003411010c80120022802c00120022802c80122036a2204200229009802370000200441086a20024198026a41086a220b2900003700002002200341106a22043602c80120022802682103200241c0016a2004200010c80120022802c001220420022802c80122056a2003200010c9081a2002200520006a22003602c8010240200228026c450d002003102c0b20024198026a2004200010cd01200229029c022212422088a7410020022802980222001b2103024020022802c401450d002004102c0b200341ffffffff00712003470d0220034104742203417f4c0d020240024020030d00410421140c010b200310322214450d040b4100211520024100360250200220143602482002200341047636024c2000410420001b221d2012420020001b2212422088a722004104746a21042012a7211c02400240024020000d00201d210041002118410021170c010b41002115201d2100410021174100211803400240200041046a28020022030d00200041106a21000c020b200041086a2902002112024002402000280200220520014d0d0002402015200228024c470d00200241c8006a201510ce0120022802502115200228024821140b201420154104746a220c2003360204200c2005360200200c41086a20123702002002201541016a22153602500c010b201741016a211720182012422088a76a21182012a7450d002003102c0b200041106a22002004470d000c020b0b20042000460d000340200041106a21030240200041086a280200450d00200041046a280200102c0b2003210020042003470d000b0b0240201c450d00201c41ffffffff0071450d00201d102c0b0240024020150d0020024190016a4187dec700410410c50120024198026a41d09ac500411310c501200241003602d002200242013703c802200241c8026a41004104102f20022802c80220022802d00222006a200d3600002002200041046a22003602d002200241c8026a20004104102f20022802c802220020022802d00222036a200e3600002002200341046a22033602d002200241d8006a2000200310c7012002200020036a3602cc01200220003602c8012002200f3602c4012002200241d8006a3602c001200241e8006a200241c0016a107e024020022802cc02450d002000102c0b2002280270220041206a2203417f4c0d040240024020030d00410121040c010b200310322204450d060b200241003602c801200220033602c401200220043602c001200241c0016a4100411010c80120022802c00120022802c80122036a2204200229009001370000200441086a20132900003700002002200341106a22033602c801200241c0016a2003411010c80120022802c00120022802c80122036a2204200229009802370000200441086a200b2900003700002002200341106a22043602c80120022802682103200241c0016a2004200010c80120022802c001220420022802c80122056a2003200010c9081a2002200520006a22003602c8010240200228026c450d002003102c0b2004200010b401024020022802c401450d002004102c0b4101210a0c010b200228024c211d2002280248211420024190016a4187dec700410410c50120024198026a41d09ac500411310c501200241003602d002200242013703c802200241c8026a41004104102f20022802c80220022802d00222006a200d3600002002200041046a22003602d002200241c8026a20004104102f20022802c802220020022802d00222036a200e3600002002200341046a22033602d002200241d8006a2000200310c7012002200020036a3602cc01200220003602c8012002200f3602c4012002200241d8006a3602c001200241e8006a200241c0016a107e024020022802cc02450d002000102c0b2002280270220041206a2203417f4c0d030240024020030d00410121040c010b200310322204450d050b200241003602d002200220033602cc02200220043602c802200241c8026a4100411010c80120022802c80220022802d00222036a2204200229009001370000200441086a20132900003700002002200341106a22033602d002200241c8026a2003411010c80120022802c80220022802d00222036a2204200229009802370000200441086a200b2900003700002002200341106a22043602d00220022802682103200241c8026a2004200010c80120022802c802221c20022802d00222046a2003200010c9081a2002200420006a221e3602d0020240200228026c450d002003102c0b201541047422034104722200417f4c0d03200010322204450d04200241003602c801200220003602c401200220043602c001200241c0016a2015108f01201420036a210c20142100034020002802002104200241c0016a20022802c8014104102f20022802c00120022802c80122056a20043600002002200541046a3602c801200041046a2802002000410c6a280200200241c0016a10bb01200041106a2200200c470d000b201c201e20022802c001220020022802c80110a702024020022802c401450d002000102c0b024020022802cc02450d00201c102c0b201441046a210003400240200041046a280200450d002000280200102c0b200041106a2100200341706a22030d000b4100210a201d450d002014450d00201d41ffffffff0071450d002014102c0b20024190016a4187dec700410410c50120024198026a41acb1c500410c10c501200241003602d002200242013703c802200241c8026a41004104102f20022802c80220022802d00222006a200d3600002002200041046a22003602d002200241c8026a20004104102f20022802c802220020022802d00222036a200e3600002002200341046a22033602d002200241d8006a2000200310c7012002200020036a3602cc01200220003602c8012002200f3602c4012002200241d8006a3602c001200241e8006a200241c0016a107e024020022802cc02450d002000102c0b2002280270220041206a2203417f4c0d020240024020030d00410121040c010b200310322204450d040b200241003602602002200336025c20022004360258200241d8006a4100411010c8012002280258200228026022036a2204200229009001370000200441086a20132900003700002002200341106a2203360260200241d8006a2003411010c8012002280258200228026022036a2204200229009802370000200441086a200b2900003700002002200341106a220336026020022802682104200241d8006a2003200010c80120022802582203200228026022056a2004200010c9081a2002200520006a22003602600240200228026c450d002004102c0b200241c0016a2003200010f302200b200241c0016a41086a220529030037030020024198026a41106a2211200241c0016a41106a220e29030037030020024198026a41186a221a200241c0016a41186a220c29030037030020024198026a41206a221b200241c0016a41206a221c29030037030020024198026a41286a2210200241c0016a41286a221d280200360200200241c8026a41086a2208201641086a221e290000370300200241c8026a41106a2207201641106a2220290000370300200241c8026a41186a2209201641186a2221290000370300200241c8026a411f6a22242016411f6a2222280000360000200220022903c00137039802200220162900003703c802410021144100210d024020022d00f40122044102460d0020022802f001211f20022802ec01211920024190016a41286a201028020036020020024190016a41206a201b29030037030020024190016a41186a201a29030037030020024190016a41106a20112903003703002013200b290300370300200241e8006a41086a2008290300370300200241e8006a41106a2007290300370300200241e8006a41186a2009290300370300200241e8006a411f6a2024280000360000200220022903980237039001200220022903c802370368201721142018210d0b201d20024190016a41286a280200360200201c20024190016a41206a290300370300200c20024190016a41186a290300370300200e20024190016a41106a2903003703002005201329030037030020022002290390013703c0012002201f200d6b221f3602f0012002201920146b22193602ec01200220043a00f40120162002290368370000201e200241e8006a41086a2903003700002020200241e8006a41106a2903003700002021200241e8006a41186a2903003700002022200241e8006a411f6a2800003600000240024020044102470d002003200010b4010c010b200241003602a00220024201370398022005290300211220022903c001210620024198026a41004110102f20022802980220022802a00222046a22052012370008200520063700002002200441106a22043602a002200c290300211220022903d001210620024198026a20044110102f20022802980220022802a00222046a22052012370008200520063700002002200441106a22043602a00220022802e001210520024198026a20044104102f20022802980220022802a0026a2005360000200220022802a00241046a22043602a00220022802e401210520024198026a20044104102f20022802980220022802a0026a2005360000200220022802a00241046a22043602a00220022802e801210520024198026a20044104102f20022802980220022802a0026a2005360000200220022802a00241046a22043602a00220024198026a20044104102f20022802980220022802a0026a2019360000200220022802a00241046a22043602a00220024198026a20044104102f20022802980220022802a0026a201f360000200220022802a00241046a3602a00220024198026a20231091052003200020022802980220022802a00210a702200228029c02450d00200228029802102c0b0240200228025c450d002003102c0b0240200a450d002002280248210402402015450d0020154104742103200441046a210003400240200041046a280200450d002000280200102c0b200041106a2100200341706a22030d000b0b200228024c41ffffffff0071450d002004102c0b200241106a200241286a10c4072002280214210d20022802100d000b0b0340200241086a200241286a10c40720022802084101460d000b0240200228022c2203450d00200328020021002003102c2000450d000340200028020021032000102c2003210020030d000b0b20024190016a4187dec700410410c50120024198026a41e39ac500410e10c50120022002280224360228200241e8006a200241286a410410c701200241cc016a200241286a41046a3602002002200241f0006a3602c4012002200241286a3602c8012002200241e8006a3602c001200241c8026a200241c0016a107e20022802d002220041206a2203417f4c0d000240024020030d00410121040c010b200310322204450d020b200241003602c801200220033602c401200220043602c001200241c0016a4100411010c80120022802c00120022802c80122036a2204200229009001370000200441086a20024190016a41086a2900003700002002200341106a22033602c801200241c0016a2003411010c80120022802c00120022802c80122036a2204200229009802370000200441086a20024198026a41086a2900003700002002200341106a22043602c80120022802c8022103200241c0016a2004200010c80120022802c001220420022802c80122056a2003200010c9081a2002200520006a22003602c801024020022802cc02450d002003102c0b20022001360298022004200020024198026a410410a702024020022802c401450d002004102c0b200241f0026a24000f0b103b000b1039000b940201057f024002400240200128021822020d00410021030c010b20012002417f6a36021820012802042204450d0120012802002105024002402001280208220620042f01324f0d00200421020c010b034002400240200428020022020d00410021020c010b200541016a210520042f013021060b2004102c20022104200620022f01324f0d000b0b41012103200641016a2104200220064102746a41046a280200210602402005450d00200220044102746a41346a280200210202402005417f6a2204450d000340200228023421022004417f6a22040d000b0b410021040b2001200436020820012002360204200141003602000b20002006360204200020033602000f0b41ecd0c800412b4198d1c800103c000b130020004103360204200041849bc5003602000b340020004187dec70036020420004100360200200041146a410d360200200041106a41b4a4c500360200200041086a42043702000b2901017f230041106b2202240020024100360208200242043703002000200210b707200241106a24000bcc7307017f017e0f7f017e067f027e087f230041d0016b2203240042002104200341386a22054200370300200341306a22064200370300200341206a41086a220742003703002003420037032041042108200341c0016a4187dec700410410c5012007200341c0016a41086a2209290000370300200320032900c001370320200341c0016a41d893c600410d10c50120052009290000370300200620032900c001370300200341c0016a200341206a412010b903024020032802c0012205450d00200341206a412010b40120032902c4012104200521080b0240024002402004422088a72205450d00200820054102746a210a20034198016a41086a210b20034198016a41046a210c200341a8016a41086a210d2008210e0340200e2802002107200341f8006a4187dec700410410c50120034188016a41ecaec500411b10c5012003200736029801200341a8016a20034198016a410410c7012003200c36022c2003200d360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801220541206a2209417f4c0d030240024020090d004101210f0c010b20091032220f450d030b20034100360228200320093602242003200f360220200341206a4100411010c80120032802202003280228220f6a22092003290078370000200941086a200341f8006a41086a22092900003700002003200f41106a220f360228200341206a200f411010c8012003280220200328022822106a220f200329008801370000200f41086a20034188016a41086a220f2900003700002003201041106a221136022820032802c0012110200341206a2011200510c80120032802202211200328022822126a2010200510c9081a2003201220056a2205360228024020032802c401450d002010102c0b2011200510b40102402003280224450d002011102c0b200341f8006a4187dec700410410c50120034188016a41b0afc500411f10c5012003200736029801200341a8016a20034198016a410410c7012003200c36022c2003200d360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801220541206a2210417f4c0d030240024020100d00410121110c010b201010322211450d030b200341003602282003201036022420032011360220200341206a4100411010c8012003280220200328022822106a22112003290078370000201141086a20092900003700002003201041106a2210360228200341206a2010411010c8012003280220200328022822106a2211200329008801370000201141086a200f2900003700002003201041106a221136022820032802c0012110200341206a2011200510c80120032802202211200328022822126a2010200510c9081a2003201220056a2205360228024020032802c401450d002010102c0b2011200510b40102402003280224450d002011102c0b200341f8006a4187dec700410410c50120034188016a41ecb1c500411810c5012003200736029801200341a8016a20034198016a410410c7012003200c36022c2003200d360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801220541206a2210417f4c0d030240024020100d00410121110c010b201010322211450d030b200341003602b001200320103602ac01200320113602a801200341a8016a4100411010c80120032802a80120032802b00122106a22112003290078370000201141086a20092900003700002003201041106a22103602b001200341a8016a2010411010c80120032802a80120032802b00122106a2211200329008801370000201141086a200f2900003700002003201041106a22103602b00120032802c0012111200341a8016a2010200510c80120032802a801221020032802b00122126a2011200510c9081a2003201220056a22053602b001024020032802c401450d002011102c0b200341206a2010200510b90302400240200328022022130d0041042113420021140c010b2010200510b401200329022421140b024020032802ac01450d002010102c0b02402014422088a72205450d002005410274211520132111034020112802002112200341f8006a4187dec700410410c50120034188016a41acb1c500410c10c501200341003602c801200342013703c001200341c0016a41004104102f20032802c00120032802c80122056a20123600002003200541046a22053602c801200341c0016a20054104102f20032802c001220520032802c80122106a20073600002003201041046a22103602c80120034198016a2005201010c7012003200520106a36022c200320053602282003200b360224200320034198016a360220200341a8016a200341206a107e024020032802c401450d002005102c0b20032802b001220541206a2210417f4c0d050240024020100d00410121160c010b201010322216450d050b200341003602282003201036022420032016360220200341206a4100411010c8012003280220200328022822106a22162003290078370000201641086a20092900003700002003201041106a2210360228200341206a2010411010c8012003280220200328022822106a2216200329008801370000201641086a200f2900003700002003201041106a221636022820032802a8012110200341206a2016200510c80120032802202216200328022822176a2010200510c9081a2003201720056a2205360228024020032802ac01450d002010102c0b2016200510b40102402003280224450d002016102c0b200341f8006a4187dec700410410c50120034188016a41d09ac500411310c501200341003602c801200342013703c001200341c0016a41004104102f20032802c00120032802c80122056a20123600002003200541046a22053602c801200341c0016a20054104102f20032802c001220520032802c80122106a20073600002003201041046a22103602c80120034198016a2005201010c7012003200520106a36022c200320053602282003200b360224200320034198016a360220200341a8016a200341206a107e024020032802c401450d002005102c0b20032802b001220541206a2210417f4c0d050240024020100d00410121120c010b201010322212450d050b200341003602282003201036022420032012360220200341206a4100411010c8012003280220200328022822106a22122003290078370000201241086a20092900003700002003201041106a2210360228200341206a2010411010c8012003280220200328022822106a2212200329008801370000201241086a200f2900003700002003201041106a221236022820032802a8012110200341206a2012200510c80120032802202212200328022822166a2010200510c9081a2003201620056a2205360228024020032802ac01450d002010102c0b2012200510b40102402003280224450d002012102c0b201141046a21112015417c6a22150d000b0b02402014a72205450d00200541ffffffff0371450d002013102c0b200341f8006a4187dec700410410c50120034188016a41fcb2c500411710c5012003200736029801200341a8016a20034198016a410410c7012003200c36022c2003200d360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801220541206a2210417f4c0d030240024020100d00410121110c010b201010322211450d030b200341003602b001200320103602ac01200320113602a801200341a8016a4100411010c80120032802a80120032802b00122106a22112003290078370000201141086a20092900003700002003201041106a22103602b001200341a8016a2010411010c80120032802a80120032802b00122106a2211200329008801370000201141086a200f2900003700002003201041106a22103602b00120032802c0012111200341a8016a2010200510c80120032802a801221020032802b00122126a2011200510c9081a2003201220056a22053602b001024020032802c401450d002011102c0b200341206a2010200510b90302400240200328022022130d0041042113420021140c010b2010200510b401200329022421140b024020032802ac01450d002010102c0b02402014422088a72205450d002005410274211520132111034020112802002112200341f8006a4187dec700410410c50120034188016a41acb1c500410c10c501200341003602c801200342013703c001200341c0016a41004104102f20032802c00120032802c80122056a20073600002003200541046a22053602c801200341c0016a20054104102f20032802c001220520032802c80122106a20123600002003201041046a22103602c80120034198016a2005201010c7012003200520106a36022c200320053602282003200b360224200320034198016a360220200341a8016a200341206a107e024020032802c401450d002005102c0b20032802b001220541206a2210417f4c0d050240024020100d00410121160c010b201010322216450d050b200341003602282003201036022420032016360220200341206a4100411010c8012003280220200328022822106a22162003290078370000201641086a20092900003700002003201041106a2210360228200341206a2010411010c8012003280220200328022822106a2216200329008801370000201641086a200f2900003700002003201041106a221636022820032802a8012110200341206a2016200510c80120032802202216200328022822176a2010200510c9081a2003201720056a2205360228024020032802ac01450d002010102c0b2016200510b40102402003280224450d002016102c0b200341f8006a4187dec700410410c50120034188016a41d09ac500411310c501200341003602c801200342013703c001200341c0016a41004104102f20032802c00120032802c80122056a20073600002003200541046a22053602c801200341c0016a20054104102f20032802c001220520032802c80122106a20123600002003201041046a22103602c80120034198016a2005201010c7012003200520106a36022c200320053602282003200b360224200320034198016a360220200341a8016a200341206a107e024020032802c401450d002005102c0b20032802b001220541206a2210417f4c0d050240024020100d00410121120c010b201010322212450d050b200341003602282003201036022420032012360220200341206a4100411010c8012003280220200328022822106a22122003290078370000201241086a20092900003700002003201041106a2210360228200341206a2010411010c8012003280220200328022822106a2212200329008801370000201241086a200f2900003700002003201041106a221236022820032802a8012110200341206a2012200510c80120032802202212200328022822166a2010200510c9081a2003201620056a2205360228024020032802ac01450d002010102c0b2012200510b40102402003280224450d002012102c0b201141046a21112015417c6a22150d000b0b200e41046a210e02402014a72205450d00200541ffffffff0371450d002013102c0b200e200a470d000b0b02402004a72205450d00200541ffffffff0371450d002008102c0b200341386a4200370300200341306a4200370300200341206a41086a2205420037030020034200370320200341c0016a4187dec700410410c5012005200341c0016a41086a2207290000370300200320032900c001370320200341c0016a41acaec500411b10c501200641086a2007290000370000200620032900c00137000020034188016a200341206a10f0040240200328028801220c450d0002400240200329028c012214428080808010540d00024020144220882204a7220b450d0020034198016a41086a210e20034198016a41046a2111200341a8016a41086a2112200341b8016a41086a2118200341cc006a2119200341206a41186a211a0240034002400240024002400240024002400240024002400240200b417f6a220b2014422088a722134f0d00200c200b4103746a221641046a280200210720162802002105200341f8006a4187dec700410410c50120034188016a41bcadc500411710c501200341003602c801200342013703c001200341c0016a41004104102f20032802c00120032802c80122096a20053600002003200941046a22093602c801200341c0016a20094104102f20032802c001220920032802c801220f6a20073600002003200f41046a220f3602c80120034198016a2009200f10c70120032009200f6a36022c200320093602282003200e360224200320034198016a360220200341a8016a200341206a107e024020032802c401450d002009102c0b20032802b001221041206a2209417f4c0d120240024020090d004101210f0c010b20091032220f450d120b200341003602c801200320093602c4012003200f3602c001200341c0016a4100411010c80120032802c00120032802c801220f6a22092003290078370000200941086a200341f8006a41086a22092900003700002003200f41106a220f3602c801200341c0016a200f411010c80120032802c00120032802c80122156a220f200329008801370000200f41086a20034188016a41086a220f2900003700002003201541106a22173602c80120032802a8012115200341c0016a2017201010c80120032802c001221720032802c801220d6a2015201010c9081a2003200d20106a22103602c801024020032802ac01450d002015102c0b200341206a2017201010fe04024020032d004022104102460d00200341206a41086a290300211b2003290320211c200328023021082003280234211d2003280238211e200328023c211f0b024020032802c401450d002017102c0b20104102460d01024002400240024020100d00200841016a2002470d03200341f8006a4187dec700410410c50120034188016a41ecaec500411b10c5012003200536029801200341a8016a20034198016a410410c7012003201136022c20032012360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801221041206a2215417f4c0d1620150d01410121170c020b200510fb02450d0d200710fb02450d0d20194200370200201a2001370300201941086a41003a0000200320003703302003201c3703202003201d3602482003201f3602442003201e3602402003201b370328200341f8006a4187dec700410410c50120034188016a41acb1c500410c10c501200341003602b001200342013703a801200341a8016a41004104102f20032802a80120032802b00122106a20053600002003201041046a22103602b001200341a8016a20104104102f20032802a801221020032802b00122156a20073600002003201541046a22153602b001200341b8016a2010201510c7012003201020156a3602cc01200320103602c801200320183602c4012003200341b8016a3602c00120034198016a200341c0016a107e024020032802ac01450d002010102c0b20032802a001221041206a2215417f4c0d150240024020150d00410121170c010b201510322217450d150b200341003602c801200320153602c401200320173602c001200341c0016a4100411010c80120032802c00120032802c80122156a22172003290078370000201741086a20092900003700002003201541106a22153602c801200341c0016a2015411010c80120032802c00120032802c80122156a2217200329008801370000201741086a200f2900003700002003201541106a22173602c8012003280298012115200341c0016a2017201010c80120032802c001221720032802c801220d6a2015201010c9081a2003200d20106a22103602c8010240200328029c01450d002015102c0b20172010200341206a109005024020032802c401450d002017102c0b200341f8006a4187dec700410410c50120034188016a41ecb1c500411810c5012003200736029801200341a8016a20034198016a410410c7012003201136022c20032012360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801221041206a2215417f4c0d150240024020150d00410121170c010b201510322217450d150b200341003602b001200320153602ac01200320173602a801200341a8016a4100411010c80120032802a80120032802b00122156a22172003290078370000201741086a20092900003700002003201541106a22153602b001200341a8016a2015411010c80120032802a80120032802b00122156a2217200329008801370000201741086a200f2900003700002003201541106a22173602b00120032802c0012115200341a8016a2017201010c80120032802a801222020032802b00122176a2015201010c9081a2003201720106a22213602b001024020032802c401450d002015102c0b200341206a2020202110b90302402003280220220a0d0041002110200341003602c801200342043703c00141002115410021220c080b2003200329022422043702c4012003200a3602c0014100211002402004422088a722220e020706000b4100211020222115034020102015410176221720106a220d2005200a200d4102746a280200491b2110201520176b221541014b0d000c060b0b201510322217450d130b200341003602282003201536022420032017360220200341206a4100411010c8012003280220200328022822156a22172003290078370000201741086a20092900003700002003201541106a2215360228200341206a2015411010c8012003280220200328022822156a2217200329008801370000201741086a200f2900003700002003201541106a221536022820032802c0012117200341206a2015201010c801200328022022152003280228220d6a2017201010c9081a2003200d20106a2210360228024020032802c401450d002017102c0b200341086a2015201010c6012003200328020c417f6a417f20032802081b3602c00120152010200341c0016a410410a70202402003280224450d002015102c0b2016200c2013417f6a22104103746a290200370200200341f8006a4187dec700410410c50120034188016a41bcadc500411710c501200341003602c801200342013703c001200341c0016a41004104102f20032802c00120032802c80122166a20053600002003201641046a22053602c801200341c0016a20054104102f20032802c001220520032802c80122166a20073600002003201641046a22073602c80120034198016a2005200710c7012003200520076a36022c200320053602282003200e360224200320034198016a360220200341a8016a200341206a107e024020032802c401450d002005102c0b20032802b001220541206a2207417f4c0d130240024020070d00410121160c010b200710322216450d130b2010ad2104200341003602282003200736022420032016360220200341206a4100411010c8012003280220200328022822076a22102003290078370000201041086a20092900003700002003200741106a2207360228200341206a2007411010c8012003280220200328022822076a2209200329008801370000200941086a200f2900003700002003200741106a220936022820032802a8012107200341206a2009200510c801200328022022092003280228220f6a2007200510c9081a2003200f20056a2205360228024020032802ac01450d002007102c0b201442ffffffff0f832114200442208621042009200510b40102402003280224450d002009102c0b201420048421140b200b450d0c0c0b0b200b201341d8c5c500103f000b41e8c5c50041da0041c4c6c500105c000b2005200a20104102746a2802002215460d0320222010200520154b6a2210490d040b20222004a72215470d010b200341c0016a201510d20420032802c001210a0b200a20104102746a221541046a2015202220106b41027410ca081a201520053602002003202241016a3602c80120032802a801212020032802b00121210b200341206a41086a2223200341c0016a41086a2224280200360200200320032903c00122043703202004a722100d012020202110b4010c020b201020221044000b20202021200341206a10d10420032802242215450d00201541ffffffff0371450d002010102c0b024020032802ac01450d002020102c0b200341f8006a4187dec700410410c50120034188016a41fcb2c500411710c5012003200536029801200341a8016a20034198016a410410c7012003201136022c20032012360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801221041206a2215417f4c0d080240024020150d00410121170c010b201510322217450d080b200341003602b001200320153602ac01200320173602a801200341a8016a4100411010c80120032802a80120032802b00122156a22172003290078370000201741086a20092900003700002003201541106a22153602b001200341a8016a2015411010c80120032802a80120032802b00122156a2217200329008801370000201741086a200f2900003700002003201541106a22173602b00120032802c0012115200341a8016a2017201010c80120032802a801222020032802b00122176a2015201010c9081a2003201720106a22213602b001024020032802c401450d002015102c0b200341206a2020202110b90302400240024002400240024002402003280220220a0d0041002110200341003602c801200342043703c00141002115410021220c010b2003200329022422043702c4012003200a3602c001410021100240024002402004422088a722220e020201000b4100211020222115034020102015410176221720106a220d2007200a200d4102746a280200491b2110201520176b221541014b0d000b0b2007200a20104102746a2802002215460d0320222010200720154b6a2210490d040b20222004a72215470d010b200341c0016a201510d20420032802c001210a0b200a20104102746a221541046a2015202220106b41027410ca081a201520073602002003202241016a3602c80120032802a801212020032802b00121210b20232024280200360200200320032903c00122043703202004a722100d012020202110b4010c020b201020221044000b20202021200341206a10d10420032802242215450d00201541ffffffff0371450d002010102c0b20032802ac01450d002020102c0b200341f8006a4187dec700410410c50120034188016a41ecaec500411b10c5012003200536029801200341a8016a20034198016a410410c7012003201136022c20032012360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801221041206a2215417f4c0d070240024020150d00410121170c010b201510322217450d070b200341003602282003201536022420032017360220200341206a4100411010c8012003280220200328022822156a22172003290078370000201741086a20092900003700002003201541106a2215360228200341206a2015411010c8012003280220200328022822156a2217200329008801370000201741086a200f2900003700002003201541106a221736022820032802c0012115200341206a2017201010c801200328022022172003280228220d6a2015201010c9081a2003200d20106a2210360228024020032802c401450d002015102c0b200341186a2017201010c601200328021c410020032802181b211002402003280224450d002017102c0b02400240201041014b0d00200341f8006a4187dec700410410c50120034188016a41ecaec500411b10c5012003200536029801200341a8016a20034198016a410410c7012003201136022c20032012360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801221041206a2215417f4c0d090240024020150d00410121170c010b201510322217450d090b200341003602282003201536022420032017360220200341206a4100411010c8012003280220200328022822156a22172003290078370000201741086a20092900003700002003201541106a2215360228200341206a2015411010c8012003280220200328022822156a2217200329008801370000201741086a200f2900003700002003201541106a221736022820032802c0012115200341206a2017201010c801200328022022172003280228220d6a2015201010c9081a2003200d20106a2210360228024020032802c401450d002015102c0b2017201010b4012003280224450d012017102c0c010b200341f8006a4187dec700410410c50120034188016a41ecaec500411b10c5012003200536029801200341a8016a20034198016a410410c7012003201136022c20032012360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801221541206a2217417f4c0d080240024020170d004101210a0c010b20171032220a450d080b2010417f6a210d20034100360228200320173602242003200a360220200341206a4100411010c8012003280220200328022822106a22172003290078370000201741086a20092900003700002003201041106a2210360228200341206a2010411010c8012003280220200328022822106a2217200329008801370000201741086a200f2900003700002003201041106a221736022820032802c0012110200341206a2017201510c801200328022022172003280228220a6a2010201510c9081a2003200a20156a2215360228024020032802c401450d002010102c0b2003200d3602c00120172015200341c0016a410410a7022003280224450d002017102c0b200341f8006a4187dec700410410c50120034188016a41b0afc500411f10c5012003200736029801200341a8016a20034198016a410410c7012003201136022c20032012360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801221041206a2215417f4c0d070240024020150d00410121170c010b201510322217450d070b200341003602282003201536022420032017360220200341206a4100411010c8012003280220200328022822156a22172003290078370000201741086a20092900003700002003201541106a2215360228200341206a2015411010c8012003280220200328022822156a2217200329008801370000201741086a200f2900003700002003201541106a221736022820032802c0012115200341206a2017201010c801200328022022172003280228220d6a2015201010c9081a2003200d20106a2210360228024020032802c401450d002015102c0b200341106a2017201010c6012003280214410020032802101b211002402003280224450d002017102c0b02400240201041014b0d00200341f8006a4187dec700410410c50120034188016a41b0afc500411f10c5012003200736029801200341a8016a20034198016a410410c7012003201136022c20032012360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801221041206a2215417f4c0d090240024020150d00410121170c010b201510322217450d090b200341003602282003201536022420032017360220200341206a4100411010c8012003280220200328022822156a22172003290078370000201741086a20092900003700002003201541106a2215360228200341206a2015411010c8012003280220200328022822156a2217200329008801370000201741086a200f2900003700002003201541106a221736022820032802c0012115200341206a2017201010c801200328022022172003280228220d6a2015201010c9081a2003200d20106a2210360228024020032802c401450d002015102c0b2017201010b4012003280224450d012017102c0c010b200341f8006a4187dec700410410c50120034188016a41b0afc500411f10c5012003200736029801200341a8016a20034198016a410410c7012003201136022c20032012360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801221541206a2217417f4c0d080240024020170d004101210a0c010b20171032220a450d080b2010417f6a210d20034100360228200320173602242003200a360220200341206a4100411010c8012003280220200328022822106a22172003290078370000201741086a20092900003700002003201041106a2210360228200341206a2010411010c8012003280220200328022822106a2217200329008801370000201741086a200f2900003700002003201041106a221736022820032802c0012110200341206a2017201510c801200328022022172003280228220a6a2010201510c9081a2003200a20156a2215360228024020032802c401450d002010102c0b2003200d3602c00120172015200341c0016a410410a7022003280224450d002017102c0b2016200c2013417f6a22104103746a290200370200200341f8006a4187dec700410410c50120034188016a41bcadc500411710c501200341003602c801200342013703c001200341c0016a41004104102f20032802c00120032802c80122166a20053600002003201641046a22053602c801200341c0016a20054104102f20032802c001220520032802c80122166a20073600002003201641046a22073602c80120034198016a2005200710c7012003200520076a36022c200320053602282003200e360224200320034198016a360220200341a8016a200341206a107e024020032802c401450d002005102c0b20032802b001220541206a2207417f4c0d070240024020070d00410121160c010b200710322216450d070b2010ad2104200341003602282003200736022420032016360220200341206a4100411010c8012003280220200328022822076a22102003290078370000201041086a20092900003700002003200741106a2207360228200341206a2007411010c8012003280220200328022822076a2209200329008801370000200941086a200f2900003700002003200741106a220936022820032802a8012107200341206a2009200510c801200328022022092003280228220f6a2007200510c9081a2003200f20056a2205360228024020032802ac01450d002007102c0b201442ffffffff0f832114200442208621042009200510b40102402003280224450d002009102c0b20142004842114200b0d000b0b201442208821040b200341386a4200370300200341306a4200370300200341206a41086a2205420037030020034200370320200341c0016a4187dec700410410c5012005200341c0016a41086a2207290000370300200320032900c001370320200341c0016a41acaec500411b10c501200641086a2007290000370000200620032900c0013700002004a722054103744104722207417f4c0d04200710322209450d03200341003602c801200320073602c401200320093602c001200341c0016a2005108f010240024020050d0020032802c001210f20032802c80121070c010b200c20054103746a210b20032802c8012107200c2105034020052802002109200341c0016a20074104102f20032802c00120032802c80122076a20093600002003200741046a22073602c801200541046a2802002109200341c0016a20074104102f20032802c001220f20032802c80122076a20093600002003200741046a22073602c801200541086a2205200b470d000b0b200341206a4120200f200710a702024020032802c401450d00200f102c0b2014a72205450d02200541ffffffff0171450d020c010b2014a72205450d01200541ffffffff0171450d010b200c102c0b42002104200341386a4200370300200341306a4200370300200341206a41086a220542003703002003420037032041042108200341c0016a4187dec700410410c5012005200341c0016a41086a2207290000370300200320032900c001370320200341c0016a41d8b0c500411c10c501200641086a2007290000370000200620032900c001370000200341c0016a200341206a10f004024020032802c0012205450d00200341206a412010b40120032902c4012104200521080b02402004422088a72205450d00200820054103746a210620034198016a41046a210e200341a8016a41086a211320034198016a41086a210d20082115034020152902002114200341f8006a4187dec700410410c50120034188016a41f8afc500411810c501200341003602c801200342013703c001200341c0016a41004104102f20032802c00120032802c80122056a2014a7220b3600002003200541046a22053602c801200341c0016a20054104102f20032802c001220520032802c80122076a2014422088a722103600002003200741046a22073602c80120034198016a2005200710c7012003200520076a36022c200320053602282003200d360224200320034198016a360220200341a8016a200341206a107e024020032802c401450d002005102c0b20032802b001220541206a2207417f4c0d030240024020070d00410121090c010b200710322209450d030b200341003602282003200736022420032009360220200341206a4100411010c8012003280220200328022822076a22092003290078370000200941086a200341f8006a41086a22122900003700002003200741106a2207360228200341206a2007411010c8012003280220200328022822076a2209200329008801370000200941086a20034188016a41086a22162900003700002003200741106a220936022820032802a8012107200341206a2009200510c801200328022022092003280228220f6a2007200510c9081a2003200f20056a2205360228024020032802ac01450d002007102c0b2009200510b40102402003280224450d002009102c0b200341f8006a4187dec700410410c50120034188016a41acb1c500410c10c501200341003602c801200342013703c001200341c0016a41004104102f20032802c00120032802c80122056a200b3600002003200541046a22053602c801200341c0016a20054104102f20032802c001220520032802c80122076a20103600002003200741046a22073602c80120034198016a2005200710c7012003200520076a36022c200320053602282003200d360224200320034198016a360220200341a8016a200341206a107e024020032802c401450d002005102c0b20032802b001220541206a2207417f4c0d030240024020070d00410121090c010b200710322209450d030b200341003602282003200736022420032009360220200341206a4100411010c8012003280220200328022822076a22092003290078370000200941086a20122900003700002003200741106a2207360228200341206a2007411010c8012003280220200328022822076a2209200329008801370000200941086a20162900003700002003200741106a220936022820032802a8012107200341206a2009200510c801200328022022092003280228220f6a2007200510c9081a2003200f20056a2205360228024020032802ac01450d002007102c0b2009200510b40102402003280224450d002009102c0b200341f8006a4187dec700410410c50120034188016a41d09ac500411310c501200341003602c801200342013703c001200341c0016a41004104102f20032802c00120032802c80122056a200b3600002003200541046a22053602c801200341c0016a20054104102f20032802c001220520032802c80122076a20103600002003200741046a22073602c80120034198016a2005200710c7012003200520076a36022c200320053602282003200d360224200320034198016a360220200341a8016a200341206a107e024020032802c401450d002005102c0b20032802b001220541206a2207417f4c0d030240024020070d00410121090c010b200710322209450d030b200341003602282003200736022420032009360220200341206a4100411010c8012003280220200328022822076a22092003290078370000200941086a20122900003700002003200741106a2207360228200341206a2007411010c8012003280220200328022822076a2209200329008801370000200941086a20162900003700002003200741106a220936022820032802a8012107200341206a2009200510c801200328022022092003280228220f6a2007200510c9081a2003200f20056a2205360228024020032802ac01450d002007102c0b2009200510b40102402003280224450d002009102c0b200341f8006a4187dec700410410c50120034188016a41fcb2c500411710c5012003200b36029801200341a8016a20034198016a410410c7012003200e36022c20032013360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801220541206a2207417f4c0d030240024020070d00410121090c010b200710322209450d030b200341003602b001200320073602ac01200320093602a801200341a8016a4100411010c80120032802a80120032802b00122076a22092003290078370000200941086a20122900003700002003200741106a22073602b001200341a8016a2007411010c80120032802a80120032802b00122076a2209200329008801370000200941086a20162900003700002003200741106a22093602b00120032802c0012107200341a8016a2009200510c80120032802a801221720032802b00122096a2007200510c9081a2003200920056a220c3602b001024020032802c401450d002007102c0b200341206a2017200c10b90320032802202205410420051b211102400240024002402003290224420020051b2214422088a7220a0e020300010b4100210520112802002010470d020c010b41002105200a2107034020052007410176220920056a220f2011200f4102746a28020020104b1b2105200720096b220741014b0d000b201120054102746a2802002010470d012005200a490d002005200a1047000b201120054102746a2207200741046a2005417f73200a6a41027410ca081a20144280808080707c211420032802a801211720032802b001210c0b20032011360220200320143702242017200c200341206a10d1040240201442ffffffff0383500d002011102c0b024020032802ac01450d002017102c0b200341f8006a4187dec700410410c50120034188016a41ecb1c500411810c5012003201036029801200341a8016a20034198016a410410c7012003200e36022c20032013360224200320034198016a3602282003200341a8016a360220200341c0016a200341206a107e20032802c801220541206a2207417f4c0d030240024020070d00410121090c010b200710322209450d030b200341003602b001200320073602ac01200320093602a801200341a8016a4100411010c80120032802a80120032802b00122076a22092003290078370000200941086a20122900003700002003200741106a22073602b001200341a8016a2007411010c80120032802a80120032802b00122076a2209200329008801370000200941086a20162900003700002003200741106a22093602b00120032802c0012107200341a8016a2009200510c80120032802a801221120032802b00122096a2007200510c9081a2003200920056a22123602b001024020032802c401450d002007102c0b200341206a2011201210b90320032802202205410420051b211002400240024002402003290224420020051b2214422088a722160e020300010b410021052010280200200b470d020c010b4100210520162107034020052007410176220920056a220f2010200f4102746a280200200b4b1b2105200720096b220741014b0d000b201020054102746a280200200b470d0120052016490d00200520161047000b201020054102746a2207200741046a2005417f7320166a41027410ca081a20144280808080707c211420032802a801211120032802b00121120b200320103602202003201437022420112012200341206a10d1040240201442ffffffff0383500d002010102c0b201541086a2115024020032802ac01450d002011102c0b20152006470d000b0b02402004a72205450d00200541ffffffff0171450d002008102c0b200341d0016a24000f0b1039000b103b000b8e0301017f230041c0006b220224000240024002400240200028020022002802000e03010200010b2002200041046a3602242002411c3602142001411c6a28020021002002200241246a360210200128021821012002413c6a41013602002002420237022c200241d4c6c5003602282002200241106a36023820012000200241286a103e21010c020b2002200041046a36020c2002200041086a3602242002411c6a411c3602002002411c3602142001411c6a28020021002002200241246a36021820022002410c6a360210200128021821012002413c6a41023602002002420337022c200241e4c6c5003602282002200241106a36023820012000200241286a103e21010c010b2002200041046a36020c2002200041086a3602242002411c6a411c3602002002411c3602142001411c6a28020021002002200241246a36021820022002410c6a360210200128021821012002413c6a41023602002002420337022c200241fcc6c5003602282002200241106a36023820012000200241286a103e21010b200241c0006a240020010b9c0701017f230041c0006b220224000240024002400240024002400240200028020022002802000e06010203040500010b2002200041046a3602042002200041086a36020820022000410c6a36020c200241106a41146a411e360200200241106a410c6a411e3602002002411e3602142001411c6a280200210020022002410c6a3602202002200241086a3602182002200241046a36021020012802182101200241286a41146a41033602002002420437022c200241d4b3c0003602282002200241106a36023820012000200241286a103e21000c050b2002200041046a3602082002200041086a36020c2002411c6a411e3602002002411e3602142001411c6a280200210020022002410c6a3602182002200241086a360210200128021821012002413c6a41023602002002420337022c200241f4b3c0003602282002200241106a36023820012000200241286a103e21000c040b2002200041046a36020c2002411e3602142001411c6a280200210020022002410c6a360210200128021821012002413c6a41013602002002420237022c2002418cb4c0003602282002200241106a36023820012000200241286a103e21000c030b2002200041046a36020c200241106a41146a4128360200200241106a410c6a412836020020022000410c6a3602202002200041086a3602182002411e3602142001411c6a280200210020022002410c6a36021020012802182101200241286a41146a41033602002002420337022c2002419cb4c0003602282002200241106a36023820012000200241286a103e21000c020b2002200041046a3602042002200041086a36020820022000410c6a36020c200241106a41146a411e360200200241106a410c6a411e3602002002411e3602142001411c6a280200210020022002410c6a3602202002200241086a3602182002200241046a36021020012802182101200241286a41146a41033602002002420437022c200241b4b4c0003602282002200241106a36023820012000200241286a103e21000c010b2002200041046a3602042002200041086a36020820022000410c6a36020c200241106a41146a411e360200200241106a410c6a411e3602002002411e3602142001411c6a280200210020022002410c6a3602202002200241086a3602182002200241046a36021020012802182101200241286a41146a41033602002002420437022c200241d4b4c0003602282002200241106a36023820012000200241286a103e21000b200241c0006a240020000b130020004102360204200041d0c9c5003602000b3400200041c7dcc70036020420004100360200200041146a410c360200200041106a41accdc500360200200041086a42043702000b4901017f02404104103222020d001039000b2000420437020420002002360200200041004101102f2000280200200041086a220028020022026a41003a00002000200241016a3602000bb00101067f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120103222060d001039000b2000422037020420002006360200200041004120102f2000280200200041086a220628020022076a220020022903003700002006200741206a360200200041086a2005290300370000200041106a2004290300370000200041186a2003290300370000200241206a24000b130020004102360204200041e8e8c5003602000b4a01017f02404108103222020d001039000b2000420837020420002002360200200041004108102f2000280200200041086a220028020022026a42f02e3700002000200241086a3602000b4a01017f02404108103222020d001039000b2000420837020420002002360200200041004108102f2000280200200041086a220028020022026a42d8043700002000200241086a3602000bb56603047f237e067f230041d01f6b22022400200241801c6a20011073200241a81c6a200241801c6a106e41002103410121040340200120036a2d0000200241a81c6a20036a2d0000732205410020056b72417f734180017141077610702004712104200341016a22034120470d000b200410702103200241881f6a200241801c6a106e20022d00881f41017110702104024002400240200341ff0171450d00200441ff01714101460d00200241c81c6a200241801c6a41011071200242f0ffffffffffff3f20022903e81c7d220642ffffffffffffff038342f0ffffffffffff3f20022903e01c7d22074233887c3703901d2002200742ffffffffffffff038342f0ffffffffffff3f20022903d81c22077d22084233887c3703881d2002200842ffffffffffffff038342f0ffffffffffff3f20022903d01c22087d22094233887c3703801d2002200942ffffffffffffff038342d1fdffffffffff3f20022903c81c22097d220a4233887c3703f81c2002200642338842137e200a42ffffffffffffff03837c3703f01c200242003703b01d200242003703b81d2002200942017c3703981d200220083703a01d200220073703a81d200220022903e01c3703b01d200220022903b81d20022903e81c7c3703b81d200241c01d6a200241981d6a41011071200241b81e6a200241f01c6a41011071200241f8156a20022903b81e2206420042ca8e9ae5dec6ac02420010ce08200241f8186a20022903c01e220742137e4200428092f58893f9b701420010ce08200241a8186a20022903c81e220842137e220b420042c486ffe299c731420010ce08200241d8176a20022903d01e220a42137e220c420042d6fff8ffd98b8601420010ce0820024188176a20022903d81e220d42137e2209420042c2a2aaa7fcfa9503420010ce0820024188166a2006420042c2a2aaa7fcfa9503420010ce08200241e8186a2007420042ca8e9ae5dec6ac02420010ce0820024198186a200b4200428092f58893f9b701420010ce08200241c8176a200c420042c486ffe299c731420010ce08200241f8166a2009420042d6fff8ffd98b8601420010ce0820024198166a2006420042d6fff8ffd98b8601420010ce08200241d8186a2007420042c2a2aaa7fcfa9503420010ce0820024188186a2008420042ca8e9ae5dec6ac02420010ce08200241b8176a200c4200428092f58893f9b701420010ce08200241e8166a2009420042c486ffe299c731420010ce08200241a8166a2006420042c486ffe299c731420010ce08200241c8186a2007420042d6fff8ffd98b8601420010ce08200241f8176a2008420042c2a2aaa7fcfa9503420010ce08200241a8176a200a420042ca8e9ae5dec6ac02420010ce08200241d8166a20094200428092f58893f9b701420010ce08200241b8166a20064200428092f58893f9b701420010ce08200241b8186a2007420042c486ffe299c731420010ce08200241e8176a2008420042d6fff8ffd98b8601420010ce0820024198176a200a420042c2a2aaa7fcfa9503420010ce08200241c8166a200d420042ca8e9ae5dec6ac02420010ce08200241f8136a20022903c01d2208420020022903b816220e20022903c8167c220620022903b8187c220720022903e8177c22092002290398177c220a20022903d816220f20022903a8177c220c20022903a8167c220b20022903c8187c220d20022903f8177c221020022903b81722112002290388187c221220022903e8167c22132002290398167c221420022903d8187c2215200229039818221620022903e8187c221720022903c8177c221820022903f8167c22192002290388167c221a20022903f818221b20022903f8157c221c20022903a8187c221d20022903d8177c221e2002290388177c221f423388200241f8186a41086a290300200241f8156a41086a2903007c201c201b54ad7c200241a8186a41086a2903007c201d201c54ad7c200241d8176a41086a2903007c201e201d54ad7c20024188176a41086a2903007c201f201e54ad7c420d86847c221c42338820024198186a41086a290300200241e8186a41086a2903007c2017201654ad7c200241c8176a41086a2903007c2018201754ad7c200241f8166a41086a2903007c2019201854ad7c20024188166a41086a2903007c201a201954ad7c201c201a54ad7c420d86847c2218423388200241b8176a41086a29030020024188186a41086a2903007c2012201154ad7c200241e8166a41086a2903007c2013201254ad7c20024198166a41086a2903007c2014201354ad7c200241d8186a41086a2903007c2015201454ad7c2018201554ad7c420d86847c2212423388200241d8166a41086a290300200241a8176a41086a2903007c200c200f54ad7c200241a8166a41086a2903007c200b200c54ad7c200241c8186a41086a2903007c200d200b54ad7c200241f8176a41086a2903007c2010200d54ad7c2012201054ad7c420d86847c220c42ffffffffffffff038320022903e01d220d7d42f0ffffffffffff3f7c220b42338842137e200c423388200241b8166a41086a290300200241c8166a41086a2903007c2006200e54ad7c200241b8186a41086a2903007c2007200654ad7c200241e8176a41086a2903007c2009200754ad7c20024198176a41086a2903007c200a200954ad7c200c200a54ad7c420d868442137e201f42feffffffffffff03837c220742ffffffffffffff038320087d42d0fdffffffffff3f7c221342ffffffffffffff03837c2206420010ce08200241e8156a200b42ffffffffffffff0383201242ffffffffffffff038320022903d81d220c7d42f0ffffffffffff3f7c220a4233887c2217420020022903c81d220942137e420010ce0820024198156a200a42ffffffffffffff0383201842ffffffffffffff038320022903d01d220a7d42f0ffffffffffff3f7c220b4233887c22144200200a42137e2215420010ce08200241c8146a200b42ffffffffffffff03832007423388201c42ffffffffffffff03837c20097d42f0ffffffffffff3f7c22074233887c22124200200c42137e2210420010ce08200241a8136a200742ffffffffffffff038320134233887c22074200200d42137e220b420010ce0820024198136a200742002008420010ce08200241e8136a200642002009420010ce08200241d8156a201742002015420010ce0820024188156a201442002010420010ce08200241b8146a20124200200b420010ce08200241a8146a201242002008420010ce0820024188136a200742002009420010ce08200241d8136a20064200200a420010ce08200241c8156a201742002010420010ce08200241f8146a20144200200b420010ce08200241e8146a201442002008420010ce0820024198146a201242002009420010ce08200241f8126a20074200200a420010ce08200241c8136a20064200200c420010ce08200241b8156a20174200200b420010ce08200241a8156a201742002008420010ce08200241d8146a201442002009420010ce0820024188146a20124200200a420010ce08200241e8126a20074200200c420010ce08200241b8136a20064200200d420010ce08200220022903c815221c20022903d8137c220820022903f8147c220920022903a8147c220a2002290388137c220c20022903d815221d20022903e8137c220b2002290388157c220d20022903b8147c22102002290398137c221320022903e815221e20022903f8137c22152002290398157c221820022903c8147c221920022903a8137c221a423388200241e8156a41086a290300200241f8136a41086a2903007c2015201e54ad7c20024198156a41086a2903007c2018201554ad7c200241c8146a41086a2903007c2019201854ad7c200241a8136a41086a2903007c201a201954ad7c420d86847c2215423388200241d8156a41086a290300200241e8136a41086a2903007c200b201d54ad7c20024188156a41086a2903007c200d200b54ad7c200241b8146a41086a2903007c2010200d54ad7c20024198136a41086a2903007c2013201054ad7c2015201354ad7c420d86847c220b42ffffffffffffff03833703a01e200220022903b815221920022903c8137c220d20022903e8147c22102002290398147c221320022903f8127c2218200b423388200241c8156a41086a290300200241d8136a41086a2903007c2008201c54ad7c200241f8146a41086a2903007c2009200854ad7c200241a8146a41086a2903007c200a200954ad7c20024188136a41086a2903007c200c200a54ad7c200b200c54ad7c420d86847c220842ffffffffffffff03833703a81e200220022903a815221c20022903b8137c220920022903d8147c220a2002290388147c220c20022903e8127c220b2008423388200241b8156a41086a290300200241c8136a41086a2903007c200d201954ad7c200241e8146a41086a2903007c2010200d54ad7c20024198146a41086a2903007c2013201054ad7c200241f8126a41086a2903007c2018201354ad7c2008201854ad7c420d86847c220842ffffffffffffff03833703b01e20022008423388200241a8156a41086a290300200241b8136a41086a2903007c2009201c54ad7c200241d8146a41086a2903007c200a200954ad7c20024188146a41086a2903007c200c200a54ad7c200241e8126a41086a2903007c200b200c54ad7c2008200b54ad7c420d868442137e201a42ffffffffffffff03837c220842ffffffffffffff03833703901e20022008423388201542ffffffffffffff03837c3703981e200241a81f6a41106a4200370300200241a81f6a41186a4200370300200241a81f6a41206a4200370300200242003703b01f200242013703a81f200241b81e6a200241a81f6a200241901e6a107220024198126a20022903981d220d420020022903c01e2208420010ce08200241d80f6a200241e01e6a2903002209420020022903a01d221042137e420010ce08200241b8106a200241b81e6a41206a2203290300220a420020022903a81d221342137e221a420010ce0820024198116a200241b81e6a41186a2204290300220c420020022903b01d221842137e2219420010ce08200241f8116a200241b81e6a41106a2205290300220b420020022903b81d221c42137e2215420010ce08200241d8126a200b4200200d420010ce0820024198106a200842002010420010ce08200241a8106a20094200201a420010ce0820024188116a200a42002019420010ce08200241e8116a200c42002015420010ce08200241c8126a200c4200200d420010ce0820024188106a200b42002010420010ce08200241e8106a200842002013420010ce08200241f8106a200942002019420010ce08200241d8116a200a42002015420010ce08200241b8126a200a4200200d420010ce08200241f80f6a200c42002010420010ce08200241d8106a200b42002013420010ce08200241b8116a200842002018420010ce08200241c8116a200942002015420010ce08200241a8126a20094200200d420010ce08200241e80f6a200a42002010420010ce08200241c8106a200c42002013420010ce08200241a8116a200b42002018420010ce0820024188126a20084200201c420010ce08200241980d6a2006420020022903a81222202002290388127c220d20022903e80f7c221020022903c8107c221320022903a8117c221520022903c811222120022903b8117c221820022903b8127c221920022903f80f7c221a20022903d8107c221c20022903f810222220022903e8107c221d20022903d8117c221e20022903c8127c221f2002290388107c220e20022903a81022232002290398107c220f2002290388117c221120022903e8117c221620022903d8127c221b20022903d80f22242002290398127c222520022903b8107c22262002290398117c222720022903f8117c2228423388200241d80f6a41086a29030020024198126a41086a2903007c2025202454ad7c200241b8106a41086a2903007c2026202554ad7c20024198116a41086a2903007c2027202654ad7c200241f8116a41086a2903007c2028202754ad7c420d86847c2225423388200241a8106a41086a29030020024198106a41086a2903007c200f202354ad7c20024188116a41086a2903007c2011200f54ad7c200241e8116a41086a2903007c2016201154ad7c200241d8126a41086a2903007c201b201654ad7c2025201b54ad7c420d86847c220f423388200241f8106a41086a290300200241e8106a41086a2903007c201d202254ad7c200241d8116a41086a2903007c201e201d54ad7c200241c8126a41086a2903007c201f201e54ad7c20024188106a41086a2903007c200e201f54ad7c200f200e54ad7c420d86847c221d423388200241c8116a41086a290300200241b8116a41086a2903007c2018202154ad7c200241b8126a41086a2903007c2019201854ad7c200241f80f6a41086a2903007c201a201954ad7c200241d8106a41086a2903007c201c201a54ad7c201d201c54ad7c420d86847c2218423388200241a8126a41086a29030020024188126a41086a2903007c200d202054ad7c200241e80f6a41086a2903007c2010200d54ad7c200241c8106a41086a2903007c2013201054ad7c200241a8116a41086a2903007c2015201354ad7c2018201554ad7c420d868442137e202842ffffffffffffff03837c221042ffffffffffffff0383220d420010ce08200241b8096a201842ffffffffffffff038322184200200742137e420010ce08200241c80e6a201d42ffffffffffffff038322154200201242137e221c420010ce08200241f80d6a200f42ffffffffffffff038322134200201442137e221a420010ce08200241e80d6a2010423388202542ffffffffffffff03837c22104200201742137e2219420010ce08200241d80d6a201042002006420010ce08200241880d6a200d42002007420010ce08200241980f6a20184200201c420010ce08200241d80e6a20154200201a420010ce08200241880e6a201342002019420010ce08200241980e6a201342002006420010ce08200241c80d6a201042002007420010ce08200241f80c6a200d42002012420010ce08200241a80f6a20184200201a420010ce08200241e80e6a201542002019420010ce08200241f80e6a201542002006420010ce08200241a80e6a201342002007420010ce08200241b80d6a201042002012420010ce08200241e80c6a200d42002014420010ce08200241b80f6a201842002019420010ce08200241c80f6a201842002006420010ce08200241880f6a201542002007420010ce08200241b80e6a201342002012420010ce08200241a80d6a201042002014420010ce08200241d80c6a200d42002017420010ce08200241e8066a20022903c80f222020022903d80c7c220620022903880f7c220720022903b80e7c221220022903a80d7c221420022903b80f222120022903e80c7c221720022903f80e7c221920022903a80e7c221a20022903b80d7c221c20022903a80f222220022903f80c7c221d20022903e80e7c221e20022903980e7c221f20022903c80d7c220e20022903980f222320022903880d7c220f20022903d80e7c221120022903880e7c221620022903d80d7c221b20022903b809222420022903980d7c222520022903c80e7c222620022903f80d7c222720022903e80d7c2228423388200241b8096a41086a290300200241980d6a41086a2903007c2025202454ad7c200241c80e6a41086a2903007c2026202554ad7c200241f80d6a41086a2903007c2027202654ad7c200241e80d6a41086a2903007c2028202754ad7c420d86847c2225423388200241980f6a41086a290300200241880d6a41086a2903007c200f202354ad7c200241d80e6a41086a2903007c2011200f54ad7c200241880e6a41086a2903007c2016201154ad7c200241d80d6a41086a2903007c201b201654ad7c2025201b54ad7c420d86847c220f423388200241a80f6a41086a290300200241f80c6a41086a2903007c201d202254ad7c200241e80e6a41086a2903007c201e201d54ad7c200241980e6a41086a2903007c201f201e54ad7c200241c80d6a41086a2903007c200e201f54ad7c200f200e54ad7c420d86847c221d423388200241b80f6a41086a290300200241e80c6a41086a2903007c2017202154ad7c200241f80e6a41086a2903007c2019201754ad7c200241a80e6a41086a2903007c201a201954ad7c200241b80d6a41086a2903007c201c201a54ad7c201d201c54ad7c420d86847c2217423388200241c80f6a41086a290300200241d80c6a41086a2903007c2006202054ad7c200241880f6a41086a2903007c2007200654ad7c200241b80e6a41086a2903007c2012200754ad7c200241a80d6a41086a2903007c2014201254ad7c2017201454ad7c420d868442137e202842ffffffffffffff03837c220742ffffffffffffff0383220642002008420010ce08200241b8076a200942002007423388202542ffffffffffffff03837c220742137e420010ce08200241d8076a200a4200200f42ffffffffffffff0383221242137e221c420010ce0820024188086a200c4200201d42ffffffffffffff0383221942137e221a420010ce08200241c8086a200b4200201742ffffffffffffff0383221742137e2214420010ce08200241d8066a200b42002006420010ce08200241a8076a200842002007420010ce08200241c8076a20094200201c420010ce08200241f8076a200a4200201a420010ce08200241b8086a200c42002014420010ce08200241c8066a200c42002006420010ce0820024198076a200b42002007420010ce08200241d8086a200842002012420010ce08200241e8076a20094200201a420010ce08200241a8086a200a42002014420010ce08200241e8056a200a42002006420010ce0820024188076a200c42002007420010ce08200241e8086a200b42002012420010ce0820024188096a200842002019420010ce0820024198086a200942002014420010ce0820024188056a200942002006420010ce08200241f8066a200a42002007420010ce08200241f8086a200c42002012420010ce0820024198096a200b42002019420010ce08200241a8096a200842002017420010ce0820022d00b81e21292003200241801c6a41206a222a2903003703002004200241801c6a41186a222b2903003703002005200241801c6a41106a222c2903002208370300200241b81e6a41086a222d200241801c6a41086a222e2903002207370300200220022903801c22063703b81e2002200620022903801c7c22063703b81e202d2007202e2903007c220737030020052008202c2903007c220837030020042004290300202b2903007c220937030020032003290300202a2903007c220a370300200241880c6a200d42002006420010ce08200241880a6a200a4200201042137e420010ce08200241980a6a20094200201342137e2212420010ce08200241e80a6a20084200201542137e220b420010ce08200241b80b6a20074200201842137e220c420010ce08200241c80b6a20074200200d420010ce08200241980c6a200642002010420010ce08200241f8096a200a42002012420010ce08200241a80a6a20094200200b420010ce08200241f80a6a20084200200c420010ce08200241880b6a20084200200d420010ce08200241d80b6a200742002010420010ce08200241a80c6a200642002013420010ce08200241e8096a200a4200200b420010ce08200241b80a6a20094200200c420010ce08200241c80a6a20094200200d420010ce08200241980b6a200842002010420010ce08200241e80b6a200742002013420010ce08200241b80c6a200642002015420010ce08200241d8096a200a4200200c420010ce08200241c8096a200a4200200d420010ce08200241d80a6a200942002010420010ce08200241a80b6a200842002013420010ce08200241f80b6a200742002015420010ce08200241c80c6a200642002018420010ce08200220022903c809221f20022903c80c7c220620022903d80a7c220720022903a80b7c220820022903f80b7c220920022903d809220e20022903b80c7c220a20022903c80a7c220c20022903980b7c220b20022903e80b7c220d20022903e809220f20022903a80c7c221020022903b80a7c221220022903880b7c221320022903d80b7c221420022903f809221120022903980c7c221520022903a80a7c221720022903f80a7c221820022903c80b7c221920022903880a221620022903880c7c221a20022903980a7c221c20022903e80a7c221d20022903b80b7c221e423388200241880a6a41086a290300200241880c6a41086a2903007c201a201654ad7c200241980a6a41086a2903007c201c201a54ad7c200241e80a6a41086a2903007c201d201c54ad7c200241b80b6a41086a2903007c201e201d54ad7c420d86847c221a423388200241f8096a41086a290300200241980c6a41086a2903007c2015201154ad7c200241a80a6a41086a2903007c2017201554ad7c200241f80a6a41086a2903007c2018201754ad7c200241c80b6a41086a2903007c2019201854ad7c201a201954ad7c420d86847c2215423388200241e8096a41086a290300200241a80c6a41086a2903007c2010200f54ad7c200241b80a6a41086a2903007c2012201054ad7c200241880b6a41086a2903007c2013201254ad7c200241d80b6a41086a2903007c2014201354ad7c2015201454ad7c420d86847c2210423388200241d8096a41086a290300200241b80c6a41086a2903007c200a200e54ad7c200241c80a6a41086a2903007c200c200a54ad7c200241980b6a41086a2903007c200b200c54ad7c200241e80b6a41086a2903007c200d200b54ad7c2010200d54ad7c420d86847c220a423388200241c8096a41086a290300200241c80c6a41086a2903007c2006201f54ad7c200241d80a6a41086a2903007c2007200654ad7c200241a80b6a41086a2903007c2008200754ad7c200241f80b6a41086a2903007c2009200854ad7c200a200954ad7c420d868442137e201e42ffffffffffffff03837c220642ffffffffffffff03833703e81d20022006423388201a42ffffffffffffff03837c3703f01d2002200a42ffffffffffffff038322063703881e2002201042ffffffffffffff038322073703801e2002201542ffffffffffffff0383220c3703f81d200241881f6a200241e81d6a106e2002200642f0ffffffffffff3f20067d220942ffffffffffffff038342f0ffffffffffff3f20077d22084233887c85420020022d00881f4101711070ad42ff01837d220a8320068522063703881e20022007200842ffffffffffffff038342f0ffffffffffff3f200c7d220b4233887c85200a8320078522073703801e200220022903e81d2208200942338842137e42d0fdffffffffff3f20087d220d42ffffffffffffff03837c85200a8320088522083703e81d200220022903f01d220942f0ffffffffffff3f20097d221042ffffffffffffff0383200d4233887c85200a8320098522093703f01d2002200c200b42ffffffffffffff038320104233887c85200a83200c85220a3703f81d20024198046a200229038805221b20022903a8097c220c20022903f8067c220b20022903f8087c220d2002290398097c221020022903980822252002290388097c221220022903e8057c22132002290388077c221420022903e8087c221520022903e807222620022903d8087c221720022903a8087c221820022903c8067c22192002290398077c221a20022903c807222720022903a8077c221c20022903f8077c221d20022903b8087c221e20022903d8067c221f20022903b807222820022903e8067c220e20022903d8077c220f2002290388087c221120022903c8087c2216423388200241b8076a41086a290300200241e8066a41086a2903007c200e202854ad7c200241d8076a41086a2903007c200f200e54ad7c20024188086a41086a2903007c2011200f54ad7c200241c8086a41086a2903007c2016201154ad7c420d86847c220e423388200241c8076a41086a290300200241a8076a41086a2903007c201c202754ad7c200241f8076a41086a2903007c201d201c54ad7c200241b8086a41086a2903007c201e201d54ad7c200241d8066a41086a2903007c201f201e54ad7c200e201f54ad7c420d86847c221c423388200241e8076a41086a290300200241d8086a41086a2903007c2017202654ad7c200241a8086a41086a2903007c2018201754ad7c200241c8066a41086a2903007c2019201854ad7c20024198076a41086a2903007c201a201954ad7c201c201a54ad7c420d86847c221742338820024198086a41086a29030020024188096a41086a2903007c2012202554ad7c200241e8056a41086a2903007c2013201254ad7c20024188076a41086a2903007c2014201354ad7c200241e8086a41086a2903007c2015201454ad7c2017201554ad7c420d86847c221842338820024188056a41086a290300200241a8096a41086a2903007c200c201b54ad7c200241f8066a41086a2903007c200b200c54ad7c200241f8086a41086a2903007c200d200b54ad7c20024198096a41086a2903007c2010200d54ad7c2018201054ad7c420d868442137e201642ffffffffffffff03837c221042ffffffffffffff0383220c420020022903f01c220b420010ce08200241e8046a20022903901d220d42002010423388200e42ffffffffffffff03837c221042137e420010ce0820024188066a20022903881d22124200201c42ffffffffffffff0383221542137e221c420010ce08200241b8056a20022903801d22134200201742ffffffffffffff0383221942137e221a420010ce08200241c8036a20022903f81c22144200201842ffffffffffffff0383221842137e2217420010ce0820024188046a20144200200c420010ce08200241d8046a200b42002010420010ce08200241f8056a200d4200201c420010ce08200241a8056a20124200201a420010ce08200241b8036a201342002017420010ce08200241f8036a20134200200c420010ce08200241c8046a201442002010420010ce0820024198066a200b42002015420010ce0820024198056a200d4200201a420010ce08200241a8036a201242002017420010ce08200241e8036a20124200200c420010ce08200241b8046a201342002010420010ce08200241a8066a201442002015420010ce08200241c8056a200b42002019420010ce08200241c8026a200d42002017420010ce08200241d8036a200d4200200c420010ce08200241a8046a201242002010420010ce08200241b8066a201342002015420010ce08200241d8056a201442002019420010ce08200241f8046a200b42002018420010ce082002200229039805221c2002290398067c220c20022903a8037c220b20022903f8037c221020022903c8047c221220022903f805221d20022903d8047c220d20022903a8057c221320022903b8037c22142002290388047c221520022903e804221e2002290398047c22172002290388067c221820022903b8057c221920022903c8037c221a423388200241e8046a41086a29030020024198046a41086a2903007c2017201e54ad7c20024188066a41086a2903007c2018201754ad7c200241b8056a41086a2903007c2019201854ad7c200241c8036a41086a2903007c201a201954ad7c420d86847c2217423388200241f8056a41086a290300200241d8046a41086a2903007c200d201d54ad7c200241a8056a41086a2903007c2013200d54ad7c200241b8036a41086a2903007c2014201354ad7c20024188046a41086a2903007c2015201454ad7c2017201554ad7c420d86847c221342ffffffffffffff0383220d3703a01e200220022903c802221d20022903c8057c221420022903e8037c221520022903b8047c221820022903a8067c2219201342338820024198056a41086a29030020024198066a41086a2903007c200c201c54ad7c200241a8036a41086a2903007c200b200c54ad7c200241f8036a41086a2903007c2010200b54ad7c200241c8046a41086a2903007c2012201054ad7c2013201254ad7c420d86847c220c42ffffffffffffff038322103703a81e200220022903d803221e20022903f8047c220b20022903a8047c221220022903b8067c221320022903d8057c221c200c423388200241c8026a41086a290300200241c8056a41086a2903007c2014201d54ad7c200241e8036a41086a2903007c2015201454ad7c200241b8046a41086a2903007c2018201554ad7c200241a8066a41086a2903007c2019201854ad7c200c201954ad7c420d86847c220c42ffffffffffffff038322143703b01e2002200c423388200241d8036a41086a290300200241f8046a41086a2903007c200b201e54ad7c200241a8046a41086a2903007c2012200b54ad7c200241b8066a41086a2903007c2013201254ad7c200241d8056a41086a2903007c201c201354ad7c200c201c54ad7c420d868442137e201a42ffffffffffffff03837c220b42ffffffffffffff0383220c3703901e2002200b423388201742ffffffffffffff03837c220b3703981e20024188016a200c42002008420010ce08200241d8016a20064200200b42137e420010ce08200241e8026a20074200200d42137e2215420010ce0820024188026a200a4200201042137e2213420010ce08200241386a20094200201442137e2212420010ce08200241f8006a20094200200c420010ce08200241c8016a20084200200b420010ce08200241d8026a200642002015420010ce08200241f8016a200742002013420010ce08200241286a200a42002012420010ce08200241e8006a200a4200200c420010ce08200241b8016a20094200200b420010ce08200241f8026a20084200200d420010ce08200241e8016a200642002013420010ce08200241186a200742002012420010ce08200241d8006a20074200200c420010ce08200241a8016a200a4200200b420010ce0820024188036a20094200200d420010ce0820024198026a200842002010420010ce08200241086a200642002012420010ce08200241c8006a20064200200c420010ce0820024198016a20074200200b420010ce0820024198036a200a4200200d420010ce08200241a8026a200942002010420010ce08200241b8026a200842002014420010ce08200220022903e801221520022903f8027c220620022903187c220720022903687c220820022903b8017c220920022903d802221720022903c8017c220a20022903f8017c220c20022903287c220b20022903787c220d20022903d80122182002290388017c221020022903e8027c22122002290388027c221320022903387c2214423388200241d8016a41086a29030020024188016a41086a2903007c2010201854ad7c200241e8026a41086a2903007c2012201054ad7c20024188026a41086a2903007c2013201254ad7c200241386a41086a2903007c2014201354ad7c420d86847c2210423388200241d8026a41086a290300200241c8016a41086a2903007c200a201754ad7c200241f8016a41086a2903007c200c200a54ad7c200241286a41086a2903007c200b200c54ad7c200241f8006a41086a2903007c200d200b54ad7c2010200d54ad7c420d86847c220a42ffffffffffffff03833703b81f2002200229030822132002290398027c220c20022903587c220b20022903a8017c220d2002290388037c2212200a423388200241e8016a41086a290300200241f8026a41086a2903007c2006201554ad7c200241186a41086a2903007c2007200654ad7c200241e8006a41086a2903007c2008200754ad7c200241b8016a41086a2903007c2009200854ad7c200a200954ad7c420d86847c220642ffffffffffffff03833703c01f20022002290348221520022903b8027c22072002290398017c22082002290398037c220920022903a8027c220a2006423388200241086a41086a29030020024198026a41086a2903007c200c201354ad7c200241d8006a41086a2903007c200b200c54ad7c200241a8016a41086a2903007c200d200b54ad7c20024188036a41086a2903007c2012200d54ad7c2006201254ad7c420d86847c220642ffffffffffffff03833703c81f20022006423388200241c8006a41086a290300200241b8026a41086a2903007c2007201554ad7c20024198016a41086a2903007c2008200754ad7c20024198036a41086a2903007c2009200854ad7c200241a8026a41086a2903007c200a200954ad7c2006200a54ad7c420d868442137e201442ffffffffffffff03837c220642ffffffffffffff03833703a81f20022006423388201042ffffffffffffff03837c3703b01f4200210602402029450d00200241881f6a200241a81f6a106e4200210620022d00881f410171107041ff01714101460d00200241d01e6a4200370300200241c81e6a4200370300200241c01e6a4200370300200242003703b81e200241881f6a200241901e6a106e200241b81e6a4101722129410021054100210341012104024003402005200241881f6a20036a2d0000732205410020056b72417f7341800171410776107020047121042003411f460d01202920036a2d00002105200341016a21030c000b0b420021062004107041ff01714101460d00200241b81e6a41206a200241e81d6a41206a290300370300200241b81e6a41186a200241e81d6a41186a290300370300200241b81e6a41106a200241e81d6a41106a290300370300200241b81e6a41086a200241e81d6a41086a290300370300200241e81e6a200241901e6a41086a290300370300200241f01e6a200241901e6a41106a290300370300200241f81e6a200241901e6a41186a290300370300200241801f6a200241901e6a41206a290300370300200220022903e81d3703b81e200220022903901e3703e01e200241881b6a41206a200241a81f6a41206a290300370300200241881b6a41186a200241a81f6a41186a290300370300200241881b6a41106a200241a81f6a41106a290300370300200241881b6a41086a200241a81f6a41086a290300370300200220022903a81f3703881b200241b01b6a200241b81e6a41d00010c9081a420121060b200241b81e6a210320064200510d01200241b01a6a41036a200241b01b6a41d00010c9081a200241881a6a41206a2203200241881b6a41206a290300370300200241881a6a41186a2204200241881b6a41186a290300370300200241881a6a41106a2205200241881b6a41106a290300370300200241881a6a41086a2229200241881b6a41086a290300370300200220022903881b3703881a200241b5196a200241b01a6a41d30010c9081a20024188196a41206a222a200329030037030020024188196a41186a2203200429030037030020024188196a41106a2204200529030037030020024188196a41086a22052029290300370300200220022903881a37038819200041086a200241b5196a41036a41d00010c9081a200041e0006a4200370300200041d8006a4201370300200041e8006a4200370300200041f0006a4200370300200041f8006a420037030020004180016a20022903881937000020004188016a200529030037000020004190016a200429030037000020004198016a2003290300370000200041a0016a202a290300370000200041a8016a2001290000370000200041b0016a200141086a290000370000200041b8016a200141106a290000370000200041c0016a200141186a290000370000410021030c020b200241b81e6a21030b200241b01a6a410f6a2003410f6a290000370000200241b01a6a41086a200341086a290000370300200220032900003703b01a200241b5196a200241b01a6a41d30010c9081a41012103200041013a0004200020022900b5193700052000410d6a200241b5196a41086a290000370000200041146a200241b5196a410f6a2900003700000b20002003360200200241d01f6a24000ba3990204067f1a7e157f407e230041d0ce006b22042400200441d0c6006a200341d00110c9081a200441d0c6006a41e0eec4004109200241a0016a4120108b0120044180c5006a200441d0c6006a41d00110c9081a200441a0c8006a41386a22024200370300200441a0c8006a41306a22034200370300200441a0c8006a41286a22054200370300200441a0c8006a41206a22064200370300200441a0c8006a41186a22074200370300200441a0c8006a41106a22084200370300200441a0c8006a41086a22094200370300200442003703a04820044180c5006a418aa2c6004107200441a0c8006a41c000108d012008310000210a2009310000210b2007310000210c20043100b248210d20043100b148210e20043100af48210f20043100ad48211020043100ae48211120043100bf48211220043100be48211320043100bd48211420043100bc48211520043100bb48211620043100ba48211720043100ac48211820043100ab48211920043100aa48211a20043100a948211b20043100a748211c20043100b948211d20043100b748211e20043100b648211f20043100b348212020043100b448212120043100b5482122200420043502a04820043100a4484220868420043100a5484228868420043100a64822234230868442ffffffffffffff03833703e04820042020202142088684202242108684201f42188684201e42208684200c42288684201d4230868442018842ffffffffffffff03833703f84820042023201c42088684200b42108684201b42188684201a4220868420194228868420184230868442038842ffffffffffffff03833703e8482004200c201d42088684201742108684201642188684201542208684201442288684201342308684201242388684420c8842ffffffffffffff03833703804920042018201042088684201142108684200f42188684200a42208684200e42288684200d4230868420204238868442068842ffffffffffffff03833703f04820044188c9006a200441e0c8006a1074200441a8ca006a41186a20022903002220370300200441a8ca006a41106a2003290300220a370300200441a8ca006a41086a2005290300220b37030020042006290300220d3703a84a20043100ba4a210e20043100b94a210f20043100b74a211020043100b54a211120043100b64a211220043100c74a211320043100c64a211420043100c54a211520043100c44a211620043100c34a211720043100c24a211920043100b44a210c20043100b34a211a20043100b24a211b20043100b14a211c20043100af4a211e20043100c14a211820043100bf4a211f20043100be4a212120043100bb4a211d20043100bc4a212220043100bd4a21232004200d42ffffffff0f8320043100ac4a4220868420043100ad4a4228868420043100ae4a220d4230868442ffffffffffffff03833703c84a2004201d202242088684202342108684202142188684201f42208684202042ff018322204228868420184230868442018842ffffffffffffff03833703e04a2004200d201e42088684200b42ff018342108684201c42188684201b42208684201a42288684200c4230868442038842ffffffffffffff03833703d04a20042018420886202084201942108684201742188684201642208684201542288684201442308684201342388684420c8842ffffffffffffff03833703e84a2004200c201142088684201242108684201042188684200a42ff018342208684200f42288684200e42308684201d4238868442068842ffffffffffffff03833703d84a200441f0ca006a200441c8ca006a1074200441d0c6006a41106a2203200441f0ca006a41386a290300220b370300200441d0c6006a41086a2224200441f0ca006a41306a290300220d20042903f84a220e7c3703002003200b20042903804b220f7c370300200441d0c6006a41186a2208200441f0ca006a41c0006a290300221020042903884b22117c370300200441d0c6006a41206a2209200441f0ca006a41c8006a290300221220042903904b22137c370300200420042903984b221420042903f04a22157c3703d046200441a8ce006a41206a2202200441f0ca006a41f0006a290300370300200441a8ce006a41186a2205200441f0ca006a41e8006a290300370300200441a8ce006a41106a2206200441f0ca006a41e0006a290300370300200441a8ce006a41086a2207200441f0ca006a41d8006a290300370300200420042903c04b3703a84e200441d0c1006a20042903e84b220c420042d9e2cbb5c2f2a603420010ce08200441a0c2006a200441f0ca006a4198016a29030022184200428ee0b9a98cbfbd1f420010ce08200441f0c2006a200441f0ca006a4190016a290300221d420042968c8a82a4c39824420010ce08200441c0c3006a200441f0ca006a4188016a2903002220420042d587a4ceaceea43d420010ce0820044190c4006a200441f0ca006a4180016a290300220a420042edd39cadab84b215420010ce08200441a0c4006a200a420042d9e2cbb5c2f2a603420010ce08200441e0c1006a200c420042fabaabb1878ad401420010ce08200441b0c2006a2018420042968c8a82a4c39824420010ce0820044180c3006a201d420042d587a4ceaceea43d420010ce08200441d0c3006a2020420042edd39cadab84b215420010ce08200441e0c3006a2020420042d9e2cbb5c2f2a603420010ce08200441b0c4006a200a420042fabaabb1878ad401420010ce08200441f0c1006a200c420042d2808e80cce8f301420010ce08200441c0c2006a2018420042d587a4ceaceea43d420010ce0820044190c3006a201d420042edd39cadab84b215420010ce08200441a0c3006a201d420042d9e2cbb5c2f2a603420010ce08200441f0c3006a2020420042fabaabb1878ad401420010ce08200441c0c4006a200a420042d2808e80cce8f301420010ce0820044180c2006a200c420042f7f281baccf19c03420010ce08200441d0c2006a2018420042edd39cadab84b215420010ce08200441e0c2006a2018420042d9e2cbb5c2f2a603420010ce08200441b0c3006a201d420042fabaabb1878ad401420010ce0820044180c4006a2020420042d2808e80cce8f301420010ce08200441d0c4006a200a420042f7f281baccf19c03420010ce0820044190c2006a200c420042ffdb95eed98d9001420010ce08200441d0c6006a41c8006a2225201220137d42f0ffffffffffff3f7c220c42ffffffffffffff0383201020117d42f0ffffffffffff3f7c22184233887c370300200441d0c6006a41c0006a2226201842ffffffffffffff0383200b200f7d42f0ffffffffffff3f7c22184233887c370300200441d0c6006a41386a2227201842ffffffffffffff0383200d200e7d42f0ffffffffffff3f7c22184233887c370300200441d0c6006a41306a2228201842ffffffffffffff0383201420157d42d0fdffffffffff3f7c22184233887c3703002004200c42338842137e201842ffffffffffffff03837c3703f846200441d0c6006a41f0006a22292002290300370300200441d0c6006a41e8006a222a2005290300370300200441d0c6006a41e0006a222b2006290300370300200441d0c6006a41d8006a222c2007290300370300200420042903a84e3703a047200441d0c6006a4188016a222d20042903c042221320042903f0417c220c2004290390437c221820042903e0437c221d20042903b0447c222020042903b042221420042903e0417c220a2004290380437c220b20042903d0437c220d20042903a0447c220e20042903a042221520042903d0417c220f20042903f0427c221020042903c0437c22112004290390447c2212423388200441a0c2006a41086a290300200441d0c1006a41086a2903007c200f201554ad7c200441f0c2006a41086a2903007c2010200f54ad7c200441c0c3006a41086a2903007c2011201054ad7c20044190c4006a41086a2903007c2012201154ad7c420d86847c220f423388200441b0c2006a41086a290300200441e0c1006a41086a2903007c200a201454ad7c20044180c3006a41086a2903007c200b200a54ad7c200441d0c3006a41086a2903007c200d200b54ad7c200441a0c4006a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a42ffffffffffffff0383370300200441d0c6006a4190016a222e20042903d04222112004290380427c220b20042903a0437c220d20042903f0437c220e20042903c0447c2210200a423388200441c0c2006a41086a290300200441f0c1006a41086a2903007c200c201354ad7c20044190c3006a41086a2903007c2018200c54ad7c200441e0c3006a41086a2903007c201d201854ad7c200441b0c4006a41086a2903007c2020201d54ad7c200a202054ad7c420d86847c220c42ffffffffffffff0383370300200441d0c6006a4198016a222f20042903e04222132004290390427c221820042903b0437c221d2004290380447c222020042903d0447c220a200c423388200441d0c2006a41086a29030020044180c2006a41086a2903007c200b201154ad7c200441a0c3006a41086a2903007c200d200b54ad7c200441f0c3006a41086a2903007c200e200d54ad7c200441c0c4006a41086a2903007c2010200e54ad7c200c201054ad7c420d86847c220c42ffffffffffffff0383370300200441d0c6006a4180016a2230200c423388200441e0c2006a41086a29030020044190c2006a41086a2903007c2018201354ad7c200441b0c3006a41086a2903007c201d201854ad7c20044180c4006a41086a2903007c2020201d54ad7c200441d0c4006a41086a2903007c200a202054ad7c200c200a54ad7c420d868442137e201242ffffffffffffff03837c220c423388200f42ffffffffffffff03837c3703002004200c42ffffffffffffff03833703c84720044190cc006a41206a223120044188c9006a41c8006a223229030037030020044190cc006a41186a223320044188c9006a41c0006a2234290300222037030020044190cc006a41106a223520044188c9006a41386a2236290300221d37030020044190cc006a41086a223720044188c9006a41306a22382903002218370300200420042903b049220c3703904c2004200c2004290388497c220c3703904c203720182004290390497c22183703002035201d2004290398497c221d3703002033202020042903a0497c22203703002031203129030020042903a8497c220a370300200441c03e6a20042903d046220b4200200c420010ce08200441c0c1006a200a42002024290300220d42137e420010ce08200441f0c0006a202042002003290300220e42137e2212420010ce08200441a0c0006a201d42002008290300221042137e2211420010ce08200441d03f6a201842002009290300221342137e220f420010ce08200441d03e6a20184200200b420010ce08200441b0c1006a200c4200200d420010ce08200441e0c0006a200a42002012420010ce0820044190c0006a202042002011420010ce08200441c03f6a201d4200200f420010ce08200441e03e6a201d4200200b420010ce08200441a0c1006a20184200200d420010ce08200441d0c0006a200c4200200e420010ce0820044180c0006a200a42002011420010ce08200441b03f6a20204200200f420010ce08200441f03e6a20204200200b420010ce0820044190c1006a201d4200200d420010ce08200441c0c0006a20184200200e420010ce08200441f03f6a200c42002010420010ce08200441a03f6a200a4200200f420010ce08200441803f6a200a4200200b420010ce0820044180c1006a20204200200d420010ce08200441b0c0006a201d4200200e420010ce08200441e03f6a201842002010420010ce08200441903f6a200c42002013420010ce082038290300210b2036290300210a2034290300211d200429039049210d200429039849210e20042903a0492120200441f03b6a20042903f846220c4200203229030020042903a8497d42f0ffffffffffff3f7c220f42338842137e20042903b0492004290388497d42d0fdffffffffff3f7c221242ffffffffffffff03837c2218420010ce08200441f03d6a200f42ffffffffffffff0383201d20207d42f0ffffffffffff3f7c220f4233887c221d42002028290300222042137e420010ce08200441b03d6a200f42ffffffffffffff0383200a200e7d42f0ffffffffffff3f7c220f4233887c220a42002027290300220e42137e2213420010ce08200441f03c6a200f42ffffffffffffff0383200b200d7d42f0ffffffffffff3f7c220d4233887c220b42002026290300221042137e2211420010ce08200441b03c6a200d42ffffffffffffff038320124233887c220d42002025290300221242137e220f420010ce08200441e03b6a200d4200200c420010ce08200441b03e6a201842002020420010ce08200441a03d6a201d42002013420010ce08200441e03c6a200a42002011420010ce08200441a03c6a200b4200200f420010ce08200441d03b6a200b4200200c420010ce08200441a03e6a200d42002020420010ce08200441e03d6a20184200200e420010ce08200441d03c6a201d42002011420010ce08200441903c6a200a4200200f420010ce08200441c03b6a200a4200200c420010ce08200441903e6a200b42002020420010ce08200441d03d6a200d4200200e420010ce08200441903d6a201842002010420010ce08200441803c6a201d4200200f420010ce08200441b03b6a201d4200200c420010ce08200441803e6a200a42002020420010ce08200441c03d6a200b4200200e420010ce08200441803d6a200d42002010420010ce08200441c03c6a201842002012420010ce08200420042903d03c221320042903e03d7c220c20042903903c7c221820042903d03b7c221d20042903a03e7c222020042903a03d221420042903b03e7c220a20042903e03c7c220b20042903a03c7c220d20042903e03b7c220e20042903f03d221520042903f03b7c220f20042903b03d7c221020042903f03c7c221120042903b03c7c2212423388200441f03d6a41086a290300200441f03b6a41086a2903007c200f201554ad7c200441b03d6a41086a2903007c2010200f54ad7c200441f03c6a41086a2903007c2011201054ad7c200441b03c6a41086a2903007c2012201154ad7c420d86847c220f423388200441a03d6a41086a290300200441b03e6a41086a2903007c200a201454ad7c200441e03c6a41086a2903007c200b200a54ad7c200441a03c6a41086a2903007c200d200b54ad7c200441e03b6a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a42ffffffffffffff03833703c84c200420042903803c221120042903903d7c220b20042903c03b7c220d20042903903e7c220e20042903d03d7c2210200a423388200441d03c6a41086a290300200441e03d6a41086a2903007c200c201354ad7c200441903c6a41086a2903007c2018200c54ad7c200441d03b6a41086a2903007c201d201854ad7c200441a03e6a41086a2903007c2020201d54ad7c200a202054ad7c420d86847c220c42ffffffffffffff03833703d04c200420042903b03b221320042903c03c7c221820042903803e7c221d20042903c03d7c222020042903803d7c220a200c423388200441803c6a41086a290300200441903d6a41086a2903007c200b201154ad7c200441c03b6a41086a2903007c200d200b54ad7c200441903e6a41086a2903007c200e200d54ad7c200441d03d6a41086a2903007c2010200e54ad7c200c201054ad7c420d86847c220c42ffffffffffffff03833703d84c2004200c423388200441b03b6a41086a290300200441c03c6a41086a2903007c2018201354ad7c200441803e6a41086a2903007c201d201854ad7c200441c03d6a41086a2903007c2020201d54ad7c200441803d6a41086a2903007c200a202054ad7c200c200a54ad7c420d868442137e201242ffffffffffffff03837c220c42ffffffffffffff03833703b84c2004200c423388200f42ffffffffffffff03837c3703c04c200441e03a6a20042903c847220c420020042903804a2218420010ce08200441d03a6a20044188c9006a4198016a290300221d42002030290300222042137e420010ce08200441803a6a20044188c9006a4190016a290300220a4200202d290300220e42137e2212420010ce08200441b0396a20044188c9006a4188016a290300220b4200202e290300221042137e2211420010ce08200441e0386a20044188c9006a4180016a290300220d4200202f290300221342137e220f420010ce08200441d0386a200d4200200c420010ce08200441a03b6a201842002020420010ce08200441c03a6a201d42002012420010ce08200441f0396a200a42002011420010ce08200441a0396a200b4200200f420010ce0820044190396a200b4200200c420010ce08200441c0386a200d42002020420010ce08200441903b6a20184200200e420010ce08200441b03a6a201d42002011420010ce08200441e0396a200a4200200f420010ce08200441d0396a200a4200200c420010ce0820044180396a200b42002020420010ce08200441b0386a200d4200200e420010ce08200441803b6a201842002010420010ce08200441a03a6a201d4200200f420010ce08200441903a6a201d4200200c420010ce08200441c0396a200a42002020420010ce08200441f0386a200b4200200e420010ce08200441a0386a200d42002010420010ce08200441f03a6a201842002013420010ce08200420042903903a221c20042903f03a7c220c20042903c0397c221820042903f0387c221d20042903a0387c222020042903a03a221e20042903803b7c220a20042903d0397c220b2004290380397c220d20042903b0387c220e20042903b03a221f20042903903b7c220f20042903e0397c22102004290390397c221120042903c0387c221220042903c03a222120042903a03b7c221320042903f0397c221420042903a0397c221520042903d0387c221620042903d03a222220042903e03a7c221720042903803a7c221920042903b0397c221a20042903e0387c221b423388200441d03a6a41086a290300200441e03a6a41086a2903007c2017202254ad7c200441803a6a41086a2903007c2019201754ad7c200441b0396a41086a2903007c201a201954ad7c200441e0386a41086a2903007c201b201a54ad7c420d86847c2217423388200441c03a6a41086a290300200441a03b6a41086a2903007c2013202154ad7c200441f0396a41086a2903007c2014201354ad7c200441a0396a41086a2903007c2015201454ad7c200441d0386a41086a2903007c2016201554ad7c2017201654ad7c420d86847c2213423388200441b03a6a41086a290300200441903b6a41086a2903007c200f201f54ad7c200441e0396a41086a2903007c2010200f54ad7c20044190396a41086a2903007c2011201054ad7c200441c0386a41086a2903007c2012201154ad7c2013201254ad7c420d86847c220f423388200441a03a6a41086a290300200441803b6a41086a2903007c200a201e54ad7c200441d0396a41086a2903007c200b200a54ad7c20044180396a41086a2903007c200d200b54ad7c200441b0386a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a42ffffffffffffff03833703804d2004200f42ffffffffffffff03833703f84c2004201342ffffffffffffff03833703f04c2004200a423388200441903a6a41086a290300200441f03a6a41086a2903007c200c201c54ad7c200441c0396a41086a2903007c2018200c54ad7c200441f0386a41086a2903007c201d201854ad7c200441a0386a41086a2903007c2020201d54ad7c200a202054ad7c420d868442137e201b42ffffffffffffff03837c220c423388201742ffffffffffffff03837c3703e84c2004200c42ffffffffffffff03833703e04c20044190356a20042903a047220c420020042903d8492218420010ce08200441a0366a20044188c9006a41f0006a290300221d4200202c290300222042137e420010ce08200441e0366a20044188c9006a41e8006a290300220a4200202b290300220e42137e2212420010ce08200441a0376a20044188c9006a41e0006a290300220b4200202a290300221042137e2211420010ce08200441e0376a20044188c9006a41d8006a290300220d42002029290300221342137e220f420010ce08200441e0356a200d4200200c420010ce08200441a0356a201842002020420010ce08200441b0366a201d42002012420010ce08200441f0366a200a42002011420010ce08200441b0376a200b4200200f420010ce08200441f0356a200b4200200c420010ce08200441f0376a200d42002020420010ce08200441b0356a20184200200e420010ce08200441c0366a201d42002011420010ce0820044180376a200a4200200f420010ce0820044180366a200a4200200c420010ce08200441c0376a200b42002020420010ce0820044180386a200d4200200e420010ce08200441c0356a201842002010420010ce08200441d0366a201d4200200f420010ce0820044190366a201d4200200c420010ce0820044190376a200a42002020420010ce08200441d0376a200b4200200e420010ce0820044190386a200d42002010420010ce08200441d0356a201842002013420010ce082004200429039036221c20042903d0357c220c2004290390377c221820042903d0377c221d2004290390387c222020042903d036221e20042903c0357c220a2004290380367c220b20042903c0377c220d2004290380387c220e20042903c036221f20042903b0357c220f2004290380377c221020042903f0357c221120042903f0377c221220042903b036222120042903a0357c221320042903f0367c221420042903b0377c221520042903e0357c221620042903a03622222004290390357c221720042903e0367c221920042903a0377c221a20042903e0377c221b423388200441a0366a41086a29030020044190356a41086a2903007c2017202254ad7c200441e0366a41086a2903007c2019201754ad7c200441a0376a41086a2903007c201a201954ad7c200441e0376a41086a2903007c201b201a54ad7c420d86847c2217423388200441b0366a41086a290300200441a0356a41086a2903007c2013202154ad7c200441f0366a41086a2903007c2014201354ad7c200441b0376a41086a2903007c2015201454ad7c200441e0356a41086a2903007c2016201554ad7c2017201654ad7c420d86847c2213423388200441c0366a41086a290300200441b0356a41086a2903007c200f201f54ad7c20044180376a41086a2903007c2010200f54ad7c200441f0356a41086a2903007c2011201054ad7c200441f0376a41086a2903007c2012201154ad7c2013201254ad7c420d86847c220f423388200441d0366a41086a290300200441c0356a41086a2903007c200a201e54ad7c20044180366a41086a2903007c200b200a54ad7c200441c0376a41086a2903007c200d200b54ad7c20044180386a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a42338820044190366a41086a290300200441d0356a41086a2903007c200c201c54ad7c20044190376a41086a2903007c2018200c54ad7c200441d0376a41086a2903007c201d201854ad7c20044190386a41086a2903007c2020201d54ad7c200a202054ad7c420d868442137e201b42ffffffffffffff03837c221842ffffffffffffff0383220c3703884d20042018423388201742ffffffffffffff03837c22183703904d2004200a42ffffffffffffff0383221d3703a84d2004200f42ffffffffffffff038322203703a04d2004201342ffffffffffffff0383220a3703984d200441b0cd006a41086a2231201820187c370300200441b0cd006a41106a2224200a200a7c370300200441b0cd006a41186a2225202020207c370300200441b0cd006a41206a2226201d201d7c3703002004200c200c7c3703b04d20042903c04c211c20042903c84c211e20042903d04c211f20042903d84c212120042903b84c2122200420042903803f222320042903903f7c220c2004290380417c221820042903b0407c221d20042903e03f7c222020042903a03f223920042903f03f7c220a20042903f03e7c220b2004290390417c220d20042903c0407c220e200429038040223a20042903d0407c220f20042903b03f7c221020042903e03e7c221120042903a0417c221220042903e040223b20042903b0417c22132004290390407c221420042903c03f7c221520042903d03e7c221620042903c041223c20042903c03e7c221720042903f0407c221920042903a0407c221a20042903d03f7c221b423388200441c0c1006a41086a290300200441c03e6a41086a2903007c2017203c54ad7c200441f0c0006a41086a2903007c2019201754ad7c200441a0c0006a41086a2903007c201a201954ad7c200441d03f6a41086a2903007c201b201a54ad7c420d86847c2217423388200441e0c0006a41086a290300200441b0c1006a41086a2903007c2013203b54ad7c20044190c0006a41086a2903007c2014201354ad7c200441c03f6a41086a2903007c2015201454ad7c200441d03e6a41086a2903007c2016201554ad7c2017201654ad7c420d86847c221342338820044180c0006a41086a290300200441d0c0006a41086a2903007c200f203a54ad7c200441b03f6a41086a2903007c2010200f54ad7c200441e03e6a41086a2903007c2011201054ad7c200441a0c1006a41086a2903007c2012201154ad7c2013201254ad7c420d86847c220f423388200441a03f6a41086a290300200441f03f6a41086a2903007c200a203954ad7c200441f03e6a41086a2903007c200b200a54ad7c20044190c1006a41086a2903007c200d200b54ad7c200441c0c0006a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a423388200441803f6a41086a290300200441903f6a41086a2903007c200c202354ad7c20044180c1006a41086a2903007c2018200c54ad7c200441b0c0006a41086a2903007c201d201854ad7c200441e03f6a41086a2903007c2020201d54ad7c200a202054ad7c420d868442137e201b42ffffffffffffff03837c220c423388201742ffffffffffffff03837c220e3703884e2004200c42ffffffffffffff0383220b3703804e2004200a42ffffffffffffff0383220a3703a04e2004200f42ffffffffffffff0383220d3703984e2004201342ffffffffffffff0383220f3703904e2004200b20042903b84c7c3703804e2004200e20042903c04c7c3703884e2004200f20042903c84c7c3703904e2004200d20042903d04c7c3703984e2004200a20042903d84c7c3703a04e2002202629030037030020052025290300222037030020062024290300221d370300200720312903002218370300200420042903b04d220c3703a84e2004200c20042903e04c7c220c3703a84e2007201820042903e84c7c22183703002006201d20042903f04c7c221d3703002005202020042903f84c7c22123703002002200229030020042903804d7c2215370300200441f0276a202629030020042903804d7d42f0ffffffffffff3f7c221042338842137e20042903b04d20042903e04c7d42d0fdffffffffff3f7c221142ffffffffffffff03837c22204200200a20217d42f0ffffffffffff3f7c221342338842137e200b20227d42d0fdffffffffff3f7c221442ffffffffffffff03837c220a420010ce0820044180356a201342ffffffffffffff0383200d201f7d42f0ffffffffffff3f7c220d4233887c220b4200203129030020042903e84c7d42f0ffffffffffff3f7c221642ffffffffffffff038320114233887c221342137e2223420010ce0820044180346a200d42ffffffffffffff0383200f201e7d42f0ffffffffffff3f7c220f4233887c220d4200202429030020042903f04c7d42f0ffffffffffff3f7c221142ffffffffffffff038320164233887c221942137e221e420010ce0820044180336a200f42ffffffffffffff0383200e201c7d42f0ffffffffffff3f7c220f4233887c220e4200202529030020042903f84c7d42f0ffffffffffff3f7c221642ffffffffffffff038320114233887c221c42137e221b420010ce08200441d0266a200f42ffffffffffffff038320144233887c220f4200201042ffffffffffffff038320164233887c222142137e2216420010ce08200441c0266a200f42002020420010ce08200441e0276a200a42002013420010ce08200441f0336a200b4200201e420010ce08200441f0326a200d4200201b420010ce0820044180326a200e42002016420010ce0820044180316a200e42002020420010ce08200441b0266a200f42002013420010ce08200441d0276a200a42002019420010ce08200441e0326a200b4200201b420010ce08200441f0316a200d42002016420010ce08200441f0306a200d42002020420010ce08200441e0346a200e42002013420010ce0820044180256a200f42002019420010ce08200441c0276a200a4200201c420010ce08200441e0316a200b42002016420010ce08200441e0306a200b42002020420010ce08200441d0346a200d42002013420010ce08200441c0336a200e42002019420010ce08200441d0236a200f4200201c420010ce08200441b0276a200a42002021420010ce08200441902b6a200c420020042903804e2210420010ce08200441802d6a20042903a04e221a4200201842137e420010ce08200441802e6a20042903984e22174200201d42137e2239420010ce08200441802f6a20042903904e22144200201242137e2222420010ce0820044180306a20042903884e22114200201542137e221f420010ce08200441f02f6a20114200200c420010ce08200441a02b6a201042002018420010ce08200441f02c6a201a42002039420010ce08200441f02d6a201742002022420010ce08200441f02e6a20144200201f420010ce08200441e02e6a20144200200c420010ce08200441e02f6a201142002018420010ce08200441b02b6a20104200201d420010ce08200441e02c6a201a42002022420010ce08200441e02d6a20174200201f420010ce08200441d02d6a20174200200c420010ce08200441d02e6a201442002018420010ce08200441d02f6a20114200201d420010ce08200441c02b6a201042002012420010ce08200441d02c6a201a4200201f420010ce08200441c02c6a201a4200200c420010ce08200441c02d6a201742002018420010ce08200441c02e6a20144200201d420010ce08200441c02f6a201142002012420010ce08200441d02b6a201042002015420010ce08200441d0306a20204200200c420010ce08200441f0346a201542002023420010ce08200441e0336a20124200201e420010ce08200441d0326a201d4200201b420010ce08200441d0316a201842002016420010ce08200441c0306a201842002020420010ce08200441c0346a200c42002013420010ce08200441d0336a20154200201e420010ce08200441c0326a20124200201b420010ce08200441c0316a201d42002016420010ce08200441b0306a201d42002020420010ce08200441b0346a201842002013420010ce08200441b0336a200c42002019420010ce08200441b0326a20154200201b420010ce08200441b0316a201242002016420010ce08200441a0306a201242002020420010ce08200441a0346a201d42002013420010ce08200441a0336a201842002019420010ce08200441a0326a200c4200201c420010ce08200441a0316a201542002016420010ce0820044190306a201542002020420010ce0820044190346a201242002013420010ce0820044190336a201d42002019420010ce0820044190326a20184200201c420010ce0820044190316a200c42002021420010ce08200441a0276a20104200200a420010ce08200441902f6a200b4200201142137e420010ce08200441a02e6a200d4200201442137e221d420010ce08200441b02d6a200e4200201742137e2218420010ce0820044190106a200f4200201a42137e220c420010ce0820044180106a200f42002010420010ce0820044190276a200a42002011420010ce08200441902e6a200b4200201d420010ce08200441a02d6a200d42002018420010ce08200441b02c6a200e4200200c420010ce08200441e02b6a200e42002010420010ce08200441f00f6a200f42002011420010ce0820044180276a200a42002014420010ce08200441902d6a200b42002018420010ce08200441a02c6a200d4200200c420010ce08200441f02b6a200d42002010420010ce08200441b02f6a200e42002011420010ce08200441900f6a200f42002014420010ce08200441f0266a200a42002017420010ce08200441902c6a200b4200200c420010ce08200441802c6a200b42002010420010ce08200441a02f6a200d42002011420010ce08200441b02e6a200e42002014420010ce08200441b00e6a200f42002017420010ce08200441e0266a200a4200201a420010ce08200420042903e02c221320042903b02b7c220c20042903e02d7c221820042903e02e7c221d20042903e02f7c222020042903f02c221420042903a02b7c220a20042903f02d7c220b20042903f02e7c220d20042903f02f7c220e20042903802d221520042903902b7c220f20042903802e7c221020042903802f7c22112004290380307c2212423388200441802d6a41086a290300200441902b6a41086a2903007c200f201554ad7c200441802e6a41086a2903007c2010200f54ad7c200441802f6a41086a2903007c2011201054ad7c20044180306a41086a2903007c2012201154ad7c420d86847c220f423388200441f02c6a41086a290300200441a02b6a41086a2903007c200a201454ad7c200441f02d6a41086a2903007c200b200a54ad7c200441f02e6a41086a2903007c200d200b54ad7c200441f02f6a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a42ffffffffffffff038322173703c04d200420042903d02c221120042903c02b7c220b20042903d02d7c220d20042903d02e7c220e20042903d02f7c2210200a423388200441e02c6a41086a290300200441b02b6a41086a2903007c200c201354ad7c200441e02d6a41086a2903007c2018200c54ad7c200441e02e6a41086a2903007c201d201854ad7c200441e02f6a41086a2903007c2020201d54ad7c200a202054ad7c420d86847c220c42ffffffffffffff038322213703c84d200420042903c02c221320042903d02b7c221820042903c02d7c221d20042903c02e7c222020042903c02f7c220a200c423388200441d02c6a41086a290300200441c02b6a41086a2903007c200b201154ad7c200441d02d6a41086a2903007c200d200b54ad7c200441d02e6a41086a2903007c200e200d54ad7c200441d02f6a41086a2903007c2010200e54ad7c200c201054ad7c420d86847c220c42ffffffffffffff038322233703d04d2004200c423388200441c02c6a41086a290300200441d02b6a41086a2903007c2018201354ad7c200441c02d6a41086a2903007c201d201854ad7c200441c02e6a41086a2903007c2020201d54ad7c200441c02f6a41086a2903007c200a202054ad7c200c200a54ad7c420d868442137e201242ffffffffffffff03837c220c42ffffffffffffff038322143703b04d2004200c423388200f42ffffffffffffff03837c22153703b84d20044180286a20042903903022222004290390317c220c2004290390347c22182004290390337c221d2004290390327c222020042903a031223920042903a0327c220a20042903a0307c220b20042903a0347c220d20042903a0337c220e20042903b032223a20042903b0337c220f20042903b0317c221020042903b0307c221120042903b0347c221220042903d033223b20042903c0347c221320042903c0327c221620042903c0317c221920042903c0307c221a20042903f034223c20042903d0307c221b20042903e0337c221c20042903d0327c221e20042903d0317c221f423388200441f0346a41086a290300200441d0306a41086a2903007c201b203c54ad7c200441e0336a41086a2903007c201c201b54ad7c200441d0326a41086a2903007c201e201c54ad7c200441d0316a41086a2903007c201f201e54ad7c420d86847c221b423388200441d0336a41086a290300200441c0346a41086a2903007c2013203b54ad7c200441c0326a41086a2903007c2016201354ad7c200441c0316a41086a2903007c2019201654ad7c200441c0306a41086a2903007c201a201954ad7c201b201a54ad7c420d86847c2213423388200441b0326a41086a290300200441b0336a41086a2903007c200f203a54ad7c200441b0316a41086a2903007c2010200f54ad7c200441b0306a41086a2903007c2011201054ad7c200441b0346a41086a2903007c2012201154ad7c2013201254ad7c420d86847c220f423388200441a0316a41086a290300200441a0326a41086a2903007c200a203954ad7c200441a0306a41086a2903007c200b200a54ad7c200441a0346a41086a2903007c200d200b54ad7c200441a0336a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a42ffffffffffffff0383223d42f0ffffffffffff3f7c223e20237d221242338842137e200a42338820044190306a41086a29030020044190316a41086a2903007c200c202254ad7c20044190346a41086a2903007c2018200c54ad7c20044190336a41086a2903007c201d201854ad7c20044190326a41086a2903007c2020201d54ad7c200a202054ad7c420d868442137e201f42ffffffffffffff03837c222042ffffffffffffff0383223f42d0fdffffffffff3f7c224020147d220a42ffffffffffffff03837c220c4200203f20147c2218420010ce08200441c0296a203d20237c221d42002020423388201b42ffffffffffffff03837c224142f0ffffffffffff3f7c224220157d220b42ffffffffffffff0383200a4233887c222042137e420010ce08200441a02a6a200f42ffffffffffffff0383224320217c220a4200201342ffffffffffffff0383224442f0ffffffffffff3f7c224520177d220d42ffffffffffffff0383200b4233887c220e42137e2213420010ce08200441b02a6a204420177c220b4200204342f0ffffffffffff3f7c224620217d220f42ffffffffffffff0383200d4233887c221042137e2211420010ce08200441d0296a204120157c220d4200201242ffffffffffffff0383200f4233887c221242137e220f420010ce0820044180296a200d4200200c420010ce0820044190286a201842002020420010ce08200441902a6a201d42002013420010ce08200441e02a6a200a42002011420010ce08200441c02a6a200b4200200f420010ce08200441f0286a200b4200200c420010ce08200441b0296a200d42002020420010ce08200441a0286a20184200200e420010ce08200441d02a6a201d42002011420010ce08200441f02a6a200a4200200f420010ce08200441e0286a200a4200200c420010ce08200441a0296a200b42002020420010ce08200441e0296a200d4200200e420010ce08200441b0286a201842002010420010ce08200441802b6a201d4200200f420010ce08200441d0286a201d4200200c420010ce0820044190296a200a42002020420010ce08200441802a6a200b4200200e420010ce08200441f0296a200d42002010420010ce08200441c0286a201842002012420010ce0820044180216a2014420020042903e030222220042903b0277c220c20042903d0347c221820042903c0337c221d20042903d0237c222020042903e031223920042903c0277c220a20042903f0307c220b20042903e0347c220d2004290380257c220e20042903e032223a20042903d0277c220f20042903f0317c22102004290380317c221120042903b0267c221220042903f033223b20042903e0277c221320042903f0327c22162004290380327c221920042903c0267c221a200429038035223c20042903f0277c221b2004290380347c221c2004290380337c221e20042903d0267c221f42338820044180356a41086a290300200441f0276a41086a2903007c201b203c54ad7c20044180346a41086a2903007c201c201b54ad7c20044180336a41086a2903007c201e201c54ad7c200441d0266a41086a2903007c201f201e54ad7c420d86847c221b423388200441f0336a41086a290300200441e0276a41086a2903007c2013203b54ad7c200441f0326a41086a2903007c2016201354ad7c20044180326a41086a2903007c2019201654ad7c200441c0266a41086a2903007c201a201954ad7c201b201a54ad7c420d86847c2213423388200441e0326a41086a290300200441d0276a41086a2903007c200f203a54ad7c200441f0316a41086a2903007c2010200f54ad7c20044180316a41086a2903007c2011201054ad7c200441b0266a41086a2903007c2012201154ad7c2013201254ad7c420d86847c220f423388200441e0316a41086a290300200441c0276a41086a2903007c200a203954ad7c200441f0306a41086a2903007c200b200a54ad7c200441e0346a41086a2903007c200d200b54ad7c20044180256a41086a2903007c200e200d54ad7c200f200e54ad7c420d86847c220a423388200441e0306a41086a290300200441b0276a41086a2903007c200c202254ad7c200441d0346a41086a2903007c2018200c54ad7c200441c0336a41086a2903007c201d201854ad7c200441d0236a41086a2903007c2020201d54ad7c200a202054ad7c420d868442137e201f42ffffffffffffff03837c220c42ffffffffffffff03832218420010ce08200441b0226a200a42ffffffffffffff0383221d4200201542137e420010ce08200441e0236a200f42ffffffffffffff038322204200201742137e220e420010ce0820044190256a201342ffffffffffffff0383220a4200202142137e220d420010ce08200441a0226a200c423388201b42ffffffffffffff03837c220b4200202342137e220c420010ce0820044190226a200b42002014420010ce08200441f0206a201842002015420010ce08200441c0226a201d4200200e420010ce08200441f0236a20204200200d420010ce08200441a0256a200a4200200c420010ce08200441b0256a200a42002014420010ce0820044180226a200b42002015420010ce08200441e0206a201842002017420010ce08200441d0226a201d4200200d420010ce0820044180246a20204200200c420010ce0820044190246a202042002014420010ce08200441c0256a200a42002015420010ce08200441f0216a200b42002017420010ce08200441d0206a201842002021420010ce08200441e0226a201d4200200c420010ce08200441f0226a201d42002014420010ce08200441a0246a202042002015420010ce08200441d0256a200a42002017420010ce08200441e0216a200b42002021420010ce08200441c0206a201842002023420010ce08200420042903d022221c20042903e0207c220c2004290380247c220d20042903b0257c220e2004290380227c220f20042903c022221e20042903f0207c221020042903f0237c221120042903a0257c22122004290390227c221320042903b022221f2004290380217c221620042903e0237c22192004290390257c221a20042903a0227c221b423388200441b0226a41086a29030020044180216a41086a2903007c2016201f54ad7c200441e0236a41086a2903007c2019201654ad7c20044190256a41086a2903007c201a201954ad7c200441a0226a41086a2903007c201b201a54ad7c420d86847c2216423388200441c0226a41086a290300200441f0206a41086a2903007c2010201e54ad7c200441f0236a41086a2903007c2011201054ad7c200441a0256a41086a2903007c2012201154ad7c20044190226a41086a2903007c2013201254ad7c2016201354ad7c420d86847c221042ffffffffffffff03833703904e200420042903e022221a20042903d0207c22112004290390247c221220042903c0257c221320042903f0217c22192010423388200441d0226a41086a290300200441e0206a41086a2903007c200c201c54ad7c20044180246a41086a2903007c200d200c54ad7c200441b0256a41086a2903007c200e200d54ad7c20044180226a41086a2903007c200f200e54ad7c2010200f54ad7c420d86847c220c42ffffffffffffff03833703984e200420042903f022221c20042903c0207c220d20042903a0247c220e20042903d0257c220f20042903e0217c2210200c423388200441e0226a41086a290300200441d0206a41086a2903007c2011201a54ad7c20044190246a41086a2903007c2012201154ad7c200441c0256a41086a2903007c2013201254ad7c200441f0216a41086a2903007c2019201354ad7c200c201954ad7c420d86847c220c42ffffffffffffff03833703a04e2004200c423388200441f0226a41086a290300200441c0206a41086a2903007c200d201c54ad7c200441a0246a41086a2903007c200e200d54ad7c200441d0256a41086a2903007c200f200e54ad7c200441e0216a41086a2903007c2010200f54ad7c200c201054ad7c420d868442137e201b42ffffffffffffff03837c220c42ffffffffffffff03833703804e2004200c423388201642ffffffffffffff03837c3703884e20044190286a41086a2903002147200441902a6a41086a2903002148200429039028213b20042903902a210c200441e02a6a41086a290300214920042903e02a213c200441c02a6a41086a290300214a20042903c02a214b20044180296a41086a290300214c200429038029214d20044180286a41086a290300214e200441c0296a41086a290300214f200429038028215020042903c029210d200441a02a6a41086a290300215120042903a02a2152200441b02a6a41086a290300215320042903b02a2154200441d0296a41086a290300215520042903d029215620042903d02a210f20042903a028211f20042903f02a212220042903f028213920042903b029213a200441d02a6a41086a2903002157200441a0286a41086a2903002158200441f02a6a41086a2903002159200441f0286a41086a290300215a200441b0296a41086a290300215b20042903802b211020042903b028211a20042903e028211b20042903a029211c20042903e029211e200441802b6a41086a290300215c200441b0286a41086a290300215d200441e0286a41086a290300215e200441a0296a41086a290300215f200441e0296a41086a290300216020042903c028211220042903d0282111200429039029211320042903802a211620042903f0292119200441c0286a41086a2903002161200441d0286a41086a290300216220044190296a41086a2903002163200441802a6a41086a2903002164200441f0296a41086a290300216520044188c9006a20044180ce006a41011071200441e01c6a200429038849220e4200201920162013201120127c22127c22137c22167c2219201e201c201b2010201a7c221a7c221b7c221c7c221e203a20392022200f201f7c221f7c22227c22397c223a204d204b203c200c203b7c223b7c223c7c224b7c224d205620542052200d20507c22507c22527c22547c2256423388205520532051204f204e7c2050200d54ad7c7c2052205054ad7c7c2054205254ad7c7c2056205454ad7c420d86847c220d423388204c204a2049204820477c203b200c54ad7c7c203c203b54ad7c7c204b203c54ad7c7c204d204b54ad7c200d204d54ad7c420d86847c223b423388205b205a2059205720587c201f200f54ad7c7c2022201f54ad7c7c2039202254ad7c7c203a203954ad7c203b203a54ad7c420d86847c221f4233882060205f205e205c205d7c201a201054ad7c7c201b201a54ad7c7c201c201b54ad7c7c201e201c54ad7c201f201e54ad7c420d86847c220f423388206520642063206220617c2012201154ad7c7c2013201254ad7c7c2016201354ad7c7c2019201654ad7c200f201954ad7c420d868442137e205642ffffffffffffff03837c221142ffffffffffffff0383220c420010ce08200441e01f6a200f42ffffffffffffff038322194200200429039049220f42137e420010ce08200441901f6a201f42ffffffffffffff038322164200200429039849221042137e221b420010ce08200441c01e6a203b42ffffffffffffff03832213420020042903a049221242137e221a420010ce08200441f01d6a2011423388200d42ffffffffffffff03837c220d420020042903a849221c42137e2211420010ce08200441f01c6a200d4200200e420010ce08200441d01f6a200c4200200f420010ce08200441801f6a20194200201b420010ce08200441b01e6a20164200201a420010ce08200441e01d6a201342002011420010ce08200441801d6a20134200200e420010ce08200441c01f6a200d4200200f420010ce08200441f01e6a200c42002010420010ce08200441a01e6a20194200201a420010ce08200441d01d6a201642002011420010ce08200441901d6a20164200200e420010ce08200441b01f6a20134200200f420010ce08200441e01e6a200d42002010420010ce08200441901e6a200c42002012420010ce08200441c01d6a201942002011420010ce08200441a01d6a20194200200e420010ce08200441a01f6a20164200200f420010ce08200441d01e6a201342002010420010ce08200441801e6a200d42002012420010ce08200441b01d6a200c4200201c420010ce08200420042903a01e223a20042903f01e7c220e20042903d01d7c220f20042903801d7c221020042903c01f7c221120042903801f223b20042903d01f7c221220042903b01e7c221a20042903e01d7c221b20042903f01c7c221c20042903e01f223c20042903e01c7c221e20042903901f7c221f20042903c01e7c222220042903f01d7c2239423388200441e01f6a41086a290300200441e01c6a41086a2903007c201e203c54ad7c200441901f6a41086a2903007c201f201e54ad7c200441c01e6a41086a2903007c2022201f54ad7c200441f01d6a41086a2903007c2039202254ad7c420d86847c221e423388200441801f6a41086a290300200441d01f6a41086a2903007c2012203b54ad7c200441b01e6a41086a2903007c201a201254ad7c200441e01d6a41086a2903007c201b201a54ad7c200441f01c6a41086a2903007c201c201b54ad7c201e201c54ad7c420d86847c221242ffffffffffffff03833703b84e200420042903c01d222220042903901e7c221a20042903901d7c221b20042903b01f7c221c20042903e01e7c221f2012423388200441a01e6a41086a290300200441f01e6a41086a2903007c200e203a54ad7c200441d01d6a41086a2903007c200f200e54ad7c200441801d6a41086a2903007c2010200f54ad7c200441c01f6a41086a2903007c2011201054ad7c2012201154ad7c420d86847c220e42ffffffffffffff03833703c04e200420042903a01d223a20042903b01d7c220f20042903a01f7c221020042903d01e7c221120042903801e7c2212200e423388200441c01d6a41086a290300200441901e6a41086a2903007c201a202254ad7c200441901d6a41086a2903007c201b201a54ad7c200441b01f6a41086a2903007c201c201b54ad7c200441e01e6a41086a2903007c201f201c54ad7c200e201f54ad7c420d86847c220e42ffffffffffffff03833703c84e2004200e423388200441a01d6a41086a290300200441b01d6a41086a2903007c200f203a54ad7c200441a01f6a41086a2903007c2010200f54ad7c200441d01e6a41086a2903007c2011201054ad7c200441801e6a41086a2903007c2012201154ad7c200e201254ad7c420d868442137e203942ffffffffffffff03837c220e42ffffffffffffff03833703a84e2004200e423388201e42ffffffffffffff03837c3703b04e200441f0ca006a41106a4200370300200441f0ca006a41186a4200370300200441f0ca006a41206a4200370300200442003703f84a200442013703f04a200441d0c6006a200441f0ca006a200441a8ce006a1072200441c0146a200c420020042903d846220e420010ce08200441e0156a200441d0c6006a41286a290300220f4200200d42137e420010ce0820044180176a200929030022104200201342137e221c420010ce08200441a0186a200829030022114200201642137e221b420010ce08200441c0196a200329030022124200201942137e221a420010ce08200441b0196a20124200200c420010ce08200441b0146a200e4200200d420010ce08200441d0156a200f4200201c420010ce08200441f0166a20104200201b420010ce0820044190186a20114200201a420010ce0820044180186a20114200200c420010ce08200441a0196a20124200200d420010ce08200441a0146a200e42002013420010ce08200441c0156a200f4200201b420010ce08200441e0166a20104200201a420010ce08200441d0166a20104200200c420010ce08200441f0176a20114200200d420010ce0820044190196a201242002013420010ce08200441c0136a200e42002016420010ce08200441b0156a200f4200201a420010ce08200441a0156a200f4200200c420010ce08200441c0166a20104200200d420010ce08200441e0176a201142002013420010ce0820044180196a201242002016420010ce08200441e0126a200e42002019420010ce0820044180126a20042903804e220c4200200e420010ce0820044190156a200f420020042903884e220d42137e420010ce08200441b0166a2010420020042903904e221342137e221b420010ce08200441d0176a2011420020042903984e221942137e221a420010ce08200441f0186a2012420020042903a04e221c42137e2216420010ce08200441e0186a20124200200c420010ce08200441f0116a200e4200200d420010ce0820044180156a200f4200201b420010ce08200441a0166a20104200201a420010ce08200441c0176a201142002016420010ce08200441b0176a20114200200c420010ce08200441d0186a20124200200d420010ce08200441e0116a200e42002013420010ce08200441f0146a200f4200201a420010ce0820044190166a201042002016420010ce0820044180166a20104200200c420010ce08200441a0176a20114200200d420010ce08200441c0186a201242002013420010ce08200441d0116a200e42002019420010ce08200441e0146a200f42002016420010ce08200441d0146a200f4200200c420010ce08200441f0156a20104200200d420010ce0820044190176a201142002013420010ce08200441b0186a201242002019420010ce08200441c0116a200e4200201c420010ce08200441c00d6a20042903802c224b20042903e0267c220c20042903a02f7c220d20042903b02e7c220e20042903b00e7c220f20042903902c224d20042903f0267c221020042903f02b7c221120042903b02f7c221220042903900f7c221320042903902d22502004290380277c221620042903a02c7c221920042903e02b7c221a20042903f00f7c221b20042903902e22522004290390277c221c20042903a02d7c221e20042903b02c7c221f2004290380107c222220042903902f225420042903a0277c223920042903a02e7c223a20042903b02d7c223b2004290390107c223c423388200441902f6a41086a290300200441a0276a41086a2903007c2039205454ad7c200441a02e6a41086a2903007c203a203954ad7c200441b02d6a41086a2903007c203b203a54ad7c20044190106a41086a2903007c203c203b54ad7c420d86847c2239423388200441902e6a41086a29030020044190276a41086a2903007c201c205254ad7c200441a02d6a41086a2903007c201e201c54ad7c200441b02c6a41086a2903007c201f201e54ad7c20044180106a41086a2903007c2022201f54ad7c2039202254ad7c420d86847c221e423388200441902d6a41086a29030020044180276a41086a2903007c2016205054ad7c200441a02c6a41086a2903007c2019201654ad7c200441e02b6a41086a2903007c201a201954ad7c200441f00f6a41086a2903007c201b201a54ad7c201e201b54ad7c420d86847c2216423388200441902c6a41086a290300200441f0266a41086a2903007c2010204d54ad7c200441f02b6a41086a2903007c2011201054ad7c200441b02f6a41086a2903007c2012201154ad7c200441900f6a41086a2903007c2013201254ad7c2016201354ad7c420d86847c2210423388200441802c6a41086a290300200441e0266a41086a2903007c200c204b54ad7c200441a02f6a41086a2903007c200d200c54ad7c200441b02e6a41086a2903007c200e200d54ad7c200441b00e6a41086a2903007c200f200e54ad7c2010200f54ad7c420d868442137e203c42ffffffffffffff03837c225642ffffffffffffff0383220d420020042903d014224720042903c0117c220c20042903f0157c220e2004290390177c220f20042903b0187c221120042903e014224820042903d0117c22122004290380167c221320042903a0177c221920042903c0187c221a20042903f014224920042903e0117c221b2004290390167c221c20042903b0177c221f20042903d0187c2222200429038015224a20042903f0117c223a20042903a0167c223b20042903c0177c223c20042903e0187c224b200429039015224c2004290380127c224d20042903b0167c225020042903d0177c225220042903f0187c225442338820044190156a41086a29030020044180126a41086a2903007c204d204c54ad7c200441b0166a41086a2903007c2050204d54ad7c200441d0176a41086a2903007c2052205054ad7c200441f0186a41086a2903007c2054205254ad7c420d86847c224d42338820044180156a41086a290300200441f0116a41086a2903007c203a204a54ad7c200441a0166a41086a2903007c203b203a54ad7c200441c0176a41086a2903007c203c203b54ad7c200441e0186a41086a2903007c204b203c54ad7c204d204b54ad7c420d86847c223a423388200441f0146a41086a290300200441e0116a41086a2903007c201b204954ad7c20044190166a41086a2903007c201c201b54ad7c200441b0176a41086a2903007c201f201c54ad7c200441d0186a41086a2903007c2022201f54ad7c203a202254ad7c420d86847c221c423388200441e0146a41086a290300200441d0116a41086a2903007c2012204854ad7c20044180166a41086a2903007c2013201254ad7c200441a0176a41086a2903007c2019201354ad7c200441c0186a41086a2903007c201a201954ad7c201c201a54ad7c420d86847c2212423388200441d0146a41086a290300200441c0116a41086a2903007c200c204754ad7c200441f0156a41086a2903007c200e200c54ad7c20044190176a41086a2903007c200f200e54ad7c200441b0186a41086a2903007c2011200f54ad7c2012201154ad7c420d868442137e205442ffffffffffffff03837c220c42ffffffffffffff0383221a420010ce08200441900e6a201242ffffffffffffff0383221b42002056423388203942ffffffffffffff03837c220e42137e420010ce08200441b00f6a201c42ffffffffffffff0383221c4200201e42ffffffffffffff0383221342137e2211420010ce08200441e00e6a203a42ffffffffffffff0383221e4200201642ffffffffffffff0383221642137e220f420010ce08200441f00c6a200c423388204d42ffffffffffffff03837c221f4200201042ffffffffffffff0383221942137e220c420010ce08200441b00d6a201f4200200d420010ce08200441800e6a201a4200200e420010ce08200441a00f6a201b42002011420010ce08200441d00e6a201c4200200f420010ce08200441e00c6a201e4200200c420010ce08200441a00d6a201e4200200d420010ce08200441f00d6a201f4200200e420010ce08200441c00f6a201a42002013420010ce08200441c00e6a201b4200200f420010ce08200441d00c6a201c4200200c420010ce08200441900d6a201c4200200d420010ce08200441e00d6a201e4200200e420010ce08200441d00f6a201f42002013420010ce08200441f00e6a201a42002016420010ce08200441f00b6a201b4200200c420010ce08200441800d6a201b4200200d420010ce08200441d00d6a201c4200200e420010ce08200441e00f6a201e42002013420010ce08200441800f6a201f42002016420010ce08200441a00e6a201a42002019420010ce08200441b00a6a20042903800d224c20042903a00e7c220c20042903d00d7c220f20042903e00f7c221020042903800f7c221120042903f00b224e20042903f00e7c221220042903900d7c222220042903e00d7c223920042903d00f7c223a20042903c00e224f20042903c00f7c223b20042903d00c7c223c20042903a00d7c224b20042903f00d7c224d20042903a00f225120042903800e7c225020042903d00e7c225220042903e00c7c225420042903b00d7c225620042903900e225320042903c00d7c224720042903b00f7c224820042903e00e7c224920042903f00c7c224a423388200441900e6a41086a290300200441c00d6a41086a2903007c2047205354ad7c200441b00f6a41086a2903007c2048204754ad7c200441e00e6a41086a2903007c2049204854ad7c200441f00c6a41086a2903007c204a204954ad7c420d86847c2247423388200441a00f6a41086a290300200441800e6a41086a2903007c2050205154ad7c200441d00e6a41086a2903007c2052205054ad7c200441e00c6a41086a2903007c2054205254ad7c200441b00d6a41086a2903007c2056205454ad7c2047205654ad7c420d86847c2250423388200441c00e6a41086a290300200441c00f6a41086a2903007c203b204f54ad7c200441d00c6a41086a2903007c203c203b54ad7c200441a00d6a41086a2903007c204b203c54ad7c200441f00d6a41086a2903007c204d204b54ad7c2050204d54ad7c420d86847c223b423388200441f00b6a41086a290300200441f00e6a41086a2903007c2012204e54ad7c200441900d6a41086a2903007c2022201254ad7c200441e00d6a41086a2903007c2039202254ad7c200441d00f6a41086a2903007c203a203954ad7c203b203a54ad7c420d86847c223c423388200441800d6a41086a290300200441a00e6a41086a2903007c200c204c54ad7c200441d00d6a41086a2903007c200f200c54ad7c200441e00f6a41086a2903007c2010200f54ad7c200441800f6a41086a2903007c2011201054ad7c203c201154ad7c420d868442137e204a42ffffffffffffff03837c225542ffffffffffffff03832222420020042903a015225720042903e0127c220c20042903c0167c220f20042903e0177c22102004290380197c221120042903b015225820042903c0137c221220042903d0167c223920042903f0177c223a2004290390197c224b20042903c015225920042903a0147c224d20042903e0167c22522004290380187c225420042903a0197c225620042903d015225a20042903b0147c224820042903f0167c22492004290390187c224a20042903b0197c224c20042903e015225b20042903c0147c224e2004290380177c224f20042903a0187c225120042903c0197c2253423388200441e0156a41086a290300200441c0146a41086a2903007c204e205b54ad7c20044180176a41086a2903007c204f204e54ad7c200441a0186a41086a2903007c2051204f54ad7c200441c0196a41086a2903007c2053205154ad7c420d86847c224e423388200441d0156a41086a290300200441b0146a41086a2903007c2048205a54ad7c200441f0166a41086a2903007c2049204854ad7c20044190186a41086a2903007c204a204954ad7c200441b0196a41086a2903007c204c204a54ad7c204e204c54ad7c420d86847c2248423388200441c0156a41086a290300200441a0146a41086a2903007c204d205954ad7c200441e0166a41086a2903007c2052204d54ad7c20044180186a41086a2903007c2054205254ad7c200441a0196a41086a2903007c2056205454ad7c2048205654ad7c420d86847c224d423388200441b0156a41086a290300200441c0136a41086a2903007c2012205854ad7c200441d0166a41086a2903007c2039201254ad7c200441f0176a41086a2903007c203a203954ad7c20044190196a41086a2903007c204b203a54ad7c204d204b54ad7c420d86847c2212423388200441a0156a41086a290300200441e0126a41086a2903007c200c205754ad7c200441c0166a41086a2903007c200f200c54ad7c200441e0176a41086a2903007c2010200f54ad7c20044180196a41086a2903007c2011201054ad7c2012201154ad7c420d868442137e205342ffffffffffffff03837c225242ffffffffffffff0383220c420010ce08200441800b6a201242ffffffffffffff0383220f42002055423388204742ffffffffffffff03837c223942137e420010ce08200441900c6a204d42ffffffffffffff038322104200205042ffffffffffffff0383223a42137e2250420010ce08200441b00b6a204842ffffffffffffff038322114200203b42ffffffffffffff0383224b42137e224d420010ce08200441e0096a2052423388204e42ffffffffffffff03837c22124200203c42ffffffffffffff0383223c42137e223b420010ce08200441a00a6a201242002022420010ce08200441f00a6a200c42002039420010ce08200441800c6a200f42002050420010ce08200441a00b6a20104200204d420010ce08200441d0096a20114200203b420010ce08200441900a6a201142002022420010ce08200441e00a6a201242002039420010ce08200441a00c6a200c4200203a420010ce08200441900b6a200f4200204d420010ce08200441c0096a20104200203b420010ce08200441800a6a201042002022420010ce08200441d00a6a201142002039420010ce08200441b00c6a20124200203a420010ce08200441c00b6a200c4200204b420010ce08200441e0086a200f4200203b420010ce08200441f0096a200f42002022420010ce08200441c00a6a201042002039420010ce08200441c00c6a20114200203a420010ce08200441d00b6a20124200204b420010ce08200441e00b6a200c4200203c420010ce08200441b0206a2018420042b0c1bad0f4e48603420010ce0820044180236a201d420042a7a7fbf49beaf607420010ce08200441b0246a2020420042a0d69f90da80b1cb00420010ce08200441e0256a200a420042badf96dcb5c3bac700420010ce08200441d0216a200b420042a7ecfac2b5f7ea19420010ce08200441c0216a200b420042b0c1bad0f4e48603420010ce08200441a0206a20184200429db1bce4dfb435420010ce0820044190236a201d420042a0d69f90da80b1cb00420010ce08200441c0246a2020420042badf96dcb5c3bac700420010ce08200441f0256a200a420042a7ecfac2b5f7ea19420010ce0820044180266a200a420042b0c1bad0f4e48603420010ce08200441b0216a200b4200429db1bce4dfb435420010ce0820044190206a2018420042e098f4e5e9ebfb03420010ce08200441a0236a201d420042badf96dcb5c3bac700420010ce08200441d0246a2020420042a7ecfac2b5f7ea19420010ce08200441e0246a2020420042b0c1bad0f4e48603420010ce0820044190266a200a4200429db1bce4dfb435420010ce08200441a0216a200b420042e098f4e5e9ebfb03420010ce0820044180206a20184200429e9981b4dab2e103420010ce08200441b0236a201d420042a7ecfac2b5f7ea19420010ce08200441c0236a201d420042b0c1bad0f4e48603420010ce08200441f0246a20204200429db1bce4dfb435420010ce08200441a0266a200a420042e098f4e5e9ebfb03420010ce0820044190216a200b4200429e9981b4dab2e103420010ce08200441f01f6a20184200429df893c0a486ae01420010ce08200441901a6a20042903b04d2222420042b0c1bad0f4e48603420010ce08200441e01a6a20042903d04d2239420042a7a7fbf49beaf607420010ce08200441b01b6a20042903c84d223a420042a0d69f90da80b1cb00420010ce08200441801c6a20042903c04d223b420042badf96dcb5c3bac700420010ce08200441d01c6a20042903b84d223c420042a7ecfac2b5f7ea19420010ce08200441c01c6a203c420042b0c1bad0f4e48603420010ce08200441801a6a20224200429db1bce4dfb435420010ce08200441d01a6a2039420042a0d69f90da80b1cb00420010ce08200441a01b6a203a420042badf96dcb5c3bac700420010ce08200441f01b6a203b420042a7ecfac2b5f7ea19420010ce08200441e01b6a203b420042b0c1bad0f4e48603420010ce08200441b01c6a203c4200429db1bce4dfb435420010ce08200441f0196a2022420042e098f4e5e9ebfb03420010ce08200441c01a6a2039420042badf96dcb5c3bac700420010ce08200441901b6a203a420042a7ecfac2b5f7ea19420010ce08200441801b6a203a420042b0c1bad0f4e48603420010ce08200441d01b6a203b4200429db1bce4dfb435420010ce08200441a01c6a203c420042e098f4e5e9ebfb03420010ce08200441e0196a20224200429e9981b4dab2e103420010ce08200441b01a6a2039420042a7ecfac2b5f7ea19420010ce08200441a01a6a2039420042b0c1bad0f4e48603420010ce08200441f01a6a203a4200429db1bce4dfb435420010ce08200441c01b6a203b420042e098f4e5e9ebfb03420010ce08200441901c6a203c4200429e9981b4dab2e103420010ce08200441d0196a20224200429df893c0a486ae01420010ce08200441e0106a200c420042ea81f582a8b53f420010ce08200441d0126a200f420042bbda9284b7cbdd1b420010ce08200441b0136a201042004288f5a7f5b28623420010ce0820044190146a2011420042edd5d7bc83fb803c420010ce08200441b0116a2012420042edc19ab7ab9cc0c700420010ce08200441a0116a2012420042ea81f582a8b53f420010ce08200441d0106a200c420042b9a6dff282e9ba01420010ce08200441c0126a200f42004288f5a7f5b28623420010ce08200441a0136a2010420042edd5d7bc83fb803c420010ce0820044180146a2011420042edc19ab7ab9cc0c700420010ce08200441f0136a2011420042ea81f582a8b53f420010ce0820044190116a2012420042b9a6dff282e9ba01420010ce08200441c0106a200c420042d8f8d29390ec01420010ce08200441b0126a200f420042edd5d7bc83fb803c420010ce0820044190136a2010420042edc19ab7ab9cc0c700420010ce0820044180136a2010420042ea81f582a8b53f420010ce08200441e0136a2011420042b9a6dff282e9ba01420010ce0820044180116a2012420042d8f8d29390ec01420010ce08200441b0106a200c420042ff91f789b6a19403420010ce08200441a0126a200f420042edc19ab7ab9cc0c700420010ce0820044190126a200f420042ea81f582a8b53f420010ce08200441f0126a2010420042b9a6dff282e9ba01420010ce08200441d0136a2011420042d8f8d29390ec01420010ce08200441f0106a2012420042ff91f789b6a19403420010ce08200441a0106a200c420042fff5f38289d9e103420010ce08200441a0076a20042903f009224c20042903e00b7c220c20042903c00a7c220f20042903c00c7c221020042903d00b7c221120042903e008224e20042903c00b7c221220042903800a7c222220042903d00a7c223920042903b00c7c223a20042903900b224f20042903a00c7c223b20042903c0097c223c20042903900a7c224b20042903e00a7c224d20042903800c225120042903f00a7c225020042903a00b7c225220042903d0097c225420042903a00a7c225620042903800b225320042903b00a7c224720042903900c7c224820042903b00b7c224920042903e0097c224a423388200441800b6a41086a290300200441b00a6a41086a2903007c2047205354ad7c200441900c6a41086a2903007c2048204754ad7c200441b00b6a41086a2903007c2049204854ad7c200441e0096a41086a2903007c204a204954ad7c420d86847c2247423388200441800c6a41086a290300200441f00a6a41086a2903007c2050205154ad7c200441a00b6a41086a2903007c2052205054ad7c200441d0096a41086a2903007c2054205254ad7c200441a00a6a41086a2903007c2056205454ad7c2047205654ad7c420d86847c2250423388200441900b6a41086a290300200441a00c6a41086a2903007c203b204f54ad7c200441c0096a41086a2903007c203c203b54ad7c200441900a6a41086a2903007c204b203c54ad7c200441e00a6a41086a2903007c204d204b54ad7c2050204d54ad7c420d86847c223b423388200441e0086a41086a290300200441c00b6a41086a2903007c2012204e54ad7c200441800a6a41086a2903007c2022201254ad7c200441d00a6a41086a2903007c2039202254ad7c200441b00c6a41086a2903007c203a203954ad7c203b203a54ad7c420d86847c223a423388200441f0096a41086a290300200441e00b6a41086a2903007c200c204c54ad7c200441c00a6a41086a2903007c200f200c54ad7c200441c00c6a41086a2903007c2010200f54ad7c200441d00b6a41086a2903007c2011201054ad7c203a201154ad7c420d868442137e204a42ffffffffffffff03837c220c42ffffffffffffff0383220f4200200d420010ce08200441f0076a20194200200c423388204742ffffffffffffff03837c221042137e225e420010ce0820044180096a20164200205042ffffffffffffff0383221242137e2250420010ce08200441a0086a20134200203b42ffffffffffffff0383223942137e2222420010ce08200441d0066a200e4200203a42ffffffffffffff0383225242137e2211420010ce0820044190076a200e4200200f420010ce08200441e0076a200d42002010420010ce08200441f0086a201942002050420010ce0820044190086a201642002022420010ce08200441c0066a201342002011420010ce0820044180076a20134200200f420010ce08200441d0076a200e42002010420010ce0820044190096a200d42002012420010ce0820044180086a201942002022420010ce08200441b0066a201642002011420010ce08200441f0066a20164200200f420010ce08200441c0076a201342002010420010ce08200441a0096a200e42002012420010ce08200441b0086a200d42002039420010ce08200441a0066a201942002011420010ce08200441e0066a20194200200f420010ce08200441b0076a201642002010420010ce08200441b0096a201342002012420010ce08200441c0086a200e42002039420010ce08200441d0086a200d42002052420010ce082004200429038008224c2004290390097c220c20042903b0067c223a2004290380077c223b20042903d0077c223c20042903f008224e20042903e0077c224b2004290390087c224d20042903c0067c22542004290390077c225620042903f007224f20042903a0077c22472004290380097c224820042903a0087c224920042903d0067c224a423388200441f0076a41086a290300200441a0076a41086a2903007c2047204f54ad7c20044180096a41086a2903007c2048204754ad7c200441a0086a41086a2903007c2049204854ad7c200441d0066a41086a2903007c204a204954ad7c420d86847c2247423388200441f0086a41086a290300200441e0076a41086a2903007c204b204e54ad7c20044190086a41086a2903007c204d204b54ad7c200441c0066a41086a2903007c2054204d54ad7c20044190076a41086a2903007c2056205454ad7c2047205654ad7c420d86847c224b42ffffffffffffff03833703e046200420042903a006224920042903b0087c224d20042903f0067c225420042903c0077c225620042903a0097c2248204b42338820044180086a41086a29030020044190096a41086a2903007c200c204c54ad7c200441b0066a41086a2903007c203a200c54ad7c20044180076a41086a2903007c203b203a54ad7c200441d0076a41086a2903007c203c203b54ad7c204b203c54ad7c420d86847c220c42ffffffffffffff03833703e846200420042903e006224c20042903d0087c223a20042903b0077c223b20042903b0097c223c20042903c0087c224b200c423388200441a0066a41086a290300200441b0086a41086a2903007c204d204954ad7c200441f0066a41086a2903007c2054204d54ad7c200441c0076a41086a2903007c2056205454ad7c200441a0096a41086a2903007c2048205654ad7c200c204854ad7c420d86847c220c42ffffffffffffff03833703f0462004200c423388200441e0066a41086a290300200441d0086a41086a2903007c203a204c54ad7c200441b0076a41086a2903007c203b203a54ad7c200441b0096a41086a2903007c203c203b54ad7c200441c0086a41086a2903007c204b203c54ad7c200c204b54ad7c420d868442137e204a42ffffffffffffff03837c220c42ffffffffffffff03833703d0462004200c423388204742ffffffffffffff03837c3703d84620044190236a41086a290300215f200441a0206a41086a2903002160200429039023210c20042903a0202155200441c0246a41086a290300216120042903c0242157200441f0256a41086a290300216220042903f0252158200441c0216a41086a290300216320042903c021215920044180236a41086a2903002164200441b0206a41086a2903002165200429038023213a20042903b020215a200441b0246a41086a290300216620042903b024215b200441e0256a41086a290300216720042903e025215c200441d0216a41086a290300216820042903d021215d20042903a023213b200429039020214e20042903d024214f200429038026215120042903b0212153200441a0236a41086a290300216920044190206a41086a290300216a200441d0246a41086a290300216b20044180266a41086a290300216c200441b0216a41086a290300216d20042903b023213c200429038020214820042903e0242149200429039026214a20042903a021214c200441b0236a41086a290300216e20044180206a41086a290300216f200441e0246a41086a290300217020044190266a41086a2903002171200441a0216a41086a290300217220042903c023214b20042903f01f214d20042903f024215420042903a02621562004290390212147200441c0236a41086a2903002173200441f01f6a41086a2903002174200441f0246a41086a2903002175200441a0266a41086a290300217620044190216a41086a2903002177200441a8ca006a200441d0c6006a106e20042d00a84a41017110702102200420042903b04d2278204720562054204b204d7c224d7c22547c22567c2247204c204a2049203c20487c22487c22497c224a7c224c20532051204f203b204e7c224e7c224f7c22517c2253205920582057200c20557c22557c22577c22587c2259205d205c205b203a205a7c225a7c225b7c225c7c225d423388206820672066206420657c205a203a54ad7c7c205b205a54ad7c7c205c205b54ad7c7c205d205c54ad7c420d86847c223a423388206320622061205f20607c2055200c54ad7c7c2057205554ad7c7c2058205754ad7c7c2059205854ad7c203a205954ad7c420d86847c2255423388206d206c206b2069206a7c204e203b54ad7c7c204f204e54ad7c7c2051204f54ad7c7c2053205154ad7c2055205354ad7c420d86847c223b423388207220712070206e206f7c2048203c54ad7c7c2049204854ad7c7c204a204954ad7c7c204c204a54ad7c203b204c54ad7c420d86847c223c423388207720762075207320747c204d204b54ad7c7c2054204d54ad7c7c2056205454ad7c7c2047205654ad7c203c204754ad7c420d868442137e205d42ffffffffffffff03837c224b42ffffffffffffff03838542002002ad42ff01837d220c832078853703b04d200420042903b84d224d204b423388203a42ffffffffffffff03837c85200c83204d853703b84d200420042903c04d223a205542ffffffffffffff038385200c83203a853703c04d200420042903c84d223a203b42ffffffffffffff038385200c83203a853703c84d200420042903d04d223a203c42ffffffffffffff038385200c83203a853703d04d20044190066a200f4200201820042903a01a225a20042903d0197c223a20042903f01a7c223b20042903c01b7c223c20042903901c7c224b20042903b01a225b20042903e0197c224d20042903801b7c225420042903d01b7c225620042903a01c7c224720042903c01a225c20042903f0197c224820042903901b7c224920042903e01b7c224a20042903b01c7c224c20042903d01a225d20042903801a7c224e20042903a01b7c224f20042903f01b7c225120042903c01c7c225320042903e01a225f20042903901a7c225520042903b01b7c225720042903801c7c225820042903d01c7c2259423388200441e01a6a41086a290300200441901a6a41086a2903007c2055205f54ad7c200441b01b6a41086a2903007c2057205554ad7c200441801c6a41086a2903007c2058205754ad7c200441d01c6a41086a2903007c2059205854ad7c420d86847c2255423388200441d01a6a41086a290300200441801a6a41086a2903007c204e205d54ad7c200441a01b6a41086a2903007c204f204e54ad7c200441f01b6a41086a2903007c2051204f54ad7c200441c01c6a41086a2903007c2053205154ad7c2055205354ad7c420d86847c224e423388200441c01a6a41086a290300200441f0196a41086a2903007c2048205c54ad7c200441901b6a41086a2903007c2049204854ad7c200441e01b6a41086a2903007c204a204954ad7c200441b01c6a41086a2903007c204c204a54ad7c204e204c54ad7c420d86847c2248423388200441b01a6a41086a290300200441e0196a41086a2903007c204d205b54ad7c200441801b6a41086a2903007c2054204d54ad7c200441d01b6a41086a2903007c2056205454ad7c200441a01c6a41086a2903007c2047205654ad7c2048204754ad7c420d86847c224d423388200441a01a6a41086a290300200441d0196a41086a2903007c203a205a54ad7c200441f01a6a41086a2903007c203b203a54ad7c200441c01b6a41086a2903007c203c203b54ad7c200441901c6a41086a2903007c204b203c54ad7c204d204b54ad7c420d868442137e205942ffffffffffffff03837c225442ffffffffffffff038385200c83201885223a420010ce08200441d0036a201d204d42ffffffffffffff038385200c83201d85223b4200205e420010ce08200441a0046a2020204842ffffffffffffff038385200c83202085223c42002050420010ce08200441f0046a200a204e42ffffffffffffff038385200c83200a85224b42002022420010ce08200441c0056a200b2054423388205542ffffffffffffff03837c85200c83200b85224d42002011420010ce08200441b0056a204d4200200f420010ce0820044180066a203a42002010420010ce08200441c0036a203b42002050420010ce0820044190046a203c42002022420010ce08200441e0046a204b42002011420010ce08200441d0046a204b4200200f420010ce08200441a0056a204d42002010420010ce08200441f0056a203a42002012420010ce08200441b0036a203b42002022420010ce0820044180046a203c42002011420010ce08200441f0036a203c4200200f420010ce08200441c0046a204b42002010420010ce0820044190056a204d42002012420010ce08200441e0056a203a42002039420010ce08200441a0036a203b42002011420010ce0820044190036a203b4200200f420010ce08200441e0036a203c42002010420010ce08200441b0046a204b42002012420010ce0820044180056a204d42002039420010ce08200441d0056a203a42002052420010ce08200420042903b003225220042903f0057c220f2004290380047c221020042903d0047c221120042903a0057c221220042903c00322542004290380067c22222004290390047c223920042903e0047c223a20042903b0057c223b20042903d00322562004290390067c223c20042903a0047c224b20042903f0047c224d20042903c0057c2250423388200441d0036a41086a29030020044190066a41086a2903007c203c205654ad7c200441a0046a41086a2903007c204b203c54ad7c200441f0046a41086a2903007c204d204b54ad7c200441c0056a41086a2903007c2050204d54ad7c420d86847c223c423388200441c0036a41086a29030020044180066a41086a2903007c2022205454ad7c20044190046a41086a2903007c2039202254ad7c200441e0046a41086a2903007c203a203954ad7c200441b0056a41086a2903007c203b203a54ad7c203c203b54ad7c420d86847c222242ffffffffffffff03833703e046200420042903a003224d20042903e0057c223920042903f0037c223a20042903c0047c223b2004290390057c224b2022423388200441b0036a41086a290300200441f0056a41086a2903007c200f205254ad7c20044180046a41086a2903007c2010200f54ad7c200441d0046a41086a2903007c2011201054ad7c200441a0056a41086a2903007c2012201154ad7c2022201254ad7c420d86847c220f42ffffffffffffff03833703e8462004200429039003225220042903d0057c221020042903e0037c221120042903b0047c22122004290380057c2222200f423388200441a0036a41086a290300200441e0056a41086a2903007c2039204d54ad7c200441f0036a41086a2903007c203a203954ad7c200441c0046a41086a2903007c203b203a54ad7c20044190056a41086a2903007c204b203b54ad7c200f204b54ad7c420d86847c220f42ffffffffffffff03833703f0462004200f42338820044190036a41086a290300200441d0056a41086a2903007c2010205254ad7c200441e0036a41086a2903007c2011201054ad7c200441b0046a41086a2903007c2012201154ad7c20044180056a41086a2903007c2022201254ad7c200f202254ad7c420d868442137e205042ffffffffffffff03837c220f42ffffffffffffff03833703d0462004200f423388203c42ffffffffffffff03837c3703d846200441c0126a41086a290300215a200441d0106a41086a290300215b20042903c012211120042903d010214e200441a0136a41086a290300215c20042903a013214f20044180146a41086a290300215d2004290380142151200441a0116a41086a290300215e20042903a0112153200441d0126a41086a290300215f200441e0106a41086a290300216020042903d012211220042903e0102155200441b0136a41086a290300216120042903b013215720044190146a41086a29030021622004290390142158200441b0116a41086a290300216320042903b011215920042903b012212220042903c0102148200429039013214920042903f013214a200429039011214c200441b0126a41086a2903002164200441c0106a41086a290300216520044190136a41086a2903002166200441f0136a41086a290300216720044190116a41086a290300216820042903a012213920042903b0102152200429038013215420042903e01321562004290380112147200441a0126a41086a2903002169200441b0106a41086a290300216a20044180136a41086a290300216b200441e0136a41086a290300216c20044180116a41086a290300216d200429039012213a20042903a010214b20042903f012214d20042903d013215020042903f010216e20044190126a41086a290300216f200441a0106a41086a2903002170200441f0126a41086a2903002171200441d0136a41086a2903002172200441f0106a41086a2903002173200441a8ca006a200441d0c6006a106e20042d00a84a41017110702102200420042903b04d221042f0ffffffffffff3f20042903d04d223b7d223c42338842137e42d0fdffffffffff3f20107d227442ffffffffffffff03837c8542002002ad42ff01837d220f8320108522103703b04d2004203b203b203c42ffffffffffffff038342f0ffffffffffff3f20042903c84d223c7d22754233887c85200f8385223b3703d04d20044180036a203e203b7d223e42338842137e204020107d224042ffffffffffffff03837c22104200201a206e2050204d203a204b7c223b7c224b7c224d7c2250204720562054203920527c22527c22547c22567c2247204c204a2049202220487c22487c22497c224a7c224c20532051204f2011204e7c224e7c224f7c22517c2253205920582057201220557c22557c22577c22587c2259423388206320622061205f20607c2055201254ad7c7c2057205554ad7c7c2058205754ad7c7c2059205854ad7c420d86847c2255423388205e205d205c205a205b7c204e201154ad7c7c204f204e54ad7c7c2051204f54ad7c7c2053205154ad7c2055205354ad7c420d86847c224e423388206820672066206420657c2048202254ad7c7c2049204854ad7c7c204a204954ad7c7c204c204a54ad7c204e204c54ad7c420d86847c2222423388206d206c206b2069206a7c2052203954ad7c7c2054205254ad7c7c2056205454ad7c7c2047205654ad7c2022204754ad7c420d86847c2212423388207320722071206f20707c203b203a54ad7c7c204b203b54ad7c7c204d204b54ad7c7c2050204d54ad7c2012205054ad7c420d868442137e205942ffffffffffffff03837c223a42ffffffffffffff038385200c83201a852211420010ce08200420042903b84d221a42f0ffffffffffff3f201a7d223942ffffffffffffff038320744233887c85200f83201a85221a3703b84d200441c0006a201b201242ffffffffffffff038385200c83201b85221242002042201a7d223b42ffffffffffffff038320404233887c221a42137e420010ce08200420042903c04d221b42f0ffffffffffff3f201b7d224b42ffffffffffffff038320394233887c85200f83201b8522393703c04d20044190016a201c202242ffffffffffffff038385200c83201c85221b4200204520397d222242ffffffffffffff0383203b4233887c221c42137e223b420010ce082004203c203c207542ffffffffffffff0383204b4233887c85200f838522393703c84d200441e0016a201e204e42ffffffffffffff038385200c83201e85220f4200204620397d221e42ffffffffffffff038320224233887c222242137e2239420010ce08200441b0026a201f203a423388205542ffffffffffffff03837c85200c83201f85220c4200203e42ffffffffffffff0383201e4233887c221f42137e221e420010ce08200441a0026a200c42002010420010ce08200441f0026a20114200201a420010ce08200441306a20124200203b420010ce0820044180016a201b42002039420010ce08200441d0016a200f4200201e420010ce08200441c0016a200f42002010420010ce0820044190026a200c4200201a420010ce08200441e0026a20114200201c420010ce08200441206a201242002039420010ce08200441f0006a201b4200201e420010ce08200441e0006a201b42002010420010ce08200441b0016a200f4200201a420010ce0820044180026a200c4200201c420010ce08200441d0026a201142002022420010ce08200441106a20124200201e420010ce082004201242002010420010ce08200441d0006a201b4200201a420010ce08200441a0016a200f4200201c420010ce08200441f0016a200c42002022420010ce08200441c0026a20114200201f420010ce0820042004290300225620042903c0027c220c20042903507c220f20042903a0017c221020042903f0017c22112004290310224720042903d0027c221220042903607c221a20042903b0017c221b2004290380027c221c2004290320224820042903e0027c221e20042903707c221f20042903c0017c22222004290390027c22392004290330224920042903f0027c223a2004290380017c223b20042903d0017c223c20042903a0027c224b2004290340224a2004290380037c224d2004290390017c225020042903e0017c225220042903b0027c2254423388200441c0006a41086a29030020044180036a41086a2903007c204d204a54ad7c20044190016a41086a2903007c2050204d54ad7c200441e0016a41086a2903007c2052205054ad7c200441b0026a41086a2903007c2054205254ad7c420d86847c224d423388200441306a41086a290300200441f0026a41086a2903007c203a204954ad7c20044180016a41086a2903007c203b203a54ad7c200441d0016a41086a2903007c203c203b54ad7c200441a0026a41086a2903007c204b203c54ad7c204d204b54ad7c420d86847c223a423388200441206a41086a290300200441e0026a41086a2903007c201e204854ad7c200441f0006a41086a2903007c201f201e54ad7c200441c0016a41086a2903007c2022201f54ad7c20044190026a41086a2903007c2039202254ad7c203a203954ad7c420d86847c221e423388200441106a41086a290300200441d0026a41086a2903007c2012204754ad7c200441e0006a41086a2903007c201a201254ad7c200441b0016a41086a2903007c201b201a54ad7c20044180026a41086a2903007c201c201b54ad7c201e201c54ad7c420d86847c2212423388200441086a290300200441c0026a41086a2903007c200c205654ad7c200441d0006a41086a2903007c200f200c54ad7c200441a0016a41086a2903007c2010200f54ad7c200441f0016a41086a2903007c2011201054ad7c2012201154ad7c420d868442137e205442ffffffffffffff03837c220c42ffffffffffffff0383220f3703d0462004200c423388204d42ffffffffffffff03837c22103703d8462004201242ffffffffffffff038322113703f0462004201e42ffffffffffffff038322123703e8462004203a42ffffffffffffff0383221a3703e046200441a8ca006a200441d0c6006a106e2004201142f0ffffffffffff3f20117d221b42ffffffffffffff038342f0ffffffffffff3f20127d221c4233887c85420020042d00a84a4101711070ad42ff01837d220c832011853703f04620042012201c42ffffffffffffff038342f0ffffffffffff3f201a7d22114233887c85200c832012853703e8462004201a201142ffffffffffffff038342f0ffffffffffff3f20107d22114233887c85200c83201a853703e04620042010201142ffffffffffffff038342d0fdffffffffff3f200f7d22114233887c85200c832010853703d8462004200f201b42338842137e201142ffffffffffffff03837c85200c83200f853703d046200441e0c4006a200441d0c6006a106e41002102034020044180c5006a20026a41003a0000200241016a220241c801470d000b20044188c9006a41186a2203200141186a29000037030020044188c9006a41106a2205200141106a29000037030020044188c9006a41086a2206200141086a2900003703002004200129000037038849200441d0c6006a20044188c9006a10d207200441d0c6006a41086a290300210c200441d0c6006a41106a290300210f200441d0c6006a41186a2903002110200441d0c6006a41206a290300211a200441f8c6006a290300211b20044180c7006a290300211120044188c7006a290300211220044190c7006a290300211c20044198c7006a290300211e200441a0c7006a290300211f20042802d446210120042802d046210220044180c5006a200441a8c7006a41f00010c9081a02400240024020024101460d00200441f0ca006a20044180c5006a41f00010c9081a2004200f200c4233887c22224233882022200f54ad420d8684223a20107c223942ffffffffffffff03833703b048200420394233882039203a54ad420d8684223a201a7c223942ffffffffffffff03833703b848200420394233882039203a54ad420d8684223a201b7c223942ffffffffffffff03833703c048200420394233882039203a54ad420d868442137e200c42ffffffffffffff03837c223942ffffffffffffff03833703a04820042039423388202242ffffffffffffff03837c3703a84820044188c9006a41206a4200370300200342003703002005420037030020064200370300200442003703884920044180c5006a41206a420037030020044180c5006a41186a420037030020044180c5006a41106a420037030020044180c5006a41086a420037030020044200370380452004201220114233887c22224233882022201254ad420d8684223a201c7c22394233882039203a54ad420d8684223b201e7c223a423388203a203b54ad420d8684223c201f7c223b42ffffffffffffff03833703f0462004203a42ffffffffffffff03833703e8462004203942ffffffffffffff03833703e0462004203b423388203b203c54ad420d868442137e201142ffffffffffffff03837c2239423388202242ffffffffffffff03837c3703d8462004203942ffffffffffffff03833703d046200441a0c8006a20044188c9006a106f20044180c5006a200441d0c6006a106f72107041ff01714101460d01200041a0016a201937030020004198016a201637030020004190016a201337030020004188016a200e37030020004180016a200d370300200041f8006a203d370300200041f0006a2043370300200041e8006a2044370300200041e0006a2041370300200041d8006a203f370300200041d0006a2023370300200041c8006a2021370300200041c0006a2017370300200041386a2015370300200041306a2014370300200041286a201d370300200041206a2020370300200041186a200a370300200041106a200b370300200041086a201837030020004190026a201f37030020004188026a201e37030020004180026a201c370300200041f8016a2012370300200041f0016a2011370300200041e8016a201b370300200041e0016a201a370300200041d8016a2010370300200041d0016a200f370300200041c8016a200c370300200041c0016a200441e0c4006a41186a290300370300200041b8016a200441e0c4006a41106a290300370300200041b0016a200441e0c4006a41086a290300370300200041a8016a20042903e04437030020004198026a200441f0ca006a41f00010c9081a200041003602000c020b2000200136020420004101360200200041186a20103e0200200041106a200f370200200041086a200c3702000c010b20004101360200200041013a00040b200441d0ce006a24000b7301027f024020002802042201450d0020002802002202450d002001450d002002102c0b0240200041106a2802002201450d00200028020c2202450d00200141ffffff3f71450d002002102c0b02402000411c6a2802002201450d0020002802182200450d00200141286c450d002000102c0b0b130020004103360204200041b4f3c5003602000b3400200041b4f0c50036020420004100360200200041146a4106360200200041106a41e4fec500360200200041086a420f3702000b4901017f02404108103222020d001039000b2000420837020420002002360200200041004108102f2000280200200041086a220028020022026a42003700002000200241086a3602000b0d002000410020002000109b060b930301067f230041d0006b22022400200241b4f0c500410f10c501200241106a41fc84c600410c10c50120022001370330200241386a200241306a410810c701200241c0006a410c6a200241306a41086a3602002002200241386a41086a3602442002200241306a3602482002200241386a360240200241206a200241c0006a107e024002402002280228220341206a2204417f4c0d000240024020040d00410121050c010b200410322205450d020b2000200436020420002005360200200041086a2204410036020020004100411010c8012000280200200428020022056a220620022900003700002004200541106a2205360200200641086a200241086a29000037000020002005411010c8012000280200200428020022056a220620022900103700002004200541106a2207360200200641086a200241106a41086a2900003700002002280220210520002007200310c8012000280200200428020022006a2005200310c9081a2004200020036a36020002402002280224450d002005102c0b200241d0006a24000f0b103b000b1039000bff0101027f230041d0006b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341e0016a360200200241286a200341206a10e5070240024020022d00284101460d00200241206a4200370300200241186a4200370300200241106a4200370300200242003703080c010b200241206a200241c1006a290000370300200241186a200241396a290000370300200241106a200241316a290000370300200220022900293703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241d0006a24000b290020004101360204200041086a200128020420012802006b41e0016e2201360200200020013602000bc90902087f017e230041e0006b22052400200541d8006a22064200370300200541d0006a22074200370300200541c0006a41086a2208420037030020054200370340200541306a41b4f0c500410f10c5012008200541306a41086a220929000037030020052005290030370340200541306a41c3f0c500410d10c5012006200929000037030020072005290030370300024002400240200541c0006a412010ce020d0020064200370300200742003703002008420037030020054200370340200541c0006a41c1dcc700410610c501200541106a4196a4c600410610c5012006200541106a41086a29000037030020072005290010370300200541086a200541c0006a412010c601200528020c410020052802081b2106024020034101470d00200541d8006a220a4200370300200541d0006a220b4200370300200541c0006a41086a2208420037030020054200370340200541306a41b4f0c500410f10c5012008200541306a41086a220929000037030020052005290030370340200541306a41e483c600410a10c501200741086a220c2009290000370000200720052900303700002005200541c0006a412010c60102402005280200450d00200528020420064d0d002000410410a3050c030b200a4200370300200b42003703002008420037030020054200370340200541306a41b4f0c500410f10c5012008200929000037030020052005290030370340200541306a41e483c600410a10c501200c2009290000370000200720052900303700002005200241017420066a360210200541c0006a4120200541106a410410a7020b200541106a41186a2004360200200541106a41106a2208200141086a28020036020020052002360214200520063602102005200336022420052001290200370318200541c0006a41186a4200370300200541c0006a41106a4200370300200541c0006a41086a2201420037030020054200370340200541306a41b4f0c500410f10c5012001200541306a41086a220929000037030020052005290030370340200541306a41c3f0c500410d10c501200741086a2009290000370000200720052900303700002005410036023820054201370330200541306a41004104102f2005280230200528023822076a20063600002005200741046a2207360238200541306a20074104102f2005280230200528023822076a20023600002005200741046a36023820052802182109200541306a20082802002207108f0102402007450d002009200741286c6a210820052802382106200921070340200541306a20064120102f2005280230200528023822016a22062007290000370000200641086a200741086a290000370000200641106a200741106a290000370000200641186a200741186a2900003700002005200141206a2206360238200741206a290300210d200541306a20064108102f2005280230200528023822066a200d3700002005200641086a22063602382008200741286a2207470d000b0b200541306a200541246a10be03200541c0006a412020052802302207200528023810a70202402005280234450d002007102c0b02402005411c6a2802002207450d00200741286c450d002009102c0b200041043a00000c020b2000410310a3050b20012802042207450d00200741286c450d002001280200102c0b200541e0006a24000bd30302057f017e230041b0016b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341e0016a3602002002200341206a41e2c289ab0610a902200228020421042002280200210541002101200241003a00680240024002400240034020042001460d01200241c8006a20016a200520016a2d00003a00002002200141016a22063a00682006210120064120460d020c000b0b200141ff0171450d01200241003a00680c010b200241f0006a41086a2201200241c8006a41086a290300370300200241f0006a41106a2204200241c8006a41106a290300370300200241f0006a41186a2205200241c8006a41186a29030037030020022002290348370370200641ff0171411f4d0d00200241286a41186a20052903002207370300200241086a41086a2001290300370300200241086a41106a2004290300370300200241086a41186a2007370300200220022903703703080c010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241b0016a24000bd30302057f017e230041b0016b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341e0016a3602002002200341206a41e9dabdf30610a902200228020421042002280200210541002101200241003a00680240024002400240034020042001460d01200241c8006a20016a200520016a2d00003a00002002200141016a22063a00682006210120064120460d020c000b0b200141ff0171450d01200241003a00680c010b200241f0006a41086a2201200241c8006a41086a290300370300200241f0006a41106a2204200241c8006a41106a290300370300200241f0006a41186a2205200241c8006a41186a29030037030020022002290348370370200641ff0171411f4d0d00200241286a41186a20052903002207370300200241086a41086a2001290300370300200241086a41106a2004290300370300200241086a41186a2007370300200220022903703703080c010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241b0016a24000bd30302057f017e230041b0016b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341e0016a3602002002200341206a41f0c2c98b0610a902200228020421042002280200210541002101200241003a00680240024002400240034020042001460d01200241c8006a20016a200520016a2d00003a00002002200141016a22063a00682006210120064120460d020c000b0b200141ff0171450d01200241003a00680c010b200241f0006a41086a2201200241c8006a41086a290300370300200241f0006a41106a2204200241c8006a41106a290300370300200241f0006a41186a2205200241c8006a41186a29030037030020022002290348370370200641ff0171411f4d0d00200241286a41186a20052903002207370300200241086a41086a2001290300370300200241086a41106a2004290300370300200241086a41186a2007370300200220022903703703080c010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241b0016a24000b9c0803097f017e057f23004180016b22012400200141286a22024200370300200141206a22034200370300200141106a41086a420037030020014200370310200141106a41f6ddc700410b10c501200141e8006a41e9eec600411610c5012002200141e8006a41086a29000037030020032001290068370300200141203602342001200141106a360230200141386a200141106a412010b30102400240200128023822040d00410021030c010b200128023c21052001200141386a41086a28020036024c20012004360248200141086a200141c8006a1087020240024020012802080d00024002400240200128020c2206200128024c4105762202200220064b1b22074105742202417f4c0d000240024020070d00410421030c010b200210322203450d020b41002102200141003602602001200736025c2001200336025802402006450d000340200128024c22074104490d0420012802482208280000210920012007417c6a36024c2001200841046a360248200141e8006a200141c8006a10800520012802682207450d04200129026c210a200141e8006a200141c8006a108005024002402001280268220b450d00200128026c2108200128024c220c41044f0d0102402008450d00200841ffffff3f71450d00200b102c0b200aa72203450d06200341ffffff3f71450d062007102c0c060b200aa72203450d05200341ffffff3f71450d052007102c0c050b2001280270210d2001280248220e280000210f2001200c417c6a36024c2001200e41046a36024802402002200128025c470d00200141d8006a200210fe0320012802602102200128025821030b200320024105746a22022007360204200220093602002002411c6a200f360200200241186a200d360200200241146a2008360200200241106a200b360200200241086a200a3702002001200128026041016a22023602602006417f6a22060d000b200128025821030b200129025c210a20030d040c030b103b000b1039000b2001280258210602402002450d0020024105742103200641106a210203400240200241786a28020041ffffff3f71450d00200241746a280200102c0b0240200241046a28020041ffffff3f71450d002002280200102c0b200241206a2102200341606a22030d000b0b0240200128025c41ffffff3f71450d002006102c0b0b4100210320014100360260200142013703582001410f3602542001200141306a3602502001200141d8006a360264200141fc006a41013602002001420137026c200141b4bcc3003602682001200141d0006a360278200141e4006a41dcb7c000200141e8006a103e1a20013502604220862001350258841000200128025c450d002001280258102c0b2005450d002004102c0b0240024020030d0020004100360208200042043702000c010b2000200a370204200020033602000b20014180016a24000bd30302057f017e230041b0016b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341e0016a3602002002200341206a41e1e69df30610a902200228020421042002280200210541002101200241003a00680240024002400240034020042001460d01200241c8006a20016a200520016a2d00003a00002002200141016a22063a00682006210120064120460d020c000b0b200141ff0171450d01200241003a00680c010b200241f0006a41086a2201200241c8006a41086a290300370300200241f0006a41106a2204200241c8006a41106a290300370300200241f0006a41186a2205200241c8006a41186a29030037030020022002290348370370200641ff0171411f4d0d00200241286a41186a20052903002207370300200241086a41086a2001290300370300200241086a41106a2004290300370300200241086a41186a2007370300200220022903703703080c010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241b0016a24000bd30302057f017e230041b0016b2202240002400240200128020022032001280204470d00200041003602000c010b2001200341e0016a3602002002200341206a41e1ea91cb0610a902200228020421042002280200210541002101200241003a00680240024002400240034020042001460d01200241c8006a20016a200520016a2d00003a00002002200141016a22063a00682006210120064120460d020c000b0b200141ff0171450d01200241003a00680c010b200241f0006a41086a2201200241c8006a41086a290300370300200241f0006a41106a2204200241c8006a41106a290300370300200241f0006a41186a2205200241c8006a41186a29030037030020022002290348370370200641ff0171411f4d0d00200241286a41186a20052903002207370300200241086a41086a2001290300370300200241086a41106a2004290300370300200241086a41186a2007370300200220022903703703080c010b200241106a4200370300200241186a4200370300200241206a4200370300200242003703080b20002003360200200020022903083700042000410c6a200241106a290300370000200041146a200241186a2903003700002000411c6a200241206a2903003700000b200241b0016a24000bc50302087f047e230041c0006b2202240002400240024020012802182203450d0020012003417f6a36021820012802042204450d0220012802002105024002402001280208220620042f01064f0d00200421030c010b034002400240200428020022030d00410021030c010b200541016a210520042f010421060b2004102c20032104200620032f01064f0d000b0b200241206a41186a2207200320064105746a220441206a290000370300200241206a41106a2208200441186a290000370300200241206a41086a2209200441106a2900003703002002200441086a290000370320200641016a210402402005450d00200320044102746a41e8026a280200210302402005417f6a2204450d00034020032802e80221032004417f6a22040d000b0b410021040b200241186a2007290300220a370300200241106a2008290300220b370300200241086a2009290300220c37030020022002290320220d3703002001200436020820012003360204200141003602002000200d370001200041096a200c370000200041116a200b370000200041196a200a370000200041013a00000c010b200041003a00000b200241c0006a24000f0b41ecd0c800412b4198d1c800103c000b5b01027f230041306b220124000340200141086a200010e30720012d00080d000b024020002802042202450d00200228020021002002102c2000450d000340200028020021022000102c2002210020020d000b0b200141306a24000bfd0202047f047e230041b0016b220224002002200141e7e485f30610a902200228020421032002280200210441002101200241003a0068024002400240034020032001460d01200241c8006a20016a200420016a2d00003a00002002200141016a22053a00682005210120054120470d000b200241f0006a41086a2201200241c8006a41086a290300370300200241f0006a41106a2203200241c8006a41106a290300370300200241f0006a41186a2204200241c8006a41186a29030037030020022002290348370370200541ff0171411f4b0d01410021010c020b0240200141ff0171450d00200241003a00680b410021010c010b200241286a41186a20042903002206370300200241086a41086a20012903002207370300200241086a41106a20032903002208370300200241086a41186a2006370300200220022903702209370308200041196a2006370000200041116a2008370000200041096a200737000020002009370001410121010b200020013a0000200241b0016a24000b1300200041073602042000419889c6003602000b7301027f024020002802042201450d0020002802002202450d002001450d002002102c0b0240200041106a2802002201450d00200028020c2202450d00200141ffffff3f71450d002002102c0b02402000411c6a2802002201450d0020002802182200450d00200141306c450d002000102c0b0b340020004184dec70036020420004100360200200041146a4105360200200041106a41a090c600360200200041086a42033702000b6f01027f02404108103222020d001039000b2000420837020420002002360200200041004104102f2000280200200041086a220228020022036a41003600002002200341046a2203360200200020034104102f2000280200200228020022006a41003600002002200041046a3602000b6001027f230041106b22022400024041e00010322203450d002002410c6a41083602002002200336020820024200370300410410322203450d00200042043702042000200336020020004100108f01200210aa06200241106a24000f0b1039000be40401017f230041c0006b2202240002400240024002400240200028020022002802000e0401020300010b200220002802043602202002200041086a280200360224200241146a41023602002002410236020c2001411c6a28020021002002200241246a3602102002200241206a360208200128021821012002413c6a41023602002002420337022c20024184b1c0003602282002200241086a36023820012000200241286a103e21000c030b200220002802043602202002200041086a280200360224200241146a41023602002002410236020c2001411c6a28020021002002200241246a3602102002200241206a360208200128021821012002413c6a41023602002002420337022c2002419cb1c0003602282002200241086a36023820012000200241286a103e21000c020b200220002802043602042002200041086a28020036022020022000410c6a280200360224200241086a41146a4102360200200241086a410c6a41023602002002410236020c2001411c6a28020021002002200241246a3602182002200241206a3602102002200241046a36020820012802182101200241286a41146a41033602002002420437022c200241b4b1c0003602282002200241086a36023820012000200241286a103e21000c010b200220002802043602202002200041086a280200360224200241146a41023602002002410236020c2001411c6a28020021002002200241246a3602102002200241206a360208200128021821012002413c6a41023602002002420337022c200241d4b1c0003602282002200241086a36023820012000200241286a103e21000b200241c0006a240020000bac3402037f027e0240024002400240024002400240024002400240024020002802000e0a000102030405060708090a0b2001200141086a22022802004101102f200128020020022802006a41003a00002002200228020041016a220336020002400240024002400240200041086a22042d00000e0500010203040e0b200120034101102f200128020020022802006a41003a00002002200228020041016a3602002001200041106a290300200041186a2d0000200041196a2d000010ac070f0b200120034101102f200128020020022802006a41013a00002002200228020041016a2204360200024002400240024002402000410c6a2d00000e0400010203000b200120044101102f2001280200200141086a22022802006a41003a00002002200228020041016a3602000c030b200120044101102f2001280200200141086a22022802006a41013a00002002200228020041016a3602000c020b200120044101102f2001280200200141086a22022802006a41023a00002002200228020041016a3602000c010b200120044101102f2001280200200141086a22022802006a41033a00002002200228020041016a220436020020002d000d2103200120044101102f200128020020022802006a20033a00002002200228020041016a220436020020002d000e2103200120044101102f200128020020022802006a20033a00002002200228020041016a3602000b20012000290318200041206a2d0000200041216a2d000010ac070f0b200120034101102f200128020020022802006a41023a00002002200228020041016a3602000f0b200120034101102f200128020020022802006a41033a00002002200228020041016a2200360200200120004120102f200128020020022802006a22012004290001370000200141186a200441196a290000370000200141106a200441116a290000370000200141086a200441096a2900003700002002200228020041206a3602000f0b200120034101102f200128020020022802006a41043a00002002200228020041016a2200360200200120004120102f200128020020022802006a22012004290001370000200141186a200441196a290000370000200141106a200441116a290000370000200141086a200441096a2900003700002002200228020041206a3602000f0b2001200141086a22022802004101102f200128020020022802006a41033a00002002200228020041016a2203360200200041046a210402400240024020002d00040e030001020b0b200120034101102f200128020020022802006a41003a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041286a2802002100200120044104102f200128020020022802006a20003600002002200228020041046a3602000f0b200120034101102f200128020020022802006a41013a00002002200228020041016a2204360200200041086a2802002100200120044104102f200128020020022802006a20003600002002200228020041046a3602000f0b200120034101102f200128020020022802006a41023a00002002200228020041016a2203360200200041286a2802002100200120034104102f200128020020022802006a20003600002002200228020041046a2200360200200120004120102f200128020020022802006a22012004290001370000200141186a200441196a290000370000200141106a200441116a290000370000200141086a200441096a2900003700002002200228020041206a3602000f0b2001200141086a22022802004101102f200128020020022802006a41043a00002002200228020041016a220336020002400240024002400240024002400240200041086a22042d00000e0800010203040506070f0b200120034101102f200128020020022802006a41003a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041306a2903002105200041386a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41013a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041306a2903002105200041386a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41023a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2203360200200120034120102f200128020020022802006a2203200441216a290000370000200341186a200441396a290000370000200341106a200441316a290000370000200341086a200441296a2900003700002002200228020041206a2204360200200041d0006a2903002105200041d8006a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41033a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041306a2903002105200041386a2903002106200120044110102f200128020020022802006a22042006370008200420053700002002200228020041106a2204360200200041c0006a2903002105200041c8006a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41043a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041306a2903002105200041386a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41053a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041306a2903002105200041386a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41063a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041306a2903002105200041386a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41073a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2203360200200120034120102f200128020020022802006a2203200441216a290000370000200341186a200441396a290000370000200341106a200441316a290000370000200341086a200441296a2900003700002002200228020041206a2204360200200041d0006a2903002105200041d8006a2903002106200120044110102f200128020020022802006a22042006370008200420053700002002200228020041106a220436020020002d00492100200120044101102f200128020020022802006a2102024020004101460d00200241003a0000200141086a2201200128020041016a3602000f0b200241013a0000200141086a2201200128020041016a3602000f0b2001200141086a22022802004101102f200128020020022802006a41073a00002002200228020041016a2203360200024002400240024002400240024002400240200041086a22042d00000e090001020304050607080f0b200120034101102f200128020020022802006a41003a00002002200228020041016a22043602002000410c6a2802002103200120044104102f200128020020022802006a20033600002002200228020041046a2204360200200041106a2903002105200041186a2903002106200120044110102f200128020020022802006a22042006370008200420053700002002200228020041106a2204360200200041206a2903002105200041286a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41013a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041306a2903002105200041386a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41023a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041306a2903002105200041386a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41033a00002002200228020041016a22043602002000410c6a2802002100200120044104102f200128020020022802006a20003600002002200228020041046a3602000f0b200120034101102f200128020020022802006a41043a00002002200228020041016a360200200120042d000110310f0b200120034101102f200128020020022802006a41053a00002002200228020041016a360200200120042d000110310f0b200120034101102f200128020020022802006a41063a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041306a2903002105200041386a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41073a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041306a2903002105200041386a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b200120034101102f200128020020022802006a41083a00002002200228020041016a2203360200200120034120102f200128020020022802006a22032004290001370000200341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a2900003700002002200228020041206a2204360200200041306a2903002105200041386a2903002106200120044110102f200128020020022802006a22012006370008200120053700002002200228020041106a3602000f0b2001200141086a22022802004101102f200128020020022802006a41083a00002002200228020041016a2204360200200120044101102f200128020020022802006a41003a00002002200228020041016a2204360200200120044110102f200128020020022802006a2204200041106a290000370000200441086a200041186a2900003700002002200228020041106a36020020002802042000410c6a280200200110bb01200041206a2d00002100200120022802004101102f200128020020022802006a20003a00002002200228020041016a3602000f0b2001200141086a22022802004101102f200128020020022802006a410a3a00002002200228020041016a2204360200200120044101102f200128020020022802006a41003a00002002200228020041016a220436020020002802042100200120044104102f200128020020022802006a20003600002002200228020041046a3602000f0b2001200141086a22022802004101102f200128020020022802006a410b3a00002002200228020041016a220436020002400240024020002802040e03000102060b200120044101102f200128020020022802006a41003a00002002200228020041016a360200200041086a28020021022001200041106a2802002200108f012000450d052002200041286c6a2103200141086a220028020021040340200120044120102f200128020020002802006a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a2900003700002000200028020041206a2204360200200241206a2903002105200120044108102f200128020020002802006a20053700002000200028020041086a22043602002003200241286a2202470d000c060b0b200120044101102f200128020020022802006a41013a00002002200228020041016a3602000f0b200120044101102f200128020020022802006a41023a00002002200228020041016a3602000f0b2001200141086a22022802004101102f200128020020022802006a410c3a00002002200228020041016a220436020002400240024020002d00040e03000102050b200120044101102f200128020020022802006a41003a00002002200228020041016a2204360200200120044120102f200128020020022802006a2201200041046a2200290001370000200141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a2900003700002002200228020041206a3602000f0b200120044101102f200128020020022802006a41013a00002002200228020041016a3602000f0b200120044101102f200128020020022802006a41023a00002002200228020041016a360200200041086a28020021022001200041106a2802002200108f012000450d022002200041d0006c6a210303402001200141086a22002802004120102f200128020020002802006a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a2900003700002000200028020041206a360200200241206a200110f8032003200241d0006a2202470d000c030b0b2001200141086a22022802004101102f200128020020022802006a41103a00002002200228020041016a220436020002400240024020002802040e03000102040b200120044101102f200128020020022802006a41003a00002002200228020041016a3602002001200041086a10f6052000418c026a28020020004194026a280200200110bb010f0b200120044101102f200128020020022802006a41013a00002002200228020041016a3602002001200041086a10f6052000418c026a28020020004194026a280200200110bb010f0b200120044101102f200128020020022802006a41023a00002002200228020041016a3602002001200041086a10f6052000418c026a28020020004194026a280200200110bb010f0b2001200141086a22022802004101102f200128020020022802006a411b3a00002002200228020041016a220436020002400240024020002d00040e03000102030b200120044101102f200128020020022802006a41003a00002002200228020041016a3602002001200041086a2d0000200041096a2d00002000410a6a2d000010aa070f0b200120044101102f200128020020022802006a41013a00002002200228020041016a2204360200200120044120102f200128020020022802006a2201200041046a2200290001370000200141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a2900003700002002200228020041206a3602000f0b200120044101102f200128020020022802006a41023a00002002200228020041016a3602002001200041086a2d0000200041096a2d00002000410a6a2d000010aa070b0b13002000410a360204200041cca4c6003602000b3400200041c1dcc70036020420004100360200200041146a4110360200200041106a41dcc0c600360200200041086a42063702000b4901017f02404101103222020d001039000b2000420137020420002002360200200041004101102f2000280200200041086a220028020022026a41003a00002000200241016a3602000b2901017f230041106b2202240020024100360208200242043703002000200210b807200241106a24000b4901027f230041106b22022400200241003602082002420437030002404104103222030d001039000b200042043702042000200336020020004100108f012002102b200241106a24000bfd0101087f230041306b2202240020004201370200200241186a22034200370300200241106a22044200370300200241086a22054200370300200041086a22064100360200200242003703000240412010322207450d002002422037022420022007360220200241206a41004120102f20022802202208200228022822096a22072002290300370000200741086a2005290300370000200741106a2004290300370000200741186a20032903003700002002200941206a2207360228200041002007102f2000280200200628020022006a2008200710c9081a2006200020076a36020002402002280224450d002008102c0b200241306a24000f0b1039000b870101027f20004201370200200041086a22024100360200200041004108102f2000280200200228020022036a42003700002002200341086a2203360200200020034108102f2000280200200228020022036a42003700002002200341086a2203360200200020034108102f2000280200200228020022006a42003700002002200041086a3602000b8b0101037f230041d0006b22022400200241086a410041c80010cb081a200041086a2203410036020020004201370200200041004104102f2000280200200328020022046a41003600002003200441046a2204360200200020044104102f2000280200200328020022046a41003600002003200441046a3602002000200241086a108705200241d0006a24000b130020004103360204200041dcdcc6003602000bff0203027f017e017f230041c0016b22022400200241086a109b01200041086a220341003602002000420137020020022903082104200041004108102f2000280200200328020022056a20043700002003200541086a220536020020022903102104200020054108102f2000280200200328020022056a20043700002003200541086a220536020020022903182104200020054108102f2000280200200328020022056a20043700002003200541086a3602002000200241206a109f042000200241306a109f042000200241c0006a109f04200241d0006a2903002104200020032802004108102f2000280200200328020022056a20043700002003200541086a3602002000200241d8006a109f042000200241e8006a109f042000200241f8006a109f0420024188016a2903002104200020032802004108102f2000280200200328020022056a20043700002003200541086a360200200020024190016a109f042000200241a0016a109f042000200241b0016a109f04200241c0016a24000b6701027f20004201370200200041086a22024100360200200041004108102f2000280200200228020022036a42c0f0f50b3700002002200341086a2203360200200020034108102f2000280200200228020022006a4280c2d72f3700002002200041086a3602000b4a01017f02404104103222020d001039000b2000420437020420002002360200200041004104102f2000280200200041086a220028020022026a41e0123600002000200241046a3602000b3c02017e017f0240024010252201422088a72202450d0020002001a73602000c010b20004101360200410021020b20002002360208200020023602040b130020002002ad4220862001ad84101e10fc070b130020004105360204200041ece5c6003602000bd20101057f230041206b22022400024002402001422088a722030d004101210441002103410121050c010b2001a72105410021040b2002200336020c200220053602080240024002402003450d0020052d0000210620022003417f6a36020c2002200541016a360208024020060e020200010b200241106a200241086a10af0820022802102203450d00200229021421010c020b41f2b3c800412e200241106a41a0b4c80041b0b4c8001040000b410021030b2000200137020420002003360200024020040d002005102c0b200241206a24000bb70301067f230041106b2202240020004201370200200041086a22034100360200024002400240024020012d00000e03000102030b200041004101102f2000280200200328020022046a41013a00002003200441016a3602002000200141016a10e4050c020b200041004101102f2000280200200328020022046a41023a00002003200441016a3602002000200141016a10e4050c010b200041004101102f2000280200200328020022046a41033a00002003200441016a3602002000200141016a10e4050b2001280224220128020021042000200041086a22032802004104102f2000280200200328020022056a20043600002003200541046a22063602000240412010322204450d002002422037020420022004360200200241004120102f20022802002205200228020822076a22042001290004370000200441086a2001410c6a290000370000200441106a200141146a290000370000200441186a2001411c6a2900003700002002200741206a2201360208200020062001102f2000280200200328020022006a2005200110c9081a2003200020016a36020002402002280204450d002005102c0b200241106a24000f0b1039000bbb0502067f017e230041c0046b2202240041002103200241003a00b00320012802042104417f21050240024002400240034020042003460d0120024190036a20036a200128020022062d00003a00002001200420056a3602042001200641016a3602002002200341016a22063a00b0032005417f6a21052006210320064120470d000b200241a0026a41086a220320024190036a41086a290300370300200241a0026a41106a220520024190036a41106a290300370300200241a0026a41186a220720024190036a41186a29030037030020022002290390033703a002200641ff0171411f4b0d010c020b200341ff0171450d01200241003a00b0030c010b20024180026a41086a200329030037030020024180026a41106a200529030037030020024180026a41186a2007290300370300200220022903a0023703800202400240200420066b22034108490d002001280200220529000021082001200341786a3602042001200541086a36020020024190036a200110ac05200228029403450d01200241a0026a20024190036a41f00010c9081a20024190036a200110ac050240200228029403450d00200241206a20024190036a41f00010c9081a200241086a220320024180026a41086a290300370300200241106a220120024180026a41106a290300370300200241186a220520024180026a41186a290300370300200220022903800237030020024190016a200241a0026a41f00010c9081a20002008370300200041086a20024190016a41f00010c9081a200041f8006a200241206a41f00010c9081a20004180026a2005290300370300200041f8016a2001290300370300200041f0016a2003290300370300200041e8016a20022903003703000c040b2000410036020c200241a0026a410472102b0c030b2000410036020c0c020b2000410036020c0c010b2000410036020c0b200241c0046a24000ba75108077f017e097f047e077f017e387f057e230022012102200141c0056b41607122012400200141386a22034200370300200141306a22044200370300200141206a41086a220542003703002001420037032020014180056a41bee8c700410d10c501200520014180056a41086a2206290000370300200120012900800537032020014180056a41b4edc700410f10c50120032006290000370300200420012900800537030020014180056a200141206a10f5042001280280052103200520014180056a410c6a28020036020020012001290284053703200240024020030d0020014200370318200142043703100c010b200141106a410c6a200528020036020020012003360210200120012903203702140b200141386a22054200370300200141306a22064200370300200141206a41086a2203420037030020014200370320200141c0046a41f1ddc700410510c5012003200141c0046a41086a290000370300200120012900c00437032020014180056a41c4fec000410a10c501200520014180056a41086a290000370300200620012900800537030020014180046a200141206a412010b9030240024020012802800422050d00410021070c010b2001290284042208422088a721072008a72203450d00200341ffffffff0371450d002005102c0b200041f0016a2802002109200141386a220a4200370300200141306a220b4200370300200141206a41086a2205420037030020014200370320200141c0046a41c1dcc700410610c5012005200141c0046a41086a290000370300200120012900c00437032020014180056a4196a4c600410610c501200641086a20014180056a41086a22032900003700002006200129008005370000200141086a200141206a412010c601200128020c21062001280208210c200a4200370300200b4200370300200542003703002001420037032020014180056a41bee8c700410d10c50120052003290000370300200120012900800537032020014180056a41c4efc700411110c501200441086a220d200329000037000020042001290080053700004100210e200120064100200c1b3602800541042106200141206a412020014180056a410410a702200a4200370300200b4200370300200542003703002001420037032020014180056a41bee8c700410d10c50120052003290000370300200120012900800537032020014180056a4188eec700411110c501200d20032900003700002004200129008005370000200920076a210f200141c0046a200141206a10eb040240024020012802c00422100d00200141003602c803200142043703c003410021110c010b200120012902c40422083702c403200120103602c0032008a7211102402008422088a7220e450d002010200e412c6c6a210c2001419c056a210d200141c0046a410472210620014180046a41086a210b20102105034020014102360220200529020021082001290338211220012903302113200129032821142005200129032037020020052902082115200520143702082005290210211420052013370210200541186a2203290200211320032012370200200120133703d804200120143703d004200120153703c804200120083703c004200b200541286a2802003602002001200541206a2902003703800402402008a70d00200d20012903800437020020014180056a41186a2203200641186a28020036020020014180056a41106a200641106a290200220837030020014180056a41086a200641086a2902002212370300200d41086a200b28020036020020012006290200221337038005200141206a41206a221620014180056a41206a290300370300200141206a41186a22172003290300370300200141206a41106a22182008370300200141206a41086a221920123703002001201337032002402001280218220a2001280214470d00200141106a200a1081042001280218210a0b2001280210200a412c6c6a2203200129032037020020034100360228200341086a2019290300370200200341106a2018290300370200200341186a2017290300370200200341206a20162903003702002001200a41016a3602180b2005412c6a2205200c470d000b0b201021060b02400240200f200e4b0d002001200f3602c803200f210a0c010b200141206a41186a20014180056a41186a290200370300200141206a41106a20014180056a41106a290200370300200141206a41086a20014180056a41086a2902003703002001200129028005370320200141c0036a200e200f200e6b220b10dd0120012802c003220620012802c803220a412c6c6a21050240200b4102490d00200e417f73200920076a6a21030340200541023602002005412c6a21052003417f6a22030d000b200b200a6a417f6a210a0b0240200b450d0020054102360200200541086a2001290320370200200541106a200141206a41086a290300370200200541186a200141206a41106a290300370200200541206a200141206a41186a290300370200200a41016a210a0b2001200a3602c80320012802c40321110b200141386a4200370300200141306a4200370300200141206a41086a220542003703002001420037032020014180056a41bee8c700410d10c501200520014180056a41086a2203290000370300200120012900800537032020014180056a4188eec700411110c501200441086a2003290000370000200420012900800537000020014180056a2006200a10e404200141206a4120200128028005220520012802880510a7020240200128028405450d002005102c0b02402011450d002011412c6c450d002006102c0b0240024002400240024002400240024002400240024002400240024002400240200f450d00200041e8026a2802002206450d0020004184036a290200210820002902fc0221122000418c036a290000211320004194036a290000211441002105200141206a410041800210cb081a200141c8026a221a4200370300200141c0026a2014370300200141b8026a2013370300200141b0026a2008370300200141d0026a4200370300200120123703a802200141c0003602a002200141003602f802200142043703f002200141f0026a4100200610950220012802f00220012802f802220a4102746a2103034020032005360200200341046a21032006200541016a2205470d000b20012006200a6a221b3602f8020240201b4102490d0020012802f002211c201bad211d2001419c056a211e200141ac056a211f200141bc056a21200340201da72205417f6a21212005200567411f7174417f6a212220012802a002210503400240200541c000490d0020012903c0022212422088a7212320012903b8022213422088a7212420012802cc022225ad42208620012802c8022226ad84220842037c2214a72127200842027c2215a72128200842017c2208a721292014422088a7212a2015422088a7212b2008422088a7212c2012a7212d2013a7212e41e5f0c18b06212f41eec8819903213041b2da88cb07213141f4ca81d9062132410a213320012802b8022234213520012802bc022236213720012802c0022238213920012802c402223a213b2034213c2036213d2038213e203a213f20012802b4022205210b20012802b0022203210c20012802ac022206210d20012802a802220a2116200521172003211820062119200a210e200521112003211020062107200a210920012903d0022208422088a7224021412008a7224221432040214420422145204021462042214741f4ca81d906214841b2da88cb07214941eec8819903214a41e5f0c18b06214b41f4ca81d906214c41b2da88cb07214d41eec8819903214e41e5f0c18b06214f41f4ca81d906215041e5f0c18b06215141eec8819903215241b2da88cb0721530340200620306a2230ad422086200a202f6a222fad84202aad4220862027ad84852208422088a74110772227203d6a222aad4220862008a7411077223d203c6a223cad842006ad422086200aad84852208422088a7410c77220620306a220aad4220862008a7410c772230202f6a222fad842027ad422086203dad84852208422088a74108772227202a6a222aad4220862008a74108772254203c6a223cad842006ad4220862030ad84852208a74107772206200520326a2230ad422086200320316a2231ad842040ad4220862042ad84852212422088a74110772240203f6a2242ad4220862012a74110772232203e6a223dad842005ad4220862003ad84852212422088a7410c77220520306a22036a2230ad4220862003ad4220862012a7410c77220320316a2231ad842040ad4220862032ad84852212422088a7410877224020426a223ead4220862012a74108772242203d6a223fad842005ad4220862003ad84852212422088a7410777220520316a2203ad842042ad4220862027ad84852213422088a74110772242202a6a2227ad4220862013a7411077222a203c6a223cad842006ad4220862005ad84852213422088a7410c77220520306a2232ad4220862013a7410c77220620036a2231ad842042ad422086202aad84852213422088a7410877224220276a223dad4220862013a7410877222a203c6a223cad842005ad4220862006ad84852213a741077721052012a74107772203200a6a2206ad4220862008422088a7410777220a202f6a2227ad842054ad4220862040ad84852208422088a74110772240203e6a223ead4220862008a74110772254203f6a2255ad842003ad422086200aad84852208422088a7410c77220320066a2230ad4220862008a7410c77220620276a222fad842040ad4220862054ad84852208422088a74108772227203e6a223fad4220862008a7410877224020556a223ead842003ad4220862006ad84852208a74107772106200d204a6a2203ad4220862016204b6a220aad84202bad4220862028ad84852212422088a7411077222820376a222bad4220862012a7411077223720356a2235ad84200dad4220862016ad84852212422088a7410c77220d20036a2203ad4220862012a7410c772216200a6a220aad842028ad4220862037ad84852212422088a74108772228202b6a222bad4220862012a7410877224a20356a2235ad84200dad4220862016ad84852212a7410777220d200b20486a2216ad422086200c20496a2237ad842041ad4220862043ad84852214422088a74110772241203b6a223bad4220862014a7411077224320396a2239ad84200bad422086200cad84852214422088a7410c77220b20166a220c6a2216ad422086200cad4220862014a7410c77220c20376a2237ad842041ad4220862043ad84852214422088a74108772241203b6a223bad4220862014a7410877224320396a2239ad84200bad422086200cad84852214422088a7410777220b20376a220cad842043ad4220862028ad84852215422088a74110772228202b6a222bad4220862015a7411077223720356a2235ad84200dad422086200bad84852215422088a7410c77220b20166a2248ad4220862015a7410c77220d200c6a2249ad842028ad4220862037ad84852215422088a74108772243202b6a2237ad4220862015a7410877222b20356a2235ad84200bad422086200dad84852215a7410777210b2014a7410777220c20036a2203ad4220862012422088a7410777220d200a6a220aad84204aad4220862041ad84852212422088a74110772216203b6a223bad4220862012a7411077222820396a2239ad84200cad422086200dad84852212422088a7410c77220c20036a224aad4220862012a7410c772203200a6a224bad842016ad4220862028ad84852212422088a74108772228203b6a223bad4220862012a7410877224120396a2239ad84200cad4220862003ad84852212a7410777210d2019204e6a2203ad422086200e204f6a220aad84202cad4220862029ad84852214422088a7411077220c20366a2216ad4220862014a7411077223620346a2234ad842019ad422086200ead84852214422088a7410c77221920036a2203ad4220862014a7410c77220e200a6a220aad84200cad4220862036ad84852214422088a7410877220c20166a2216ad4220862014a7410877222920346a2234ad842019ad422086200ead84852214a741077722192017204c6a220ead4220862018204d6a2236ad842044ad4220862045ad84852256422088a7411077222c203a6a223aad4220862056a7411077224420386a2238ad842017ad4220862018ad84852256422088a7410c772217200e6a22186a220ead4220862018ad4220862056a7410c77221820366a2236ad84202cad4220862044ad84852256422088a74108772244203a6a223aad4220862056a7410877222c20386a2238ad842017ad4220862018ad84852256422088a7410777221720366a2218ad84202cad422086200cad84852257422088a7411077220c20166a2216ad4220862057a7411077223620346a2234ad842019ad4220862017ad84852257422088a7410c772217200e6a224cad4220862057a7410c77221920186a224dad84200cad4220862036ad84852257422088a7410877224520166a2236ad4220862057a7410877222c20346a2234ad842017ad4220862019ad84852257a741077721172056a7410777220c20036a2203ad4220862014422088a74107772216200a6a220aad842029ad4220862044ad84852214422088a74110772218203a6a2219ad4220862014a7411077220e20386a2238ad84200cad4220862016ad84852214422088a7410c77220c20036a224ead4220862014a7410c772203200a6a224fad842018ad422086200ead84852214422088a7410877222920196a223aad4220862014a7410877224420386a2238ad84200cad4220862003ad84852214a74107772119200720526a2203ad422086200920516a220aad842025ad4220862026ad84852256422088a7411077220c20246a2216ad4220862056a74110772218202e6a220ead842007ad4220862009ad84852256422088a7410c77220720036a2203ad4220862056a7410c772209200a6a220aad84200cad4220862018ad84852256422088a7410877220c20166a2216ad4220862056a74108772218200e6a220ead842007ad4220862009ad84852256a74107772207201120506a2209ad422086201020536a2225ad842046ad4220862047ad84852258422088a7411077222620236a2246ad4220862058a74110772247202d6a2250ad842011ad4220862010ad84852258422088a7410c77221120096a22106a2209ad4220862010ad4220862058a7410c77221020256a2225ad842026ad4220862047ad84852258422088a7410877222620466a2246ad4220862058a7410877224720506a2251ad842011ad4220862010ad84852258422088a7410777221120256a2210ad842047ad422086200cad84852259422088a7411077220c20166a2216ad4220862059a74110772225200e6a220ead842007ad4220862011ad84852259422088a7410c77221120096a2250ad4220862059a7410c77220720106a2253ad84200cad4220862025ad84852259422088a7410877224720166a2224ad4220862059a74108772225200e6a222ead84225a2011ad4220862007ad84852259a741077721112058a7410777220c20036a2203ad4220862056422088a74107772216200a6a220aad842018ad4220862026ad84852256422088a7411077221820466a220ead4220862056a7411077221020516a2207ad84200cad4220862016ad84852256422088a7410c77220c20036a2252ad4220862056a7410c772203200a6a2251ad842018ad4220862010ad84852256422088a74108772226200e6a2223ad4220862056a7410877224620076a222dad842258200cad4220862003ad84852256a741077721072013422088a7410777210a2008422088a741077721032015422088a741077721162012422088a7410777210c2057422088a7410777210e2014422088a741077721182059422088a741077721092056422088a741077721102033417f6a22330d000b20012903c802210820012903d0022112200120323602bc03200120313602b803200120303602b4032001202f3602b003200120483602ac03200120493602a8032001204a3602a4032001204b3602a0032001204c36029c032001204d360298032001204e360294032001204f360290032001205036028c03200120533602880320012052360284032001205136028003200120053602fc03200120033602f803200120063602f4032001200a3602f0032001200b3602ec032001200c3602e8032001200d3602e403200120163602e003200120173602dc03200120183602d803200120193602d4032001200e3602d003200120113602cc03200120103602c803200120073602c403200120093602c00320012058370388042001205a370380042001203f3602bc042001203e3602b8042001203d3602b4042001203c3602b0042001203b3602ac04200120393602a804200120373602a404200120353602a0042001203a36029c04200120383602980420012036360294042001203436029004200120403602fc04200120423602f8042001202a3602f404200120273602f004200120413602ec04200120433602e8042001202b3602e404200120283602e004200120443602dc04200120453602d8042001202c3602d404200120293602d004200120463602cc04200120473602c804200120253602c404200120263602c00420012802a802210520012802ac02210320012802b002210620012802b402210a20012802b802210b20012802bc02210c20012802c002210d20012802c402211620014180056a41086a201a41086a2903002213370300200120123703b805200120123703a80520012012370398052001201a2903002212370380052001200842037c22143e02b005200120144220883e02b4052001200842027c22143e02a005200120144220883e02a4052001200842017c22143e029005200120144220883e0294052001200842047c22083e02c802200120084220883e02cc02200128028003211720012802840321182001280288032119200128028c03210e20012802c003211120012802c403211020012802c803210720012802cc032109200128028004214020012802840421422001280288042134200128028c04213620012802c0042138200128028405213a20012802c404212520012802c80421262001200128028c0520012802cc046a36025c200120262013a76a3602582001203a20256a360254200120382012a76a3602502001201620366a36024c2001200d20346a3602482001200c20426a3602442001200b20406a3602402001200a20096a36023c2001200620076a3602382001200320106a3602342001200520116a3602302001200e41f4ca81d9066a36022c2001201941b2da88cb076a3602282001201841eec88199036a3602242001201741e5f0c18b066a360220200128029003211720012802940321182001280298032119200128029c03210e20012802d003211120012802d403211020012802d803210720012802dc032109200128029004214020012802940421422001280298042134200128029c04213620012802d0042138200128029005213a20012802d4042125200128029405212620012802d804212720012802980521282001201e28020020012802dc046a36029c012001202820276a360298012001202620256a360294012001203a20386a360290012001201620366a36028c012001200d20346a360288012001200c20426a360284012001200b20406a360280012001200a20096a36027c2001200620076a3602782001200320106a3602742001200520116a3602702001200e41f4ca81d9066a36026c2001201941b2da88cb076a3602682001201841eec88199036a3602642001201741e5f0c18b066a36026020012802a003211720012802a403211820012802a803211920012802ac03210e20012802e003211120012802e403211020012802e803210720012802ec03210920012802a004214020012802a404214220012802a804213420012802ac04213620012802e004213820012802a005213a20012802e404212520012802a405212620012802e804212720012802a80521282001201f28020020012802ec046a3602dc012001202820276a3602d8012001202620256a3602d4012001203a20386a3602d0012001201620366a3602cc012001200d20346a3602c8012001200c20426a3602c4012001200b20406a3602c0012001200a20096a3602bc012001200620076a3602b8012001200320106a3602b4012001200520116a3602b0012001200e41f4ca81d9066a3602ac012001201941b2da88cb076a3602a8012001201841eec88199036a3602a4012001201741e5f0c18b066a3602a00120012802b003211720012802b403211820012802b803211920012802bc03210e20012802f003211120012802f403211020012802f803210720012802fc03210920012802b004214020012802b404214220012802b804213420012802bc04213620012802f004213820012802b005213a20012802f404212520012802b405212620012802f804212720012802b80521282001202028020020012802fc046a36029c022001202820276a360298022001202620256a360294022001203a20386a360290022001201620366a36028c022001200d20346a360288022001200c20426a360284022001200b20406a360280022001200a20096a3602fc012001200620076a3602f8012001200320106a3602f4012001200520116a3602f0012001200e41f4ca81d9066a3602ec012001201941b2da88cb076a3602e8012001201841eec88199036a3602e4012001201741e5f0c18b066a3602e00141002105200141003602a0020b200141206a20054102746a35020021082001200541016a22053602a0022022201d20087e2208a7490d000b2021201b4f0d08201b2008422088a722054d0d07201c20214102746a220328020021062003201c20054102746a220528020036020020052006360200201d427f7c211d202141014b0d000b0b20004188026a2802004101460d0120012802f80221050c020b2001410036022820014204370320200141206a109b080c020b20012802f80222052000418c026a280200200f6c2203490d00200120033602f802200321050b200141003602c804200142043703c004200141c0046a4100200f10ec012005200f70210d2005200f6e211620012802c8042205200f6a211720012802c0042005410c6c6a210b4100210c0340417f4100200d200c4b1b20166b220320012802f80222056a220620054b0d0220014100360288052001420437038005200120063602f80220012802f002210a20014180056a4100410020034102746b410276109502200a20054102746a2105200a20064102746a210a2001280288052106024002402003450d0020012802800520064102746a2103034020032005417c6a2205280200360200200641016a2106200341046a21032005200a470d000b2001200636028805200a21030c010b200120063602880502400240200a2005470d00200a21030c010b2005200a6b417c6a417c71200a6a41046a21030b2005210a0b200c41016a210c200a20036b2105024003402005450d012005417c6a21050c000b0b200b200129038005370200200b41086a20014180056a41086a280200360200200b410c6a210b200c200f470d000b200120173602c80420014188056a2017360200200120012903c0043703800520014180056a109b0820012802f40241ffffffff0371450d0020012802f002102c0b200141386a4200370300200141306a4200370300200141206a41086a220542003703002001420037032020014180056a41bee8c700410d10c501200520014180056a41086a2203290000370300200120012900800537032020014180056a41f4eec700411410c501200441086a2003290000370000200420012900800537000020014180056a200141206a412010b903200129028405420020012802800522051b21082005410420051b211120002802f001450d032001280218220d450d0820012802102110200d417f6a210720014180036a41046a2119200141c0036a41086a210e4100211641002103034020102003412c6c6a210520002802f40121182003210a024002400240024002400240024002400340200d200a460d012005280200210c02400240200541246a28020020184b0d00200141c0046a41f1ddc700410510c50120014180056a41e8fec000410b10c5012001200c36028003200141c0036a20014180036a410410c7012001201936022c2001200e360224200120014180036a3602282001200141c0036a36022020014180046a200141206a107e200128028804220341206a2206417f4c0d040240024020060d004101210b0c010b20061032220b450d060b200141003602c803200120063602c4032001200b3602c003200141c0036a4100411010c80120012802c00320012802c80322066a220b20012900c004370000200b41086a200141c0046a41086a2900003700002001200641106a22063602c803200141c0036a2006411010c80120012802c00320012802c80322066a220b200129008005370000200b41086a20014180056a41086a2900003700002001200641106a220b3602c8032001280280042106200141c0036a200b200310c80120012802c003220b20012802c80322176a2006200310c9081a2001201720036a22033602c8030240200128028404450d002006102c0b200141206a200b200310b30102400240200128022022060d00410021030c010b410121032001280224450d002006102c0b024020012802c403450d00200b102c0b20030d010b024002402008422088a722170e020a00010b41002105200c2011280200470d090c080b4100210520172103034020052003410176220620056a220b200c2011200b4102746a280200491b2105200320066b220341014b0d000c070b0b02402016450d00200a20166b2203200d4f0d05200141206a41286a22062005201641546c6a220341286a220b280200360200200141206a41206a220c200341206a2217290200370300200141206a41186a2218200341186a2209290200370300200141206a41106a2240200341106a2242290200370300200141206a41086a2234200341086a223629020037030020012003290200370320200541086a22382902002112200541106a223a2902002113200541186a22252902002114200541206a22262902002115200541286a2227280200212820032005290200370200200b202836020020172015370200200920143702002042201337020020362012370200202720062802003602002026200c29030037020020252018290300370200203a204029030037020020382034290300370200200520012903203702000c090b2005412c6a210541002116200d200a41016a220a470d000c0f0b0b200d200d41f48ac500103f000b103b000b1039000b2003200d41e48ac500103f000b200c201120054102746a280200470d0120052017490d00200520171047000b201120054102746a2203200341046a2005417f7320176a41027410ca081a20084280808080707c21080b201641016a21160b200a41016a21032007200a460d050c000b0b2006200541d089c5001059000b2005201b419c86c400103f000b2021201b41e48ac500103f000b024020012802142205450d002005412c6c450d002001280210102c0b2001420037031820014204370310200842ffffffff0f8321080c050b2016450d0020012802182205200d20166b220d4f0d012005210d0c020b2001280218210d0c010b2001200d3602180b200d450d00200d412c6c2106200128021041286a210541002103034020002802f001220a450d0320052003200a703602002005412c6a2105200341016a2103200641546a22060d000b0b20002802f0012205450d022001200d20057036021c0b200120113602c004200120083702c404200141386a4200370300200141306a4200370300200141206a41086a220542003703002001420037032020014180056a41bee8c700410d10c501200520014180056a41086a2203290000370300200120012900800537032020014180056a41f4eec700411410c501200441086a20032900003700002004200129008005370000200141206a4120200141c0046a10d1040240200842ffffffff0383500d002011102c0b2005200141106a41086a29030037030020012001290310370320200141206a10a406200224000f0b41c0fac70041394180fcc700103c000b41c0fac70041394190fcc700103c000be30401047f23004190016b220524002005200436020420052003360200024002400240200241074b0d0041002802d8d248450d0120054126360244200541e59ec00036024041002802d4d248210241002802d0d248210341002802dcd248210420054188016a41e90036020020054180016a42df80808010370300200541fc006a419e9fc000360200200541f4006a4213370200200541f0006a418b9fc000360200200541e8006a4201370300200541d8006a4201370300200541d0006a4113360200200541e4006a200541086a360200200541b4b5c8003602542005418b9fc00036024c200541013602482005410436020c200241e0a3c000200441024622041b28021021022005200541c0006a360208200341f8a3c00020041b200541c8006a20021103000c010b2002417c714108460d0020012800082102200541c8006a200510ef04200541086a41086a200541d4006a290200370300200541086a41106a2203200541dc006a290200370300200541086a41186a2204200541e4006a290200370300200541086a41206a2201200541ec006a290200370300200541086a41286a2206200541f4006a290200370300200541086a41306a2207200541fc006a2802003602002005200529024c370308024020052802482208450d00200020083602042000200236020020002005290308370208200041106a200541106a290300370200200041186a2003290300370200200041206a2004290300370200200041286a2001290300370200200041306a2006290300370200200041386a20072802003602000c020b200041003602040c010b200041003602040b20054190016a24000bc80302017f017e230041e0006b220524002005200436020420052003360200024002400240200241074b0d0041002802d8d248450d012005412636020c200541e59ec00036020841002802d4d248210241002802d0d248210341002802dcd2482104200541d0006a41e900360200200541c8006a42df80808010370300200541c4006a419e9fc0003602002005413c6a4213370200200541386a418b9fc000360200200541306a4201370300200541206a4201370300200541186a41133602002005412c6a200541d8006a360200200541b4b5c80036021c2005418b9fc000360214200541013602102005410436025c200241e0a3c000200441024622041b28021021022005200541086a360258200341f8a3c00020041b200541106a20021103000c010b2002417c714108460d0020012800082103200541106a200510b006024020052802102202450d00200529021421060240200528020422044104490d00200020063702082000200236020420002003360200200041106a2005280200220228000036020020052004417c6a3602042005200241046a3602000c030b2006428080808010540d002002102c0b200041003602040c010b200041003602040b200541e0006a24000b3400200041f6ddc70036020420004100360200200041146a4102360200200041106a4180efc600360200200041086a420b3702000b13002000411736020420004190fac6003602000bf6840103247f057e197f230041d0076b22042400200441a8056a41086a22052001410c6a290000370300200441a8056a41106a2206200141146a290000370300200441a8056a41186a22072001411c6a290000370300200441d8066a41086a22082001412c6a290200370300200441d8066a41106a2209200141346a290200370300200441d8066a41186a220a2001413c6a290200370300200420012900043703a805200420012902243703d8062001280200210b200441c8026a41186a220c200141dc006a290000370300200441c8026a41106a220d200141d4006a290000370300200441c8026a41086a220e200141cc006a29000037030020044180066a41086a220f200141ec006a29000037030020044180066a41106a2210200141f4006a29000037030020044180066a41186a2211200141fc006a29000037030020044198076a41086a22122001418c016a29000037030020044198076a41106a221320014194016a29000037030020044198076a41186a22142001419c016a290000370300200420012900443703c802200420012900643703800620042001290084013703980720044180016a200141dc016a290000370300200441f8006a200141d4016a290000370300200441f0006a200141cc016a290000370300200441e8006a200141c4016a290000370300200441c8006a41186a200141bc016a290000370300200441c8006a41106a200141b4016a290000370300200441c8006a41086a200141ac016a290000370300200420012900a401370348200441286a200141e4016a10990120044188026a41186a200729030037030020044188026a41106a200629030037030020044188026a41086a2005290300370300200441e8016a41086a2008290300370300200441e8016a41106a2009290300370300200441e8016a41186a200a290300370300200441c8016a41086a200e290300370300200441c8016a41106a200d290300370300200441c8016a41186a200c290300370300200420042903a80537038802200420042903d8063703e801200420042903c8023703c801200441a8016a41186a2011290300370300200441a8016a41106a2010290300370300200441a8016a41086a200f29030037030020044188016a41086a201229030037030020044188016a41106a201329030037030020044188016a41186a201429030037030020042004290380063703a80120042004290398073703880120014198026a280200211520014194026a280200211620014190026a28020021172001418c026a280200211820014188026a280200211920014184026a280200211a20014180026a280200211b200141fc016a280200211c200141f8016a280200211d200141f4016a280200211e200141f0016a280200211f200141ec016a2802002120200141e8016a280200212120012802e4012114200742003703002006420037030020054200370300200442003703a805200441a8026a41ac95c400410d10c5012005200441a8026a41086a290000370300200420042900a8023703a805200441b8026a41c695c400410c10c5012007200441b8026a41086a290000370300200620042900b802370300200441c8026a200441a8056a10f50220042802f402212220042802a0032123200228020421092002280200210a2004411436028807200742003703002006420037030020054200370300200442003703a80520044180066a41ffdcc700410710c5012005200f29000037030020042004290080063703a805200441d8066a418893c700410a10c50120072008290000370300200620042900d806370300200441c8026a200441a8056a10e1010240024020042802c80222050d00200441003602c807200442013703c0070c010b200420042902cc023702c407200420053602c0070b200441c0056a4200370300200441a8056a41106a4200370300200441a8056a41086a22054200370300200442003703a805200441a8026a41e6dcc700410710c5012005200441a8026a41086a290000370300200420042900a8023703a805200441b8026a4188bbc200410910c501200641086a200441b8026a41086a290000370000200620042900b802370000200441c8026a200441a8056a10cb03024002400240024020042903c8024202510d00200441c8026a41106a280200210520044180066a41e6dcc700410710c501200441d8066a419b92c100411010c5012004200536029807200441b0066a20044198076a410410c701200441d4026a20044198076a41046a3602002004200441b0066a41086a3602cc02200420044198076a3602d0022004200441b0066a3602c802200441a8056a200441c8026a107e20042802b005220541206a2207417f4c0d010240024020070d00410121080c010b200710322208450d030b200441003602e805200420073602e405200420083602e005200441e0056a4100411010c80120042802e00520042802e80522076a2208200429008006370000200841086a20044180066a41086a2900003700002004200741106a22073602e805200441e0056a2007411010c80120042802e00520042802e80522076a220820042900d806370000200841086a200441d8066a41086a2900003700002004200741106a22083602e80520042802a8052107200441e0056a2008200510c80120042802e005222420042802e80522086a2007200510c9081a2004200820056a22253602e805024020042802ac05450d002007102c0b200441c8026a2024202510cc03200441a8056a41086a200441c8026a410c6a290200370300200420042902cc023703a8050240024020042802c8024101460d00200441b0066a410c6a4100360200200442003703b0060c010b200441b0066a41086a200441a8056a41086a290300370300200420042903a8053703b0060b200441003602a0072004200936029c072004200a36029807200420044188076a3602a8072004200441c0076a3602a407200441c8026a20044198076a20044198076a410c6a2212108508024020042d00c8024101470d00200441c8026a41106a210f200441b0066a4104722113200441c8026a4101722107200441c8056a2126200441ce056a21270340200441a8056a41186a220c200741186a2900002228370300200441a8056a41106a220d200741106a2900002229370300200441a8056a41086a220e200741086a290000222a37030020044180066a41086a2205202a37030020044180066a41106a2209202937030020044180066a41186a220a20283703002004200729000022283703a805200420283703800620042802a8072802002108200441d8066a41186a2210200a290300370300200441d8066a41106a220a2009290300370300200441d8066a41086a2211200529030037030020042004290380063703d8060240024020042802b4062205450d0020042802b80621090c010b41940310322205450d054100210920054100360200200520042902a805370204200541003b01322005410c6a200e290200370200200541146a200d2902003702002005411c6a200c290200370200200541246a20262902003702002005412a6a2027290100370100200541346a200441c8026a41e00210c9081a200441003602b806200420053602b4060b200441c8026a20092005200441d8066a1090020240024020042802c8024101470d00200e20112903002228370300200d200a2903002229370300200c2010290300222a370300200420042903d806222b3703a80520042902cc02212c20042802d4022105200f202b370200200f41086a2028370200200f41106a2029370200200f41186a202a370200200420133602d402200420053602d0022004202c3703c802200441c8026a410010cd0321050c010b20042802d00220042802d4024102746a41046a21050b2005200528020020086a360200200420042802b00620086a3602b006200441c8026a20044198076a201210850820042d00c8024101460d000b0b200441c8026a410c6a200441b0066a41086a290300370200200420042903b0063702cc02200441013602c80220242025200441c8026a41047210ce03200441c8026a41086a10cf0320042802e405450d002024102c0b024020042802c40741ffffff3f71450d0020042802c007102c0b02400240201c0d004100212d0c010b2001280200210f200441a8026a41f1ddc700410510c501200441b8026a4191f6c000411210c5012004200f3602d806200441b0066a200441d8066a410410c701200441d4026a200441d8066a41046a3602002004200441b8066a3602cc022004200441d8066a3602d0022004200441b0066a3602c802200441a8056a200441c8026a107e20042802b005220541206a2207417f4c0d010240024020070d00410121080c010b200710322208450d030b20044100360288062004200736028406200420083602800620044180066a4100411010c80120042802800620042802880622076a220820042900a802370000200841086a200441a8026a41086a2900003700002004200741106a22073602880620044180066a2007411010c80120042802800620042802880622076a220820042900b802370000200841086a200441b8026a41086a2900003700002004200741106a22073602880620042802a805210820044180066a2007200510c801200428028006220720042802880622096a2008200510c9081a2004200920056a220536028806024020042802ac05450d002008102c0b200441206a2007200510c6010240024020042802204101460d002004201a3602e0062004201b3602dc062004201c3602d806200441a8026a41f1ddc700410510c501200441b8026a41d081c100410a10c5012004200f36029807200441b0066a20044198076a410410c701200441d4026a20044198076a41046a3602002004200441b8066a3602cc02200420044198076a3602d0022004200441b0066a3602c802200441a8056a200441c8026a107e20042802b005220841206a220f417f4c0d0302400240200f0d00410121090c010b200f10322209450d050b200441003602d0022004200f3602cc02200420093602c802200441c8026a4100411010c80120042802c80220042802d002220f6a220920042900a802370000200941086a200441a8026a41086a2900003700002004200f41106a220f3602d002200441c8026a200f411010c80120042802c80220042802d002220f6a220920042900b802370000200941086a200441b8026a41086a2900003700002004200f41106a22093602d00220042802a805210f200441c8026a2009200810c80120042802c802220920042802d002220a6a200f200810c9081a2004200a20086a22083602d002024020042802ac05450d00200f102c0b2023410246210f20092008200441d8066a108a03024020042802cc02450d002009102c0b41002022200f1b21080240201b450d00201c102c0b200820006a21080c010b20042802242108201b450d00201c102c0b200420083602c80220072005200441c8026a410410a7020240200428028406450d002007102c0b4101212d0b20012802002105200441a8026a4181dec700410310c501200441b8026a41a4bfc000411510c501200420053602d806200441b0066a200441d8066a410410c701200441d4026a200441d8066a41046a3602002004200441b8066a222e3602cc022004200441d8066a3602d0022004200441b0066a3602c802200441a8056a200441c8026a107e20042802b005220541206a2207417f4c0d000240024020070d00410121080c010b200710322208450d020b200441003602e006200420073602dc06200420083602d806200441d8066a4100411010c80120042802d80620042802e00622076a220820042900a802370000200841086a200441a8026a41086a2900003700002004200741106a22073602e006200441d8066a2007411010c80120042802d80620042802e00622076a220820042900b802370000200841086a200441b8026a41086a2900003700002004200741106a22083602e00620042802a8052107200441d8066a2008200510c80120042802d806220920042802e00622086a2007200510c9081a2004200820056a220a3602e006024020042802ac05450d002007102c0b200441c8026a2009200a10cd0120042902cc022228420020042802c80222051b21292005410420051b2108024002402028422088a7410020051b22052016490d00024002402016450d00200520166b220c41ffffffff0071200c470d04200c4104742205417f4c0d044104210f02402005450d0020051032220f450d060b200f200820164104746a200c41047410c9081a202942ffffffff0f832016ad4220868421282005410476210e2008210d0c010b2029a7220e41ffffffff0071200e470d03200e4104742205417f4c0d034104210d02402005450d0020051032220d450d050b2005410476ad21282029422088a7210c2008210f0b02402028422088a72205450d0020054104742107200d41046a210503400240200541046a280200450d002005280200102c0b200541106a2105200741706a22070d000b0b02402028a72205450d00200d450d00200541ffffffff0071450d00200d102c0b200cad422086200ead8421280c010b202942ffffffff0f83212802402029422088a72205450d002005410474210f4100210503400240200820056a220741086a280200450d00200741046a280200102c0b200f200541106a2205470d000b0b2008210f0b2004200f3602c802200420283702cc022009200a200441c8026a10cf0102402028422088a72205450d0020054104742107200f41046a210503400240200541046a280200450d002005280200102c0b200541106a2105200741706a22070d000b0b0240202842ffffffff0083500d00200f102c0b024020042802dc06450d002009102c0b0240024002400240024002402020450d0020012802002113201441086a21052020410c6c220741746a210f410021080340200528020020086a21082005410c6a2105200741746a22070d000b200441a8026a4184dec700410310c501200441b8026a418894c600411310c501200420133602d806200441b0066a200441d8066a410410c701200441c8026a410c6a200441d8066a41046a3602002004202e3602cc02200f410c6e21092004200441d8066a3602d0022004200441b0066a3602c802200441a8056a200441c8026a107e20042802b005220541206a2207417f4c0d064101210f02402007450d0020071032220f450d080b200441003602880620042007360284062004200f3602800620044180066a4100411010c80120042802800620042802880622076a220f20042900a802370000200f41086a200441a8026a41086a2900003700002004200741106a22073602880620044180066a2007411010c80120042802800620042802880622076a220f20042900b802370000200f41086a200441b8026a41086a2900003700002004200741106a220f3602880620042802a805210720044180066a200f200510c801200428028006220f200428028806220a6a2007200510c9081a2004200a20056a220536028806024020042802ac05450d002007102c0b200441c8026a200f20051083050240024020042802d00222100d0041e00010322210450d0941082105200441b4056a4108360200200420103602b005200442003703a8054100210a4100210e0c010b200441b4056a20042802d4022205360200200420103602b005200420042903c80222283703a8052028422088a7210a2028a7210e0b200941016a21262014410c6a210720142020410c6c22096a2111200441b0056a21162014210c024002400340200c210f024002402009450d00200f280200220d0d0120112007460d0003402007410c6a21050240200741046a280200450d002007280200102c0b2005210720112005470d000b0b02402021450d002021410c6c450d002014102c0b200441c8026a41086a200441a8056a41086a2903002228370300200420042903a8053703c802200428028806210d200428028006210c2028a722090d02200c200d10b4010c030b200f410c6a210c200f2902042128024002402005417f6a220f200a200e6b71200f460d00200a210f0c010b2005417f2011200c6b410c6d220f41016a22122012200f491b6a220f2005490d064100417f200f417f6a6776200f4102491b221241016a220f2012490d060240200f20054b0d00200a210f0c010b20162005200f20056b10850520042802b405210a0240024020042802a805220e20042802ac05220f4b0d0020042802b00521100c010b0240200f2005200e6b2212490d00200e410c6c210520042802b0052210200a20126b220e410c6c6a201020056a2012410c6c10c9081a2004200e3602a8050c010b20042802b00522102005410c6c6a2010200f410c6c10c9081a2004200f20056a220f3602ac050b200a21050b20042005417f6a200f41016a71220a3602ac052010200f410c6c6a220f2028370204200f200d360200200941746a21092007410c6a21070c000b0b20042802d402417f6a220a20042802cc02220f20042802c80222056b712210410c6c41046a2207417f4c0d070240024020070d004101210e0c010b20071032220e450d090b200441003602e006200420073602dc062004200e3602d806200441d8066a2010108f010240200f2005460d00034020092005410c6c6a22072802002007280208200441d8066a10bb01200541016a200a712205200f470d000b0b200c200d20042802d806220520042802e00610a702024020042802dc06450d002005102c0b200441c8026a10aa060b0240200428028406450d00200c102c0b200441a8026a4184dec700410310c501200441b8026a41f494c600411610c501200420133602d806200441b0066a200441d8066a410410c701200441d4026a200441d8066a41046a3602002004200441b8066a3602cc022004200441d8066a3602d0022004200441b0066a3602c802200441a8056a200441c8026a107e20042802b005220541206a2207417f4c0d060240024020070d004101210f0c010b20071032220f450d080b200441003602e006200420073602dc062004200f3602d806200441d8066a4100411010c80120042802d80620042802e00622076a220f20042900a802370000200f41086a200441a8026a41086a2900003700002004200741106a22073602e006200441d8066a2007411010c80120042802d80620042802e00622076a220f20042900b802370000200f41086a200441b8026a41086a2900003700002004200741106a22073602e00620042802a805210f200441d8066a2007200510c80120042802d806220720042802e00622096a200f200510c9081a2004200920056a22053602e006024020042802ac05450d00200f102c0b200441c8026a2007200510a004200441c8026a41086a220f280200210920042802cc02210a20042802c802210c200441013602c802200f20094100200c410146220c1b20086a3602002004200a4100200c1b20266a3602cc0220072005200441c8026a41047210a104024020042802dc06450d002007102c0b200441c0056a4200370300200441b8056a4200370300200441a8056a41086a22054200370300200442003703a80520044180066a4184dec700410310c501200520044180066a41086a29000037030020042004290080063703a805200441d8066a41fc95c600410d10c501200641086a200441d8066a41086a290000370000200620042900d806370000200441c8026a200441a8056a412010b903024002400240024020042802c80222090d0041002105200441003602a0072004420437039807410021074100210a0c010b200420042902cc02222837029c072004200936029807410021050240024002402028422088a7220a0e020201000b41002105200a2107034020052007410176220820056a220f20132009200f4102746a280200491b2105200720086b220741014b0d000b0b2013200920054102746a2802002207460d03200a2005201320074b6a2205490d070b200a2028a72207470d010b20044198076a200710d20420042802980721090b200920054102746a220741046a2007200a20056b41027410ca081a200720133602002004200a41016a3602a0070b200441c8026a41086a20044198076a41086a280200360200200420042903980722283703c80202402028a722050d00200441c0056a4200370300200441b8056a4200370300200441a8056a41086a22054200370300200442003703a80520044180066a4184dec700410310c501200520044180066a41086a29000037030020042004290080063703a805200441d8066a41fc95c600410d10c501200641086a200441d8066a41086a290000370000200620042900d806370000200441a8056a412010b4010c020b200441c0056a4200370300200441b8056a4200370300200441a8056a41086a22074200370300200442003703a80520044180066a4184dec700410310c501200720044180066a41086a29000037030020042004290080063703a805200441d8066a41fc95c600410d10c501200641086a200441d8066a41086a290000370000200620042900d806370000200441a8056a4120200441c8026a10d10420042802cc0241ffffffff0371450d012005102c0c010b2021450d002014450d002021410c6c450d002014102c0b2001280200201510c30720012802002121200441a8056a41186a22114200370300200441a8056a41106a22124200370300200441a8056a41086a220e4200370300200442003703a805200441a8026a41c1dcc700410610c501200e200441a8026a41086a2226290000370300200420042900a8023703a805200441b8026a4196a4c600410610c501200641086a200441b8026a41086a2227290000370000200620042900b802370000200441186a200441a8056a412010c601201f201d4104746a210d201f2105201d450d02200428021c410020042802181b212f200d41706a213020044188076a41046a2131200441c0076a41046a2132200441b0066a41086a2133200441c0076a41086a213420044188076a41086a211d2004419d036a2135200441fd026a210a200441b0066a41206a2136200441ec026a2137200441c8026a410472213820044198076a4104722139201f2105034020052109024003400240200941046a28020022100d00200941106a21050c060b2009280200210f200941086a2902002128200441a8026a4187dec700410410c501200441b8026a41acb1c500410c10c501200441003602a007200442013703980720044198076a41004104102f20042802980720042802a00722056a20213600002004200541046a22053602a00720044198076a20054104102f200428029807220520042802a00722076a200f3600002004200741046a22073602a00720044188076a2005200710c7012004200520076a3602b405200420053602b0052004201d3602ac05200420044188076a3602a805200441c0076a200441a8056a107e0240200428029c07450d002005102c0b20042802c807220541206a2207417f4c0d070240024020070d00410121080c010b200710322208450d090b20044100360290072004200736028c07200420083602880720044188076a4100411010c80120042802880720042802900722076a220820042900a802370000200841086a20262900003700002004200741106a22073602900720044188076a2007411010c80120042802880720042802900722076a220820042900b802370000200841086a20272900003700002004200741106a22083602900720042802c007210720044188076a2008200510c8012004280288072208200428029007220c6a2007200510c9081a2004200c20056a220536029007024020042802c407450d002007102c0b200441c8026a2008200510f302200e200441c8026a41086a22152903003703002012200441c8026a41106a22242903003703002011200441c8026a41186a2225290300370300200441a8056a41206a2207200441c8026a41206a221a290300370300200441a8056a41286a220c200441c8026a41286a222228020036020020044198076a41086a2213200a41086a222329000037030020044198076a41106a2214200a41106a223a29000037030020044198076a41186a2216200a41186a223b29000037030020044198076a411f6a2220200a411f6a280000360000200420042903c8023703a8052004200a29000037039807024020042d00fc02223c41024622050d0020042802f802213d20042802f402213e200441d8066a41286a200c280200360200200441d8066a41206a2007290300370300200441d8066a41186a2011290300370300200441d8066a41106a2012290300370300200441d8066a41086a200e29030037030020332013290300370300200441b0066a41106a2014290300370300200441b0066a41186a2016290300370300200441b0066a411f6a2020280000360000200420042903a8053703d80620042004290398073703b0060b0240200428028c07450d002008102c0b0240024020050d0020044180066a41286a2216200441d8066a41286a28020036020020044180066a41206a2220200441d8066a41206a29030037030020044180066a41186a223f200441d8066a41186a220529030037030020044180066a41106a2240200441d8066a41106a220729030037030020044180066a41086a2241200441d8066a41086a2208290300370300200441e0056a41086a220c2033290300370300200441e0056a41106a2213200441b0066a41106a290300370300200441e0056a41186a2214200441b0066a41186a290300370300200420042903d80637038006200420042903b0063703e005200441dc056a41026a2242203641026a2d00003a0000200420362f00003b01dc052004201036029c072004202f36029807203e41016a2143200420283703a007203d2028422088a722446a214502400240203c4101460d00200542003703002007420037030020084200370300200442003703d8060c010b20052014290300370300200720132903003703002008200c290300370300200420042903e0053703d8060b200441a8056a203910ca01203841186a2005290300370200203841106a2007290300370200203841086a2008290300370200203820042903d806370200203720042903a805370000203741086a200e290300370000203741106a2012290300370000203741186a20112903003700002004202f3602c802200441e0056a200441c8026a10cb0120222016280200360200201a20202903003703002025203f2903003703002024204029030037030020152041290300370300200a20042903e0053700002023200c290300370000203a2013290300370000203b201429030037000020042004290380063703c802200441013a00fc02200420453602f802200420433602f402203541026a20422d00003a0000203520042f01dc053b0000200441a8026a4187dec700410410c501200441b8026a41acb1c500410c10c501200441003602b806200442013703b006200441b0066a41004104102f20042802b00620042802b80622056a20213600002004200541046a22053602b806200441b0066a20054104102f20042802b006220520042802b80622076a200f3600002004200741046a22073602b80620044188076a2005200710c7012004200520076a3602b405200420053602b0052004201d3602ac05200420044188076a3602a805200441c0076a200441a8056a107e024020042802b406450d002005102c0b20042802c807220541206a2207417f4c0d090240024020070d00410121080c010b200710322208450d0b0b200441003602b005200420073602ac05200420083602a805200441a8056a4100411010c80120042802a80520042802b00522076a220820042900a802370000200841086a20262900003700002004200741106a22073602b005200441a8056a2007411010c80120042802a80520042802b00522076a220820042900b802370000200841086a20272900003700002004200741106a22083602b00520042802c0072107200441a8056a2008200510c80120042802a805220820042802b005220c6a2007200510c9081a2004200c20056a22053602b005024020042802c407450d002007102c0b20082005200441c8026a109005024020042802ac05450d002008102c0b200441a8026a4187dec700410410c501200441b8026a41d09ac500411310c501200441003602b005200442013703a805200441a8056a41004104102f20042802a80520042802b00522056a20213600002004200541046a22053602b005200441a8056a20054104102f20042802a805220520042802b00522076a200f3600002004200741046a22073602b005200441c0076a2005200710c7012004200520076a3602d402200420053602d002200420343602cc022004200441c0076a3602c802200441b0066a200441c8026a107e024020042802ac05450d002005102c0b20042802b806220541206a2207417f4c0d090240024020070d00410121080c010b200710322208450d0b0b200441003602c807200420073602c407200420083602c007200441c0076a4100411010c80120042802c00720042802c80722076a220820042900a802370000200841086a20262900003700002004200741106a22073602c807200441c0076a2007411010c80120042802c00720042802c80722076a220820042900b802370000200841086a20272900003700002004200741106a22083602c80720042802b0062107200441c0076a2008200510c80120042802c007220820042802c807220c6a2007200510c9081a2004200c20056a22053602c807024020042802b406450d002007102c0b2028a72107200441003602b005200442013703a805200441a8056a41004104102f20042802a80520042802b005220c6a202f3600002004200c41046a3602b00520102044200441a8056a10bb01201520042802b005360200200420042903a8053703c80220082005200441c8026a10f402024020042802c407450d002008102c0b02402007450d002010102c0b200441a8026a4187dec700410410c501200441b8026a41f19ac500411210c5012004200f3602c007200441b0066a200441c0076a410410c701200420323602d402200420333602cc022004200441c0076a3602d0022004200441b0066a3602c802200441a8056a200441c8026a107e20042802b005220541206a2207417f4c0d090240024020070d00410121080c010b200710322208450d0b0b200441003602d002200420073602cc02200420083602c802200441c8026a4100411010c80120042802c80220042802d00222076a220820042900a802370000200841086a20262900003700002004200741106a22073602d002200441c8026a2007411010c80120042802c80220042802d00222076a220820042900b802370000200841086a20272900003700002004200741106a22083602d00220042802a8052107200441c8026a2008200510c80120042802c802220820042802d002220c6a2007200510c9081a2004200c20056a22053602d002024020042802ac05450d002007102c0b200441a8056a2008200510f7040240024020042802a80522050d0041002114200441003602c807200442043703c007410421054100210c0c010b200420042902ac0522283702c407200420053602c0072028422088a721142028a7210c0b024020042802cc02450d002008102c0b2014450d0120052014417f6a4104746a2207280200202f470d012007410c6a2105200741046a210c0240200728020c2208200741086a280200470d00200c200810d2042005280200210820042802c80721140b200c28020020084102746a20213602002005200528020041016a3602000c030b02402028a7450d002010102c0b200941106a2209200d470d010c070b0b410410322207450d072007202136020002402014200c470d00200441c0076a201410ce0120042802c807211420042802c00721050b200520144104746a220520073602042005202f360200200541086a4281808080103702002004201441016a22143602c8070b20042802c407211520042802c0072116200441a8026a4187dec700410410c501200441b8026a41f19ac500411210c5012004200f36028807200441b0066a20044188076a410410c701200420313602d4022004202e3602cc02200420044188076a3602d0022004200441b0066a3602c802200441a8056a200441c8026a107e20042802b005220541206a2207417f4c0d050240024020070d00410121080c010b200710322208450d070b200441003602b806200420073602b406200420083602b006200441b0066a4100411010c80120042802b00620042802b80622076a220820042900a802370000200841086a20262900003700002004200741106a22073602b806200441b0066a2007411010c80120042802b00620042802b80622076a220820042900b802370000200841086a20272900003700002004200741106a22083602b80620042802a8052107200441b0066a2008200510c80120042802b006222020042802b80622086a2007200510c9081a2004200820056a22243602b806024020042802ac05450d002007102c0b201441047422104104722205417f4c0d05200510322207450d06200441003602d002200420053602cc02200420073602c802200441c8026a2014108f0102402014450d00201620144104746a21132016210c0340200c2802002105200441c8026a20042802d0024104102f20042802c80220042802d00222076a20053600002004200741046a3602d002200c2802042105200441c8026a200c28020c2207108f01200c41106a210c02402007450d002007410274210720042802d002210803402005280200210f200441c8026a20084104102f20042802c80220042802d00222086a200f3600002004200841046a22083602d002200541046a21052007417c6a22070d000b0b200c2013470d000b0b2020202420042802c802220520042802d00210a702024020042802cc02450d002005102c0b024020042802b406450d002020102c0b02402014450d00201641046a210503400240200541046a28020041ffffffff0371450d002005280200102c0b200541106a2105201041706a22100d000b0b02402015450d002016450d00201541ffffffff0071450d002016102c0b200941106a210520302009470d000c040b0b41e8c4c800411141909fc700105c000b2005200a1044000b200d2005460d000340200541106a21070240200541086a280200450d00200541046a280200102c0b20072105200d2007470d000b0b0240201e450d00201e41ffffffff0071450d00201f102c0b2017417f4c0d000240024020170d00410121050c010b201710322205450d020b200441003602b005200420173602ac05200420053602a805200441a8056a4100201710c80120042802a80520042802b00522056a2019201710c9081a2004200520176a3602b005200441c8026a41086a200b360200200441d4026a2207200429038802370200200441dc026a20044188026a41086a290300370200200441e4026a20044188026a41106a290300370200200441ec026a20044188026a41186a290300370200200441f4026a20042903e801370200200441fc026a200441e8016a41086a29030037020020044184036a200441e8016a41106a2903003702002004418c036a200441e8016a41186a29030037020020044288808080103703c802200441ac036a200441c8016a41186a290300370200200441a4036a200441c8016a41106a2903003702002004419c036a200441c8016a41086a29030037020020044194036a20042903c801370200200441b4036a20042903a801370200200441bc036a200441a8016a41086a290300370200200441c4036a200441a8016a41106a290300370200200441cc036a200441a8016a41186a290300370200200441d4036a200429038801370200200441dc036a20044188016a41086a290300370200200441e4036a20044188016a41106a290300370200200441ec036a20044188016a41186a290300370200200441ac046a20044180016a290300370200200441a4046a200441f8006a2903003702002004419c046a200441f0006a29030037020020044194046a200441c8006a41206a2903003702002004418c046a200441c8006a41186a29030037020020044184046a200441c8006a41106a290300370200200441fc036a200441c8006a41086a290300370200200441f4036a2004290348370200200441cc046a200441286a41186a290200370200200441c4046a200441286a41106a290200370200200441bc046a200441286a41086a290200370200200441b4046a2004290228370200200441dc046a20042802b005360200200441d4046a20042902a805370200200441c8026a10c80220012802002105200420173602e006200420183602dc06200420193602d806200441a8026a41f1ddc700410510c501200441b8026a418cffc000410510c501200420053602980720044180066a20044198076a410410c701200720044198076a41046a360200200420044180066a41086a3602cc02200420044198076a3602d002200420044180066a3602c802200441a8056a200441c8026a107e20042802b005220741206a2208417f4c0d000240024020080d004101210f0c010b20081032220f450d020b200441003602d002200420083602cc022004200f3602c802200441c8026a4100411010c80120042802c80220042802d00222086a220f20042900a802370000200f41086a200441a8026a41086a2900003700002004200841106a22083602d002200441c8026a2008411010c80120042802c80220042802d00222086a220f20042900b802370000200f41086a200441b8026a41086a2900003700002004200841106a220f3602d00220042802a8052108200441c8026a200f200710c80120042802c802220f20042802d00222096a2008200710c9081a2004200920076a22073602d002024020042802ac05450d002008102c0b200f2007200441d8066a108a03024020042802cc02450d00200f102c0b02402018450d002019102c0b200441a8026a41f1ddc700410510c501200441b8026a4191f6c000411210c501200420053602d80620044188076a200441d8066a410410c701200441d4026a200441d8066a41046a360200200420044190076a3602cc022004200441d8066a3602d002200420044188076a3602c802200441a8056a200441c8026a107e20042802b005220741206a2208417f4c0d000240024020080d004101210f0c010b20081032220f450d020b200441003602d002200420083602cc022004200f3602c802200441c8026a4100411010c80120042802c80220042802d00222086a220f20042900a802370000200f41086a200441a8026a41086a2900003700002004200841106a22083602d002200441c8026a2008411010c80120042802c80220042802d00222086a220f20042900b802370000200f41086a200441b8026a41086a2900003700002004200841106a220f3602d00220042802a8052108200441c8026a200f200710c80120042802c802220f20042802d00222096a2008200710c9081a2004200920076a22073602d002024020042802ac05450d002008102c0b200441106a200f200710c6012004280214210820042802102107024020042802cc02450d00200f102c0b024020074101470d00200820004b0d00200441a8026a41f1ddc700410510c501200441b8026a4191f6c000411210c501200420053602d80620044188076a200441d8066a410410c701200441d4026a200441d8066a41046a360200200420044190076a3602cc022004200441d8066a3602d002200420044188076a3602c802200441a8056a200441c8026a107e20042802b005220741206a220f417f4c0d0102400240200f0d00410121090c010b200f10322209450d030b200441003602d0022004200f3602cc02200420093602c802200441c8026a4100411010c80120042802c80220042802d002220f6a220920042900a802370000200941086a200441a8026a41086a2900003700002004200f41106a220f3602d002200441c8026a200f411010c80120042802c80220042802d002220f6a220920042900b802370000200941086a200441b8026a41086a2900003700002004200f41106a22093602d00220042802a805210f200441c8026a2009200710c80120042802c802220920042802d00222016a200f200710c9081a2004200120076a22073602d002024020042802ac05450d00200f102c0b2009200710b401024020042802cc02450d002009102c0b200441a8026a41f1ddc700410510c501200441b8026a41d081c100410a10c501200420053602d806200441c0076a200441d8066a410410c701200441d4026a200441d8066a41046a3602002004200441c8076a3602cc022004200441d8066a3602d0022004200441c0076a3602c802200441a8056a200441c8026a107e20042802b005220741206a220f417f4c0d0102400240200f0d00410121090c010b200f10322209450d030b200441003602e0062004200f3602dc06200420093602d806200441d8066a4100411010c80120042802d80620042802e006220f6a220920042900a802370000200941086a200441a8026a41086a2900003700002004200f41106a220f3602e006200441d8066a200f411010c80120042802d80620042802e006220f6a220920042900b802370000200941086a200441b8026a41086a2900003700002004200f41106a220f3602e00620042802a8052109200441d8066a200f200710c80120042802d806220f20042802e00622016a2009200710c9081a2004200120076a22073602e006024020042802ac05450d002009102c0b200441c8026a200f200710b803024020042802c8022209450d00200f200710b4010b20042902cc022129024020042802dc06450d00200f102c0b200441a8026a41f1ddc700410510c501200441b8026a41acffc000410b10c501200420053602d806200441b0066a200441d8066a410410c701200441d4026a200441d8066a41046a3602002004200441b8066a3602cc022004200441d8066a3602d0022004200441b0066a3602c802200441a8056a200441c8026a107e20042802b005220741206a220f417f4c0d01410121010240200f450d00200f10322201450d030b200441003602d0022004200f3602cc02200420013602c802200441c8026a4100411010c80120042802c80220042802d002220f6a220120042900a802370000200141086a200441a8026a41086a2900003700002004200f41106a220f3602d002200441c8026a200f411010c80120042802c80220042802d002220f6a220120042900b802370000200141086a200441b8026a41086a2900003700002004200f41106a22013602d00220042802a805210f200441c8026a2001200710c80120042802c802220120042802d002220a6a200f200710c9081a2004200a20076a22073602d002024020042802ac05450d00200f102c0b200441a8056a2001200710b80320042902ac05212820042802a805210f024020042802cc02450d002001102c0b200441a8026a41f1ddc700410510c501200441b8026a41acffc000410b10c501200420053602d806200441b0066a200441d8066a410410c701200441d4026a200441d8066a41046a3602002004202e3602cc022004200441d8066a3602d0022004200441b0066a3602c802200441a8056a200441c8026a107e20042802b005220741206a2201417f4c0d014101210a02402001450d0020011032220a450d030b2029420020091b2129200441003602e006200420013602dc062004200a3602d806200441d8066a4100411010c80120042802d80620042802e00622016a220a20042900a802370000200a41086a200441a8026a41086a2900003700002004200141106a22013602e006200441d8066a2001411010c80120042802d80620042802e00622016a220a20042900b802370000200a41086a200441b8026a41086a2900003700002004200141106a220a3602e00620042802a8052101200441d8066a200a200710c80120042802d806220a20042802e006220c6a2001200710c9081a2004200c20076a220c3602e006024020042802ac05450d002001102c0b2029422088222aa7220741046a2201417f4c0d0102400240024002400240024020010d00200441003602d002200442013703c8020c010b20011032220d450d07200441003602d002200420013602cc022004200d3602c802200741c000490d01200741808001490d022007418080808004490d030b200441c8026a41004101102f20042802c80220042802d00222016a41033a00002004200141016a22013602d002200441c8026a20014104102f20042802c80220042802d00222016a20073600002004200141046a22013602d002200441c8026a210d0c030b200441c8026a41004101102f20042802c80220042802d00222016a202a4202863c00002004200141016a22013602d002200441c8026a210d0c020b200441c8026a41004102102f20042802c80220042802d00222016a20074102744101723b00002004200141026a22013602d002200441c8026a210d0c010b200441c8026a41004104102f20042802c80220042802d00222016a20074102744102723600002004200141046a22013602d002200441c8026a210d0b2028a7210e2028422088a72110200d20012007102f20042802c802220120042802d002220d6a2009410120091b2211200710c9081a2004200d20076a22073602d002200a200c2001200710a702024020042802cc02450d002001102c0b200e4100200f1b210720104100200f1b2109200f4101200f1b210f024020042802dc06450d00200a102c0b200441c0056a4200370300200441b8056a4200370300200441a8056a41086a22014200370300200442003703a805200441a8026a41c1dcc700410610c5012001200441a8026a41086a290000370300200420042900a8023703a805200441b8026a4196a4c600410610c501200641086a200441b8026a41086a290000370000200620042900b802370000200441086a200441a8056a412010c601200428020c21012004280208210a200420093602d002200420073602cc022004200f3602c8022005200820014100200a1b200441c8026a10ba031a2029a7450d002011102c0b202d201c45720d02201b450d02201c102c0c020b103b000b1039000b20034100360204200328020021052003410136020002402003280208450d002005102c0b20024100360204200228020021052002410136020002402002280208450d002005102c0b200441d0076a24000bf10202097f047e230041c0006b22032400024002400240200128020422044108490d0020012802002105200341386a2106200341306a2107200341206a41086a21080340200341206a200520041097072003280228210520032802204101200328022422091b2d0000210a2001200328022c2204360204200120053602002001280208210b0240200a200941077176410171450d0020022802002209280208200b4b0d03200642003703002007420037030020084200370300200342003703200b2001200b41016a360208200441074b0d000b0b200041003a00000c010b2009280200200b4105746a2204290000210c200441186a290000210d200441106a290000210e200441086a290000210f2001200b41016a360208200341086a200f370300200341106a200e370300200341186a200d3703002003200c370300200041196a200d370000200041116a200e370000200041096a200f3700002000200c370001200041013a00000b200341c0006a24000b3400200041968dc70036020420004100360200200041146a4105360200200041106a41c88dc700360200200041086a420d3702000b2901017f230041106b2202240020024100360208200242013703002000200210db05200241106a24000bf61907077f027e037f097e017f017e027f23004180046b22032400024020024133490d0041002802d8d2484102490d00200341e80036028401200341c8a8c7003602800141002802d4d248210441002802d0d248210541002802dcd2482106200341a8026a41a205360200200341a0026a42df808080103703002003419c026a41dca7c70036020020034194026a420f37020020034190026a41b0a9c70036020020034188026a4201370300200341f8016a4201370300200341f0016a410f36020020034184026a200341306a360200200341b4b5c8003602f401200341b0a9c7003602ec0120034104360234200341023602e801200441e0a3c000200641024622061b2802102104200320034180016a360230200541f8a3c00020061b200341e8016a20041103000b200341306a41c1dcc700410610c501200341e8016a41acc8c700410710c50120034180016a200010d50202400240200328028801220441206a2205417f4c0d000240024020050d00410121060c010b200510322206450d020b41002107200341003602282003200536022420032006360220200341206a4100411010c8012003280220200328022822056a22062003290030370000200641086a200341306a41086a2900003700002003200541106a2205360228200341206a2005411010c8012003280220200328022822056a220620032900e801370000200641086a200341e8016a41086a2900003700002003200541106a22063602282003280280012105200341206a2006200410c80120032802202208200328022822066a2005200410c9081a2003200620046a22093602280240200328028401450d002005102c0b200341306a2008200910d6022003290330210a4200210b20034200370330200341fc006a280200210c200341f8006a280200210d02400240200a4201510d004101210e4200210f4200211042002111420021120c010b200341c8006a2903002111200329034021102003290338210f200341d0006a2903002112410121074100210e0b0240024020020d004200211342002114420021150c010b200241057421054200210b420021134200211442002115200121040340024002400240200441186a2d00002206417f6a41ff017141014b0d002015200441086a290300221620142004290300221756201520165620152016511b22181b21152014201720181b2114200641ff01714102460d010c020b200641ff01710d01200441086a2903002116200429030021170b20132016200b201756201320165620132016511b22061b2113200b201720061b210b0b200441206a2104200541606a22050d000b0b200341b8016a2013370300200341a8016a220520153703002003200f370380012003200b3703b001200320143703a00120032012370398012003201037038801200320113703900102400240427f200f20117c22162016200f542204201020127c2004ad7c221620105420162010511b22041b22154280c8afa025544100427f201620041b2217501b0d0020034190016a2903002115200341b0016a290300211720052903002114200341a0016a290300210b200329038801211120032903800121124201211620032903980121190c010b024002402011200f8420122010848450450d00420021160c010b42002116200341e8016a41186a22054200370300200341e8016a41106a22064200370300200341e8016a41086a22044200370300200342003703e801200341c8016a41d4dcc700410810c5012004200341c8016a41086a221a290000370300200320032900c8013703e801200341d8016a41bba8c700410d10c5012005200341d8016a41086a221b290000370300200620032900d801370300200341086a200341e8016a412010d301200341086a41106a29030021142003290310210b20032802082118200542003703002006420037030020044200370300200342003703e801200341c8016a41d4dcc700410810c5012004201a290000370300200320032900c8013703e801200341d8016a41bba8c700410d10c5012005201b290000370300200620032900d801370300200342002014420020181b221420177d200b420020181b220b201554ad7d2211200b20157d2212200b56201120145620112014511b22051b3703e00120034200201220051b3703d801200341e8016a4120200341d8016a411010a702200341a0026a201737030020034198026a2015370300200441013a0000200341f9016a200041086a29000037000020034181026a200041106a29000037000020034189026a200041186a290000370000200341023602e801200320002900003700f101200341e8016a10c8020b0b200341d8006a200b370300200341d0006a2019370300200341e0006a2014370300200341c0006a2011370300200341e8006a2017370300200341c8006a201537030020032013370370200320123703382003200c410020071b36027c2003200d410020071b360278200320164201512204ad3703300240024020040d002008200910b4010c010b20082009200341386a10d8020b02402003280224450d002008102c0b024002400240200a4201510d0020164201510d010b200a4201520d0120164201510d01200341e8016a41086a41043a0000200341f9016a200041086a29000037000020034181026a200041106a29000037000020034189026a200041186a290000370000200341003602e801200320002900003700f101200341e8016a10c8020c010b200341e8016a41086a41033a0000200341f9016a200041086a29000037000020034181026a200041106a29000037000020034189026a200041186a290000370000200341003602e801200320002900003700f101200341e8016a10c8020b0240200e450d00200341a0026a201037030020034198026a200f370300200341e8016a41086a41003a0000200341f9016a200041086a29000037000020034181026a200041106a29000037000020034189026a200041186a290000370000200341023602e801200320002900003700f101200341e8016a10c8020b200341c8016a41d4dcc700410810c501200341d8016a41bfa9c700410510c501200341e8016a200010d50220032802f001220441206a2205417f4c0d000240024020050d00410121060c010b200510322206450d020b200341003602382003200536023420032006360230200341306a4100411010c8012003280230200328023822056a220620032900c801370000200641086a200341c8016a41086a2900003700002003200541106a2205360238200341306a2005411010c8012003280230200328023822056a220620032900d801370000200641086a200341d8016a41086a2900003700002003200541106a220636023820032802e8012105200341306a2006200410c80120032802302206200328023822186a2005200410c9081a2003201820046a2204360238024020032802ec01450d002005102c0b2006200410ce02211802402003280234450d002006102c0b024002402002450d00200341c8016a41d4dcc700410810c501200341d8016a41bfa9c700410510c501200341e8016a200010d50220032802f001220441206a2205417f4c0d020240024020050d00410121060c010b200510322206450d040b200341003602382003200536023420032006360230200341306a4100411010c8012003280230200328023822056a220620032900c801370000200641086a200341c8016a41086a2900003700002003200541106a2205360238200341306a2005411010c8012003280230200328023822056a220620032900d801370000200641086a200341d8016a41086a2900003700002003200541106a220636023820032802e8012105200341306a2006200410c80120032802302206200328023822086a2005200410c9081a2003200820046a2204360238024020032802ec01450d002005102c0b200341e8016a200120021089082006200420032802e801220520032802f00110a702024020032802ec01450d002005102c0b02402003280234450d002006102c0b20180d01200010e7020c010b200341c8016a41d4dcc700410810c501200341d8016a41bfa9c700410510c501200341e8016a200010d50220032802f001220441206a2205417f4c0d010240024020050d00410121060c010b200510322206450d030b200341003602382003200536023420032006360230200341306a4100411010c8012003280230200328023822056a220620032900c801370000200641086a200341c8016a41086a2900003700002003200541106a2205360238200341306a2005411010c8012003280230200328023822056a220620032900d801370000200641086a200341d8016a41086a2900003700002003200541106a220636023820032802e8012105200341306a2006200410c80120032802302206200328023822026a2005200410c9081a2003200220046a2204360238024020032802ec01450d002005102c0b2006200410b40102402003280234450d002006102c0b2018450d00200010e8020b20034180046a24000f0b103b000b1039000bee0203027f027e017f0240024020024105744104722203417f4c0d00200310322204450d012000200336020420002004360200200041086a2203410036020020002002108f0102402002450d0020024105742104200328020021020340200020024108102f2000280200200328020022026a200141106a2900003700002003200241086a2202360200200141086a290300210520012903002106200020024110102f2000280200200328020022026a22072005370008200720063700002003200241106a220236020002400240024002400240200141186a2d00000e03000102040b200020024101102f2000280200200328020022026a41003a0000200241016a21020c020b200020024101102f2000280200200328020022026a41013a0000200241016a21020c010b200020024101102f2000280200200328020022026a41023a0000200241016a21020b200320023602000b200141206a2101200441606a22040d000b0b0f0b103b000b1039000b130020004104360204200041d0aac7003602000b3400200041d4dcc70036020420004100360200200041146a4104360200200041106a41a8c5c700360200200041086a42083702000b0b002000410841001089080bd10101037f20004201370200200041086a22024100360200200041004110102f2000280200200228020022036a22044200370008200442003700002002200341106a2203360200200020034110102f2000280200200228020022036a22044200370008200442003700002002200341106a2203360200200020034110102f2000280200200228020022036a22044200370008200442003700002002200341106a2203360200200020034110102f2000280200200228020022006a22034200370008200342003700002002200041106a3602000b130020004101360204200041a8ccc7003602000b5601027f02404110103222020d001039000b2000421037020420002002360200200041004110102f2000280200200041086a220028020022026a2203420037000820034280c8afa0253700002000200241106a3602000b130020004108360204200041d8d7c7003602000bda0706017f017e047f037e037f067e230041c0026b2202240042002103420042004280f985d404420010b3042104200241e0016a22054200370300200241d0016a41086a4208370300200241ec016a22064180023b0100200241e8016a2207200436020041012104200241013602b802200241003602d001024002404100450d0042012108420021090c010b0240024002404101450d004200210a0c010b200241c8016a210b4101210c420021080340200241b0016a200842002001420010ce08200241c0016a200142002001420010ce08200820022903b801220184200184420052200b290300220120022903b001220a200a7c7c220a200154720d0220022903c0012101200c410271210d200c4101762204210c200a2108200d450d000b0b0240200441024f0d0020012108200a21090c020b200241a0016a41086a210d20012108200a2109034020024190016a200a42002001420010ce08200241a0016a200142002001420010ce08200a200229039801220184200184420052200d2903002201200229039001220a200a7c7c220a200154720d0120022903a001210102402004410271450d00200241e0006a200942002001420010ce08200241f0006a200a42002008420010ce0820024180016a200842002001420010ce082009420052200a4200527120022903684200527220022903784200527220024180016a41086a2903002208200229036020022903707c7c2209200854720d0220022903800121080b200441034b210c20044101762104200a210a200c0d000c020b0b427f2108427f21090b200241d0006a20082009428094ebdc03420010c708200241306a2005290300220a42002008420010ce08200241206a2009420020022903d8012201420010ce08200241c0006a200142002008420010ce080240024020062d0000450d00420021010c010b2002290338210e2002290328210f2002290320211020022903302111200241c0006a41086a2903002101200728020021042002290350210320022903402112200241106a20082009428094ebdc03420010c80820022002290310200241106a41086a2903002004ad2208420010ce08427f200241086a29030020022903002213200320087e2208428094ebdc0380a7417f2008428080808080c0b2cd3b541b2008428094ebdc03824280cab5ee01566aad7c2208201354ad7c2203427f2001201120107c7c2210200a420052200942005271200e42005272200f4200527220102001547222041b7c2008427f201220041b7c220a2008542204ad7c22012004200120035420012003511b22041b2101427f200a20041b21030b2000200337030020002001370308200241c0026a24000b3400200041dce2c70036020420004100360200200041146a4102360200200041106a41f0e2c700360200200041086a42123702000b5a01027f02404110103222020d001039000b2000421037020420002002360200200041004110102f2000280200200041086a220028020022026a22034200370008200342808090bbbad6adf00d3700002000200241106a3602000b130020004102360204200041f4e4c7003602000bd50402077f027e23004180016b22022400420042004280f985d404420010b3042103200241206a22044200370300200241186a42083703002002412c6a22054180023b0100200241106a41186a22062003360200200241013602782002410036021002400240411810322203450d002002420137020420022003360200200241004101109a05200228020022072002280208220841186c6a2203200429030037030820032002290318370300200320022d002d3a0015200320052d00004100473a0014200320062802003602102002200841016a220436020802402002280278220341044d0d00200341186c450d002002280214102c0b200441186c4104722203417f4c0d01200310322205450d002000200336020420002005360200200041086a2203410036020020002004108f0102402004450d002007200441186c6a210820032802002105200721040340200441086a29030021092004290300210a200020054110102f2000280200200328020022056a220620093700082006200a3700002003200541106a2205360200200441106a2802002106200020054104102f2000280200200328020022056a20063600002003200541046a2205360200200441146a2d00002106200020054101102f2000280200200328020022056a20063a00002003200541016a2205360200200441156a2d00002106200020054101102f2000280200200328020022056a20063a00002003200541016a2205360200200441186a22042008470d000b0b024020022802042200450d00200041186c450d002007102c0b20024180016a24000f0b1039000b103b000b5501027f02404110103222020d001039000b2000421037020420002002360200200041004110102f2000280200200041086a220028020022026a2203420037000820034280c2d72f3700002000200241106a3602000b3400200041bee8c70036020420004100360200200041146a4106360200200041106a41cce8c700360200200041086a420d3702000b0b0020004104410010a7060b0b0020004104410010e4040b6301027f230041106b2202240020004201370200200041086a22034100360200200242003703082002420437030020002002108f05200020032802004104102f2000280200200328020022006a41003600002003200041046a360200200241106a24000bb70403027f017e037f230041306b22012400024002400240024020002802002202450d0020002902042103200141186a22004200370300200141106a22044200370300200141086a2205420037030020014200370300200141206a41bee8c700410d10c5012005200141206a41086a220629000037030020012001290020370300200141206a41dcecc700410f10c50120002006290000370300200420012900203703002003422088a72205410c6c41046a2200417f4c0d010240024020000d00410121040c010b200010322204450d030b200141003602282001200036022420012004360220200141206a2005108f0102402005450d0020022005410c6c6a21042002210003402000280200200041086a280200200141206a10d5032000410c6a22002004470d000b0b2001412020012802202200200128022810a70202402001280224450d002000102c0b02402005450d002005410c6c21042002210003400240200041046a28020041ffffffff0371450d002000280200102c0b2000410c6a2100200441746a22040d000b0b2003a72200450d032000410c6c450d032002102c0c030b200141186a22004200370300200141106a22044200370300200141086a2205420037030020014200370300200141206a41bee8c700410d10c5012005200141206a41086a220229000037030020012001290020370300200141206a41dcecc700410f10c50120002002290000370300200420012900203703002001412010b4010c020b103b000b1039000b200141306a24000b13002000410536020420004188fec7003602000b3400200041de96c80036020420004100360200200041146a4101360200200041106a41e896c800360200200041086a42073702000b130020004101360204200041a898c8003602000b5701027f02404110103222020d001039000b2000421037020420002002360200200041004110102f2000280200200041086a220028020022026a2203420037000820034280a094a58d1d3700002000200241106a3602000bb20301047f41242103024002402001280200220441244b0d00200421050c010b2001410c6a2802002105200421030b02400240200320056b20024f0d000240200520026a22022005490d004100417f2002417f6a677620024102491b220541016a220320054f0d020b2000200336020420004101360200200041086a41003602000f0b200041003602000f0b4124210202400240200441244b0d00200141056a2106200421050c010b2001410c6a2802002105200141086a2802002106200421020b024002400240200520034b0d000240024020034125490d0020022003470d010c040b024020044125490d00200141003a0004200141056a2006200510c9081a200120053602002006102c0c040b200041003602000f0b0240200441244b0d000240200310322202450d0020022006200510c9081a0c030b2000200336020420004101360200200041086a41013602000f0b200620022003103522020d012000200336020420004101360200200041086a41013602000f0b41e3c5c80041204184c6c800103c000b200141013a0004200120033602002001410c6a2005360200200141086a20023602000b200041003602000bff0204057f017e017f017e230041206b2202240002400240024020012802182203450d0020012003417f6a36021820012802042204450d0220012802002105024002402001280208220620042f018a014f0d00200421030c010b034002400240200428020022030d00410021030c010b200541016a210520042f01880121060b2004102c20032104200620032f018a014f0d000b0b200320064103746a418c016a2900002107200241106a41086a220820032006410c6c6a2204410c6a2802003602002002200441046a290200370310200641016a210402402005450d00200320044102746a41e4016a280200210302402005417f6a2204450d00034020032802e40121032004417f6a22040d000b0b410021040b200241086a200828020022063602002002200229031022093703002000200737020020002009370208200041106a20063602002001200436020820012003360204200141003602000c010b200041003602080b200241206a24000f0b41ecd0c800412b4198d1c800103c000bb01605047f017e087f027e0a7f230041c01f6b22042400200441e8016a200141f00110c9081a024002400240024002400240024020002802002201450d00200028020421050c010b41881610322201450d01410021052001200441c0096a41801610c908220641003b018616200641003602801620004100360204200020063602000b200441c0096a20052001200441e8016a10a3080240024020042802c0094101470d00200441e8016a41086a280200210720042903e8012108200441046a200441e8016a410c6a41e40110c9081a200441c0096a410c6a2802002101200441c0096a41086a280200210920042802c409210a200441a8076a200441046a41e40110c9081a0240024020092f0186162206410b490d00410521054100210b02400240200141054f0d0041042105200121060c010b41052106024002402001417b6a0e020201000b200141796a21064101210b410621050c010b410021064101210b0b4188161032220c450d04200c200441c0096a41801610c908220d41003b018616200d4100360280162009200541f0016c6a2201280204210e2001280200210f200441e8016a200141086a41e80110c9081a200920054104746a221041d8146a2903002111201041d0146a2903002112200d200141f0016a20092f0186162005417f736a220141f0016c10c908220d41d0146a201041e0146a200141047410c9081a200920053b018616200d20013b018616200d2009200b1b2201200641f0016c6a220541f0016a200520012f01861620066b41f0016c10ca081a200541086a2007360200200520083703002005410c6a200441a8076a41e40110c9081a200120064104746a220541e0146a200541d0146a220720012f01861620066b41047410ca081a200541d8146a200337030020072002370300200120012f01861641016a3b018616200441c0056a200441e8016a41e80110c9081a0240024020092802801622010d004100210a0c010b41002105200441a0096a2113200441a8096a2114200441b0096a2115200441b8096a21160340200f2117200e2118200c21192009210620112102201221032001210920062f018416210d200441a8076a200441c0056a41e80110c9081a200a2005470d0702400240024020092f0186162205410b490d004100210b410421070240200d4105490d00200d210702400240200d417b6a0e020201000b200d41796a210d4101210b410621070c010b4100210d4101210b410521070b41b8161032220c450d09200a41016a210a41002101200c200441c0096a41801610c908220541003b018616200541003602801620052004290390093703881620054190166a20044190096a41086a29030037030020054198166a2013290300370300200541a0166a2014290300370300200541a8166a2015290300370300200541b0166a20162903003703002009200741f0016c6a2206280204210e2006280200210f200441c0096a200641086a41e80110c9081a200941d0146a221020074104746a221a41086a2903002111201a29030021122005200641f0016a20092f018616221a2007417f736a220641f0016c10c908220541d0146a2010200741016a221b4104746a200641047410c908211c200920073b018616200520063b018616200441e8016a200441c0096a41e80110c9081a20054188166a2009201b4102746a4188166a201a20076b41027410c908211a02400340200520014102746a4188166a280200220720013b01841620072005360280162001200120064922076a220120064b0d0120070d000b0b200441c0096a200441e8016a41e80110c9081a200441e8016a200441c0096a41e80110c9081a200b450d01200d410274201a6a41086a201a200d41016a22014102746a220620052f018616200d6b41027410ca081a200620193602002005200d41f0016c6a220641f0016a200620052f018616200d6b41f0016c10ca081a2006201836020420062017360200200641086a200441a8076a41e80110c9081a201c20014104746a201c200d4104746a220620052f018616200d6b41047410ca081a2006200237030820062003370300200520052f01861641016a22063b0186162001200641ffff037122064b0d020340200520014102746a4188166a280200220720013b0184162007200536028016200120012006496a220720064b0d03200120064f210d20072101200d450d000c030b0b200d41027420094188166a22066a41086a2006200d41016a22014102746a22062005200d6b220741027410ca081a200620193602002009200d41f0016c6a220541f0016a2005200741f0016c10ca081a2005201836020420052017360200200541086a200441a8076a41e80110c9081a200941d0146a220520014104746a2005200d4104746a220520092f018616200d6b41047410ca081a2005200237030820052003370300200920092f01861641016a22053b018616200d200541ffff037122054f0d050340200920014102746a4188166a280200220620013b0184162006200936028016200120012005496a220620054b0d06200120054f2107200621012007450d000c060b0b200d41027420094188166a22056a41086a2005200d41016a22014102746a220520092f018616200d6b41027410ca081a200520193602002009200d41f0016c6a220541f0016a200520092f018616200d6b41f0016c10ca081a2005201836020420052017360200200541086a200441a8076a41e80110c9081a201020014104746a2010200d4104746a220520092f018616200d6b41047410ca081a2005200237030820052003370300200920092f01861641016a22053b0186162001200541ffff037122054b0d000340200920014102746a4188166a280200220620013b01841620062009360280162001200120054922066a220120054b0d0120060d000b0b200441c0056a200441e8016a41e80110c9081a200a210520092802801622010d000b0b200441d8036a200441c0056a41e80110c9081a200441e8016a200441d8036a41e80110c9081a2000280200450d0641b81610322201450d042001200441c0096a41801610c908220141003b018616200141003602801620012004290390093703881620014190166a20044198096a29030037030020014198166a200441a0096a290300370300200141a0166a200441a8096a290300370300200141a8166a200441b0096a290300370300200141b0166a200441b8096a290300370300200120002802002205360288162000200136020020002000280204220641016a360204200541003b0184162005200136028016200441c0096a200441e8016a41e80110c9081a2006200a470d0720012f0186162205410a4b0d082001200541016a22063b0186162001200541f0016c6a2207200e3602042007200f360200200741086a200441c0096a41e80110c9081a200120054104746a220541d8146a2011370300200541d0146a2012370300200120064102746a4188166a200c360200200c20063b018416200c2001360280162000200028020841016a3602080c030b2009200141f0016c6a220541f0016a2005200620016b41f0016c10ca081a200541086a2007360200200520083703002005410c6a200441a8076a41e40110c9081a200920014104746a220541e0146a200541d0146a220620092f01861620016b41047410ca081a200541d8146a200337030020062002370300200920092f01861641016a3b0186160b2000200028020841016a3602080c010b200441cc096a2802002101200441c8096a2802002105200441e8016a10e606200520014104746a220141d8146a2003370300200141d0146a20023703000b200441c01f6a24000f0b1039000b41a5d0c800413541dcd0c800103c000b41ecd0c800412b41bcd2c800103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000bbd0101047f0240034020022f0186162104410021052002210602400240034020042005460d01200541016a210520032006108b022107200641f0016a21060240200741187441187541016a0e03000301000b0b2005417f6a21040b2001450d022001417f6a2101200220044102746a4188166a28020021020c010b0b20002001360204200041003602002000410c6a2005417f6a360200200041086a20023602000f0b200042013702002000410c6a2004360200200041086a20023602000ba00702037f017e230041e0016b22022400024002400240024020012802004101470d002001410c6a2802002203417f4c0d02200128020421044101210102402003450d00200310322201450d040b200241003602b001200220033602ac01200220013602a801200241a8016a4100200310c80120022802a80120022802b00122016a2004200310c9081a2000410c6a200120036a36020020004101360200200020022903a8013702040c010b4200210502400240024002400240200141086a2802000e050401020300040b200241a8016a200141106a10e706200241f0006a200141c8006a10e706200241386a20014180016a10e7062002200141b8016a10e706420421050c030b200241a8016a200141106a10e706420121050c020b200241a8016a200141106a10e706200241f0006a200141c8006a10e706420221050c010b200241a8016a200141106a10e706200241f0006a200141c8006a10e706200241386a20014180016a10e706420321050b200041086a2005370300200041106a20022903a801370300200041c8006a2002290370370300200041186a200241a8016a41086a290300370300200041206a200241a8016a41106a290300370300200041286a200241a8016a41186a290300370300200041306a200241a8016a41206a290300370300200041386a200241a8016a41286a290300370300200041c0006a200241a8016a41306a290300370300200041d0006a200241f0006a41086a290300370300200041d8006a200241f0006a41106a290300370300200041e0006a200241f0006a41186a290300370300200041e8006a200241f0006a41206a290300370300200041f0006a200241f0006a41286a290300370300200041f8006a200241f0006a41306a290300370300200041b0016a200241386a41306a290300370300200041a8016a200241386a41286a290300370300200041a0016a200241386a41206a29030037030020004198016a200241386a41186a29030037030020004190016a200241386a41106a29030037030020004188016a200241386a41086a29030037030020004180016a2002290338370300200041e8016a200241306a290300370300200041e0016a200241286a290300370300200041d8016a200241206a290300370300200041d0016a200241186a290300370300200041c8016a200241106a290300370300200041c0016a200241086a290300370300200041b8016a2002290300370300200041003602000b200241e0016a24000f0b103b000b1039000ba62903087f107e057f23004190056b22052400200541b0016a41e6dcc700410710c501200541f8026a419099c100410610c501200541f0016a200010e4020240024020052802f801220641206a2207417f4c0d000240024020070d00410121080c010b200710322208450d020b41002109200541003602c802200520073602c402200520083602c002200541c0026a4100411010c80120052802c00220052802c80222076a220820052900b001370000200841086a200541b0016a41086a2900003700002005200741106a22073602c802200541c0026a2007411010c80120052802c00220052802c80222076a220820052900f802370000200841086a200541f8026a41086a2900003700002005200741106a22083602c80220052802f0012107200541c0026a2008200610c80120052802c002220820052802c802220a6a2007200610c9081a2005200a20066a22063602c802024020052802f401450d002007102c0b200541f8026a2008200610c901200541d0016a41086a20054181036a290000370300200541d0016a41106a20054189036a290000370300200541d0016a41186a220620054191036a290000370300200520052900f9023703d001024020052d00f8024101470d00200541386a41186a2006290300370300200541386a41106a200541d0016a41106a290300370300200541386a41086a200541d0016a41086a290300370300200520052903d001370338410121090b024020052802c402450d002008102c0b02402009450d00200541186a41186a200541386a41186a290300370300200541186a41106a200541386a41106a290300370300200541186a41086a200541386a41086a29030037030020052005290338370318200541b0016a41e6dcc700410710c501200541f8026a418a99c100410610c501200541f0016a200541186a10d50220052802f801220641206a2207417f4c0d010240024020070d00410121080c010b200710322208450d030b200541003602c801200520073602c401200520083602c001200541c0016a4100411010c80120052802c00120052802c80122076a220820052900b001370000200841086a200541b0016a41086a2900003700002005200741106a22073602c801200541c0016a2007411010c80120052802c00120052802c80122076a220820052900f802370000200841086a200541f8026a41086a22092900003700002005200741106a22083602c80120052802f0012107200541c0016a2008200610c80120052802c001220820052802c801220a6a2007200610c9081a2005200a20066a22063602c801024020052802f401450d002007102c0b200541f8026a2008200610d803200541d0016a41086a2009290300370300200541d0016a41106a200541f8026a41106a290300370300200541d0016a41186a2207200541f8026a41186a290300370300200541f0016a41086a200541a4036a290200370300200541f0016a41106a200541ac036a290200370300200541f0016a41186a2209200541b4036a290200370300200541f0016a41206a220a200541bc036a290200370300200541f0016a41286a220b200541c4036a290200370300200541f0016a41306a220c200541cc036a280200360200200520052903f8023703d0012005200529029c033703f00102402005280298032206450d0020054190016a41186a200729030037030020054190016a41106a200541d0016a41106a29030037030020054190016a41086a200541d0016a41086a290300370300200541c0026a41086a200541f0016a41086a290300370300200541c0026a41106a200541f0016a41106a290300370300200541c0026a41186a2009290300370300200541c0026a41206a200a290300370300200541c0026a41286a200b290300370300200541c0026a41306a200c280200360200200520052903d00137039001200520052903f0013703c0020b024020052802c401450d002008102c0b2006450d00200541dc006a20052903c002370200200541386a41186a220720054190016a41186a290300370300200541386a41106a220820054190016a41106a290300370300200541386a41086a220920054190016a41086a290300370300200541e4006a200541c0026a41086a290300370200200541ec006a200541c0026a41106a290300370200200541f4006a200541c0026a41186a290300370200200541fc006a200541c0026a41206a29030037020020054184016a200541c0026a41286a2903003702002005418c016a200541f0026a2802003602002005200529039001370338200520063602582009290300210d2005290338210e024002402008290300220f2001200f2001542007290300221020025420102002511b22081b22112010200220081b22128450450d00200e2113200d21140c010b2007201020127d200f201154ad7d22153703002005200f20117d22133703480240024020134280c8afa0255620154200522015501b450d002011210f201221100c010b200541d0006a420037030020054200370348201520027c201320017c2201201354ad7c21020b20054200200d20107d200e200f54ad7d2211200e200f7d2215200e562011200d562011200d511b22071b221437034020054200201520071b2213370338200220107d2001200f54ad7d21022001200f7d21010b02400240200541386a41286a2802002207450d00200741186c2109200741037441786a41037641016a210b410021070240034002402006290300220f20012001200f562002200641086a220a29030022105620022010511b22081b22112010200220081b221284500d002006200f20117d22133703002006201020127d200f201154ad7d22153703080240024020134280c8afa0255620154200522015501b450d00200121152011210f201221100c010b2006420037030820064200370300200220157c200120137c2215200154ad7c21020b200541386a41086a220842002008290300220120107d20052903382211200f54ad7d22122011200f7d2213201156201220015620122001511b22081b221437030020054200201320081b2213370338200220107d2015200f54ad7d21022015200f7d2101200a29030021102006290300210f0b200f2010844200520d01200641186a2106200741016a2107200941686a22090d000b200b21070b0240200528026022082007490d00200528025821060c020b2007200841d089c500104f000b41002108410021070b200520063602800320054184036a2006200741186c6a22093602002005200541386a41206a36028803200520073602f802200541003602602005200820076b22083602fc020240024002402007450d0020052009360280032008450d0220062006200741186c6a200841186c10ca081a200541c0006a2903002114200529033821130c010b20052009360280032008450d010b200520083602600b0240200e201358200d201458200d2014511b0d00200541f0016a41c1dcc700410610c501200541f8026a41acc8c700410710c501200541c0026a200010d50220052802c802220641206a2207417f4c0d020240024020070d004101210a0c010b20071032220a450d040b200e20137d2210200e56200d20147d200e201354ad7d220f200d56200f200d511b210941002108200541003602980120052007360294012005200a3602900120054190016a4100411010c80120052802900120052802980122076a220a20052900f001370000200a41086a200541f0016a41086a2900003700002005200741106a22073602980120054190016a2007411010c80120052802900120052802980122076a220a20052900f802370000200a41086a200541f8026a41086a2900003700002005200741106a22073602980120052802c002210a20054190016a2007200610c8012005280290012207200528029801220b6a200a200610c9081a2005200b20066a220636029801024020052802c402450d00200a102c0b4200200f20091b21024200201020091b2101200541f0016a2007200610d60220052903f001210d42002113200542003703f001200541bc026a2802002109200541b8026a280200210a02400240200d4201510d004101210b420021164200211742002118420021194200210f4200211042002115420021110c010b200541a8026a2903002118200541a0026a290300211720054198026a290300211620054190026a290300211020054188026a290300210f200529038002211120052903f8012115410121084100210b20052903b00221190b2011200220112015200156201120025620112002511b220c1b221a7d201520012015200c1b221254ad7d2111201520127d211502400240200120127d220e2002201a7d2001201254ad7d22148450450d004200211b2001211a2002211c0c010b201420142010200f200e56201020145620102014511b220c1b22137d200e200e200f200c1b221454ad7d211b201020137d200f201454ad7d21102013201a7c201420127c221a201454ad7c211c200e20147d2113200f20147d210f0b200541e8026a221d2017370300200541d8026a2010370300200541f0026a221e2018370300200520163703e0022005200f3703d002200520153703c002200520113703c80202400240427f2015200f7c22122012201554220c201120107c200cad7c221220115420122011511b220c1b22144280c8afa025544100427f2012200c1b2212501b0d00200541d0026a2903002110201e2903002112201d2903002114200541e0026a290300210e20052903c802211620052903c00221174201210f20052903d80221180c010b024002402015200f8420112010848450450d004200210f0c010b4200210f200541d0016a41186a220c4200370300200541d0016a41106a221d4200370300200541d0016a41086a221e4200370300200542003703d001200541b0016a41d4dcc700410810c501201e200541b0016a41086a221f290000370300200520052900b0013703d001200541f8026a41bba8c700410d10c501200c200541f8026a41086a2220290000370300201d20052900f8023703002005200541d0016a412010d301200541106a29030021102005290308210e20052802002121200c4200370300201d4200370300201e4200370300200542003703d001200541b0016a41d4dcc700410810c501201e201f290000370300200520052900b0013703d001200541f8026a41bba8c700410d10c501200c2020290000370300201d20052900f802370300200542002010420020211b221020127d200e420020211b220e201454ad7d2216200e20147d2217200e56201620105620162010511b220c1b37038003200542002017200c1b3703f802200541d0016a4120200541f8026a411010a702200541b0036a2012370300200541a8036a2014370300202041013a000020054189036a200041086a29000037000020054191036a200041106a29000037000020054199036a200041186a290000370000200541023602f8022005200029000037008103200541f8026a10c8020b0b20054198026a200e370300200541a0026a201437030020054180026a2016370300200541a8026a201237030020054188026a20103703002005201837039002200520193703b002200520173703f80120052009410020081b3602bc022005200a410020081b3602b8022005200f4201512208ad3703f0010240024020080d002007200610b4010c010b20072006200541f8016a10d8020b0240200528029401450d002007102c0b024002400240200d4201510d00200f4201510d010b200d4201520d01200f4201510d01200541f8026a41086a41043a000020054189036a200041086a29000037000020054191036a200041106a29000037000020054199036a200041186a290000370000200541003602f8022005200029000037008103200541f8026a10c8020c010b200541f8026a41086a41033a000020054189036a200041086a29000037000020054191036a200041106a29000037000020054199036a200041186a290000370000200541003602f8022005200029000037008103200541f8026a10c8020b0240200b450d00200541b0036a2011370300200541a8036a2015370300200541f8026a41086a41003a000020054189036a200041086a29000037000020054191036a200041106a29000037000020054199036a200041186a290000370000200541023602f8022005200029000037008103200541f8026a10c8020b2004427f2004290300220f201a7c22102010200f542206200441086a2207290300220f201c7c2006ad7c2210200f542010200f511b22061b3703002007427f201020061b37030002402013201b84500d00200342002003290300220f20137d22102010200f56200341086a22062903002210201b7d200f201354ad7d220f201056200f2010511b22071b37030020064200200f20071b3703000b200542f3e885db96cddbb3203703d001200541d0016a200541f0006a2005290338200541386a41086a29030010ab04200541b0016a41e6dcc700410710c501200541f8026a418a99c100410610c501200541f0016a200541186a10d50220052802f801220641206a2207417f4c0d020240024020070d00410121080c010b200710322208450d040b200541003602c802200520073602c402200520083602c002200541c0026a4100411010c80120052802c00220052802c80222076a220820052900b001370000200841086a200541b0016a41086a2900003700002005200741106a22073602c802200541c0026a2007411010c80120052802c00220052802c80222076a220820052900f802370000200841086a200541f8026a41086a2900003700002005200741106a22083602c80220052802f0012107200541c0026a2008200610c80120052802c002220820052802c80222096a2007200610c9081a2005200920066a22063602c802024020052802f401450d002007102c0b20082006200541386a10ac04024020052802c402450d002008102c0b200541b0036a2002370300200541a8036a2001370300200541f8026a41086a41023a000020054189036a200041086a29000037000020054191036a200041106a29000037000020054199036a200041186a290000370000200541033602f8022005200029000037008103200541f8026a10c8020b0240200528025c2206450d00200641186c450d002005280258102c0b200541e8006a28020041ffffffff0371450d002005280264102c0b20054190056a24000f0b103b000b1039000bc81605047f027e077f027e087f23004190236b2202240020024190026a200141980210c9081a024002400240024002400240024020002802002203450d00200028020421040c010b41901810322203450d01410021042003200241b8066a41881810c908220141003b018e18200141003602881820004100360204200020013602000b20024190026a41f1016a210520024190026a4180026a290300210620024188046a290300210720024190026a41fc016a280200210820024190026a41f4016a280200210920022d008004220a417f6a210b0240034020032f018e18210c4100210d024003400240200d2201200c470d00200c21010c020b0240024020024190026a200320014198026c6a220d108b02220e41ff01710d000240200a200d2d00f001220e460d00417f4101200a200e491b210e0c010b024002400240024002400240200b0e06000504030201070b417f2007200d2903f801220f852006200d4180026a290300221085844200522007200f54200620105420062010511b1b210e0c050b02402009200d41f4016a280200200d41fc016a280200220d20082008200d4b1b10cc08220e450d00417f4101200e4100481b210e0c050b417f2008200d472008200d491b210e0c040b2005200d41f1016a412010cc08220d450d04417f4101200d4100481b210e0c030b2005200d41f1016a411010cc08220d450d03417f4101200d4100481b210e0c020b2005200d41f1016a410810cc08220d450d02417f4101200d4100481b210e0c010b2005200d41f1016a410410cc08220d450d01417f4101200d4100481b210e0b200141016a210d200e41187441187541016a0e03020001020b0b20024190026a10e60620022d0080044106490d02200228028404410020022802880422011b220d450d022001450d02200d102c0c020b02402004450d002004417f6a2104200320014102746a4190186a28020021030c010b0b20024190026a41086a280200210e2002290390022106200241046a20024190026a410c6a418c0210c9081a200241d0206a200241046a418c0210c9081a0240024020032f018e18220c410b490d004105210d4100210b02400240200141054f0d004104210d2001210c0c010b4105210c024002402001417b6a0e020201000b200141796a210c4101210b4106210d0c010b4100210c4101210b0b4190181032220a450d0341002105200a200241b8066a41881810c908220441003b018e1820044100360288182003200d4198026c6a220128020421082001280200210920024190026a200141086a41900210c9081a200420014198026a20032f018e18200d417f736a22114198026c10c90821012003200d3b018e18200120113b018e1820012003200b1b220d200c4198026c6a22014198026a2001200d2f018e18200c6b4198026c10ca081a200141086a200e360200200120063703002001410c6a200241d0206a418c0210c9081a200d200d2f018e1841016a3b018e18200241c01e6a20024190026a41900210c9081a02402003280288182201450d00200241f0226a2112200241f8226a211320024180236a211420024188236a21154100210503402009211120082116200a21172003210d20012103200d2f018c182104200241d0206a200241c01e6a41900210c9081a41000d0602400240024020032f018e18220d410b490d004100210b4104210c024020044105490d002004210c024002402004417b6a0e020201000b200441796a21044101210b4106210c0c010b410021044101210b4105210c0b41c0181032220a450d08200541016a210541002101200a200241b8066a41881810c908220d41003b018e18200d410036028818200d20022903e02237039018200d4198186a200241e0226a41086a290300370300200d41a0186a2012290300370300200d41a8186a2013290300370300200d41b0186a2014290300370300200d41b8186a20152903003703002003200c4198026c6a220e2802042108200e2802002109200241b8066a200e41086a41900210c9081a200d200e4198026a20032f018e182218200c417f736a220e4198026c10c908210d2003200c3b018e18200d200e3b018e1820024190026a200241b8066a41900210c9081a200d4190186a200c41027420036a4194186a2018200c6b41027410c908211802400340200d20014102746a4190186a280200220c20013b018c18200c200d3602881820012001200e49220c6a2201200e4b0d01200c0d000b0b200241b8066a20024190026a41900210c9081a20024190026a200241b8066a41900210c9081a200b450d01200441027420186a41086a2018200441016a22014102746a220e200d2f018e1820046b41027410ca081a200e2017360200200d20044198026c6a220e4198026a200e200d2f018e1820046b4198026c10ca081a200e2016360204200e2011360200200e41086a200241d0206a41900210c9081a200d200d2f018e1841016a220e3b018e182001200e41ffff0371220e4b0d020340200d20014102746a4190186a280200220c20013b018c18200c200d3602881820012001200e496a220c200e4b0d032001200e4f2104200c21012004450d000c030b0b200441027420034190186a220e6a41086a200e200441016a22014102746a220e200d20046b220c41027410ca081a200e2017360200200320044198026c6a220d4198026a200d200c4198026c10ca081a200d2016360204200d2011360200200d41086a200241d0206a41900210c9081a200320032f018e1841016a220d3b018e182004200d41ffff0371220d4f0d050340200320014102746a4190186a280200220e20013b018c18200e20033602881820012001200d496a220e200d4b0d062001200d4f210c200e2101200c450d000c060b0b200441027420034190186a220d6a41086a200d200441016a22014102746a220d20032f018e1820046b41027410ca081a200d2017360200200320044198026c6a220d4198026a200d20032f018e1820046b4198026c10ca081a200d2016360204200d2011360200200d41086a200241d0206a41900210c9081a200320032f018e1841016a220d3b018e182001200d41ffff0371220d4b0d000340200320014102746a4190186a280200220e20013b018c18200e20033602881820012001200d49220e6a2201200d4b0d01200e0d000b0b200241c01e6a20024190026a41900210c9081a20032802881822010d000b0b200241a8046a200241c01e6a41900210c9081a20024190026a200241a8046a41900210c9081a2000280200450d0541c01810322201450d032001200241b8066a41881810c908220141003b018e182001410036028818200120022903e0223703901820014198186a200241e8226a290300370300200141a0186a200241f0226a290300370300200141a8186a200241f8226a290300370300200141b0186a20024180236a290300370300200141b8186a20024188236a29030037030020012000280200220d360290182000200136020020002000280204220341016a360204200d41003b018c18200d200136028818200241b8066a20024190026a41900210c9081a20032005470d0620012f018e18220d410a4b0d072001200d41016a22033b018e182001200d4198026c6a220d2008360204200d2009360200200d41086a200241b8066a41900210c9081a200120034102746a4190186a200a360200200a20033b018c18200a2001360288182000200028020841016a3602080c020b200320014198026c6a220d4198026a200d200c20016b4198026c10ca081a200d41086a200e360200200d2006370300200d410c6a200241d0206a418c0210c9081a200320032f018e1841016a3b018e180b2000200028020841016a3602080b20024190236a24000f0b1039000b41a5d0c800413541dcd0c800103c000b41ecd0c800412b41bcd2c800103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000bc70401047f024020002d0000220220012d0000460d0041000f0b41012103024002400240024002400240024002402002417f6a0e0707050403020100060b410021032000410c6a28020022022001410c6a280200470d0541012103200041046a2802002200200141046a2802002201460d0520002001200210cc084521030c050b200041086a290300200141086a29030085200041106a290300200141106a2903008584500f0b20002d000120012d0001460f0b0240200041186a2802002202200141186a280200460d0041000f0b024020024101470d000240200041246a2802002202200141246a280200460d0041000f0b2000411c6a28020022042001411c6a2802002205460d004100210320042005200210cc080d030b4101210320002001460d02200041016a200141016a411410cc08450f0b0240200041046a2802002202200141046a280200460d0041000f0b024020024101470d000240200041106a2802002202200141106a280200460d0041000f0b200041086a2802002204200141086a2802002205460d004100210320042005200210cc080d020b200041186a290300200141186a290300510f0b0240200041246a2802002202200141246a280200460d0041000f0b024020024101470d000240200041306a2802002202200141306a280200460d0041000f0b200041286a2802002204200141286a2802002205460d004100210320042005200210cc080d010b4101210320002001460d00200041016a200141016a412010cc08450f0b20030f0b200041046a280200200141046a280200460b9b0101037f024002402001280208220241ffffffff03712002470d0020024102742203417f4c0d00200128020021040240024020030d00410421010c010b200310322201450d020b20002001360200200041086a220141003602002000200341027636020420004100200210a9082000280200200128020022004102746a2004200241027410c9081a2001200020026a3602000f0b103b000b1039000bd80101027f024002400240200041046a280200220320016b20024f0d00200120026a22022001490d02200341017422012002200120024b1b22014104200141044b1b220141ffffffff037122042001470d02200141027422024100480d0220042001464102742104024002400240024002402000280200410020031b22010d002002450d010c030b200341027422030d0120020d020b200421010c020b200120032002103522010d010c030b200210322201450d020b20002001360200200041046a20024102763602000b0f0b2004450d001039000b103b000bcf0201077f230041106b220124000240024002400240200041086a2802002202450d0020002802002203200241027422046a210541002106200321070240034020072802000d01200741046a2107200641016a21062004417c6a22040d000b2002417f6a21060b2006450d0020022006490d01200220066b220741ffffffff03712007470d0220074102742207417f4c0d024104210402402007450d00200710322204450d040b200141003602082001200436020020012007410276360204200141002005200320064102746a22076b2206410276220410a9082001280200200128020822024102746a2007200610c9081a2001200220046a3602080240200041046a28020041ffffffff0371450d002000280200102c0b20002001290300370200200041086a200141086a2802003602000b200141106a24000f0b2006200241a0aec8001058000b103b000b1039000be30303047f017e057f230041106b22012400024002400240024002400240024020002802002202280200220341016a41004c0d002002200336020020002802042203280200220441016a41004c0d0120022903082105200320043602002000280208220441086a2802002206200028020c220728020022086b41016a220920064f0d024101200028021428020020086a6b22062000280210220841086a28020022006a220a20064f0d0302400240200542ffffffff0f560d00410021002005200428020020094102746a3502007e20032903084220862008280200200a4102746a35020084580d010b20022802000d052002410036020020022002290308427f7c370308200441086a2802002200200020072802006b22024d0d0620032802000d07200428020020024102746a3502002105200341003602002003200520032903087c370308410121000b200141106a240020000f0b41fcaec8004118200141086a4194afc80041b4afc8001040000b41fcaec8004118200141086a4194afc80041c4afc8001040000b200920064188adc800103f000b200a20004188adc800103f000b41d4afc8004110200141086a41e4afc80041f4afc8001040000b200220004188adc800103f000b41d4afc8004110200141086a41e4afc8004184b0c8001040000bd003030a7f017e027f02400240024002400240200141086a2802002203200241086a2802002204200320044b1b220541016a22064101200641014b1b220741ffffffff03712007470d0020074102742206417f4c0d000240024020060d00410421080c010b200610372208450d020b20002008360200200041086a200736020020002006410276360204024020050d00410021000c050b2007417f6a21062004417f6a220920044b210a200741027420086a417c6a210b2002280200210c410021024200210d03404100210002402003417f6a220e20034b0d00410021002003200e20026b220f4d0d0041002100200f200e4b0d002001280200200f4102746a28020021000b4100210e0240200a0d002004200920026b220f4d0d00200f20094b0d00200c200f4102746a280200210e0b200720064d0d03200b200d2000ad7c200ead7c220d3e0200200b417c6a210b2006417f6a2106200d422088210d2005200241016a2202460d040c000b0b103b000b1039000b2006200741b0aec800103f000b200da721000b024020072005417f736a220620074f0d00200820064102746a20003602000240200141046a28020041ffffffff0371450d002001280200102c0b0f0b2006200741b0aec800103f000bba0203027f027e037f230041206b22022400200241106a41086a2203200141086a28020036020020022001290200370310200241106a10aa08024002400240200328020022014105744180014b0d00024020010d0042002104420021050c020b2002280210220341786a21062003200141027422016a417c6a280200210741002103200241086a21084200210442002105034020022007ad4200200341e0007110cd08200829030020057c2002290300220520047c2204200554ad7c210520014104460d02200341206a2103200620016a28020021072001417c6a21010c000b0b20004182aec80036020420004101360200200041086a411d3602000c010b20004100360200200041106a2005370300200041086a20043703000b0240200228021441ffffffff0371450d002002280210102c0b200241206a24000b1c00200128021841d8bdc800410f2001411c6a28020028020c1100000bf20102047f017e230041106b22022400200241086a2001108702024002400240024002402002280208450d00200041003602000c010b024020012802042203200228020c2204490d002004417f4c0d020240024020040d00410121050c010b200410372205450d04200128020421030b024020032004490d0020052001280200200410c9082103200128020422052004490d052001200520046b3602042001200128020020046a3602002003450d0120002004ad2206422086200684370204200020033602000c020b2005102c0b200041003602000b200241106a24000f0b103b000b1039000b200420054194afc0001058000b9a0201057f230041106b22022400024002400240200128020022030d00410121040c010b0240200141086a28020041056a2204417f4c0d0020040d0141012105410021040c020b103b000b2004103222050d001039000b200241003602082002200436020420022005360200200241004101102f20022802002205200228020822046a21060240024020030d00200641003a0000200441016a21040c010b200641013a00002002200441016a360208200141086a280200220420021077200220022802082004102f20022802002205200228020822016a2003200410c9081a200120046a21040b20002002290300370204200041013602002000410c6a2004360200200041106a2004ad4220862005ad84370300200241106a24000b0600200010140b0600200010150bb10301047f230041c0006b2202240020002802002103410121000240200128021841859cc000410c2001411c6a28020028020c1100000d0002400240200328020822000d0020032802002200200328020428020c11080042f4f99ee6eea3aaf9fe00520d012002200036020c2002412936021420022002410c6a36021020012802182104200128021c2105410121002002413c6a41013602002002420237022c200241949cc0003602282002200241106a36023820042005200241286a103e0d020c010b2002200036020c2002410836021420022002410c6a36021020012802182104200128021c2105410121002002413c6a41013602002002420237022c200241949cc0003602282002200241106a36023820042005200241286a103e0d010b200328020c2100200241106a41146a4102360200200241106a410c6a410236020020022000410c6a3602202002200041086a360218200241043602142002200036021020012802182100200128021c2101200241286a41146a41033602002002420337022c200241a49cc0003602282002200241106a36023820002001200241286a103e21000b200241c0006a240020000b180020002802002200280200200041046a280200200110690bdb0103027f017e017f024002400240200041046a2802002202200028020822036b20014f0d00200320016a22012003490d02200241017422032001200320014b1b22014104200141044b1bad420c7e2204422088a722030d022004a722014100480d022003454102742105024002400240024002402000280200410020021b22030d002001450d010c030b2002410c6c22020d0120010d020b200521020c020b200320022001103522020d010c030b200110322202450d020b20002002360200200041046a2001410c6e3602000b0f0b2005450d001039000b103b000b1c00200128021841d8bdc800410f2001411c6a28020028020c1100000bc50201057f230041106b22022400024002400240024020002d002c410171450d0002400240200028020041244b0d00200041056a2103200021040c010b2000410c6a2104200041086a28020021030b2003450d0220042802002204450d02200420036a417f6a220320032d00002001723a00000c010b41242104024002402000280200220541244b0d00200041056a2106200021030c010b2000410c6a2103200041086a2802002106200521040b0240200328020022052004470d0020022000410110a008024020022802004101470d00200241086a2802000d0441e8c4c800411141fcc4c800103c000b2000410c6a22032802002105200041086a28020021060b200620056a20014104743a00002003200328020041016a3602000b2000200028022c41016a36022c200241106a24000f0b41a0c0c800413a41dcc0c800105c000b1039000bcf0101027f230041306b22032400024002400240024020024125490d002002417f4c0d02200210322204450d0320042001200210c90821012000410c6a2002360200200041086a2001360200410121010c010b2003410c6a2001200210c9081a200041256a2003412c6a2800003600002000411d6a200341246a290000370000200041156a2003411c6a2900003700002000410d6a200341146a290000370000200041056a200329000c370000410021010b200020013a000420002002360200200341306a24000f0b103b000b1039000bdf0f29027f027e017f017e017f017e017f027e017f017e017f017e017f027e017f017e017f017e017f017e017f017e017f017e017f027e017f017e017f017e017f037e017f027e017f017e017f017e017f037e0d7f230022022103200241c0026b41607122022400200129030021044200210520014200370300200141386a22062903002107200141306a22082903002109200141286a220a290300210b200141206a290300210c20014198016a220d290300210e20014190016a220f290300211020014188016a2211290300211220014180016a2903002113200141d8016a22142903002115200141d0016a22162903002117200141c8016a22182903002119200141c0016a221a290300211b200141e0016a221c290300211d200141a0016a221e290300211f200141a8016a2903002120200141b0016a22212903002122200141b8016a22232903002124200141e0006a22252903002126200141e8006a2903002127200141f0006a2903002128200141f8006a2229290300212a200141c0006a290300212b200141c8006a222c290300212d200141d0006a222e290300212f200141d8006a2230290300213120012903082132200129031021332002200141186a223429030037039801200220333703900120022032370388012002200437038001200220313703182002202f3703102002202d3703082002202b3703002002202a3703b802200220283703b002200220273703a802200220263703a0022002202437039802200220223703900220022020370388022002201f3703800241092135024002400240024002402004a70e050401020300040b200241e8016a41106a200229039801370300200241e8016a41086a200229039001370300200241d0016a41086a20022903a802370300200241d0016a41106a20022903b002370300200241c0016a41086a20022903880237030020022002290388013703e801200220022903a0023703d00120022002290380023703c001200220022800940236007b2002200228009102360278200241c8006a41186a2017370300200241c8006a41106a2019370300200241c8006a41206a20153703002002201b3703502002201d370370200220243703482022a72135420321050c030b200241c8006a41186a200b370300200241d0006a200229039801370300200241c8006a41206a2009370300200241c8006a41286a20073703002002200c3703582002200228008c0136007b200220022800890136027820022002290390013703482032a721350c020b200241e8016a41106a200229039801370300200241e8016a41086a200229039001370300200241c8006a41086a2002290310370300200241c8006a41106a2002290318370300200241c8006a41286a20022903b002370300200241c8006a41206a20022903a80237030020022002290388013703e801200220022800013602782002200228000436007b20022002290308370348200220022903a002370360202ba72135420121050c010b200241e8016a41106a200229039801370300200241e8016a41086a200229039001370300200241d0016a41086a20022903a802370300200241d0016a41106a20022903b002370300200241c8006a41186a200e3703002002201337034820022002290388013703e801200220022903a0023703d001200220022800b902360278200220022800bc0236007b2002201237035020022010370358200241c8006a41286a2002290388023703002002200229038002370368202aa72135420221050b200241a0026a41086a2236200241e8016a41086a290300370300200241a0026a41106a2237200241e8016a41106a29030037030020024180026a41086a2238200241d0016a41086a29030037030020024180026a41106a2239200241d0016a41106a290300370300200220022903e8013703a002200220022903d00137038002200241386a41086a223a200241c0016a41086a290300370300200220022903c001370338200241086a223b20024180016a41086a290300370300200241106a223c20024180016a41106a290300370300200241186a223d20024180016a41186a290300370300200241206a223e20024180016a41206a290300370300200241286a223f20024180016a41286a290300370300200241306a224020024180016a41306a2903003703002002200229038001370300200020353a0000200041046a200228007b36000020002002280278360001200041306a200241c8006a41286a290300370000200041286a200241c8006a41206a290300370000200041206a200241c8006a41186a290300370000200041186a200241c8006a41106a290300370000200041106a200241c8006a41086a290300370000200041086a2002290348370000200110a20120302031370300202e202f370300202c202d3703002001202b3703402006200737030020082009370300200a200b3703002001200c370320200d200e370300200f2010370300201120123703002001201337038001200120053703002029202a370300200120022903a002370308200141106a2036290300370300203420372903003703002025200229038002370300202541086a2038290300370300202541106a2039290300370300201e2002290338370300201e41086a203a290300370300201c20402903003703002014203f2903003703002016203e2903003703002018203d290300370300201a203c2903003703002023203b29030037030020212002290300370300200324000bf50201027f230041106b2202240002400240024002400240200028020022002802000e0401020300010b2001280218419ecbc80041062001411c6a28020028020c11000021010c030b200128021841a4cbc80041032001411c6a28020028020c11000021010c020b2002200128021841a7cbc80041052001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41accbc80010661a20022d0008210120022802042203450d01200141ff0171210041012101024020000d00024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841fa9dc00041012000411c6a28020028020c1100000d010b2002280200220128021841c5c7c50041012001411c6a28020028020c11000021010b200220013a00080c010b200128021841bccbc80041082001411c6a28020028020c11000021010b200241106a2400200141ff01714100470b900d01027f230041106b220224000240024002400240024002400240024002400240200028020022002d00000e09010203040506070800010b200128021841c4cbc80041092001411c6a28020028020c11000021010c080b200128021841cdcbc80041062001411c6a28020028020c11000021010c070b200128021841d3cbc80041092001411c6a28020028020c1100002103200241003a0005200220033a0004200220013602002002200041046a36020c200241dccbc80041022002410c6a41e0cbc80010601a20022d0004210120022d0005450d06200141ff0171210041012101024020000d0020022802002201411c6a28020028020c210020012802182103024020012d00004104710d002002200341f49dc0004102200011000022013a00040c080b200341f69dc0004101200011000021010b200220013a00040c060b200128021841f0cbc800410b2001411c6a28020028020c1100002103200241003a0005200220033a0004200220013602002002200041246a36020c41012101200241fbcbc80041072002410c6a4184ccc800106021032002200041016a36020c200341dccbc80041022002410c6a4194ccc80010601a20022d00042100024020022d00050d00200021010c060b0240200041ff01710d0020022802002201411c6a28020028020c210020012802182103024020012d00004104710d002002200341f49dc0004102200011000022013a00040c070b200341f69dc0004101200011000021010b200220013a00040c050b200128021841a4ccc800410e2001411c6a28020028020c1100002103200241003a0005200220033a0004200220013602002002200041046a36020c200241fbcbc80041072002410c6a4184ccc800106021012002200041186a36020c200141b2ccc80041052002410c6a41b8ccc80010601a20022d0004210120022d0005450d04200141ff0171210041012101024020000d0020022802002201411c6a28020028020c210020012802182103024020012d00004104710d002002200341f49dc0004102200011000022013a00040c060b200341f69dc0004101200011000021010b200220013a00040c040b200128021841c8ccc800410c2001411c6a28020028020c1100002103200241003a0005200220033a0004200220013602002002200041186a36020c41012101200241fbcbc80041072002410c6a4184ccc800106021032002200041016a36020c200341d4ccc80041032002410c6a41d8ccc80010601a20022d00042100024020022d00050d00200021010c040b0240200041ff01710d0020022802002201411c6a28020028020c210020012802182103024020012d00004104710d002002200341f49dc0004102200011000022013a00040c050b200341f69dc0004101200011000021010b200220013a00040c030b200128021841e8ccc800410e2001411c6a28020028020c1100002103200241003a0005200220033a000420022001360200410121012002200041016a36020c200241dccbc80041022002410c6a41f8ccc80010601a20022d00042100024020022d00050d00200021010c030b0240200041ff01710d0020022802002201411c6a28020028020c210020012802182103024020012d00004104710d002002200341f49dc0004102200011000022013a00040c040b200341f69dc0004101200011000021010b200220013a00040c020b20012802184188cdc800410c2001411c6a28020028020c1100002103200241003a0005200220033a0004200220013602002002200041086a36020c200241dccbc80041022002410c6a4194cdc80010601a20022d0004210120022d0005450d01200141ff0171210041012101024020000d0020022802002201411c6a28020028020c210020012802182103024020012d00004104710d002002200341f49dc0004102200011000022013a00040c030b200341f69dc0004101200011000021010b200220013a00040c010b2002200128021841a4cdc800410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41accbc80010661a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841fa9dc00041012000411c6a28020028020c1100000d010b2002280200220128021841c5c7c50041012001411c6a28020028020c11000021010b200220013a00080b200241106a2400200141ff01714100470bc20101047f230041106b220224002000280200220028020821032000280200210041012104200128021841fc9dc00041012001411c6a28020028020c1100002105200241003a0005200220053a00042002200136020002402003450d0003402002200036020c20022002410c6a41b0cdc80010671a200041016a21002003417f6a22030d000b20022d000421050b0240200541ff01710d0020022802002200280218419a92c10041012000411c6a28020028020c11000021040b200241106a240020040bd70201047f024020002802082201450d002000280200210220014198026c2103410021010340024002400240024002400240024002400240200220016a22042802000e0b0808080800010203040506070b200441086a280200450d07200441046a280200102c0c070b200441086a280200450d06200441046a280200102c0c060b200441086a10f5060c050b200441086a10f5060c040b200441086a280200450d03200441046a280200102c0c030b0240200441086a280200450d00200441046a280200102c0b200441106a2d00004106490d02200441186a280200450d02200441146a280200102c0c020b200441086a10f5060c010b200441086a10f506200441f0016a2d00004106490d00200441f8016a280200450d00200441f4016a280200102c0b200320014198026a2201470d000b0b024020002802042201450d0020002802002204450d0020014198026c450d002004102c0b0bbb0201047f024020002802082201450d002000280200210220014188026c21034100210103400240024002400240024002400240200220016a22002802000e06060001020304050b200041046a10bd08200041106a10f5060c050b200041046a10bd08200041206a10f506200041106a220410be08200041146a2802002200450d0420004188026c450d042004280200102c0c040b200041046a10bd08200041106a10bd080c030b200041046a10bd08200041206a10f506200041106a220410be08200041146a2802002200450d0220004188026c450d022004280200102c0c020b200041046a10bd08200041206a10f506200041106a220410be08200041146a2802002200450d0120004188026c450d012004280200102c0c010b200041186a10f506200041046a10bd080b200320014188026a2201470d000b0b0bb00201027f02400240024002400240024002400240200028020022012d00000e0700010203040506070b200141046a10bd08200141106a220210be08200141146a2802002201450d0620022802002202450d0620014188026c450d062002102c0c060b200141046a10bd08200141106a220210be08200141146a2802002201450d0520022802002202450d0520014188026c450d052002102c0c050b200141046a10bd08200141106a220210be08200141146a2802002201450d0420022802002202450d0420014188026c450d042002102c0c040b200141046a10bd080c030b200141086a2802002202450d02200141046a2802002201450d022002450d022001102c0c020b200141086a10f506200141046a10bf080c010b200141086a10f506200141046a10bf080b2000280200102c0b810501037f230041106b220224002000280200210041012103200128021841fc9dc00041012001411c6a28020028020c1100002104200241003a0005200220043a0004200220013602002002200036020c20022002410c6a41b0cdc800106721012002200041016a36020c20012002410c6a41b0cdc800106721012002200041026a36020c20012002410c6a41b0cdc800106721012002200041036a36020c20012002410c6a41b0cdc800106721012002200041046a36020c20012002410c6a41b0cdc800106721012002200041056a36020c20012002410c6a41b0cdc800106721012002200041066a36020c20012002410c6a41b0cdc800106721012002200041076a36020c20012002410c6a41b0cdc800106721012002200041086a36020c20012002410c6a41b0cdc800106721012002200041096a36020c20012002410c6a41b0cdc8001067210120022000410a6a36020c20012002410c6a41b0cdc8001067210120022000410b6a36020c20012002410c6a41b0cdc8001067210120022000410c6a36020c20012002410c6a41b0cdc8001067210120022000410d6a36020c20012002410c6a41b0cdc8001067210120022000410e6a36020c20012002410c6a41b0cdc8001067210120022000410f6a36020c20012002410c6a41b0cdc800106721012002200041106a36020c20012002410c6a41b0cdc800106721012002200041116a36020c20012002410c6a41b0cdc800106721012002200041126a36020c20012002410c6a41b0cdc800106721012002200041136a36020c20012002410c6a41b0cdc80010671a024020022d00040d0020022802002200280218419a92c10041012000411c6a28020028020c11000021030b200241106a240020030bb90701037f230041106b220224002000280200210041012103200128021841fc9dc00041012001411c6a28020028020c1100002104200241003a0005200220043a0004200220013602002002200036020c20022002410c6a41b0cdc800106721012002200041016a36020c20012002410c6a41b0cdc800106721012002200041026a36020c20012002410c6a41b0cdc800106721012002200041036a36020c20012002410c6a41b0cdc800106721012002200041046a36020c20012002410c6a41b0cdc800106721012002200041056a36020c20012002410c6a41b0cdc800106721012002200041066a36020c20012002410c6a41b0cdc800106721012002200041076a36020c20012002410c6a41b0cdc800106721012002200041086a36020c20012002410c6a41b0cdc800106721012002200041096a36020c20012002410c6a41b0cdc8001067210120022000410a6a36020c20012002410c6a41b0cdc8001067210120022000410b6a36020c20012002410c6a41b0cdc8001067210120022000410c6a36020c20012002410c6a41b0cdc8001067210120022000410d6a36020c20012002410c6a41b0cdc8001067210120022000410e6a36020c20012002410c6a41b0cdc8001067210120022000410f6a36020c20012002410c6a41b0cdc800106721012002200041106a36020c20012002410c6a41b0cdc800106721012002200041116a36020c20012002410c6a41b0cdc800106721012002200041126a36020c20012002410c6a41b0cdc800106721012002200041136a36020c20012002410c6a41b0cdc800106721012002200041146a36020c20012002410c6a41b0cdc800106721012002200041156a36020c20012002410c6a41b0cdc800106721012002200041166a36020c20012002410c6a41b0cdc800106721012002200041176a36020c20012002410c6a41b0cdc800106721012002200041186a36020c20012002410c6a41b0cdc800106721012002200041196a36020c20012002410c6a41b0cdc8001067210120022000411a6a36020c20012002410c6a41b0cdc8001067210120022000411b6a36020c20012002410c6a41b0cdc8001067210120022000411c6a36020c20012002410c6a41b0cdc8001067210120022000411d6a36020c20012002410c6a41b0cdc8001067210120022000411e6a36020c20012002410c6a41b0cdc8001067210120022000411f6a36020c20012002410c6a41b0cdc80010671a024020022d00040d0020022802002200280218419a92c10041012000411c6a28020028020c11000021030b200241106a240020030b834a0f027f017e1c7f017e017f067e017f097e027f017e037f077e0c7f057e047f230041f00b6b22022400024020002802000d00200041086a2103420021040240024002400240024020012802000e050401020300040b200241b00b6a200141086a10c308200241c8036a200141c0006a10c308200241b0056a200141f8006a10c308200241d0086a200141b0016a10c30820024190036a41086a200241b00b6a41096a29000037030020024190036a41106a200241b00b6a41116a29000037030020024190036a41186a200241b00b6a41196a29000037030020024190036a41206a200241b00b6a41216a29000037030020024190036a41286a200241b00b6a41296a29000037030020024190036a412f6a200241b00b6a41306a290000370000200241d8026a41086a200241c8036a41096a290000370300200241d8026a41106a200241c8036a41116a290000370300200241d8026a41186a200241c8036a41196a290000370300200241d8026a41206a200241c8036a41216a290000370300200241d8026a41286a200241c8036a41296a290000370300200241d8026a412f6a200241c8036a41306a290000370000200220022900b10b37039003200220022900c9033703d80220022d00b00b210520022d00c8032106200241a0026a41086a200241b0056a41096a290000370300200241a0026a41106a200241b0056a41116a290000370300200241a0026a41186a200241b0056a41196a290000370300200241a0026a41206a200241b0056a41216a290000370300200241a0026a41286a200241b0056a41296a290000370300200241a0026a412f6a200241b0056a41306a290000370000200241e8016a41086a200241d0086a41096a290000370300200241e8016a41106a200241d0086a41116a290000370300200241e8016a41186a200241d0086a41196a290000370300200241e8016a41206a200241d0086a41216a290000370300200241e8016a41286a200241d0086a41296a290000370300200241e8016a412f6a200241d0086a41306a290000370000200220022900b1053703a002200220022900d1083703e80120022d00b005210720022d00d0082108420421040c030b200241d0086a200141086a10c30820024190036a41086a200241d9086a290000370300200241a0036a200241e1086a290000370300200241a8036a200241e9086a290000370300200241b0036a200241f1086a290000370300200241b8036a200241f9086a290000370300200241bf036a20024180096a290000370000200220022900d1083703900320022d00d0082105420121040c020b200241b0056a200141086a10c308200241d0086a200141c0006a10c30820024190036a41086a200241b0056a41096a29000037030020024190036a41106a200241b0056a41116a29000037030020024190036a41186a200241b0056a41196a29000037030020024190036a41206a200241b0056a41216a29000037030020024190036a41286a200241b0056a41296a29000037030020024190036a412f6a200241b0056a41306a290000370000200241d8026a41086a200241d0086a41096a290000370300200241d8026a41106a200241d0086a41116a290000370300200241d8026a41186a200241d0086a41196a290000370300200241d8026a41206a200241d0086a41216a290000370300200241d8026a41286a200241d0086a41296a290000370300200241d8026a412f6a200241d0086a41306a290000370000200220022900b10537039003200220022900d1083703d80220022d00b005210520022d00d0082106420221040c010b200241c8036a200141086a10c308200241b0056a200141c0006a10c308200241d0086a200141f8006a10c30820024190036a41086a200241c8036a41096a29000037030020024190036a41106a200241c8036a41116a29000037030020024190036a41186a200241c8036a41196a29000037030020024190036a41206a200241c8036a41216a29000037030020024190036a41286a200241c8036a41296a29000037030020024190036a412f6a200241c8036a41306a290000370000200241d8026a41086a200241b0056a41096a290000370300200241d8026a41106a200241b0056a41116a290000370300200241d8026a41186a200241b0056a41196a290000370300200241d8026a41206a200241b0056a41216a290000370300200241d8026a41286a200241b0056a41296a290000370300200241d8026a412f6a200241b0056a41306a290000370000200220022900c90337039003200220022900b1053703d80220022d00c803210520022d00b0052106200241a0026a41086a200241d0086a41096a290000370300200241a0026a41106a200241d0086a41116a290000370300200241a0026a41186a200241d0086a41196a290000370300200241a0026a41206a200241d0086a41216a290000370300200241a0026a41286a200241d0086a41296a290000370300200241a0026a412f6a200241d0086a41306a290000370000200220022900d1083703a00220022d00d0082107420321040b4100210941002101024002400240024002402003280200220a417f6a0e0400010203040b200041106a2d00004521010c030b41002101200041106a2d00000d0241014102200041c8006a2d00001b21010c020b41002101200041106a2d00000d0141012101200041c8006a2d00000d014102410320004180016a2d00001b21010c010b41002101200041106a2d00000d0041012101200041c8006a2d00000d004102210120004180016a2d00000d0041034104200041b8016a2d00001b21010b4100210b024002400240024002402004a7220c0e050400010203040b4100417f200541ff01711b21094101210b0c030b4102210b200541ff01710d02417f417e200641ff01711b21090c020b4103210b200541ff01710d01417f2109200641ff01710d01417e417d200741ff01711b21090c010b4104210b200541ff01710d00417f2109200641ff01710d00417e2109200741ff01710d00417d417c200841ff01711b21090b20012009200b6a220d4b210e4104210b4104210902400240024002400240200a0e050001020304000b410021090c030b410121090c020b410221090c010b410321090b200d2001200e1b210102400240024002400240200c0e050001020304000b4100210b0c030b4101210b0c020b4102210b0c010b4103210b0b02400240200920014101746b200b6a41044b0d00200241c8036a41c0006a220f20063a0000200241d9036a20024190036a41086a290300370000200241e1036a20024190036a41106a290300370000200241e9036a20024190036a41186a290300370000200241f1036a20024190036a41206a290300370000200241f9036a20024190036a41286a290300370000200241c8036a41386a20024190036a412f6a290000370000200220053a00d003200220043703c80320022002290390033700d103200241c8036a41f8006a221020073a000020024191046a200241d8026a41086a29030037000020024199046a200241d8026a41106a290300370000200241a1046a200241d8026a41186a290300370000200241a9046a200241d8026a41206a290300370000200241b1046a200241d8026a41286a290300370000200241c8036a41f0006a200241d8026a412f6a290000370000200241c9046a200241a0026a41086a290300370000200241d1046a200241a0026a41106a290300370000200241d9046a200241a0026a41186a290300370000200241e1046a200241a0026a41206a290300370000200241e9046a200241a0026a41286a290300370000200241c8036a41a8016a200241a0026a412f6a290000370000200220022903d80237008904200220022903a0023700c104200241c8036a41b0016a221120083a0000200241c8036a41e0016a200241e8016a412f6a290000370000200241a1056a200241e8016a41286a29030037000020024199056a200241e8016a41206a29030037000020024191056a200241e8016a41186a29030037000020024189056a200241e8016a41106a29030037000020024181056a200241e8016a41086a290300370000200220022903e8013700f904200041b8016a210120004180016a210b200041c8006a2109200241c8036a41086a2112200041306a2113200041e0006a210c200041d8006a210d200041d0006a2114200041a0016a210e20004198016a211520004190016a2116200041c0016a2117200041d8016a2118200041d0016a211920004188016a211a200041e8006a211b03404100210a0240024002400240024020022802c8030e050401020300040b2011210a0c030b2012210a0c020b200f210a0c010b2010210a0b0240200a450d002000290308500d0020002d001041ff01710d00200a2d0000450d00200241d0086a200241c8036a10b908024020022d00d008220a4109460d000240024002400240200a417e6a0e06000102040403040b20022802f4084101470d0320022802fc08220a201c200a1b211c20022802f8084100200a1b220a450d03201c450d03200a102c0c030b20022802d4084101470d0220022802dc08220a201d200a1b211d20022802d8084100200a1b220a450d02201d450d02200a102c0c020b20022802e8084101470d0120022802f008220a201e200a1b211e20022802ec084100200a1b220a450d01201e450d01200a102c0c010b20022802d808220a201f200a1b211f20022802d4084100200a1b220a450d00201f450d00200a102c0b200028020821204200212120004200370308200041386a2222290300212320132903002124200c2903002125200d290300212620142903002127200b2903002128200041f8006a2229290300212a200041f0006a290300212b200e290300212c2015290300212d2016290300212e200041b0016a290300212f200041e0016a29030021302018290300213120192903002132200041186a22332903002204a72134200041106a2903002235a721362004422088a721372035422088a72138200029032821392000290348213a2000290368213b200029038801213c20002903a801213d20002903c801213e20002903e801213f4109210a02400240024002400240024020200e050501020300050b2017290300213520012903002104420321212037214020342141203821420c030b2037214020342141203821420c020b420121212037214020342141203821420c010b420221212037214020342141203821420b2036210a0b200241b0056a41306a2220200241d0086a41306a290300370300200241b0056a41286a2234200241d0086a41286a290300370300200241b0056a41206a2236200241d0086a41206a290300370300200241b0056a41186a2237200241d0086a41186a290300370300200241b0056a41106a2238200241d0086a41106a290300370300200241b0056a41086a2243200241d0086a41086a290300370300200220022903d0083703b005200310a201200041a8016a2030370300200e2031370300201520323703002000203e37039001201a203537030020002004370380012029202f3703002000203d370370201b202c370300200c202d370300200d202e3703002000203c370350200041c0006a202a3703002022202b3703002000203b370330200041286a2025370300200041206a2026370300203320273703002000203a3703102000203f3703b0012000202837034820002021370308200120022903b005370300200141086a2043290300370300200141106a2038290300370300200141186a2037290300370300200141206a2036290300370300200141286a2034290300370300200141306a20202903003703000240024002400240200a41ff0171417e6a0e06000102050503050b202442808080807083428080808010854200520d042023422088a7220a2044200a1b21442023a74100200a1b220a450d042044450d04200a102c0c040b20424101470d032040204520401b21452041410020401b220a450d032045450d03200a102c0c030b2039a74101470d022024a7220a2046200a1b21462039422088a74100200a1b220a450d022046450d02200a102c0c020b2041204720411b21472042410020411b220a450d012047450d01200a102c0c010b0b200241b0056a200241c8036a41e80110c9081a200241d0086a200241b0056a10b9080240024020022d00d00822204109460d00200041116a2122200241d0086a41b0016a210e200241d0086a41096a2148200241d0086a41f8006a210d200241d0086a41086a210a200241d0086a4101722129200241d0086a41c0006a210c200041106a2145200041206a2144200041e0006a210f20004180016a2110200041a0016a2111200041c0016a2112200041e0016a2117200241980a6a211e200241f8096a211d200241d8096a211c200241b8096a214920024198096a214a200241d0086a41286a214b03402002419c076a41026a2215202941026a2d00003a0000200220292f00003b019c0720022802d408211620022802d808211420022802dc08211820022903e008214c20022802e808211b20022802ec08211f20022802f008211920022802f408214720022802f808214620022802fc08211a200229038009214d200029030821042000420037030820452903002128200041186a290300212f20442903002135200041306a290300213d200041386a290300212a200041c0006a2903002121200041d0006a290300213b200041d8006a2903002125200f2903002126200041f0006a2903002127200041f8006a290300212c2010290300212d20004190016a290300212e20004198016a290300213020112903002131200041b0016a2903002132200041b8016a290300213a2012290300213c200041d0016a290300213e200041d8016a290300213f20002903e80121242000290328212b2000290348213920002903682123200029038801214e20002903a801214f20002903c8012150200241d0086a41d8016a2017290300370300200241d0086a41d0016a203f370300201e203e370300200241d0086a41b8016a203c370300200e203a370300201d2032370300200241d0086a4198016a2031370300200241d0086a4190016a2030370300201c202e370300200d202d370300200241d0086a41f0006a202c37030020492027370300200241d0086a41d8006a2026370300200241d0086a41d0006a2025370300204a203b370300200241d0086a41386a2021370300200241d0086a41306a202a370300204b203d370300200241d0086a41186a2035370300200220503703900a2002204f3703f0092002204e3703d009200220233703b00920022039370390092002202b3703f0082002202f3703e008200220283703d808200220043703d008200220243703b00a200241bc0a6a41026a223320152d00003a0000200220022f019c073b01bc0a02400240024002400240024002402004a722340e0404000102030b200241ec0b6a41026a20332d00003a0000200241b00b6a41086a200a41086a290300370300200241b00b6a41106a200a41106a290300370300200241b00b6a41186a200a41186a290300370300200241b00b6a41206a200a41206a290300370300200241b00b6a41286a200a41286a290300370300200241b00b6a41306a200a41306a290300370300200220022f01bc0a3b01ec0b2002200a2903003703b00b420221040c040b200241ec0b6a41026a20332d00003a0000200241b00b6a41086a200a41086a290300370300200241b00b6a41106a200a41106a290300370300200241b00b6a41186a200a41186a290300370300200241b00b6a41206a200a41206a290300370300200241b00b6a41286a200a41286a290300370300200241b00b6a41306a200a41306a290300370300200220022f01bc0a3b01ec0b2002200a2903003703b00b200241f80a6a41306a200c41306a290300370300200241f80a6a41286a200c41286a290300370300200241f80a6a41206a200c41206a290300370300200241f80a6a41186a200c41186a290300370300200241f80a6a41106a200c41106a290300370300200241f80a6a41086a200c41086a2903003703002002200c2903003703f80a420321040c030b200241ec0b6a41026a20332d00003a0000200241b00b6a41086a200a41086a290300370300200241b00b6a41106a200a41106a290300370300200241b00b6a41186a200a41186a290300370300200241b00b6a41206a200a41206a290300370300200241b00b6a41286a200a41286a290300370300200241b00b6a41306a200a41306a290300370300200220022f01bc0a3b01ec0b2002200a2903003703b00b200241f80a6a41306a200c41306a290300370300200241f80a6a41286a200c41286a290300370300200241f80a6a41206a200c41206a290300370300200241f80a6a41186a200c41186a290300370300200241f80a6a41106a200c41106a290300370300200241f80a6a41086a200c41086a290300370300200241c00a6a41306a200d41306a290300370300200241c00a6a41286a200d41286a290300370300200241c00a6a41206a200d41206a290300370300200241c00a6a41186a200d41186a290300370300200241c00a6a41106a200d41106a290300370300200241c00a6a41086a200d41086a2903003703002002200c2903003703f80a2002200d2903003703c00a420421040c020b202aa72133203da72134202fa721362028a72137202a422088a72138203d422088a72143202b422088a72141202f422088a721422028422088a72140202ba72113200241cc086a41026a204841026a2d00003a000020024190086a41086a200c41086a29030037030020024190086a41106a200c41106a29030037030020024190086a41186a200c41186a29030037030020024190086a41206a200c41206a29030037030020024190086a41286a200c41286a29030037030020024190086a41306a200c41306a290300370300200220482f00003b01cc082002200c29030037039008200241d8076a41306a200d41306a290300370300200241d8076a41286a200d41286a290300370300200241d8076a41206a200d41206a290300370300200241d8076a41186a200d41186a290300370300200241d8076a41106a200d41106a290300370300200241d8076a41086a200d41086a290300370300200241a0076a41306a200e41306a290300370300200241a0076a41286a200e41286a290300370300200241a0076a41206a200e41206a290300370300200241a0076a41186a200e41186a290300370300200241a0076a41106a200e41106a290300370300200241a0076a41086a200e41086a2903003703002002200d2903003703d8072002200e2903003703a007410121150240024002400240202041ff0171417e6a0e06000102060603060b4101211520474101470d05201a2051201a1b215120464100201a1b2220450d052051450d052020102c0c050b4101211520164101470d042018205220181b21522014410020181b2220450d042052450d042020102c0c040b41012115201b4101470d032019205320191b2153201f410020191b2220450d032053450d032020102c0c030b2014205420141b21542016410020141b2220450d022054450d022020102c0c020b200241ec0b6a41026a20332d00003a0000200220022f01bc0a3b01ec0b420121040b200241cc086a41026a200241ec0b6a41026a2d00003a000020024190086a41086a200241b00b6a41086a29030037030020024190086a41106a200241b00b6a41106a29030037030020024190086a41186a200241b00b6a41186a29030037030020024190086a41206a200241b00b6a41206a29030037030020024190086a41286a200241b00b6a41286a29030037030020024190086a41306a200241b00b6a41306a290300370300200220022f01ec0b3b01cc08200220022903b00b37039008200241d8076a41306a200241f80a6a41306a290300370300200241d8076a41286a200241f80a6a41286a290300370300200241d8076a41206a200241f80a6a41206a290300370300200241d8076a41186a200241f80a6a41186a290300370300200241d8076a41106a200241f80a6a41106a290300370300200241d8076a41086a200241f80a6a41086a290300370300200241a0076a41086a200241c00a6a41086a290300370300200241a0076a41106a200241c00a6a41106a290300370300200241a0076a41186a200241c00a6a41186a290300370300200241a0076a41206a200241c00a6a41206a290300370300200241a0076a41286a200241c00a6a41286a290300370300200241a0076a41306a200241c00a6a41306a290300370300200220022903f80a3703d807200220022903c00a3703a0074100211502402034417f6a41024d0d00200241d0086a10a2010b20202137201621402014213620182142204c2135201b2113201f2141201921342047214320462133201a2138204d21210b200310a201200020373a001020002004370308200020213703402000203836023c2000203336023820002043360234200020343602302000204136022c20002013360228200020353703202000204236021c2000203636021820002040360214202220022f01cc083b0000202241026a200241cc086a41026a2d00003a00002009200229039008370300200941086a20024190086a41086a290300370300200941106a20024190086a41106a290300370300200941186a20024190086a41186a290300370300200941206a20024190086a41206a290300370300200941286a20024190086a41286a290300370300200941306a20024190086a41306a290300370300200b41306a200241d8076a41306a290300370300200b41286a200241d8076a41286a290300370300200b41206a200241d8076a41206a290300370300200b41186a200241d8076a41186a290300370300200b41106a200241d8076a41106a290300370300200b41086a200241d8076a41086a290300370300200b20022903d807370300200120022903a007370300200141086a200241a0076a41086a290300370300200141106a200241a0076a41106a290300370300200141186a200241a0076a41186a290300370300200141206a200241a0076a41206a290300370300200141286a200241a0076a41286a290300370300200141306a200241a0076a41306a29030037030020150d02200241d0086a200241b0056a10b90820022d00d00822204109470d000b0b200241b0056a10f506420521040c020b41ecc9c8004130200241d0086a419ccac80041accac8001040000b200241b0016a412f6a20024190036a412f6a290000370000200241b0016a41286a20024190036a41286a290300370300200241b0016a41206a20024190036a41206a290300370300200241b0016a41186a20024190036a41186a290300370300200241b0016a41106a20024190036a41106a290300370300200241b0016a41086a20024190036a41086a290300370300200241f8006a41086a200241d8026a41086a290300370300200241f8006a41106a200241d8026a41106a290300370300200241f8006a41186a200241d8026a41186a290300370300200241f8006a41206a200241d8026a41206a290300370300200241f8006a41286a200241d8026a41286a290300370300200241f8006a412f6a200241d8026a412f6a29000037000020022002290390033703b001200220022903d802370378200241c0006a412f6a200241a0026a412f6a290000370000200241c0006a41286a200241a0026a41286a290300370300200241c0006a41206a200241a0026a41206a290300370300200241c0006a41186a200241a0026a41186a290300370300200241c0006a41106a200241a0026a41106a290300370300200241c0006a41086a200241a0026a41086a290300370300200241086a412f6a200241e8016a412f6a290000370000200241086a41286a200241e8016a41286a290300370300200241086a41206a200241e8016a41206a290300370300200241086a41186a200241e8016a41186a290300370300200241086a41106a200241e8016a41106a290300370300200241086a41086a200241e8016a41086a290300370300200220022903a002370340200220022903e8013703080b20044205510d0020024190096a20063a0000200241e1086a200241b0016a41086a290300370000200241e9086a200241b0016a41106a290300370000200241f1086a200241b0016a41186a290300370000200241f9086a200241b0016a41206a29030037000020024181096a200241b0016a41286a29030037000020024188096a200241b0016a412f6a290000370000200220053a00d808200220043703d008200220022903b0013700d908200241c8096a20073a000020024199096a200241f8006a41086a290300370000200241a1096a200241f8006a41106a290300370000200241a9096a200241f8006a41186a290300370000200241b1096a200241f8006a41206a290300370000200241b9096a200241f8006a41286a290300370000200241c0096a200241f8006a412f6a290000370000200241d1096a200241c0006a41086a290300370000200241d9096a200241c0006a41106a290300370000200241e1096a200241c0006a41186a290300370000200241e9096a200241c0006a41206a290300370000200241f1096a200241c0006a41286a290300370000200241f8096a200241c0006a412f6a2900003700002002200229037837009109200220022903403700c909200241800a6a20083a0000200241b00a6a200241086a412f6a290000370000200241a90a6a200241086a41286a290300370000200241a10a6a200241086a41206a290300370000200241990a6a200241086a41186a290300370000200241910a6a200241086a41106a290300370000200241890a6a200241086a41086a290300370000200220022903083700810a200241d0086a10a2010b200241f00b6a24000b840501027f230041106b22022400024002400240024002400240024002400240024020012d00000e09010203040506070800010b200041083a00000c080b200041003a00000c070b200041013a0000200041046a200141046a2802003602000c060b410321030240024002400240200141246a2802000e0400010203000b410021030c020b2002200141286a10c408410121030c010b410221030b200041023a0000200041246a2003360200200041286a200229020037020020002001290001370001200041306a200241086a280200360200200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a2900003700000c050b410321030240024002400240200141046a2802000e0400010203000b410021030c020b2002200141086a10c408410121030c010b410221030b200041033a0000200041046a2003360200200041086a2002290200370200200041186a2001290318370300200041106a200241086a2802003602000c040b410321030240024002400240200141186a2802000e0400010203000b410021030c020b20022001411c6a10c408410121030c010b410221030b200041043a0000200041186a20033602002000411c6a200229020037020020002001290001370001200041246a200241086a280200360200200041096a200141096a290000370000200041116a200141116a2800003600000c030b200041053a0000200020012d00013a00010c020b200041063a0000200041106a200141106a290300370300200041086a200141086a2903003703000c010b2002200141046a10c408200041073a00002000410c6a200241086a280200360200200041046a20022903003702000b200241106a24000b5f01027f0240024020012802082202417f4c0d00200128020021030240024020020d00410121010c010b200210322201450d020b200020023602042000200136020020012003200210c9081a200041086a20023602000f0b103b000b1039000b8d14030c7f027e0d7f230041f01b6b22032400200041f8016a2802002104200041f4016a280200210520002802f0012106200341e8016a200041f00110c9081a0240024002400240024002400240024020052f0186162207410b490d00410521074100210802400240200441054f0d0041042107200421090c010b41052109024002402004417b6a0e020201000b200441796a210941012108410621070c010b41002109410121080b4188161032220a450d03200a200341f0056a41801610c908220b41003b018616200b4100360280162005200741f0016c6a2204280204210c2004280200210d200341d8036a200441086a41e80110c9081a200520074104746a220e41d8146a290300210f200e41d0146a2903002110200b200441f0016a20052f0186162007417f736a220441f0016c10c908220b41d0146a200e41e0146a200441047410c9081a200520073b018616200b20043b018616200b200520081b2204200941f0016c6a220741f0016a200720042f01861620096b41f0016c10ca081a2007200341e8016a41f00110c9081a200420094104746a220741e0146a200741d0146a221120042f01861620096b41047410ca081a200741d8146a200237030020112001370300200420042f01861641016a3b0186162003200341d8036a41e80110c908210e0240024020052802801622040d00410021060c010b41002107200e41d0056a2112200e41d8056a2113200e41e0056a2114200e41e8056a21150340200d2116200c2117200a211820052109200f2101201021022004210520092f0184162108200e41d8036a200e41e80110c9081a20062007470d0602400240024020052f0186162207410b490d00410021194104210b024020084105490d002008210b024002402008417b6a0e020201000b200841796a2108410121194106210b0c010b41002108410121194105210b0b41b8161032220a450d08200641016a210641002104200a200e41f0056a41801610c908220741003b01861620074100360280162007200e2903c0053703881620074190166a200e41c0056a41086a29030037030020074198166a2012290300370300200741a0166a2013290300370300200741a8166a2014290300370300200741b0166a20152903003703002005200b41f0016c6a2209280204210c2009280200210d200e41f0056a200941086a41e80110c9081a200541d0146a221a200b4104746a221b41086a290300210f201b29030021102007200941f0016a20052f018616221b200b417f736a220941f0016c10c908220741d0146a201a200b41016a221c4104746a200941047410c908211d2005200b3b018616200720093b018616200e41e8016a200e41f0056a41e80110c9081a20074188166a2005201c4102746a4188166a201b200b6b41027410c908211b02400340200720044102746a4188166a280200220b20043b018416200b20073602801620042004200949220b6a220420094b0d01200b0d000b0b200e41f0056a200e41e8016a41e80110c9081a200e41e8016a200e41f0056a41e80110c9081a2019450d012008410274201b6a41086a201b200841016a22044102746a220920072f01861620086b41027410ca081a200920183602002007200841f0016c6a220941f0016a200920072f01861620086b41f0016c10ca081a2009201736020420092016360200200941086a200e41d8036a41e80110c9081a201d20044104746a201d20084104746a220920072f01861620086b41047410ca081a2009200137030820092002370300200720072f01861641016a22093b0186162004200941ffff037122094b0d020340200720044102746a4188166a280200220b20043b018416200b200736028016200420042009496a220b20094b0d03200420094f2108200b21042008450d000c030b0b200841027420054188166a22096a41086a2009200841016a22044102746a2209200720086b220b41027410ca081a200920183602002005200841f0016c6a220741f0016a2007200b41f0016c10ca081a2007201736020420072016360200200741086a200e41d8036a41e80110c9081a200541d0146a220720044104746a200720084104746a220720052f01861620086b41047410ca081a2007200137030820072002370300200520052f01861641016a22073b0186162008200741ffff037122074f0d050340200520044102746a4188166a280200220920043b0184162009200536028016200420042007496a220920074b0d06200420074f210b20092104200b450d000c060b0b200841027420054188166a22076a41086a2007200841016a22044102746a220720052f01861620086b41027410ca081a200720183602002005200841f0016c6a220741f0016a200720052f01861620086b41f0016c10ca081a2007201736020420072016360200200741086a200e41d8036a41e80110c9081a201a20044104746a201a20084104746a220720052f01861620086b41047410ca081a2007200137030820072002370300200520052f01861641016a22073b0186162004200741ffff037122074b0d000340200520044102746a4188166a280200220920043b01841620092005360280162004200420074922096a220420074b0d0120090d000b0b200e200e41e8016a41e80110c9081a2006210720052802801622040d000b0b200e41d8036a200e41e80110c9081a200e41e8016a200e41d8036a41e80110c9081a20002802fc012207280200450d0541b81610322204450d032004200e41f0056a41801610c908220441003b01861620044100360280162004200e2903c0053703881620044190166a200e41c8056a29030037030020044198166a200e41d0056a290300370300200441a0166a200e41d8056a290300370300200441a8166a200e41e0056a290300370300200441b0166a200e41e8056a290300370300200420072802002209360288162007200436020020072007280204220b41016a360204200941003b0184162009200436028016200e41f0056a200e41e8016a41e80110c9081a200b2006470d0620042f0186162209410a4b0d072004200941016a220b3b0186162004200941f0016c6a2205200c3602042005200d360200200541086a200e41f0056a41e80110c9081a200420094104746a220941d8146a200f370300200941d0146a20103703002004200b4102746a4188166a200a360200200a200b3b018416200a2004360280162007200728020841016a3602080c020b2005200441f0016c6a220941f0016a2009200720046b41f0016c10ca081a2009200341e8016a41f00110c9081a200520044104746a220741e0146a200741d0146a221120052f01861620046b41047410ca081a200741d8146a200237030020112001370300200520052f01861641016a3b0186160b20002802fc012204200428020841016a3602080b200341f01b6a240020110f0b1039000b41a5d0c800413541dcd0c800103c000b41ecd0c800412b41bcd2c800103c000b419ecec800413041d0cec800103c000b41e0cec80041204180cfc800103c000b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080b4c01017f230041206b22052400200542003703182005420037031020052001200220032004200541106a10cf08200529031021012000200529031837030820002001370300200541206a24000b3e01017f230041106b2205240020052001200220032004410010cf08200529030021012000200541086a29030037030820002001370300200541106a24000b3601017f02402002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b7101017f0240024020012000490d002002450d01200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000c020b0b2002450d002001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000b0b20000b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205470d01200041016a2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b20030b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000bd10502037f057e230041306b2206240002400240024002400240024002400240024002402002500d002003500d012004500d02200479a7200279a76b2207413f4b0d0341ff0020076b2108200741016a21070c080b02402004500d0020050d040c060b024002402005450d0020034200510d0620054200370308200520012003823703000c010b20034200510d050b200120038021010c060b2004500d030240024002402001500d0020047b4201510d01200479a7200279a76b2207413e4b0d0241ff0020076b2108200741016a21070c090b02402005450d0020054200370300200520022004823703080b200220048021010c070b02402005450d002005200137030020052004427f7c2002833703080b200220047a8821010c060b2005450d040c020b024020037b4201510d0041bf7f200379a7200279a76b22076b2108200741c1006a21070c060b02402005450d002005420037030820052003427f7c2001833703000b20034201510d06200641206a2001200220037aa710c608200641286a2903002102200629032021010c060b2005450d020b2005200137030020052002370308420021010c020b00000b420021010b420021020c010b200641106a20012002200741ff007110c608200620012002200841ff007110cd08200641086a2903002102200641106a41086a2903002109200629030021012006290310210a0240024020070d004200210b0c010b4200210c03402009420186200a423f8884220b200b427f8520047c2002423f88200a42018684220a427f85220b20037c200b54ad7c423f87220b2004837d200a200b200383220d54ad7d2109200a200d7d210a20024201862001423f888421022001420186200c842101200b420183220b210c2007417f6a22070d000b0b02402005450d002005200a370300200520093703080b20024201862001423f888421022001420186200b8421010b2000200137030020002002370308200641306a24000b0bfbd2080300418080c0000bccd208100010001c0000001d020000050000006c6962726172792f616c6c6f632f7372632f7261775f7665632e7273c00010004b0000005e010000130000002a00000004000000040000002b0000002c0000002d0000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f72002a00000000000000010000000e000000a800100018000000410200001c0000006c6962726172792f616c6c6f632f7372632f666d742e72732f72757374632f323563386335336464393934616362336634663763303266653662623436303736333933663862302f6c6962726172792f636f72652f7372632f666d742f6d6f642e72736c6962726172792f616c6c6f632f7372632f7665632e7273292073686f756c64206265203c206c656e202869732000000064011000140000007801100017000000c5631100010000000b01100018000000fa0300000d000000696e73657274696f6e20696e6465782028697320292073686f756c64206265203c3d206c656e202869732000b8011000120000002301100016000000c5631100010000000b011000180000002a0400000d00000072656d6f76616c20696e64657820286973200000ec011000200000000c021000120000002a00000000000000010000002e000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e6465782069732030303031303230333034303530363037303830393130313131323133313431353136313731383139323032313232323332343235323632373238323933303331333233333334333533363337333833393430343134323433343434353436343734383439353035313532353335343535353635373538353936303631363236333634363536363637363836393730373137323733373437353736373737383739383038313832383338343835383638373838383939303931393239333934393539363937393839390000f802100010000000080310002200000072616e676520656e6420696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e677468205b2e2e2e5d00900310000b000000d60d100016000000cf03100001000000b40d10000e000000c20d100004000000c60d100010000000cf03100001000000900310000b0000009b03100026000000c103100008000000c903100006000000cf031000010000006279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f662060601304100002000000f80310001b0000006104000024000000f80310001b00000057040000110000006c6962726172792f636f72652f7372632f666d742f6d6f642e72732e2e0000004e0410001b0000005400000014000000307800003c04100012000000080310002200000072616e676520737461727420696e646578206c6962726172792f636f72652f7372632f666d742f6e756d2e727300010305050606030706080809110a1c0b190c140d100e0d0f0410031212130916011705180219031a071c021d011f1620032b032c022d0b2e01300331023201a702a902aa04ab08fa02fb05fd04fe03ff0900d2091000250000000a0000001c000000ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f00d11454964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f7475962f5f262e2fa7afb7bfc7cfd7df9a409798308f1fc0c1ceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab35280b80e003190801042f043404070301070607110a500f1207550703041c0a090308030703020303030c0405030b06010e15053a0311070605100757070207150d500443032d03010411060f0c3a041d255f206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a06213f4c042d0374083c030f033c0738082b0582ff1118082f112d032010210f808c048297190b158894052f053b07020e180980b32d740c80d61a0c0580ff0580df0cee0d03848d033709815c1480b80880cb2a38030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d00d2091000250000001a000000360000000006010103010402080809020a050b020e041001110212051311140115021702190d1c051d0824016a036b02bc02d102d40cd509d602d702da01e005e102e802ee20f004f802f902fa02fb010c273b3e4e4f8f9e9e9f060709363d3e56f3d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a4546494a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a22253e3fc5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf79cc6e6f935e227b0503042d036603012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a8126524e28082a561c1417094e041e0f430e19070a0648082709750b3f412a063b050a0651060105100305808b621e48080a80a65e22450b0a060d1339070a362c041080c03c64530c48090a46451b4808531d398107460a1d03474937030e080a0639070a81361980b7010f320d839b66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b654b0439071140050b020e97f80884d62a09a2f7811f3103110408818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b80d52d031a040281703a0501850080d7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae381d0d2c040907020e06809a83d8080d030d03740c59070c140c0438080a062808224e81540c15030305070919070709030d072980cb250a84066c6962726172792f636f72652f7372632f756e69636f64652f7072696e7461626c652e727300080a1000160000001e0a10000d000000736c69636520696e64657820737461727473206174202062757420656e647320617420000003000083042000910560005d13a0001217a01e0c20e01eef2c202b2a30a02b6fa6602c02a8e02c1efbe02d00fea0359effe035fd016136010aa136240d6137ab0ee1382f182139301c6146f31ea14af06a614e4f6fa14e9dbc214f65d1e14f00da215000e0e15130e16153ece2a154d0e8e15420002e55f001bf558c0d100028000000520000003e00000000700007002d0101010201020101480b30151001650702060202010423011e1b5b0b3a09090118040109010301052b03770f0120370101010408040103070a021d013a0101010204080109010a021a010202390104020402020303011e0203010b0239010405010204011402160601013a0101020104080107030a021e013b0101010c0109012801030139030503010407020b021d013a01020102010301050207020b021c02390201010204080109010a021d0148010401020301010801510102070c08620102090b064a021b0101010101370e01050102050b0124090166040106010202021902040310040d01020206010f01000300031d031d021e02400201070801020b09012d03770222017603040209010603db0202013a010107010101010208060a020130113f0430070101050128090c0220040202010338010102030101033a0802029803010d0107040106010302c63a01050001c32100038d016020000669020004010a200250020001030104011902050197021a120d012608190b2e0330010204020227014306020202020c0108012f01330101030202050201012a020801ee010201040100010010101000020001e201950500030102050428030401a50200040002990bb001360f3803310402024503240501083e010c0234090a0402015f03020101020601a0010308150239020101010116010e070305c308020301011701510102060101020101020102eb010204060201021b025508020101026a0101010206010165030204010500090102f5010a0201010401900402020401200a280602040801090602032e0d010200070106010152160207010201027a060301010201070101480203010101000200053b0700013f0451010002000101030405080802071e0494030037043208010e011605010f000701110207010201050007000400076d07006080f0000000008c0d1000280000004b000000280000008c0d10002800000057000000160000006c6962726172792f636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f662060426f72726f774572726f72426f72726f774d75744572726f7270616e69636b6564206174200000003d0e1000010000003e0e100003000000c41a1200000000003c0e1000010000003c0e1000010000003a27272c2020202020000000680e1000200000003000000021000000680e10002000000031000000120000006c6962726172792f636f72652f7372632f666d742f6275696c646572732e7273980e1000200000005a000000050000006c6962726172792f636f72652f7372632f736c6963652f6d656d6368722e7273207b202c20207b0a2a0000000c000000040000002f00000030000000310000002c0a00002a0000000400000004000000320000003300000034000000207d7d28280a2c0a5b000000f80310001b000000f907000016000000f80310001b000000f20700001e000000306200002a00000004000000040000003500000036000000370000000001025965734e6f706179735f6665653d6d61782d77656967687461637475616c5f7765696768743d496e76616c696420726576657273653a2068617368206c656e67746820746f6f2073686f72746672616d655f737570706f72743a3a686173682f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f737570706f72742f7372632f686173682e72730000002a000000000000000100000038000000390000003a0000002a00000001000000010000001a0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f73797374656d2f7372632f6c696d6974732e72734275696c6465722066696e6973686564207769746820606275696c645f6f725f70616e6963603b205468652070616e69632069732065787065637465642069662072756e74696d65207765696768747320617265206e6f7420636f72726563742810100060000000a201000016000000c41a1200000000000000000000000000010000000000000082800000000000008a8000000000008000800080000000808b800000000000000100008000000000818000800000008009800000000000808a00000000000000880000000000000009800080000000000a000080000000008b800080000000008b0000000000008089800000000000800380000000000080028000000000008080000000000000800a800000000000000a0000800000008081800080000000808080000000000080010000800000000008800080000000802a00000000000000010000003b0000003c0000003a0000002a00000000000000010000003b0000003c0000003a00000001a8010001605354524f424576312e302e3200001c12100058000000680000000d0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6d65726c696e2d322e302e302f7372632f7374726f62652e72734a131000190000006313100016000000000000002000000004000000020000000000000002000000000000000300000001000000200000000400000002000000000000000200000000000000030000001c12100058000000880000000d0000000c1310003e0000001c1210005800000091000000090000001c121000580000005e000000090000001c121000580000005f00000009000000596f75207573656420746865205420666c61672c207768696368207468697320696d706c656d656e746174696f6e20646f65736e277420737570706f7274596f7520747269656420746f20636f6e74696e7565206f702020627574206368616e67656420666c61677320746f200000001c121000580000007c000000150000001c121000580000007d0000000d00000000000000201410000e000000000000003014100001000000000000000000000038141000010000000000000000000000401410000600000000000000c41a120000000000000000000000000048141000010000000000000000000000501410000700000000000000c41a12000000000000000000000000005814100001000000000000004e6577417574686f7269746965730000e51410000d000000af1410003600000050617573656400008814100027000000526573756d65640060141000280000002043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e204e657720617574686f726974792073657420686173206265656e206170706c6965642e205c5b617574686f726974795f7365745c5d417574686f726974794c697374000000000000201510000700000000000000281510000300000000000000000000004015100004000000000000004f6666656e63650016281000040000001a2810000e000000d9071200040000006015100055000000b51510005300000008161000460000004e1610001d00000020546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e6420286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e206c61737420656c656d656e7420696e64696361746573206f6620746865206f6666656e636520776173206170706c69656420287472756529206f7220717565756564202866616c736529205c5b6b696e642c2074696d65736c6f742c206170706c6965645c5d2e0000000000981610000a0000000000000054bd1000010000000000000000000000a416100002000000000000004e657753657373696f6e0000b4161000590000000d17100022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e7420697320746865205c5b73657373696f6e5f696e6465785c5d2c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e53746f72656452616e676574696d737461703054696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e00a5d11000630000009f000000120000004572726f7200000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000f4f311004a0000004f000000210000004a1810001e00000068181000190000001418100036000000444d51206973206e6f7420656d7074792c206275742070726f6365737365645f646f776e776172645f6d65737361676573206973203070726f6365737365645f646f776e776172645f6d65737361676573203d202c2062757420646d715f6c656e677468206973206f6e6c79200000008e19100046000000c263110003000000c5631100010000005f1910002f000000c263110003000000c5631100010000002a191000130000003d19100022000000c263110003000000c563110001000000ec1810003e000000c263110003000000c56311000100000074686520756d7020717565756520776f756c642068617665206d6f7265206974656d73207468616e207065726d697474656420627920636f6e6669672028757077617264206d6573736167652069647820206c6172676572207468616e207065726d697474656420627920636f6e66696720286d6f726520757077617264206d65737361676573207468616e207065726d697474656420627920636f6e666967202874686520756d7020717565756520776f756c6420686176652067726f776e207061737420746865206d61782073697a65207065726d697474656420627920636f6e6669672028741a100022000000a81b100031000000c263110003000000c5631100010000007b1b10002d000000c263110003000000c5631100010000003e1b10003d000000c563110001000000c91a10001a000000191b1000230000003c1b100002000000c91a10001a000000e31a100036000000c263110003000000c563110001000000741a100022000000961a100033000000c263110003000000c56311000100000073656e64696e67207468652048524d50206d65737361676520617420696e6465782020776f756c642065786365656420746865206e656f6769746961746564206368616e6e656c20746f74616c2073697a652020287468652048524d50206d65737361676520617420696e64657820206578636565647320746865206e65676f746961746564206368616e6e656c206d6178696d756d206d6573736167652073697a6520282069732073656e7420746f2061206e6f6e206578697374656e74206368616e6e656c202d3e7468652048524d50206d6573736167657320617265206e6f7420736f727465642028666972737420756e736f7274656420697320617420696e646578206d6f72652048524d50206d65737361676573207468616e207065726d697474656420627920636f6e666967202820776f756c642065786365656420746865206e656f6769746961746564206368616e6e656c2063617061636974792020280000002a000000040000000400000035000000360000003d000000766563746f72207769746820706f736974697665206c656e6774682077696c6c20686176652061206d61783b207165643cd3110070000000780000000e0000006974657261746f72207769746820706f736974697665206c656e6774682077696c6c20686176652061206d696e3b2071656400003cd31100700000007c0000000e0000002a00000000000000010000003e0000003cd3110070000000890000002c0000002a00000000000000010000003f0000003cd3110070000000950000002b0000006c656e677468206f6620656c65637465645f65646765732069732067726561746572207468616e206f7220657175616c20323b206c6173745f696e64657820696e64657820697320617420746865206d696e696d756d20656c65637465645f65646765732e6c656e2829202d20313b20696e6465782069732077697468696e2072616e67653b2071656400003cd31100700000009f000000340000003cd3110070000000a2000000110000003cd3110070000000ac0000002c0000003cd3110070000000b80000002c0000003cd31100700000006d000000220000003cd31100700000005500000021000000691e100029000000e21d1000660000001402000033000000481e100021000000f0191200020000006672616d655f737570706f72743a3a73746f726167652f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f737570706f72742f7372632f73746f726167652f6d6f642e7273286b65792c2076616c756529206661696c656420746f206465636f6465206174206e6578745f6b65792072657475726e65642061206b65792077697468206e6f2076616c7565206174204e6f726d616c2065787472696e73696373206861766520776569676874206c696d697420636f6e666967757265642062792064656661756c743b20716564e01e100040000000710000000a0000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f636f6d6d6f6e2f7372632f6c69622e72732a00000000000000010000003f00000050d211006f0000005e000000270000003cd31100700000008e0000002f000000601f10004400000056000000010000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f70617261636861696e732f7372632f646d702e7273446f776e776172644d65737361676551756575657300000000000000d88911000d000000000000000000000088f711000b00000000000000000000000000000000000000000000000000000000000000c41a1200c42010000000000000000000f889110002000000000000000100000000000000a41f1000150000000105000000000000e8c811000600000000000000d42010002b00000000000000000000000000000000000000c41a1200002110000000000000000000102110000100000000000000010000000000000018211000190000000105000000000000e8c811000600000000000000312110000400000000000000000000000000000000000000c41a1200382110000000000000000000482110000700000000000000010000002a0000000000000001000000400000005665633c496e626f756e64446f776e776172644d6573736167653c543a3a426c6f636b4e756d6265723e3e002a000000000000000100000041000000c222100034000000446f776e776172644d65737361676551756575654865616473486173680000002a0000000000000001000000420000008021100049000000c41a120000000000c921100024000000ed2110001e0000000b2210003a00000045221000480000008d221000350000002041206d617070696e6720746861742073746f7265732074686520646f776e77617264206d657373616765207175657565204d5143206865616420666f72206561636820706172612e2045616368206c696e6b20696e207468697320636861696e20686173206120666f726d3a206028707265765f686561642c20422c2048284d2929602c207768657265202d2060707265765f68656164603a206973207468652070726576696f757320686561642068617368206f72207a65726f206966206e6f6e652e202d206042603a206973207468652072656c61792d636861696e20626c6f636b206e756d62657220696e2077686963682061206d6573736167652077617320617070656e6465642e202d206048284d29603a206973207468652068617368206f6620746865206d657373616765206265696e6720617070656e6465642e2054686520646f776e77617264206d657373616765732061646472657373656420666f722061206365727461696e20706172612e00002a00000000000000010000003f00000046251000160000005c2510001500000071251000150000008625100014000000fc2410001e0000001a2510000c0000002625100020000000a824100005000000ad24100013000000c02410003c000000f09f92b820436f6d7061637420736f6c7574696f6e20646964206e6f7420676574207472696d6d65642064756520746f20626c6f636b20776569676874206c696d6974732e0000002a0000000c000000040000001b000000f12310006c000000a40100004f0000005d2410002b000000882410002000000070616c6c65745f7374616b696e673a3a6f6666636861696e5f656c656374696f6e2f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f7374616b696e672f7372632f6f6666636861696e5f656c656374696f6e2e7273f09f92b82070726570617265642061207365712d70687261676d656e20736f6c7574696f6e2077697468202062616c616e63696e6720697465726174696f6e7320616e642073636f726520f09f92b820206e6f6d696e61746f7273206f7574206f66202068616420746f2062652072656d6f7665642066726f6d20636f6d7061637420736f6c7574696f6e2064756520746f2073697a65206c696d6974732ef09f92b82072656d6f766564206120766f74657220617420696e646578202077697468207374616b65202066726f6d20636f6d7061637420746f20726564756365207468652073697a65f09f92b8204d6178696d756d20776569676874203d20202f2f2063757272656e7420776569676874203d20202f2f206d6178696d756d20766f74657273203d20202f2f2063757272656e7420766f746573203d207061726974792f7374616b696e672d656c656374696f6e2f6661696c656420746f20777269746520746f206f6666636861696e2064622e4469676573744974656d206e6f7420657175616c436865636b47656e6573697344656665727265644f6666656e63657300000000000000642710000700000001050000000000006b2710000d00000000000000782710003400000000000000000000000000000000000000c41a1200ac2710000000000000000000bc27100001000000000000000000000000000000f1251000100000000000000000000000c42710001900000000000000000000000000000000000000000000000000000000000000c41a1200e02710000000000000000000f027100002000000000000000100000000000000002810001600000002050500000000001628100004000000000000001a2810000e00000000000000282810001200000000000000c41a12003c28100000000000000000004c28100001000000000000000100000000000000542810001200000001050000000000001628100004000000000000000d9f11000700000000000000000000000000000000000000c41a1200682810000000000000000000782810000600000000000000010000005265706f7274735265706f727449644f663c543e4f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e2a0000000000000001000000430000007b2a1000520000005665633c44656665727265644f6666656e63654f663c543e3e0000002a000000000000000100000044000000112a1000590000006a2a100011000000436f6e63757272656e745265706f727473496e6465784b696e644f706171756554696d65536c6f745665633c5265706f727449644f663c543e3e00002a000000000000000100000045000000c72910004a0000005265706f72747342794b696e64496e64657800002a000000000000000100000046000000a828100044000000c41a120000000000ec2810002f000000c41a1200000000001b291000520000006d2910005a00000020456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f6620646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e204465666572726564207265706f72747320746861742068617665206265656e2072656a656374656420627920746865206f6666656e63652068616e646c657220616e64206e65656420746f206265207375626d69747465642061742061206c617465722074696d652e20546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e696d2d6f6e6c696e653a6f66666c696e626162653a65717569766f636174696f6772616e6470613a65717569766f6361000000102b10005f00000076000000010000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f6f6666656e6365732f7372632f6c69622e72736772616e62616265696d6f6e706172616173676e61756469002a00000000000000010000004700000048000000490000002a00000000000000010000004700000047000000490000000000000041ee110006000000000000004a000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000000004c0000000000000000000000000000004d0000000000000000000000000000004e0000000000000000000000000000000000000047ee110004000000000000004f0000000000000000000000000000000000000000000000000000000000000050000000000000000000000002000000000000000000000000000000000000005100000000000000000000000000000052000000000000000000000001000000000000004bee11000900000000000000530000000000000000000000000000000000000000000000000000000000000054000000000000000000000002000000000000000000000000000000000000005500000000000000000000000000000052000000000000000000000002000000000000005e0b120007000000000000005600000000000000000000000000000000000000000000000000000000000000570000000000000000000000000000005800000000000000000000000000000059000000000000000000000000000000520000000000000000000000030000000000000054ee110008000000000000005a000000000000000000000000000000000000000000000000000000000000005b0000000000000000000000000000005c0000000000000000000000000000005d0000000000000000000000000000005e000000000000000000000004000000000000005cf1110012000000000000005f0000000000000000000000000000000000000000000000000000000200000000000000000000000000000002000000000000000000000000000000000000006000000000000000000000000000000052000000000000000000000005000000000000005cee11000a000000000000006100000000000000000000000000000000000000000000000000000000000000620000000000000000000000020000000000000000000000000000000000000052000000000000000000000000000000630000000000000000000000060000000000000066ee11000700000000000000640000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000660000000000000000000000000000006700000000000000000000000000000068000000000000000000000007000000000000006dee110008000000000000006900000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000006a00000000000000000000000000000052000000000000000000000000000000520000000000000000000000080000000000000075ee11000a00000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000002000000000000000000000000000000000000005200000000000000000000000000000052000000000000000000000009000000000000007fee110007000000000000006b000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000006d000000000000000000000000000000520000000000000000000000000000006e00000000000000000000000a0000000000000086ee110007000000000000006f000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000071000000000000000000000000000000520000000000000000000000000000007200000000000000000000000b000000000000008dee1100080000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000075000000000000000000000000000000520000000000000000000000000000007600000000000000000000000c0000000000000095ee1100120000000200000000000000000000000000000000000000000000000000000000000000000000005200000000000000000000000200000000000000000000000000000000000000520000000000000000000000000000005200000000000000000000000d00000000000000a7ee1100100000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000520000000000000000000000000000005200000000000000000000000e00000000000000b7ee1100170000000000000077000000000000000000000000000000000000000000000000000000000000007800000000000000000000000200000000000000000000000000000000000000520000000000000000000000000000007900000000000000000000000f00000000000000ceee110009000000000000007a00000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000007b000000000000000000000000000000520000000000000000000000000000007c00000000000000000000001000000000000000d7ee110011000000000000007d000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000200000000000000000000000000000000000000520000000000000000000000000000007f00000000000000000000001100000000000000e8ee1100090000000000000080000000000000000000000000000000000000000000000000000000000000005200000000000000000000000200000000000000000000000000000000000000520000000000000000000000000000005200000000000000000000001200000000000000f1ee1100050000000000000081000000000000000000000000000000000000000000000000000000000000005200000000000000000000000200000000000000000000000000000000000000520000000000000000000000000000005200000000000000000000001300000000000000f6ee11000b000000000000008200000000000000000000000000000000000000000000000000000000000000520000000000000000000000020000000000000000000000000000000000000052000000000000000000000000000000520000000000000000000000140000000000000001ef110003000000000000008300000000000000000000000000000000000000000000000000000000000000520000000000000000000000020000000000000000000000000000000000000052000000000000000000000000000000520000000000000000000000150000000000000004ef110003000000000000008400000000000000000000000000000000000000000000000000000000000000520000000000000000000000020000000000000000000000000000000000000052000000000000000000000000000000520000000000000000000000160000000000000007ef11000400000000000000850000000000000000000000000000000000000000000000000000000000000086000000000000000000000002000000000000000000000000000000000000005200000000000000000000000000000087000000000000000000000017000000000000000bef11000b000000000000008800000000000000000000000000000000000000000000000000000000000000520000000000000000000000020000000000000000000000000000000000000052000000000000000000000000000000520000000000000000000000180000000000000016ef1100090000000000000089000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000200000000000000000000000000000000000000520000000000000000000000000000008b000000000000000000000019000000000000001fef1100100000000200000000000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000200000000000000000000000000000000000000520000000000000000000000000000008d00000000000000000000001a000000000000002fef110004000000000000008e000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000090000000000000000000000000000000520000000000000000000000000000009100000000000000000000001b000000506172656e7420686173682073686f756c642062652076616c69642e20391000600000001e010000090000005472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e2039100060000000270100000900000020391000600000006d0100003b000000803910003200000020391000600000009601000009000000446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e0020391000600000009e0100000d00000053746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2039100060000000a4010000090000005369676e617475726520766572696669636174696f6e206661696c65642e000020391000600000003c010000110000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f6578656375746976652f7372632f6c69622e72734e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e0000c43910005d000000740100001b0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e312f7372632f7472696564626d75742e7273000000c43910005d000000670100000d000000496e73657274696f6e206e657665722064656c657465732ec43910005d000000640200000d000000617373657274696f6e206661696c65643a20216578697374696e675f6b65792e69735f656d70747928290000c43910005d0000008003000015000000a83a100046000000fa000000010000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f70617261636861696e732f7372632f70617261732e727350617374436f64655072756e696e6750617374436f646550617374436f64654d657461467574757265436f646555706772616465730000000000443f10000a000000000000000000000088f711000b00000000000000000000000000000000000000000000000000000000000000c41a1200503f10000000000000000000603f100001000000000000000100000000000000683f10000b0000000105000000000000e8c8110006000000000000007f2512000200000000000000000000000000000000000000c41a1200743f10000000000000000000843f1000010000000000000000000000000000008c3f1000050000000105000000000000e8c81100060000000000000088cf11000800000000000000000000000000000000000000c41a1200943f10000000000000000000a43f100001000000000000000000000000000000ac3f10000b0000000105000000000000e8c811000600000000000000154211000e00000000000000000000000000000000000000c41a1200b83f10000000000000000000c83f100001000000000000000000000000000000fd3a1000080000000105000000000000d03f10001800000000000000154211000e00000000000000000000000000000000000000c41a1200e83f10000000000000000000f83f100001000000000000000000000000000000053b10000c0000000105000000000000e8c811000600000000000000004010002000000000000000000000000000000000000000c41a12002040100000000000000000003040100003000000000000000100000000000000ee3a10000f0000000000000000000000484010001d00000000000000000000000000000000000000000000000000000000000000c41a12006840100000000000000000007840100006000000000000000100000000000000113b1000120000000105000000000000e8c811000600000000000000d5f711000e00000000000000000000000000000000000000c41a1200a84010000000000000000000b840100003000000000000000000000000000000d04010000a0000000105000000000000e8c811000600000000000000154211000e00000000000000000000000000000000000000c41a1200dc4010000000000000000000ec40100001000000000000000000000000000000f44010000d000000000000000000000088f711000b00000000000000000000000000000000000000000000000000000000000000c41a1200044110000000000000000000144110000200000000000000010000000000000024411000140000000105000000000000e8c811000600000000000000c12d11000f00000000000000000000000000000000000000c41a12003841100000000000000000004841100001000000000000000000000000000000d88911000d000000000000000000000088f711000b00000000000000000000000000000000000000000000000000000000000000c41a12005041100000000000000000006041100001000000000000000100000050617261636861696e7300002a000000000000000100000040000000c34610004b0000005061726174687265616473002a000000000000000100000092000000b24610001100000048656164730000002a0000000000000001000000930000008a4610002800000043757272656e74436f6465002a0000000000000001000000930000006246100028000000285061726149642c20543a3a426c6f636b4e756d626572292a000000000000000100000093000000fe451000640000005061726150617374436f64654d6574613c543a3a426c6f636b4e756d6265723e2a0000000000000001000000940000002d451000520000007f45100052000000d14510002d0000005665633c285061726149642c20543a3a426c6f636b4e756d626572293e0000002a0000000000000001000000450000001f431000680000008743100060000000e74310003b00000022441000640000008644100052000000d8441000550000002a000000000000000100000093000000364210004a0000008042100059000000d942100046000000467574757265436f646500002a00000000000000010000009300000014421000220000005570636f6d696e6750617261730000002a0000000000000001000000400000009041100061000000f1411000230000005570636f6d696e67506172617347656e657369732a00000000000000010000009300000068411000280000002a000000000000000100000040000000409011003b000000205570636f6d696e6720706172617320696e7374616e74696174696f6e20617267756d656e74732e205570636f6d696e672070617261732028636861696e7320616e642074687265616473292e20546865736520617265206f6e6c792075706461746564206f6e2073657373696f6e206368616e67652e20436f72726573706f6e647320746f20616e20656e74727920696e20746865207570636f6d696e672d67656e65736973206d61702e205468652061637475616c2066757475726520636f6465206f66206120706172612e2054686520626c6f636b206e756d6265722061742077686963682074686520706c616e6e656420636f6465206368616e676520697320657870656374656420666f72206120706172612e20546865206368616e67652077696c6c206265206170706c696564206166746572207468652066697273742070617261626c6f636b20666f72207468697320494420696e636c7564656420776869636820657865637574657320696e2074686520636f6e74657874206f6620612072656c617920636861696e20626c6f636b20776974682061206e756d626572203e3d206065787065637465645f6174602e2057686963682070617261732068617665207061737420636f64652074686174206e65656473207072756e696e6720616e64207468652072656c61792d636861696e20626c6f636b2061742077686963682074686520636f646520776173207265706c616365642e204e6f746520746861742074686973206973207468652061637475616c20686569676874206f662074686520696e636c7564656420626c6f636b2c206e6f7420746865206578706563746564206865696768742061742077686963682074686520636f6465207570677261646520776f756c64206265206170706c6965642c20616c74686f7567682074686579206d617920626520657175616c2e205468697320697320746f20656e737572652074686520656e7469726520616363657074616e636520706572696f6420697320636f76657265642c206e6f7420616e206f666673657420616363657074616e636520706572696f64207374617274696e672066726f6d207468652074696d65206174207768696368207468652070617261636861696e20706572636569766573206120636f6465207570677261646520617320686176696e67206f636375727265642e204d756c7469706c6520656e747269657320666f7220612073696e676c65207061726120617265207065726d69747465642e204f72646572656420617363656e64696e6720627920626c6f636b206e756d6265722e205061737420636f6465206f662070617261636861696e732e205468652070617261636861696e73207468656d73656c766573206d6179206e6f74206265207265676973746572656420616e796d6f72652c2062757420776520616c736f206b65657020746865697220636f6465206f6e2d636861696e20666f72207468652073616d6520616d6f756e74206f662074696d65206173206f7574646174656420636f646520746f206b65657020697420617661696c61626c6520666f72207365636f6e6461727920636865636b6572732e2041637475616c207061737420636f64652c20696e646963617465642062792074686520706172612069642061732077656c6c2061732074686520626c6f636b206e756d62657220617420776869636820697420626563616d65206f757464617465642e205468652076616c69646174696f6e20636f6465206f66206576657279206c69766520706172612e2054686520686561642d64617461206f66206576657279207265676973746572656420706172612e20416c6c2070617261746872656164732e20416c6c2070617261636861696e732e204f72646572656420617363656e64696e67206279205061726149642e20506172617468726561647320617265206e6f7420696e636c756465642e0000a83a1000460000009f00000025000000457261456c656374696f6e5374617475734e6f6d696e61746f727300ffff0000ffffffff434810001c0000005f4810000400000063481000020000005f481000040000006548100002000000536e617073686f7456616c696461746f7273536e617073686f744e6f6d696e61746f7273134810001d0000003048100013000000f0471000220000001248100001000000f09f92b820457374696d6174696e67206e6578742073657373696f6e206368616e6765206661696c65642e7374616b696e6770616c6c65745f7374616b696e67f09f92b8204661696c656420746f2063726561746520736e617073686f74206174202ef09f92b820456c656374696f6e2077696e646f77206973204f70656e28292e20536e617073686f742063726561746564f09f92b820536e617073686f742073697a6520746f6f20626967205b203c3e205d5b5d2e00dc4810003e0000001a49100001000000b448100028000000f09f92b8204578656375746564206f6666636861696e20776f726b65722074687265616420776974686f7574206572726f72732ef09f92b8204572726f7220696e20656c656374696f6e206f6666636861696e20776f726b65723a20f09f92b820736b697070696e67206f6666636861696e20776f726b657220696e206f70656e20656c656374696f6e2077696e646f772064756520746f205b5d45726173526577617264506f696e74734e6f6d696e61746f72536c617368496e45726156616c696461746f72536c617368496e457261536c617368696e675370616e735370616e536c617368496e636f7272656374486973746f7279446570746843616c6c4e6f74416c6c6f7765644f6666636861696e456c656374696f6e426f677573456c656374696f6e53697a654f6666636861696e456c656374696f6e426f67757353636f72654f6666636861696e456c656374696f6e426f677573456467654f6666636861696e456c656374696f6e426f67757353656c66566f74654f6666636861696e456c656374696f6e536c61736865644e6f6d696e6174696f6e4f6666636861696e456c656374696f6e426f6775734e6f6d696e6174696f6e4f6666636861696e456c656374696f6e426f6775734e6f6d696e61746f724f6666636861696e456c656374696f6e426f677573436f6d706163744f6666636861696e456c656374696f6e426f67757357696e6e65724f6666636861696e456c656374696f6e426f67757357696e6e6572436f756e74536e617073686f74556e617661696c61626c654f6666636861696e456c656374696f6e5765616b5375626d697373696f6e4f6666636861696e456c656374696f6e4561726c795375626d697373696f6e416c7265616479436c61696d65644e6f74536f72746564416e64556e69717565496e76616c69644e756d6265724f664e6f6d696e6174696f6e73496e76616c6964457261546f52657761726446756e6465645461726765744e6f556e6c6f636b4368756e6b4e6f4d6f72654368756e6b73496e73756666696369656e7456616c7565496e76616c6964536c617368496e6465784475706c6963617465496e646578456d70747954617267657473416c7265616479506169726564416c7265616479426f6e6465644e6f7453746173684e6f74436f6e74726f6c6c6572496e636f7272656374536c617368696e675370616e7300002a0000001000000008000000950000009500000096000000674c100023000000244c1000430000001248100001000000f09f92b820436861696e20646f6573206e6f74206861766520656e6f756768207374616b696e672063616e6469646174657320746f206f7065726174652e204572612043616c6c20746f207365712d70687261676d656e206661696c65642064756520746f204c6564676572426f6e646564457261735374616b65727300000000000000c45010000400000000000000c850100003000000000000000000000010511000160000000000000000000000c05110000a00000000000000cc511000010000000000000000000000e45110001500000000000000000000008c521000060000000000000094521000010000000000000000000000ac521000200000000000000000000000ac5310001100000000000000c0531000010000000000000000000000d85310001f0000000000000000000000d05410000800000000000000d8541000010000000000000000000000f05410001100000000000000000000007855100008000000000000008055100001000000000000000000000098551000130000000000000000000000305610000500000000000000c41a120000000000000000000000000038561000110000000000000000000000c05610000900000000000000cc561000010000000000000000000000e4561000100000000000000000000000645710000e00000000000000745710000100000000000000000000008c5710001000000000000000000000000c5810001300000000000000205810000100000000000000000000003858100008000000000000000000000078581000180000000000000090581000010000000000000000000000a8581000070000000000000000000000e05810001500000000000000f858100001000000000000000000000010591000070000000000000000000000485910000d00000000000000c41a120000000000000000000000000058591000090000000000000000000000a05910000d00000000000000c41a1200000000000000000000000000b05910000a0000000000000000000000005a10001100000000000000145a10000100000000000000000000002c5a10000800000000000000000000006c5a10000d000000000000007c5a1000020000000000000000000000ac5a10000a0000000000000000000000fc5a10001400000000000000c41a1200000000000000000000000000105b1000080000000000000000000000505b10001500000000000000685b1000020000000000000000000000985b10000d0000000000000000000000005c10000e00000000000000105c1000020000000000000000000000405c10001c0000000000000000000000205d1000060000000000000094521000010000000000000000000000285d10000e0000000000000000000000985d10001100000000000000ac5d1000020000000000000000000000dc5d1000150000000000000000000000845e10000a000000000000007c5a1000020000000000000000000000905e10000f0000000000000000000000085f10001800000000000000205f1000050000000000000000000000985f1000310000000000000000000000206110002100000000000000205f1000050000000000000000000000446110000900000000000000626f6e6400000000c07d10000a0000000000000011db1100230000000000000038db11000500000000000000948a100015000000000000007d7e10000500000000000000827e10001f000000fe8c100059000000578d100021000000c41a120000000000788d10004c000000c41a120000000000c48d100049000000c41a120000000000658c100010000000c41a120000000000ac0412000b0000000d8e100035000000d122110008000000428e10001a000000c41a1200000000005c8e100054000000b08e100050000000008f100013000000d47b10000d000000476c10000b000000138f10004c0000005f8f1000380000004b0512000c000000626f6e645f6578747261000000000000f08c10000e00000000000000948a100015000000a98a100059000000028b10000d000000c41a1200000000000f8b100054000000638b100059000000bc8b100013000000c41a120000000000cf8b100058000000278c10003e000000c41a120000000000658c100010000000c41a120000000000ac0412000b000000a87c10003a000000d1221100080000000a8a100010000000758c10000d000000476c10000b000000828c100045000000c78c1000290000004b0512000c000000756e626f6e6400000000000038db11000500000000000000948a10001500000025861000550000007a86100040000000ba86100049000000c41a12000000000003871000520000005587100030000000c41a120000000000858710004f000000d48710004f000000238810003f000000c41a120000000000f87d100055000000d37e100043000000c41a1200000000006288100012000000c41a1200000000007488100026000000c41a120000000000ac0412000b0000009a88100050000000e27c100026000000ea88100059000000438910005c0000009f89100054000000f3891000170000000a8a1000100000003a7d10000b000000d47b10000d000000476c10000b0000001a8a100047000000618a1000290000008a8a10000a00000077697468647261775f756e626f6e64656400000000000000ce7910001200000000000000839a110003000000118210004b000000c41a1200000000005c8210004d000000a982100013000000c41a120000000000f87d100055000000d37e100043000000c41a120000000000bc82100013000000c41a120000000000cf8210001b000000c41a120000000000ac0412000b000000ea821000550000003f83100051000000908310003d000000cd8310005e000000087d100032000000b9711000100000002b841000420000006d841000080000007584100049000000be8410002a000000e884100006000000ee841000510000003f851000230000006285100054000000b68510002c000000f16c10001d000000e2851000430000004b0512000c00000076616c696461746500000000fe8110000500000000000000038210000e000000808110003a000000c41a1200000000001c7c100037000000c41a120000000000f87d100055000000d37e100043000000c41a120000000000ac0412000b000000a87c10003a000000e27c100026000000087d100032000000597410000c000000d47b10000d000000476c10000b000000ba81100024000000de811000200000004b0512000c0000006e6f6d696e617465000000005181100007000000000000005881100028000000767f100044000000c41a120000000000ba7f100054000000ff70100023000000c41a120000000000f87d100055000000d37e100043000000c41a120000000000ac0412000b0000000e8010004c0000005a801000400000009a801000360000004d7e10000a000000d08010000d000000dd80100021000000476c10000b000000fe8010003200000030811000210000004b0512000c0000006368696c6c000000a17e100032000000c41a1200000000001c7c100037000000c41a120000000000f87d100055000000d37e100043000000c41a120000000000ac0412000b000000a87c10003a000000167f100015000000087d1000320000002b7f100009000000d47b10000d000000476c10000b000000347f100022000000567f1000200000004b0512000c0000007365745f7061796565000000000000007d7e10000500000000000000827e10001f000000ca7d10002e000000c41a1200000000001c7c100037000000c41a120000000000f87d100055000000c41a120000000000ac0412000b000000a87c10003a000000e27c100026000000087d1000320000004d7e10000a000000807810000f000000310712000d000000577e1000130000006a7e1000130000004b0512000c0000007365745f636f6e74726f6c6c6572000000000000c07d10000a0000000000000011db110023000000f87b100024000000c41a1200000000001c7c100037000000c41a120000000000537c100055000000c41a120000000000ac0412000b000000a87c10003a000000e27c100026000000087d1000320000003a7d10000b000000d47b10000d000000476c10000b000000457d10003d000000827d10003e0000004b0512000c0000007365745f76616c696461746f725f636f756e740000000000bb0712000300000000000000667010000c000000af7b100025000000c41a1200000000005e78100022000000c41a120000000000ac0412000b000000d47b10000d000000e17b1000170000004b0512000c000000696e6372656173655f76616c696461746f725f636f756e7400000000a57b10000a00000000000000667010000c0000007a7b10002b000000c41a1200000000005e78100022000000c41a120000000000ac0412000b0000004c7b1000210000004b0512000c0000007363616c655f76616c696461746f725f636f756e74000000000000006d7b10000600000000000000737b100007000000177b100035000000c41a1200000000005e78100022000000c41a120000000000ac0412000b0000004c7b1000210000004b0512000c000000666f7263655f6e6f5f65726173000000eb7a10002c000000c41a1200000000005e78100022000000c41a120000000000ac0412000b000000ca7a100010000000807810000f0000008f781000120000004b0512000c000000666f7263655f6e65775f6572610000004f7a100053000000a27a100028000000c41a1200000000005e78100022000000c41a120000000000ac0412000b000000ca7a100010000000807810000f000000da7a1000110000004b0512000c0000007365745f696e76756c6e657261626c657300000000000000317a10000d000000000000003e7a100011000000e079100033000000c41a1200000000005e78100022000000c41a120000000000ac0412000b000000137a1000070000001a7a1000170000004b0512000c000000666f7263655f756e7374616b6500000000000000c97910000500000000000000be0712000c00000000000000ce7910001200000000000000839a110003000000a178100043000000c41a1200000000005e78100022000000c41a120000000000ac0412000b000000e47810003b0000001f7910002e0000004d79100061000000ae7910001b0000004b0512000c000000666f7263655f6e65775f6572615f616c776179731d78100041000000c41a1200000000005e78100022000000c41a120000000000ac0412000b000000807810000f0000008f781000120000004b0512000c00000063616e63656c5f64656665727265645f736c61736800000000000000a96a10000300000000000000ac6a10000800000000000000107810000d000000000000005eda100008000000cf76100026000000c41a120000000000f57610002d000000c41a1200000000002277100041000000c41a120000000000ac0412000b0000006377100015000000787710002e000000a677100035000000db7710001a000000f57710001b0000004b0512000c0000007061796f75745f7374616b657273000000000000c07610000f00000000000000be0712000c00000000000000a96a10000300000000000000ac6a1000080000003772100044000000c41a1200000000007b72100053000000ce7210004a000000187310004d000000c41a1200000000006573100056000000bb7310001e000000c41a120000000000d973100040000000c41a120000000000ac0412000b0000001974100040000000d2dc110031000000597410000c0000006574100047000000ac74100008000000b474100022000000d674100031000000476c10000b000000077510004a000000517510004b0000009c75100044000000e075100036000000c41a12000000000016761000540000006a761000560000004b0512000c0000007265626f6e6400007270100038000000c41a120000000000aa70100055000000ff70100023000000c41a120000000000ac0412000b000000227110003500000057711000250000007c7110003d000000b971100010000000310712000d000000c971100040000000097210002e0000004b0512000c0000007365745f686973746f72795f646570746800000000000000327010001100000000000000437010001100000000000000547010001200000000000000667010000c0000000e6d10004c0000005a6d100020000000c41a1200000000007a6d10000c000000866d100044000000ca6d1000520000001c6e1000510000006d6e100051000000be6e100028000000c41a120000000000e66e100015000000c41a120000000000ac0412000b000000fb6e100038000000336f10000f000000310712000d000000426f1000280000006a6f10001c000000866f10004c000000d26f1000600000004b0512000c000000726561705f73746173680000c46a10004e000000126b1000580000006a6b100030000000c41a1200000000009a6b100024000000c41a120000000000be6b100040000000c41a120000000000ac0412000b000000fe6b100049000000476c10000b000000526c100036000000886c100069000000f16c10001d0000004b0512000c0000007375626d69745f656c656374696f6e5f736f6c7574696f6e00000000646a100007000000000000006b6a100013000000000000007e6a10000700000000000000856a10001200000000000000976a100005000000000000009c6a10000d00000000000000a96a10000300000000000000ac6a10000800000000000000b46a10000400000000000000b86a10000c000000a762100039000000c41a120000000000e06210000d000000ed62100045000000c41a1200000000003263100021000000c41a120000000000536310002b000000c41a1200000000007e6310003d000000bb631000540000000f6410000c000000c41a1200000000001b64100048000000c41a120000000000636410002a000000c41a1200000000008d64100032000000c41a120000000000bf641000530000001265100047000000596510004c000000a565100054000000f9651000580000005166100026000000c41a1200000000007766100018000000c41a1200000000008f66100039000000c86610003e000000066710002b00000031671000550000008667100057000000dd67100010000000ed67100043000000306810001b000000c41a1200000000004b68100030000000c41a1200000000007b68100059000000d4681000590000002d691000500000007d69100027000000c41a120000000000ac0412000b000000a469100046000000ea69100029000000136a1000510000004b0512000c0000007375626d69745f656c656374696f6e5f736f6c7574696f6e5f756e7369676e65640000008c61100030000000c41a120000000000bc6110005700000013621000580000006b6210001a000000c41a120000000000ac0412000b00000085621000220000004b0512000c00000020556e7369676e65642076657273696f6e206f6620607375626d69745f656c656374696f6e5f736f6c7574696f6e602e204e6f746520746861742074686973206d757374207061737320746865205b6056616c6964617465556e7369676e6564605d20636865636b207768696368206f6e6c7920616c6c6f7773207472616e73616374696f6e732066726f6d20746865206c6f63616c206e6f646520746f20626520696e636c756465642e20496e206f7468657220776f7264732c206f6e6c792074686520626c6f636b20617574686f722063616e20696e636c7564652061207472616e73616374696f6e20696e2074686520626c6f636b2e20536565205b607375626d69745f656c656374696f6e5f736f6c7574696f6e605d2e205375626d697420616e20656c656374696f6e20726573756c7420746f2074686520636861696e2e2049662074686520736f6c7574696f6e3a20312e2069732076616c69642e20322e206861732061206265747465722073636f7265207468616e206120706f74656e7469616c6c79206578697374696e6720736f6c7574696f6e206f6e20636861696e2e207468656e2c2069742077696c6c206265205f7075745f206f6e20636861696e2e204120736f6c7574696f6e20636f6e7369737473206f662074776f20706965636573206f6620646174613a20312e206077696e6e657273603a206120666c617420766563746f72206f6620616c6c207468652077696e6e657273206f662074686520726f756e642e20322e206061737369676e6d656e7473603a2074686520636f6d706163742076657273696f6e206f6620616e2061737369676e6d656e7420766563746f72207468617420656e636f64657320746865206564676520202020776569676874732e20426f7468206f66207768696368206d617920626520636f6d7075746564207573696e67205f70687261676d656e5f2c206f7220616e79206f7468657220616c676f726974686d2e204164646974696f6e616c6c792c20746865207375626d6974746572206d7573742070726f766964653a202d20546865206073636f7265602074686174207468657920636c61696d20746865697220736f6c7574696f6e206861732e20426f74682076616c696461746f727320616e64206e6f6d696e61746f72732077696c6c20626520726570726573656e74656420627920696e646963657320696e2074686520736f6c7574696f6e2e2054686520696e64696365732073686f756c6420726573706563742074686520636f72726573706f6e64696e6720747970657320285b6056616c696461746f72496e646578605d20616e64205b604e6f6d696e61746f72496e646578605d292e204d6f72656f7665722c20746865792073686f756c642062652076616c6964207768656e207573656420746f20696e64657820696e746f205b60536e617073686f7456616c696461746f7273605d20616e64205b60536e617073686f744e6f6d696e61746f7273605d2e20416e7920696e76616c696420696e6465782077696c6c2063617573652074686520736f6c7574696f6e20746f2062652072656a65637465642e2054686573652074776f2073746f72616765206974656d73206172652073657420647572696e672074686520656c656374696f6e2077696e646f7720616e64206d6179206265207573656420746f2064657465726d696e652074686520696e64696365732e204120736f6c7574696f6e2069732076616c69642069663a20302e204974206973207375626d6974746564207768656e205b60457261456c656374696f6e537461747573605d20697320604f70656e602e20312e2049747320636c61696d65642073636f726520697320657175616c20746f207468652073636f726520636f6d7075746564206f6e2d636861696e2e20322e2050726573656e74732074686520636f7272656374206e756d626572206f662077696e6e6572732e20332e20416c6c20696e6465786573206d7573742062652076616c7565206163636f7264696e6720746f2074686520736e617073686f7420766563746f72732e20416c6c20656467652076616c756573206d75737420202020616c736f20626520636f727265637420616e642073686f756c64206e6f74206f766572666c6f7720746865206772616e756c6172697479206f662074686520726174696f20747970652028692e652e20323536202020206f722062696c6c696f6e292e20342e20466f72206561636820656467652c20616c6c2074617267657473206172652061637475616c6c79206e6f6d696e617465642062792074686520766f7465722e20352e2048617320636f72726563742073656c662d766f7465732e204120736f6c7574696f6e732073636f726520697320636f6e736973746564206f66203320706172616d65746572733a20312e20606d696e207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d6178696d697a65642e20322e206073756d207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d696e696d697a65642e20332e206073756d207b20737570706f72742e746f74616c5e32207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265202020206d696e696d697a65642028746f20656e73757265206c6573732076617269616e63652920546865207472616e73616374696f6e20697320617373756d656420746f20626520746865206c6f6e6765737420706174682c20612062657474657220736f6c7574696f6e2e2020202d20496e697469616c20736f6c7574696f6e20697320616c6d6f7374207468652073616d652e2020202d20576f72736520736f6c7574696f6e20697320726574726163656420696e207072652d64697370617463682d636865636b73207768696368207365747320697473206f776e207765696768742e77696e6e6572735665633c56616c696461746f72496e6465783e636f6d70616374436f6d7061637441737369676e6d656e747373636f7265456c656374696f6e53636f7265657261457261496e64657873697a65456c656374696f6e53697a652052656d6f766520616c6c20646174612073747275637475726520636f6e6365726e696e672061207374616b65722f7374617368206f6e6365206974732062616c616e6365206973207a65726f2e205468697320697320657373656e7469616c6c79206571756976616c656e7420746f206077697468647261775f756e626f6e64656460206578636570742069742063616e2062652063616c6c656420627920616e796f6e6520616e6420746865207461726765742060737461736860206d7573742068617665206e6f2066756e6473206c6566742e20546869732063616e2062652063616c6c65642066726f6d20616e79206f726967696e2e202d20607374617368603a20546865207374617368206163636f756e7420746f20726561702e204974732062616c616e6365206d757374206265207a65726f2e20436f6d706c65786974793a204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e73206f6e20746865206163636f756e742e204442205765696768743a202d2052656164733a205374617368204163636f756e742c20426f6e6465642c20536c617368696e67205370616e732c204c6f636b73202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c205374617368204163636f756e742c204c6f636b73202d2057726974657320456163683a205370616e536c617368202a2053205365742060486973746f72794465707468602076616c75652e20546869732066756e6374696f6e2077696c6c2064656c65746520616e7920686973746f727920696e666f726d6174696f6e207768656e2060486973746f727944657074686020697320726564756365642e20506172616d65746572733a202d20606e65775f686973746f72795f6465707468603a20546865206e657720686973746f727920646570746820796f7520776f756c64206c696b6520746f207365742e202d20606572615f6974656d735f64656c65746564603a20546865206e756d626572206f66206974656d7320746861742077696c6c2062652064656c6574656420627920746869732064697370617463682e20202020546869732073686f756c64207265706f727420616c6c207468652073746f72616765206974656d7320746861742077696c6c2062652064656c6574656420627920636c656172696e67206f6c642020202065726120686973746f72792e204e656564656420746f207265706f727420616e2061636375726174652077656967687420666f72207468652064697370617463682e20547275737465642062792020202060526f6f746020746f207265706f727420616e206163637572617465206e756d6265722e204f726967696e206d75737420626520726f6f742e202d20453a204e756d626572206f6620686973746f7279206465707468732072656d6f7665642c20692e652e203130202d3e2037203d2033202d205765696768743a204f28452920202020202d2052656164733a2043757272656e74204572612c20486973746f727920446570746820202020202d205772697465733a20486973746f727920446570746820202020202d20436c6561722050726566697820456163683a20457261205374616b6572732c204572615374616b657273436c69707065642c204572617356616c696461746f72507265667320202020202d2057726974657320456163683a204572617356616c696461746f725265776172642c2045726173526577617264506f696e74732c2045726173546f74616c5374616b652c2045726173537461727453657373696f6e496e6465786e65775f686973746f72795f6465707468436f6d706163743c457261496e6465783e5f6572615f6974656d735f64656c65746564436f6d706163743c7533323e205265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e20546865206469737061746368206f726967696e206d757374206265207369676e65642062792074686520636f6e74726f6c6c65722c20616e642069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e202d2054696d6520636f6d706c65786974793a204f284c292c207768657265204c20697320756e6c6f636b696e67206368756e6b73202d20426f756e64656420627920604d41585f554e4c4f434b494e475f4348554e4b53602e202d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d20202020202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c204c6f636b732c205b4f726967696e204163636f756e745d20202020202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c656467657220506179206f757420616c6c20746865207374616b65727320626568696e6420612073696e676c652076616c696461746f7220666f7220612073696e676c65206572612e202d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e205468656972206e6f6d696e61746f72732c20757020746f20202060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602c2077696c6c20616c736f207265636569766520746865697220726577617264732e202d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e20546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e206966206974206973206e6f74206f6e65206f6620746865207374616b6572732e20546869732063616e206f6e6c792062652063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e202d2054696d6520636f6d706c65786974793a206174206d6f7374204f284d61784e6f6d696e61746f72526577617264656450657256616c696461746f72292e202d2d2d2d2d2d2d2d2d2d2d204e20697320746865204e756d626572206f66207061796f75747320666f72207468652076616c696461746f722028696e636c7564696e67207468652076616c696461746f7229205765696768743a202d205265776172642044657374696e6174696f6e205374616b65643a204f284e29202d205265776172642044657374696e6174696f6e20436f6e74726f6c6c657220284372656174696e67293a204f284e29202d20526561643a20457261456c656374696f6e5374617475732c2043757272656e744572612c20486973746f727944657074682c204572617356616c696461746f725265776172642c202020202020202020457261735374616b657273436c69707065642c2045726173526577617264506f696e74732c204572617356616c696461746f725072656673202838206974656d7329202d205265616420456163683a20426f6e6465642c204c65646765722c2050617965652c204c6f636b732c2053797374656d204163636f756e74202835206974656d7329202d20577269746520456163683a2053797374656d204163636f756e742c204c6f636b732c204c6564676572202833206974656d73292020204e4f54453a20776569676874732061726520617373756d696e672074686174207061796f75747320617265206d61646520746f20616c697665207374617368206163636f756e7420285374616b6564292e202020506179696e67206576656e2061206465616420636f6e74726f6c6c65722069732063686561706572207765696768742d776973652e20576520646f6e277420646f20616e7920726566756e647320686572652e76616c696461746f725f73746173682043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e2043616e2062652063616c6c6564206279207468652060543a3a536c61736843616e63656c4f726967696e602e20506172616d65746572733a2065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e20436f6d706c65786974793a204f2855202b2053292077697468205520756e6170706c69656420736c6173686573207765696768746564207769746820553d3130303020616e64205320697320746865206e756d626572206f6620736c61736820696e646963657320746f2062652063616e63656c65642e202d20526561643a20556e6170706c69656420536c6173686573202d2057726974653a20556e6170706c69656420536c6173686573736c6173685f696e646963657320466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e20546865206469737061746368206f726967696e206d75737420626520526f6f742e202d205765696768743a204f283129202d2057726974653a20466f72636545726120466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2062652072656d6f7665642052656164733a20426f6e6465642c20536c617368696e67205370616e732c204163636f756e742c204c6f636b73205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c204163636f756e742c204c6f636b732057726974657320456163683a205370616e536c617368202a205373746173686e756d5f736c617368696e675f7370616e7320536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e202d204f285629202d2057726974653a20496e76756c6e657261626c6573696e76756c6e657261626c65735665633c543a3a4163636f756e7449643e20466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c20626520726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e202d204e6f20617267756d656e74732e202d20577269746520466f72636545726120466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e205363616c652075702074686520696465616c206e756d626572206f662076616c696461746f7273206279206120666163746f722e2053616d65206173205b607365745f76616c696461746f725f636f756e74605d2e666163746f7250657263656e7420496e6372656d656e74732074686520696465616c206e756d626572206f662076616c696461746f72732e6164646974696f6e616c20536574732074686520696465616c206e756d626572206f662076616c696461746f72732e205765696768743a204f2831292057726974653a2056616c696461746f7220436f756e74202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e202d2d2d2d2d2d2d2d2d2d202d20526561643a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572202d2057726974653a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572636f6e74726f6c6c6572202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e202d2d2d2d2d2d2d2d2d20202020202d20526561643a204c656467657220202020202d2057726974653a205061796565706179656552657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e20416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e202d20436f6e7461696e73206f6e6520726561642e202d2d2d2d2d2d2d2d202d20526561643a20457261456c656374696f6e5374617475732c204c6564676572202d2057726974653a2056616c696461746f72732c204e6f6d696e61746f7273204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546869732063616e206f6e6c792062652063616c6c6564207768656e202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f662060746172676574736020284e292077686963682069732063617070656420617420436f6d7061637441737369676e6d656e74733a3a4c494d495420284d41585f4e4f4d494e4154494f4e53292e202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e205765696768743a204f284e29207768657265204e20697320746865206e756d626572206f662074617267657473202d2052656164733a2045726120456c656374696f6e205374617475732c204c65646765722c2043757272656e7420457261202d205772697465733a2056616c696461746f72732c204e6f6d696e61746f7273746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e202d20526561643a2045726120456c656374696f6e205374617475732c204c6564676572202d2057726974653a204e6f6d696e61746f72732c2056616c696461746f7273707265667356616c696461746f7250726566732052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e20456d697473206057697468647261776e602e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e2020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c2077686963682069732020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602e20436f6d706c6578697479204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2072656d6f7665205570646174653a202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c204c6f636b732c205b4f726967696e204163636f756e745d202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572204b696c6c3a202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c20426f6e6465642c20536c617368696e67205370616e732c205b4f726967696e2020204163636f756e745d2c204c6f636b732c2042616c616e63654f66207374617368202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c2020205b4f726967696e204163636f756e745d2c204c6f636b732c2042616c616e63654f662073746173682e204e4f54453a2057656967687420616e6e6f746174696f6e20697320746865206b696c6c207363656e6172696f2c20776520726566756e64206f74686572776973652e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360292063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e65656420746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e20456d6974732060556e626f6e646564602e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e6365602920202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c6564207669612020206077697468647261775f756e626f6e646564602e202d204f6e6520444220656e7472792e202d20526561643a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e744572612c204c6f636b732c2042616c616e63654f662053746173682c202d2057726974653a204c6f636b732c204c65646765722c2042616c616e63654f662053746173682c203c2f7765696768743e436f6d706163743c42616c616e63654f663c543e3e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f72207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e20556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e7420746861742063616e2062652061646465642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c657220616e642069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e20456d6974732060426f6e646564602e202d2d2d2d2d2d2d2d2d2d2d2d202d20526561643a2045726120456c656374696f6e205374617475732c20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c204c6f636b73202d2057726974653a205b4f726967696e204163636f756e745d2c204c6f636b732c204c65646765726d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c20626520746865206163636f756e74207468617420636f6e74726f6c732069742e206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e202d20546872656520657874726120444220656e74726965732e204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d20526561643a20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c2043757272656e74204572612c20486973746f72792044657074682c204c6f636b73202d2057726974653a20426f6e6465642c2050617965652c205b4f726967696e204163636f756e745d2c204c6f636b732c204c65646765720000000000a09b10000c0000000000000000000000839a11000300000000000000000000000000000000000000000000000000000000000000c41a1200ac9b10000000000000000000bc9b100007000000000000000100000000000000f49b10000e0000000000000000000000839a11000300000000000000000000000000000000000000000000000000000000000000c41a1200049c10000000000000000000149c1000010000000000000001000000000000001c9c1000150000000000000000000000839a11000300000000000000000000000000000000000000000000000000000000000000c41a1200349c10000000000000000000449c1000010000000000000001000000000000004c9c10000d00000000000000000000003e7a10001100000000000000000000000000000000000000000000000000000000000000c41a12005c9c100000000000000000006c9c100003000000000000000100000000000000904c1000060000000105000000000000be0712000c00000000000000be0712000c00000000000000000000000000000000000000c41a1200849c10000000000000000000949c1000010000000000000000000000000000008a4c1000060000000102000000000000be0712000c000000000000009c9c10002900000000000000000000000000000000000000c41a1200c89c10000000000000000000d89c100001000000000000000000000000000000e09c1000050000000105000000000000be0712000c00000000000000827e10001f00000000000000000000000000000000000000c41a1200e89c10000000000000000000f89c10000100000000000000010000000000000088c911000a0000000105000000000000be0712000c00000000000000038210000e00000000000000000000000000000000000000c41a1200009d10000000000000000000109d100001000000000000000100000000000000314710000a0000000105000000000000be0712000c00000000000000189d10001900000000000000000000000000000000000000c41a1200349d10000000000000000000449d1000010000000000000000000000000000004c9d10000a0000000000000000000000ac6a10000800000000000000000000000000000000000000000000000000000000000000c41a1200589d10000000000000000000689d100004000000000000000000000000000000889d1000090000000000000000000000919d10000d00000000000000000000000000000000000000000000000000000000000000c41a1200a09d10000000000000000000b09d100004000000000000000000000000000000d09d1000150000000105000000000000ac6a10000800000000000000cfc911000c00000000000000000000000000000000000000c41a1200e89d10000000000000000000f89d100001000000000000000000000000000000964c10000b0000000205050000000000ac6a10000800000000000000be0712000c00000000000000009e10002400000000000000c41a1200249e10000000000000000000349e100006000000000000000100000000000000649e1000120000000205050000000000ac6a10000800000000000000be0712000c00000000000000009e10002400000000000000c41a1200789e10000000000000000000889e10000b000000000000000100000000000000e09e1000120000000205050000000000ac6a10000800000000000000be0712000c00000000000000038210000e00000000000000c41a1200f49e10000000000000000000049f1000050000000000000001000000000000002c9f1000130000000105000000000000ac6a10000800000000000000670c12000c00000000000000000000000000000000000000c41a1200409f10000000000000000000509f1000030000000000000000000000000000001b491000100000000105000000000000ac6a10000800000000000000689f10001d00000000000000000000000000000000000000c41a1200889f10000000000000000000989f100002000000000000000100000000000000a89f10000e0000000105000000000000ac6a10000800000000000000670c12000c00000000000000000000000000000000000000c41a1200b89f10000000000000000000c89f100002000000000000000100000000000000d89f1000080000000000000000000000e09f10000700000000000000000000000000000000000000000000000000000000000000c41a1200e89f10000000000000000000f89f10000100000000000000010000000000000000a0100013000000000000000000000055a011000700000000000000000000000000000000000000000000000000000000000000c41a120014a01000000000000000000024a01000030000000000000001000000000000003ca01000130000000000000000000000670c12000c00000000000000000000000000000000000000000000000000000000000000c41a120050a01000000000000000000060a010000200000000000000010000000000000070a01000100000000105000000000000ac6a1000080000000000000080a010002f00000000000000000000000000000000000000c41a1200b0a010000000000000000000c0a0100001000000000000000100000000000000c8a010000a0000000000000000000000d2a010001d00000000000000000000000000000000000000000000000000000000000000c41a1200f0a01000000000000000000000a11000040000000000000001000000000000003e491000130000000205050000000000ac6a10000800000000000000be0712000c0000000000000020a110001700000000000000c41a120038a11000000000000000000048a11000020000000000000000000000000000002b491000130000000205050000000000ac6a10000800000000000000be0712000c00000000000000670c12000c00000000000000c41a120058a11000000000000000000068a1100001000000000000000000000000000000514910000d0000000105000000000000be0712000c0000000000000070a110001700000000000000000000000000000000000000c41a120088a11000000000000000000098a11000010000000000000000000000000000005e491000090000000105000000000000a0a110002300000000000000c3a110002200000000000000000000000000000000000000c41a1200e8a110000000000000000000f8a110000200000000000000010000000000000008a21000160000000000000000000000ac6a10000800000000000000000000000000000000000000000000000000000000000000c41a120020a21000000000000000000030a21000010000000000000000000000000000006c4710001200000000000000000000003e7a10001100000000000000000000000000000000000000000000000000000000000000c41a120038a21000000000000000000048a21000020000000000000000000000000000007e4710001200000000000000000000003e7a10001100000000000000000000000000000000000000000000000000000000000000c41a120058a21000000000000000000068a210000200000000000000000000000000000078a210000d000000000000000000000085a210002a00000000000000000000000000000000000000000000000000000000000000c41a1200b0a210000000000000000000c0a2100003000000000000000000000000000000d8a210000b00000000000000000000009c6a10000d00000000000000000000000000000000000000000000000000000000000000c41a1200e4a210000000000000000000f4a210000100000000000000000000000000000020471000110000000000000000000000fca210001e00000000000000000000000000000000000000000000000000000000000000c41a12001ca3100000000000000000002ca31000020000000000000001000000000000003ca31000150000000000000000000000d90712000400000000000000000000000000000000000000000000000000000000000000c41a120054a31000000000000000000064a31000020000000000000001000000000000004cf211000e00000000000000000000005af211000800000000000000000000000000000000000000000000000000000000000000c41a120074a31000000000000000000084a31000040000000000000001000000486973746f727944657074682a000000000000000100000097000000d1b2100023000000c41a120000000000f4b210004e000000c41a12000000000042b31000580000009ab310004e000000e8b310000c00000056616c696461746f72436f756e7400002a000000000000000100000098000000a7b210002a0000004d696e696d756d56616c696461746f72436f756e740000002a00000000000000010000009800000057b2100050000000496e76756c6e657261626c65730000002a00000000000000010000009900000083b1100056000000d9b11000530000002cb210002b0000002a00000000000000010000009300000043b11000400000005374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0000002a00000000000000010000009a000000f2b010005100000050617965650000002a00000000000000010000009b000000b9b01000390000002a00000000000000010000009c00000068b01000510000004e6f6d696e6174696f6e733c543a3a4163636f756e7449643e0000002a0000000000000001000000930000000fb010005900000043757272656e7445726100002a0000000000000001000000930000007faf100017000000c41a12000000000096af100059000000efaf100020000000416374697665457261416374697665457261496e666f00002a000000000000000100000093000000d0ae100036000000c41a12000000000006af10002e00000034af10004b00000045726173537461727453657373696f6e496e6465780000002a00000000000000010000009300000084ae10004c0000004578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e2a00000000000000010000009d00000066ae10001e000000c41a12000000000006ac100058000000c41a1200000000005eac10002a00000016ae100050000000457261735374616b657273436c697070656400002a00000000000000010000009d00000088ac100026000000c41a120000000000aeac10005600000004ad1000370000003bad10004700000082ad10003d000000c41a120000000000bfad100057000000c41a1200000000005eac10002a00000016ae1000500000004572617356616c696461746f72507265667300002a00000000000000010000009c000000c2ab100044000000c41a12000000000006ac100058000000c41a1200000000005eac10002a0000004572617356616c696461746f72526577617264002a00000000000000010000009300000038ab100042000000c41a1200000000007aab100048000000457261526577617264506f696e74733c543a3a4163636f756e7449643e0000002a00000000000000010000009e000000c4aa10002b000000efaa10004900000045726173546f74616c5374616b6500002a00000000000000010000009f00000042aa10003b0000007daa100047000000466f726365457261466f7263696e67002a00000000000000010000009b0000002daa100015000000536c6173685265776172644672616374696f6e002a000000000000000100000098000000b6a910003e000000c41a120000000000f4a910003900000043616e63656c6564536c6173685061796f7574002a00000000000000010000009f00000036a91000450000007ba910003b000000556e6170706c696564536c61736865735665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e002a0000000000000001000000a000000005a9100031000000426f6e646564457261735665633c28457261496e6465782c2053657373696f6e496e646578293e002a0000000000000001000000a10000005ba8100049000000c41a120000000000a4a8100032000000d6a810002f0000002850657262696c6c2c2042616c616e63654f663c543e29002a000000000000000100000093000000eea71000510000003fa810001c0000002a00000000000000010000009300000096a7100058000000736c617368696e673a3a536c617368696e675370616e73002a00000000000000010000009300000073a710002300000028543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e64657829736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e0000002a0000000000000001000000a2000000f6a610004f00000045a710002e0000004561726c69657374556e6170706c696564536c61736800002a000000000000000100000093000000b7a610003f0000002a0000000000000001000000a30000005ea610005900000018a61000460000002a0000000000000001000000a3000000bfa510005900000018a6100046000000517565756564456c6563746564456c656374696f6e526573756c743c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e002a00000000000000010000009300000001a51000590000005aa5100058000000b2a510000d00000051756575656453636f7265002a000000000000000100000093000000d5a410002c000000456c656374696f6e5374617475733c543a3a426c6f636b4e756d6265723e00002a00000000000000010000009b00000068a4100052000000baa410001b000000497343757272656e7453657373696f6e46696e616c0000002a000000000000000100000093000000ffa310005300000052a41000160000002a0000000000000001000000a4000000a4a3100033000000d8e411001f000000c41a120000000000d7a31000280000002054727565206966206e6574776f726b20686173206265656e20757067726164656420746f20746869732076657273696f6e2e20546869732069732073657420746f2076332e302e3020666f72206e6577206e6574776f726b732e2054727565206966207468652063757272656e74202a2a706c616e6e65642a2a2073657373696f6e2069732066696e616c2e204e6f74652074686174207468697320646f6573206e6f742074616b652065726120666f7263696e6720696e746f206163636f756e742e20466c616720746f20636f6e74726f6c2074686520657865637574696f6e206f6620746865206f6666636861696e20656c656374696f6e2e205768656e20604f70656e285f29602c2077652061636365707420736f6c7574696f6e7320746f206265207375626d69747465642e205468652073636f7265206f66207468652063757272656e74205b60517565756564456c6563746564605d2e20546865206e6578742076616c696461746f72207365742e2041742074686520656e64206f6620616e206572612c206966207468697320697320617661696c61626c652028706f74656e7469616c6c792066726f6d2074686520726573756c74206f6620616e206f6666636861696e20776f726b6572292c20697420697320696d6d6564696174656c7920757365642e204f74686572776973652c20746865206f6e2d636861696e20656c656374696f6e2069732065786563757465642e20536e617073686f74206f66206e6f6d696e61746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c79206861766520612076616c7565207768656e205b60457261456c656374696f6e537461747573605d203d3d2060456c656374696f6e5374617475733a3a4f70656e285f29602e20536e617073686f74206f662076616c696461746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c7920546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2c2061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e20416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e20416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e20616e6420736c6173682076616c7565206f6620746865206572612e2041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e204d75737420636f6e7461696e7320696e666f726d6174696f6e20666f72206572617320666f72207468652072616e67653a20605b6163746976655f657261202d20626f756e64696e675f6475726174696f6e3b206163746976655f6572615d6020416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e2054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e74207768696368207761732063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e204d6f6465206f662065726120666f7263696e672e2054686520746f74616c20616d6f756e74207374616b656420666f7220746865206c6173742060484953544f52595f44455054486020657261732e20496620746f74616c206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207374616b652069732072657475726e65642e205265776172647320666f7220746865206c6173742060484953544f52595f44455054486020657261732e20496620726577617264206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207265776172642069732072657475726e65642e2054686520746f74616c2076616c696461746f7220657261207061796f757420666f7220746865206c6173742060484953544f52595f44455054486020657261732e2045726173207468617420686176656e27742066696e697368656420796574206f7220686173206265656e2072656d6f76656420646f65736e27742068617665207265776172642e2053696d696c617220746f2060457261735374616b657273602c207468697320686f6c64732074686520707265666572656e636573206f662076616c696461746f72732e2054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e2049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e20436c6970706564204578706f73757265206f662076616c696461746f72206174206572612e20546869732069732073696d696c617220746f205b60457261735374616b657273605d20627574206e756d626572206f66206e6f6d696e61746f7273206578706f736564206973207265647563656420746f207468652060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732e20284e6f74653a20746865206669656c642060746f74616c6020616e6420606f776e60206f6620746865206578706f737572652072656d61696e7320756e6368616e676564292e2054686973206973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e2054686973206973206b657965642066697374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e204578706f73757265206f662076616c696461746f72206174206572612e205468652073657373696f6e20696e646578206174207768696368207468652065726120737461727420666f7220746865206c6173742060484953544f52595f44455054486020657261732e20546865206163746976652065726120696e666f726d6174696f6e2c20697420686f6c647320696e64657820616e642073746172742e20546865206163746976652065726120697320746865206572612063757272656e746c792072657761726465642e2056616c696461746f7220736574206f66207468697320657261206d75737420626520657175616c20746f206053657373696f6e496e746572666163653a3a76616c696461746f7273602e205468652063757272656e742065726120696e6465782e205468697320697320746865206c617465737420706c616e6e6564206572612c20646570656e64696e67206f6e20686f77207468652053657373696f6e2070616c6c657420717565756573207468652076616c696461746f72207365742c206974206d6967687420626520616374697665206f72206e6f742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e204e756d626572206f66206572617320746f206b65657020696e20686973746f72792e20496e666f726d6174696f6e206973206b65707420666f72206572617320696e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e204d757374206265206d6f7265207468616e20746865206e756d626572206f6620657261732064656c617965642062792073657373696f6e206f74686572776973652e20492e652e2061637469766520657261206d75737420616c7761797320626520696e20686973746f72792e20492e652e20606163746976655f657261203e2063757272656e745f657261202d20686973746f72795f646570746860206d7573742062652067756172616e746565642e000000007cb510000e00000000000000cfc911000c00000000000000c41a12008cb5100000000000000000009cb51000010000000000000000000000a4b510000f00000000000000ac6a10000800000000000000c41a1200b4b510000000000000000000c4b51000010000000000000000000000ccb510001200000000000000ac6a10000800000000000000c41a1200e0b510000000000000000000f0b5100005000000000000000000000018b610001100000000000000d5f711000e00000000000000c41a12002cb6100000000000000000003cb6100007000000000000000000000074b610000d00000000000000839a11000300000000000000c41a120084b61000000000000000000094b61000030000000000000000000000acb61000140000000000000055a011000700000000000000c41a1200c0b610000000000000000000d0b61000010000000000000000000000d8b610002000000000000000839a11000300000000000000c41a1200f8b61000000000000000000008b71000040000000000000053657373696f6e7350657245726100002a0000000000000001000000a50000002abb10001c000000426f6e64696e674475726174696f6e002a0000000000000001000000a6000000f1ba100039000000536c61736844656665724475726174696f6e00002a0000000000000001000000a700000029ba100040000000c41a12000000000069ba10002f00000098ba10004b000000e3ba10000e000000456c656374696f6e4c6f6f6b61686561640000002a0000000000000001000000a8000000e5b810005c000000c41a12000000000041b910005b0000009cb9100009000000c41a120000000000a5b910005d00000002ba1000270000004d6178497465726174696f6e730000002a0000000000000001000000a900000060b810004a000000c41a120000000000aab810003b0000004d696e536f6c7574696f6e53636f726542756d702a0000000000000001000000aa00000008b81000580000004d61784e6f6d696e61746f72526577617264656450657256616c696461746f722a0000000000000001000000ab00000028b710003e000000c41a12000000000066b710005a000000c0b710004800000020546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320726577617264656420666f7220656163682076616c696461746f722e20466f7220656163682076616c696461746f72206f6e6c79207468652060244d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732063616e20636c61696d207468656972207265776172642e2054686973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e20546865207468726573686f6c64206f6620696d70726f76656d656e7420746861742073686f756c642062652070726f766964656420666f722061206e657720736f6c7574696f6e20746f2062652061636365707465642e204d6178696d756d206e756d626572206f662062616c616e63696e6720697465726174696f6e7320746f2072756e20696e20746865206f6666636861696e207375626d697373696f6e2e2049662073657420746f20302c2062616c616e63655f736f6c7574696f6e2077696c6c206e6f7420626520657865637574656420617420616c6c2e20546865206e756d626572206f6620626c6f636b73206265666f72652074686520656e64206f6620746865206572612066726f6d20776869636820656c656374696f6e207375626d697373696f6e732061726520616c6c6f7765642e2053657474696e67207468697320746f207a65726f2077696c6c2064697361626c6520746865206f6666636861696e20636f6d7075746520616e64206f6e6c79206f6e2d636861696e207365712d70687261676d656e2077696c6c20626520757365642e205468697320697320626f756e646564206279206265696e672077697468696e20746865206c6173742073657373696f6e2e2048656e63652c2073657474696e6720697420746f20612076616c7565206d6f7265207468616e20746865206c656e677468206f6620612073657373696f6e2077696c6c20626520706f696e746c6573732e204e756d626572206f662065726173207468617420736c6173686573206172652064656665727265642062792c20616674657220636f6d7075746174696f6e2e20546869732073686f756c64206265206c657373207468616e2074686520626f6e64696e67206475726174696f6e2e2053657420746f203020696620736c61736865732073686f756c64206265206170706c69656420696d6d6564696174656c792c20776974686f7574206f70706f7274756e69747920666f7220696e74657276656e74696f6e2e204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e204e756d626572206f662073657373696f6e7320706572206572612e000000000000d4bc10000900000000000000e0bc1000030000000000000000000000f8bc100003000000000000000000000010bd1000060000000000000018e8110002000000000000000000000018bd100001000000000000000000000020bd1000050000000000000018e8110002000000000000000000000028bd100002000000000000000000000038bd10001a0000000000000054bd10000100000000000000000000005cbd10000200000000000000000000006cbd10000f000000000000007cbd100001000000000000000000000084bd10000100000000000000000000008cbd10000e000000000000007cbd10000100000000000000000000009cbd1000010000000000000000000000904c1000060000000000000018e81100020000000000000000000000a4bd1000040000000000000000000000c4bd1000080000000000000018e81100020000000000000000000000ccbd1000010000000000000000000000d4bd1000090000000000000018e81100020000000000000000000000e0bd100002000000000000004572615061796f7574000000ac6a100008000000c9e9110007000000c9e911000700000017c11000560000006dc11000310000009ec110002b0000005265776172640000d8c010003f000000536c61736800000079c0100049000000c2c01000160000004f6c64536c617368696e675265706f72744469736361726465640000cfc911000c0000000ec010004700000055c01000240000005374616b696e67456c656374696f6e00ffbf10000f000000c2bf10003d000000536f6c7574696f6e53746f72656400007cbf100046000000aabe100035000000c41a120000000000dfbe10005400000033bf100049000000556e626f6e64656473be10003700000057697468647261776e000000f0bd10005700000047be10002c00000020416e206163636f756e74206861732063616c6c6564206077697468647261775f756e626f6e6465646020616e642072656d6f76656420756e626f6e64696e67206368756e6b7320776f727468206042616c616e6365602066726f6d2074686520756e6c6f636b696e672071756575652e205c5b73746173682c20616d6f756e745c5d20416e206163636f756e742068617320756e626f6e646564207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d20416e206163636f756e742068617320626f6e646564207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d204e4f54453a2054686973206576656e74206973206f6e6c7920656d6974746564207768656e2066756e64732061726520626f6e64656420766961206120646973706174636861626c652e204e6f7461626c792c2069742077696c6c206e6f7420626520656d697474656420666f72207374616b696e672072657761726473207768656e20746865792061726520616464656420746f207374616b652e2041206e657720736f6c7574696f6e20666f7220746865207570636f6d696e6720656c656374696f6e20686173206265656e2073746f7265642e205c5b636f6d707574655c5d2041206e657720736574206f66207374616b6572732077617320656c656374656420776974682074686520676976656e205c5b636f6d707574655c5d2e456c656374696f6e436f6d7075746520416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c64206e6f742062652070726f6365737365642e205c5b73657373696f6e5f696e6465785c5d204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e205c5b76616c696461746f722c20616d6f756e745c5d20546865207374616b657220686173206265656e207265776172646564206279207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d2054686520657261207061796f757420686173206265656e207365743b207468652066697273742062616c616e6365206973207468652076616c696461746f722d7061796f75743b20746865207365636f6e64206973207468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e205c5b6572615f696e6465782c2076616c696461746f725f7061796f75742c2072656d61696e6465725c5d4572726f723a2073746172745f73657373696f6e5f696e646578206d7573742062652073657420666f722063757272656e745f657261f09f92b8206f6e2d636861696e2070687261676d656e206973206661696c696e672064756520746f20612070726f626c656d20696e2074686520726573756c742e2054686973206d7573742062652061206275672e6cc210001f0000008bc2100016000000a1c2100009000000f09f92b8206e65772076616c696461746f7220736574206f662073697a652020686173206265656e20656c6563746564207669612020666f7220657261205761726e696e673a20412073657373696f6e206170706561727320746f2068617665206265656e20736b69707065642e0000ace210005e000000c90400000100000000000000cf4b10000d0000000000000050c61000010000000000000000000000c74b1000080000000000000058c61000010000000000000000000000ba4b10000d0000000000000060c61000010000000000000000000000ad4b10000d0000000000000068c61000010000000000000000000000a14b10000c0000000000000070c61000010000000000000000000000934b10000e0000000000000078c61000010000000000000000000000824b1000110000000000000080c61000010000000000000000000000714b1000110000000000000088c61000010000000000000000000000654b10000c0000000000000090c61000010000000000000000000000584b10000d0000000000000098c610000100000000000000000000004c4b10000c00000000000000a0c610000100000000000000000000003a4b10001200000000000000a8c61000010000000000000000000000204b10001a00000000000000b0c610000100000000000000000000000e4b10001200000000000000b8c61000010000000000000000000000004b10000e00000000000000c0c61000010000000000000000000000e14a10001f00000000000000c8c61000010000000000000000000000c34a10001e00000000000000d0c61000010000000000000000000000b04a10001300000000000000d8c61000010000000000000000000000904a10002000000000000000e0c61000010000000000000000000000754a10001b00000000000000e8c61000020000000000000000000000594a10001c00000000000000f8c610000200000000000000000000003b4a10001e0000000000000008c710000100000000000000000000001c4a10001f0000000000000010c71000010000000000000000000000fb491000210000000000000018c71000020000000000000000000000de4910001d0000000000000028c71000010000000000000000000000c5491000190000000000000030c71000010000000000000000000000ab4910001a0000000000000038c710000100000000000000000000008a491000210000000000000040c710000100000000000000000000007c4910000e0000000000000048c7100001000000000000000000000067491000150000000000000050c71000010000000000000000000000dc4b1000160000000000000058c710000100000000000000b9cd10001a000000a4cd1000150000008bcd1000190000006dcd10001e00000054cd10001900000043cd10001100000021cd100022000000eecc100033000000c9cc100025000000a0cc1000290000006dcc10003300000056cc10001700000037cc10001f00000016cc100021000000d3cb1000430000009acb1000390000005acb10004000000026cb100034000000faca10002c00000094ca100058000000ecca10000e00000013ca1000570000006aca10002a000000cec91000450000007bc91000530000000ec910005800000066c9100015000000c5c810004900000074c81000510000002ec810004600000010c810001e000000bec71000520000008dc710003100000060c710002d00000020496e636f7272656374206e756d626572206f6620736c617368696e67207370616e732070726f76696465642e20496e636f72726563742070726576696f757320686973746f727920646570746820696e7075742070726f76696465642e205468652063616c6c206973206e6f7420616c6c6f7765642061742074686520676976656e2074696d652064756520746f207265737472696374696f6e73206f6620656c656374696f6e20706572696f642e2054686520656c656374696f6e2073697a6520697320696e76616c69642e2054686520636c61696d65642073636f726520646f6573206e6f74206d61746368207769746820746865206f6e6520636f6d70757465642066726f6d2074686520646174612e20546865207375626d697474656420726573756c742068617320756e6b6e6f776e206564676573207468617420617265206e6f7420616d6f6e67207468652070726573656e7465642077696e6e6572732e20412073656c6620766f7465206d757374206f6e6c79206265206f726967696e617465642066726f6d20612076616c696461746f7220746f204f4e4c59207468656d73656c7665732e204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e2065646765207768696368206973207375626d6974746564206265666f726520746865206c617374206e6f6e2d7a65726f20736c617368206f6620746865207461726765742e204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e206564676520746f20776869636820746865792068617665206e6f7420766f746564206f6e20636861696e2e204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f7273206973206e6f7420616e20616374697665206e6f6d696e61746f72206f6e20636861696e2e204572726f72207768696c65206275696c64696e67207468652061737369676e6d656e7420747970652066726f6d2074686520636f6d706163742e20546869732063616e2068617070656e20696620616e20696e64657820697320696e76616c69642c206f72206966207468652077656967687473205f6f766572666c6f775f2e204f6e65206f6620746865207375626d69747465642077696e6e657273206973206e6f7420616e206163746976652063616e646964617465206f6e20636861696e2028696e646578206973206f7574206f662072616e676520696e20736e617073686f74292e20496e636f7272656374206e756d626572206f662077696e6e65727320776572652070726573656e7465642e2054686520736e617073686f742064617461206f66207468652063757272656e742077696e646f77206973206d697373696e672e20546865207375626d697474656420726573756c74206973206e6f7420617320676f6f6420617320746865206f6e652073746f726564206f6e20636861696e2e20546865207375626d697474656420726573756c74206973207265636569766564206f7574206f6620746865206f70656e2077696e646f772e205265776172647320666f72207468697320657261206861766520616c7265616479206265656e20636c61696d656420666f7220746869732076616c696461746f722e204974656d7320617265206e6f7420736f7274656420616e6420756e697175652e20496e76616c6964206e756d626572206f66206e6f6d696e6174696f6e732e20496e76616c69642065726120746f207265776172642e20417474656d7074696e6720746f2074617267657420612073746173682074686174207374696c6c206861732066756e64732e2043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e2043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e2043616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e63652e20536c617368207265636f726420696e646578206f7574206f6620626f756e64732e204475706c696361746520696e6465782e20546172676574732063616e6e6f7420626520656d7074792e20436f6e74726f6c6c657220697320616c7265616479207061697265642e20537461736820697320616c726561647920626f6e6465642e204e6f742061207374617368206163636f756e742e204e6f74206120636f6e74726f6c6c6572206163636f756e742e72656a656374696e6720756e7369676e6564207472616e73616374696f6e2062656361757365206974206973206e6f74206c6f63616c2f696e2d626c6f636b2e0079ce100040000000124810000100000043ce10003600000012481000010000005374616b696e674f6666636861696ef09f92b82076616c6964617465556e7369676e65642073756363656564656420666f72206120736f6c7574696f6e2061742065726120f09f92b82076616c696461746520756e7369676e65642070726520646973706174636820636865636b73206661696c65642064756520746f206572726f722023416e20756e7369676e656420736f6c7574696f6e2063616e206f6e6c79206265207375626d69747465642062792076616c696461746f72733b20412076616c696461746f722073686f756c6420616c776179732070726f6475636520636f727265637420736f6c7574696f6e732c20656c7365207468697320626c6f636b2073686f756c64206e6f7420626520696d706f727465642c2074687573206566666563746976656c7920646570726976696e67207468652076616c696461746f72732066726f6d20746865697220617574686f72696e67207265776172642e2048656e63652c20746869732070616e69630a0909090969732065787065637465642e0000002a0000002800000008000000ac000000ace210005e0000006b0800000f0000001dd110002a000000f09f92b820646574656374656420616e206572726f7220696e20746865207374616b696e67206c6f636b696e6720616e6420736e617073686f742e65786163746c79206f6e65206f6620606d617962655f76616c696461746f726020616e6420606d617962655f6e6f6d696e6174696f6e2e69735f736f6d656020697320747275652e2069735f76616c696461746f722069732066616c73653b206d617962655f6e6f6d696e6174696f6e20697320736f6d653b20716564ace210005e000000fc09000033000000c4d0100025000000e9d010000b000000f4d0100029000000f09f92b820412062657474657220736f6c7574696f6e20287769746820636f6d707574652020616e642073636f7265202920686173206265656e2076616c69646174656420616e642073746f726564206f6e20636861696e2ef09f92b820756e2d636f6d70616374696e6720736f6c7574696f6e206661696c65642064756520746f20496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473214e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f72212f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d7363616c652d636f6465632d312e332e352f7372632f636f6465632e72732a00000000000000010000003f000000bfd211006a0000002b010000290000002a00000000000000010000003e000000bfd211006a0000002e01000034000000bfd211006a0000008102000025000000bfd211006a0000008102000036000000bfd211006a000000870200002f000000bfd211006a000000230100002c0000005175657565644b6579734475706c6963617465644b65794e6f4173736f63696174656456616c696461746f724964496e76616c696450726f6f664e6f4b6579730000000020d31000080000000000000028d3100002000000000000000000000058d310000e0000000000000000000000c8d310000a00000000000000c41a1200000000000000000000000000d4d310000c000000000000007365745f6b65797300000000329b1100040000000000000017d7100007000000000000001ed7100005000000000000000d9f110007000000d8d510003a00000012d610004800000067d4100031000000c41a12000000000098d4100035000000c41a120000000000ac0412000b0000005ad6100015000000fad41000560000006fd610003c000000abd6100029000000d4d6100021000000f5d61000220000004b0512000c00000070757267655f6b657973000034d410003300000067d4100031000000c41a12000000000098d4100035000000c41a120000000000ac0412000b000000cdd410002d000000fad410005600000050d510003c0000008cd5100029000000b5d51000230000004b0512000c0000002052656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e20546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e202d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e20202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642e202d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460202d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e7460202d20446257726974657320706572206b65792069643a20604b65794f776e646572602053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e20416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722e202d20436f6d706c65786974793a20604f28312960202d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360202d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b65797360202d204462526561647320706572206b65792069643a20604b65794f776e657260202d20446257726974657320706572206b65792069643a20604b65794f776e657260543a3a4b65797370726f6f66000000000088c911000a00000000000000000000008cd910001300000000000000000000000000000000000000000000000000000000000000c41a1200a0d910000000000000000000b0d9100001000000000000000100000000000000b8d910000c0000000000000000000000cfc911000c00000000000000000000000000000000000000000000000000000000000000c41a1200c4d910000000000000000000d4d9100001000000000000000100000000000000dcd910000d0000000000000000000000d90712000400000000000000000000000000000000000000000000000000000000000000c41a1200ecd910000000000000000000fcd910000200000000000000010000000000000088d210000a00000000000000000000000cda10001e00000000000000000000000000000000000000000000000000000000000000c41a12002cda100000000000000000003cda1000020000000000000001000000000000004cda10001200000000000000000000005eda10000800000000000000000000000000000000000000000000000000000000000000c41a120068da1000000000000000000078da10000300000000000000010000000000000090da1000080000000105000000000000fcfd10000e0000000000000017d710000700000000000000000000000000000000000000c41a120098da10000000000000000000a8da100001000000000000000000000000000000b0da1000080000000105000000000000b8da10001400000000000000fcfd10000e00000000000000000000000000000000000000c41a1200ccda10000000000000000000dcda10000100000000000000000000005665633c543a3a56616c696461746f7249643e002a000000000000000100000099000000d6dc10001f00000043757272656e74496e6465782a000000000000000100000098000000b8dc10001e0000005175657565644368616e6765640000002a00000000000000010000009300000041dc10004e0000008fdc1000290000005665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e00002a000000000000000100000045000000badb10004f00000009dc10003800000044697361626c656456616c696461746f72735665633c7533323e00002a0000000000000001000000ad0000004ddb100020000000c41a1200000000006ddb10004d0000004e6578744b6579732a00000000000000010000009300000026db1000270000004b65794f776e6572284b65795479706549642c205665633c75383e292a000000000000000100000093000000e4da10004200000020546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e20496e6469636573206f662064697361626c65642076616c696461746f72732e205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e2054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b6579732077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e20547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f727320686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e2043757272656e7420696e646578206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e00000000000000b6d210000c0000000000000068dd10000100000000000000000000009fd21000170000000000000070dd100001000000000000000000000092d210000d0000000000000078dd1000010000000000000000000000c2d21000060000000000000080dd10000100000000000000f4dd100019000000ccdd100028000000b2dd10001a00000088dd10002a000000204e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e2052656769737465726564206475706c6963617465206b65792e204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e20496e76616c6964206f776e6572736869702070726f6f662e436865636b4d6f7274616c697479536f6d654e6f6e65002a00000004000000040000001c0000003cde10001a0000004552524f523a20436f727275707465642073746174652061742000002a00000000000000010000003f0000000000000000000000617474656d707420746f20646976696465206279207a65726f0000002a0000000800000004000000ae000000831512006d000000f104000001000000bcde10004d0000003a000000010000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f70617261636861696e732f7372632f73657373696f6e5f696e666f2e72735061726153657373696f6e496e666f0000000020e0100014000000000000000000000034e010001100000000000000000000000000000000000000000000000000000000000000c41a120048e01000000000000000000058e010000300000000000000010000000000000070e01000150000000000000000000000cfc911000c00000000000000000000000000000000000000000000000000000000000000c41a120088e01000000000000000000098e0100001000000000000000100000000000000a0e01000080000000106000000000000cfc911000c000000000000000bef11000b00000000000000000000000000000000000000c41a1200a8e010000000000000000000b8e0100003000000000000000000000041737369676e6d656e744b657973556e736166655665633c41737369676e6d656e7449643e0000002a000000000000000100000045000000e3e11000290000000ce210005b00000067e210002b0000004561726c6965737453746f72656453657373696f6e0000002a000000000000000100000098000000a3e110004000000053657373696f6e732a0000000000000001000000af000000d0e0100029000000f9e010004d00000046e110005d0000002053657373696f6e20696e666f726d6174696f6e20696e206120726f6c6c696e672077696e646f772e2053686f756c64206861766520616e20656e74727920696e2072616e676520604561726c6965737453746f72656453657373696f6e2e2e3d43757272656e7453657373696f6e496e646578602e20446f6573206e6f74206861766520616e7920656e7472696573206265666f7265207468652073657373696f6e20696e64657820696e207468652066697273742073657373696f6e206368616e6765206e6f74696669636174696f6e2e20546865206561726c696573742073657373696f6e20666f722077686963682070726576696f75732073657373696f6e20696e666f2069732073746f7265642e2041737369676e6d656e74206b65797320666f72207468652063757272656e742073657373696f6e2e204e6f7465207468617420746869732041504920697320707269766174652064756520746f206974206265696e672070726f6e6520746f20276f66662d62792d6f6e65272061742073657373696f6e20626f756e6461726965732e205768656e20696e20646f7562742c20757365206053657373696f6e73602041504920696e73746561642e506f7374496e666f3a20ace210005e00000082040000010000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f7374616b696e672f7372632f6c69622e72730000b4e3100040000000a7000000010000005468657265206973206f6e6c79206f6e6520666174616c206572726f723b2071656400002a0000000800000004000000b0000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f0000000fe4100007000000f4e310001b000000f019120002000000b4e310004000000070020000010000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f726f636f636f2f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f2076657273696f6e000020e410000d000000657865637574655f626c6f636b00000038e4100010000000696e697469616c697a655f626c6f636b50e41000080000006d6574616461746160e410000f0000006170706c795f65787472696e7369630078e410000e00000066696e616c697a655f626c6f636b000090e4100013000000696e686572656e745f65787472696e7369637300ace410000f000000636865636b5f696e686572656e747300c4e410000b00000072616e646f6d5f7365656400d8e410001400000076616c69646174655f7472616e73616374696f6ef4e410000f0000006f6666636861696e5f776f726b6572000ce510000a00000076616c696461746f7273000020e510001000000076616c696461746f725f67726f75707338e5100012000000617661696c6162696c6974795f636f726573000054e510001400000066756c6c5f76616c69646174696f6e5f6461746170e51000190000007065727369737465645f76616c69646174696f6e5f6461746100000094e5100018000000636865636b5f76616c69646174696f6e5f6f757470757473b4e510001700000073657373696f6e5f696e6465785f666f725f6368696c6400064211000f000000dce510001a000000686973746f726963616c5f76616c69646174696f6e5f636f6465000000e610001e00000063616e6469646174655f70656e64696e675f617661696c6162696c697479000028e610001000000063616e6469646174655f6576656e747340e610000c00000073657373696f6e5f696e666f54e610000c000000646d715f636f6e74656e747368e610001e000000696e626f756e645f68726d705f6368616e6e656c735f636f6e74656e7473000090e61000130000006772616e6470615f617574686f72697469657300ace610002d0000007375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e736963000000e4e610001c00000067656e65726174655f6b65795f6f776e6572736869705f70726f6f6608e710000d000000636f6e66696775726174696f6e00000020e710001300000063757272656e745f65706f63685f7374617274003ce710000b000000617574686f7269746965730050e710001500000067656e65726174655f73657373696f6e5f6b65797300000070e71000130000006465636f64655f73657373696f6e5f6b657973008ce710000d0000006163636f756e745f6e6f6e6365000000a4e710000a00000071756572795f696e666f54696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b000000ece7100060000000bf0000000d0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f74696d657374616d702f7372632f6c69622e72730000000078e8100003000000000000007ce8100001000000000000000000000094e810000f00000000000000736574000000000031eb1000030000000000000034eb1000120000000ce9100016000000c41a12000000000022e910005600000078e9100036000000c41a120000000000aee9100051000000ffe9100011000000c41a12000000000010ea100036000000c41a120000000000ac0412000b00000046ea10004d00000093ea100068000000fbea1000360000004b0512000c00000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920604d696e696d756d506572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e202d20604f2831296020284e6f7465207468617420696d706c656d656e746174696f6e73206f6620604f6e54696d657374616d7053657460206d75737420616c736f20626520604f2831296029202d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e20606f6e5f66696e616c697a656029202d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f736574602e204d75737420626520604f283129602e6e6f77436f6d706163743c543a3a4d6f6d656e743e000000000000f8eb1000030000000000000000000000197511000900000000000000000000000000000000000000000000000000000000000000c41a1200fceb100000000000000000000cec10000100000000000000010000000000000014ec1000090000000000000000000000d90712000400000000000000000000000000000000000000000000000000000000000000c41a120020ec1000000000000000000030ec10000100000000000000010000004e6f77002a0000000000000001000000b100000065ec1000240000004469645570646174650000002a00000000000000010000009300000038ec10002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e00000000000000c4ec10000d00000000000000197511000900000000000000c41a1200d4ec10000000000000000000e4ec100004000000000000004d696e696d756d506572696f640000002a0000000000000001000000b200000004ed10005a0000005eed10005a000000b8ed10005900000011ee10001c00000020546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e54696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e7420646174610000b30000001000000004000000b4000000ece7100060000000eb0000000e00000054696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636bece7100060000000a80000000d00000054696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b730000ece7100060000000aa0000000d000000726563656e746c792065786563757465642e666f726b2e4269746669656c647320616e64206865616473206d75737420626520696e636c7564656420657665727920626c6f636b0094ef1000530000004a000000110000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f70617261636861696e732f7372632f696e636c7573696f6e5f696e686572656e742e7273696e636c75736e30696e636c7573696f6e20696e686572656e742064617461206661696c656420746f206465636f6465002a0000000800000004000000b000000094ef100053000000890000000e000000696e636c7573696f6e0000000000000060f0100019000000000000007cf010000100000000000000546f6f4d616e79496e636c7573696f6e496e686572656e747300000084f010003400000020496e636c7573696f6e20696e686572656e742063616c6c6564206d6f7265207468616e206f6e63652070657220626c6f636b2e0000000038f010000900000000000000e4f0100002000000000000000000000014f1100001000000000000000000000045f11000100000000000000055f110001b0000000000000070f11000110000000000000081f110001d0000001cf110002900000020496e636c756465206261636b65642063616e6469646174657320616e64206269746669656c64732e7369676e65645f6269746669656c64735369676e6564417661696c6162696c6974794269746669656c64736261636b65645f63616e646964617465735665633c4261636b656443616e6469646174653c543a3a486173683e3e50617261496e636c7573696f6e496e686572656e7400000000000cf210000800000000000000000000007f2512000200000000000000000000000000000000000000000000000000000000000000c41a120014f21000000000000000000024f21000060000000000000000000000496e636c756465642a00000000000000010000009200000054f210003f000000c41a12000000000093f2100058000000ebf210002f000000c41a1200000000001af310005200000020576865746865722074686520696e636c7573696f6e20696e686572656e742077617320696e636c756465642077697468696e207468697320626c6f636b2e2054686520604f7074696f6e3c28293e60206973206566666563746976656c79206120626f6f6c2c20627574206974206e6576657220686974732073746f7261676520696e2074686520604e6f6e65602076617269616e742064756520746f207468652067756172616e74656573206f66204652414d4527732073746f7261676520415049732e204966207468697320697320604e6f6e65602061742074686520656e64206f662074686520626c6f636b2c2077652070616e696320616e642072656e6465722074686520626c6f636b20696e76616c69642ea81f120067000000700000002e000000a81f1200670000008f00000034000000a81f1200670000006800000034000000a81f120067000000b900000009000000a81f120067000000b200000009000000a81f120067000000d300000011000000a81f120067000000d800000009000000ecf310006a0000002c000000010000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f617574686f726974792d646973636f766572792f7372632f6c69622e7273000098d11100540000009a00000009000000617373657274696f6e206661696c65643a2062697473203c3d20726573756c742e6c656e28290000a0f4100065000000440000000d0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d7363616c652d636f6465632d312e332e352f7372632f6269745f7665632e7273566563746f72206361706163697479206f766572666c6f7700000070f510005a0000004d0000000e000000caf5100013000000f8f510001a00000070f510005a0000004501000009000000caf5100013000000ddf510001b00000070f510005a0000004c010000090000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6269747665632d302e31372e342f7372632f7665632f6170692e72734361706163697479206f766572666c6f773a20206f766572666c6f777320616c6c6f636174696f6e2073697a6520206f766572666c6f7773206d6178696d756d206c656e677468200000000000048ef610000e0000009cf610000b00000038f61000560000006d010000090000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6269747665632d302e31372e342f7372632f7665632e7273566563746f72206c656e67746820206f766572666c6f7773204b657973417574686f726564426c6f636b732f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f696d2d6f6e6c696e652f7372632f6c69622e727348656172746265617441667465720060f7100016000000f01912000200000060f710001600000076f7100012000000696d6f6e6c696e6570616c6c65745f696d5f6f6e6c696e65536b697070696e6720686561727462656174206174202e204e6f7420612076616c696461746f722e97f810001c00000069f810002e00000037f810001a00000051f81000180000001bf810000a00000025f810001200000003f8100018000000edf7100016000000d0f710001d0000004661696c656420746f206665746368206e6574776f726b2073746174654661696c656420746f2061637175697265206c6f636b4661696c656420746f207369676e20686561727462656174417574686f726974792020697320616c7265616479206f6e6c696e6548656172746265617420616c72656164792073656e74206174202e2057616974696e6720666f7220696e636c7573696f6e2e546f6f206561726c7920746f2073656e64206865617274626561742c206e657874206578706563746564206174204661696c656420746f207375626d6974207472616e73616374696f6e00b9f610006000000028020000340000007061726974792f696d2d6f6e6c696e652d6865617274626561742f0000f910000800000008f910002000000028f910000b00000033f91000030000005b696e6465783a205d205265706f7274696e6720696d2d6f6e6c696e6520617420626c6f636b3a20202873657373696f6e3a20293a20000070f9100009000000c41a120000000000c41a1200000000002a0000000400000004000000280000002a000000040000000400000028000000686561727462656174496e76616c69644b65794475706c69636174656448656172746265617400000000000070f910000900000000000000c4f91000020000000000000000000000f4f9100009000000000000000000000070f910000900000000000000a2fb10001900000000000000bbfb10000a00000000000000c5fb10002f000000ac0412000b0000003cfa1000500000008cfa100040000000ccfa100023000000effa10002c0000001bfb10004f0000006afb10001700000081fb1000210000004b0512000c000000202d20436f6d706c65786974793a20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020286865617274626561742e76616c696461746f72735f6c656e29202020616e642045206973206c656e677468206f6620606865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f61646472657373602020202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b602020202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e67746820604560202d20446252656164733a2070616c6c65745f73657373696f6e206056616c696461746f7273602c2070616c6c65745f73657373696f6e206043757272656e74496e646578602c20604b657973602c2020206052656365697665644865617274626561747360202d2044625772697465733a2060526563656976656448656172746265617473604865617274626561743c543a3a426c6f636b4e756d6265723e5f7369676e61747572653c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e61747572650000000019f710000e0000000000000000000000d5f711000e00000000000000000000000000000000000000000000000000000000000000c41a120054fd1000000000000000000064fd100006000000000000000100000000000000a7f6100004000000000000000000000094fd10001300000000000000000000000000000000000000000000000000000000000000c41a1200a8fd10000000000000000000b8fd100001000000000000000100000000000000c0fd1000120000000205050000000000cfc911000c00000000000000d2fd100009000000000000000d9f11000700000000000000c41a1200dcfd10000000000000000000ecfd100002000000000000000000000000000000abf610000e0000000205050000000000cfc911000c00000000000000fcfd10000e00000000000000839a11000300000000000000c41a12000cfe100000000000000000001cfe10000200000000000000010000002a00000000000000010000009800000033ff10004c000000c41a1200000000007fff100044000000c3ff100034000000f7ff100040000000370011004e0000005665633c543a3a417574686f7269747949643e002a000000000000000100000045000000fffe10003400000052656365697665644865617274626561747341757468496e646578002a000000000000000100000093000000a3fe10003c000000dffe100020000000543a3a56616c696461746f72496400002a0000000000000001000000980000002cfe10004500000071fe10003200000020466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e20466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e6465786020746f20606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e2054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e2063757272656e742073657373696f6e2e2041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c642066616c6c20726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e20546865206964656120697320746f206669727374207761697420666f72207468652076616c696461746f727320746f2070726f64756365206120626c6f636b20696e207468652063757272656e742073657373696f6e2c20736f20746861742074686520686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e000000000000000c01110011000000000000002001110001000000000000000000000028011100010000000000000000000000300111000700000000000000c41a120000000000000000000000000038011100010000000000000000000000400111000b000000000000004c0111000100000000000000000000005401110001000000000000004865617274626561745265636569766564000000390211000b000000f801110041000000416c6c476f6f6400c301110035000000536f6d654f66666c696e6500ab011100180000005c0111004f0000002041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265205c5b6f66666c696e655c5d2e5665633c4964656e74696669636174696f6e5475706c653e2041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f72697479496460205c5b617574686f726974795f69645c5d417574686f7269747949640000000079f910000a000000000000007c02110001000000000000000000000083f910001300000000000000840211000100000000000000a2021100190000008c02110016000000204475706c696361746564206865617274626561742e204e6f6e206578697374656e74207075626c6963206b65792e00780511006d0000007300000013000000780511006d0000004800000018000000780511006d000000480000002a000000780511006d0000008a00000018000000780511006d000000b600000019000000780511006d000000c40000001c000000101f120087000000220200001f000000780511006d0000000101000042000000780511006d00000015010000420000004475706c696361746520766f74657220286f72206f7468657220636f727275707420696e707574292e000000780511006d0000003601000021000000780511006d0000005901000015000000780511006d0000005e0100001e000000780511006d000000610000001a000000780511006d000000610000002c000000780511006d000000cb010000180000002a00000000000000010000003f000000780511006d000000cb01000021000000780511006d000000cd01000027000000780511006d000000cd01000030000000780511006d000000ce01000024000000780511006d000000ce01000039000000780511006d000000cf01000024000000780511006d000000cf01000039000000780511006d000000f301000023000000780511006d000000f30100002c000000780511006d000000f501000024000000780511006d000000f501000039000000780511006d0000001802000035000000780511006d0000001902000035000000780511006d0000002202000024000000780511006d0000002202000039000000780511006d0000004402000035000000780511006d0000004502000035000000780511006d0000005a0200002b000000780511006d0000005a02000046000000780511006d0000005b02000028000000780511006d0000005b02000047000000780511006d000000650200002b000000780511006d0000006502000047000000780511006d0000006602000028000000780511006d00000066020000480000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f6e706f732d656c656374696f6e732f7372632f7265647563652e7273000000ef0911004e000000ec000000010000007365745f68726d705f6d61785f6d6573736167655f6e756d5f7065725f63616e6469646174657365745f68726d705f6d61785f706172617468726561645f6f7574626f756e645f6368616e6e656c737365745f68726d705f6d61785f70617261636861696e5f6f7574626f756e645f6368616e6e656c737365745f68726d705f6368616e6e656c5f6d61785f6d6573736167655f73697a657365745f68726d705f6d61785f706172617468726561645f696e626f756e645f6368616e6e656c737365745f68726d705f6d61785f70617261636861696e5f696e626f756e645f6368616e6e656c737365745f68726d705f6368616e6e656c5f6d61785f746f74616c5f73697a657365745f68726d705f6368616e6e656c5f6d61785f63617061636974797365745f68726d705f726563697069656e745f6465706f7369747365745f68726d705f73656e6465725f6465706f7369747365745f68726d705f6f70656e5f726571756573745f74746c7365745f6d61785f7570776172645f6d6573736167655f6e756d5f7065725f63616e6469646174657365745f6d61785f7570776172645f6d6573736167655f73697a657365745f7072656665727265645f646973706174636861626c655f7570776172645f6d657373616765735f737465705f7765696768747365745f6d61785f646f776e776172645f6d6573736167655f73697a657365745f6d61785f7570776172645f71756575655f73697a657365745f6d61785f7570776172645f71756575655f636f756e747365745f72656c61795f7672665f6d6f64756c6f5f73616d706c65737365745f6e65656465645f617070726f76616c737365745f7a65726f74685f64656c61795f7472616e6368655f77696474687365745f6e5f64656c61795f7472616e636865737365745f6e6f5f73686f775f736c6f74737365745f646973707574655f706572696f647365745f6d61785f76616c696461746f72735f7065725f636f72657365745f7363686564756c696e675f6c6f6f6b61686561647365745f7468726561645f617661696c6162696c6974795f706572696f647365745f636861696e5f617661696c6162696c6974795f706572696f647365745f67726f75705f726f746174696f6e5f6672657175656e63797365745f706172617468726561645f726574726965737365745f706172617468726561645f636f7265737365745f6d61785f686561645f646174615f73697a657365745f6d61785f706f765f73697a657365745f6d61785f636f64655f73697a657365745f616363657074616e63655f706572696f647365745f76616c69646174696f6e5f757067726164655f64656c61797365745f76616c69646174696f6e5f757067726164655f6672657175656e63792f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f70617261636861696e732f7372632f636f6e66696775726174696f6e2e7273000000000000005c0a11000f000000000000006c0a11000100000000000000496e76616c69644e657756616c756500740a11003800000020546865206e65772076616c756520666f72206120636f6e66696775726174696f6e20706172616d6574657220697320696e76616c69642e436f6e66696775726174696f6e50656e64696e67436f6e666967416374697665436f6e666967000000000000cf0911002000000000000000041111000100000000000000000000001c111100010000000000000000000000b30911001c0000000000000004111100010000000000000000000000241111000100000000000000000000009e0911001500000000000000041111000100000000000000000000002c1111000100000000000000000000008d0911001100000000000000341111000100000000000000000000004c1111000100000000000000000000007d09110010000000000000003411110001000000000000000000000054111100010000000000000000000000670911001600000000000000341111000100000000000000000000005c11110001000000000000000000000053091100140000000000000034111100010000000000000000000000641111000100000000000000000000003d0911001600000000000000341111000100000000000000000000006c111100010000000000000000000000210911001c000000000000000411110001000000000000000000000074111100010000000000000000000000040911001d00000000000000041111000100000000000000000000007c111100010000000000000000000000e60811001e000000000000000411110001000000000000000000000084111100010000000000000000000000ce0811001800000000000000341111000100000000000000000000008c111100010000000000000000000000b30811001b0000000000000094111100010000000000000000000000ac111100010000000000000000000000a10811001200000000000000b4111100010000000000000000000000cc11110001000000000000000000000090081100110000000000000034111100010000000000000000000000d41111000200000000000000000000007c081100140000000000000034111100010000000000000000000000e41111000100000000000000000000005e0811001e0000000000000034111100010000000000000000000000ec1111000100000000000000000000004a081100140000000000000034111100010000000000000000000000f41111000100000000000000000000002e0811001c0000000000000034111100010000000000000000000000fc111100010000000000000000000000140811001a000000000000003411110001000000000000000000000004121100010000000000000000000000fb0711001900000000000000341111000100000000000000000000000c121100010000000000000000000000de0711001d000000000000003411110001000000000000000000000014121100010000000000000000000000a807110036000000000000001c121100010000000000000000000000341211000100000000000000000000008d0711001b00000000000000341111000100000000000000000000003c12110001000000000000000000000065071100280000000000000034111100010000000000000000000000441211000100000000000000000000004c0711001900000000000000341111000100000000000000000000004c121100010000000000000000000000350711001700000000000000541211000100000000000000000000006c1211000100000000000000000000001b0711001a000000000000005412110001000000000000000000000074121100020000000000000000000000fe0611001d000000000000003411110001000000000000000000000084121100010000000000000000000000df0611001f00000000000000341111000100000000000000000000008c121100010000000000000000000000b806110027000000000000003411110001000000000000000000000094121100010000000000000000000000900611002800000000000000341111000100000000000000000000009c1211000100000000000000000000006f061100210000000000000034111100010000000000000000000000a412110001000000000000000000000047061100280000000000000034111100010000000000000000000000ac1211000100000000000000000000001e061100290000000000000034111100010000000000000000000000b4121100010000000000000000000000f8051100260000000000000034111100010000000000000000000000bc121100010000000000000000000000bb0712000300000000000000d5f711000e000000db1b110026000000b91b110022000000841b11003500000000000000bb0712000300000000000000839a1100030000004c1b1100380000001a1b110032000000f41a110026000000c61a11002e0000008f1a1100370000005a1a1100350000002e1a11002c000000011a11002d000000b21911004f00000000000000bb0712000300000000000000a71911000b0000006b1911003c00000000000000bb0712000300000000000000cfc911000c0000002719110044000000d41811003f0000001319110014000000ac1811002800000088181100240000005018110038000000fb17110055000000af1711004c000000551711005a0000002d1711002800000000000000bb0712000300000000000000c824110006000000de1611004f000000921611004c0000005016110042000000021611004e00000000000000bb0712000300000000000000c9e9110007000000ad151100550000004b15110059000000a4151100090000000315110048000000ae141100550000005b141100530000000714110054000000b71311005000000065131100520000001213110053000000c41211004e000000205365747320746865206d6178696d756d206e756d626572206f66206f7574626f756e642048524d50206d657373616765732063616e2062652073656e7420627920612063616e6469646174652e205365747320746865206d6178696d756d206e756d626572206f66206f7574626f756e642048524d50206368616e6e656c732061207061726174687265616420697320616c6c6f77656420746f206f70656e2e205365747320746865206d6178696d756d206e756d626572206f66206f7574626f756e642048524d50206368616e6e656c7320612070617261636861696e20697320616c6c6f77656420746f206f70656e2e205365747320746865206d6178696d756d2073697a65206f662061206d657373616765207468617420636f756c6420657665722062652070757420696e746f20616e2048524d50206368616e6e656c2e205365747320746865206d6178696d756d206e756d626572206f6620696e626f756e642048524d50206368616e6e656c732061207061726174687265616420697320616c6c6f77656420746f206163636570742e205365747320746865206d6178696d756d206e756d626572206f6620696e626f756e642048524d50206368616e6e656c7320612070617261636861696e20697320616c6c6f77656420746f206163636570742e205365747320746865206d6178696d756d20746f74616c2073697a65206f66206d6573736167657320696e20627974657320616c6c6f77656420696e20616e2048524d50206368616e6e656c206174206f6e63652e205365747320746865206d6178696d756d206e756d626572206f66206d6573736167657320616c6c6f77656420696e20616e2048524d50206368616e6e656c206174206f6e63652e20536574732074686520616d6f756e74206f662066756e647320746861742074686520726563697069656e742073686f756c642070726f7669646520666f7220616363657074696e67206f70656e696e6720616e2048524d50206368616e6e656c2e20536574732074686520616d6f756e74206f662066756e64732074686174207468652073656e6465722073686f756c642070726f7669646520666f72206f70656e696e6720616e2048524d50206368616e6e656c2e205365747320746865206e756d626572206f662073657373696f6e7320616674657220776869636820616e2048524d50206f70656e206368616e6e656c207265717565737420657870697265732e205365747320746865206d6178696d756d206e756d626572206f66206d65737361676573207468617420612063616e6469646174652063616e20636f6e7461696e2e205365747320746865206d6178696d756d2073697a65206f6620616e20757077617264206d65737361676520746861742063616e2062652073656e7420627920612063616e6469646174652e20536574732074686520736f6674206c696d697420666f7220746865207068617365206f66206469737061746368696e6720646973706174636861626c6520757077617264206d657373616765732e205365742074686520637269746963616c20646f776e77617264206d6573736167652073697a652e205365747320746865206d6178696d756d20746f74616c2073697a65206f66206974656d7320746861742063616e2070726573656e7420696e206120757077617264206469737061746368207175657565206174206f6e63652e205365747320746865206d6178696d756d206974656d7320746861742063616e2070726573656e7420696e206120757077617264206469737061746368207175657565206174206f6e63652e2053657420746865206e756d626572206f662073616d706c657320746f20646f206f66207468652052656c61795652464d6f64756c6f20617070726f76616c2061737369676e6d656e7420637269746572696f6e2e2053657420746865206e756d626572206f662076616c696461746f7273206e656564656420746f20617070726f7665206120626c6f636b2e2053657420746865207a65726f74682064656c6179207472616e6368652077696474682e205365742074686520746f74616c206e756d626572206f662064656c6179207472616e636865732e2053657420746865206e6f2073686f7720736c6f74732c20696e206e756d626572206f66206e756d626572206f6620636f6e73656e73757320736c6f74732e204d757374206265206174206c6561737420312e2053657420746865206469737075746520706572696f642c20696e206e756d626572206f662073657373696f6e7320746f206b65657020666f722064697370757465732e2053657420746865206d6178696d756d206e756d626572206f662076616c696461746f727320746f2061737369676e20746f20616e7920636f72652e4f7074696f6e3c7533323e2053657420746865207363686564756c696e67206c6f6f6b61686561642c20696e206578706563746564206e756d626572206f6620626c6f636b73206174207065616b207468726f7567687075742e205365742074686520617661696c6162696c69747920706572696f6420666f722070617261746872656164732e205365742074686520617661696c6162696c69747920706572696f6420666f722070617261636861696e732e20536574207468652070617261636861696e2076616c696461746f722d67726f757020726f746174696f6e206672657175656e63792053657420746865206e756d626572206f66207265747269657320666f72206120706172746963756c617220706172617468726561642e2053657420746865206e756d626572206f66207061726174687265616420657865637574696f6e20636f7265732e2053657420746865206d6178206865616420646174612073697a6520666f722070617261732e2053657420746865206d617820504f5620626c6f636b2073697a6520666f7220696e636f6d696e672075706772616465732e2053657420746865206d61782076616c69646174696f6e20636f64652073697a6520666f7220696e636f6d696e672075706772616465732e205365742074686520616363657074616e636520706572696f6420666f7220616e20696e636c756465642063616e6469646174652e20536574207468652076616c69646174696f6e20757067726164652064656c61792e20536574207468652076616c69646174696f6e2075706772616465206672657175656e63792e00000000000000c60a11000c0000000000000000000000b41c11002100000000000000000000000000000000000000000000000000000000000000c41a1200d81c11000000000000000000e81c110001000000000000000100000000000000b90a11000d0000000000000000000000b41c11002100000000000000000000000000000000000000000000000000000000000000c41a1200f01c11000000000000000000001d1100010000000000000000000000486f7374436f6e66696775726174696f6e3c543a3a426c6f636b4e756d6265723e0000002a0000000000000001000000b50000003d1d1100320000002a000000000000000100000093000000081d1100350000002050656e64696e6720636f6e66696775726174696f6e2028696620616e792920666f7220746865206e6578742073657373696f6e2e205468652061637469766520636f6e66696775726174696f6e20666f72207468652063757272656e742073657373696f6e2e50726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b20716564000000e81d1100650000005f01000011000000891e11003d0000004d1e11002d0000007a1e11000c000000861e110003000000e81d11006500000066010000110000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d7363616c652d636f6465632d312e332e352f7372632f636f6d706163742e7273617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b207165640000e81d1100650000008b0100001100000000000000000000000000000000000000e81d1100650000009201000011000000a828120094000000c40a00002c00000090271200950000005a02000009000000617373657274696f6e206661696c65643a2073656c662e686569676874203e20300000009027120095000000d6000000090000009027120095000000160500005700000090271200950000009302000009000000617373657274696f6e206661696c65643a2073656c662e6c656e2829203c204341504143495459009027120095000000940200000900000090271200950000002705000051000000526571756972655375646f0000000000702011000400000000000000742011000100000000000000000000008c2011000a0000000000000000000000dc2011001500000000000000f4201100020000000000000000000000242111000a00000000000000000000007421110007000000000000007c21110001000000000000000000000094211100090000000000000000000000dc2111000700000000000000e4211100020000000000000000000000142211000b000000000000007375646f000000003c23110004000000000000004023110018000000c62311004e000000c41a120000000000b709120034000000c41a120000000000ac0412000b000000d122110008000000d922110019000000f2221100180000000a231100320000004b0512000c0000007375646f5f756e636865636b65645f776569676874000000000000003c2311000400000000000000402311001800000000000000c12411000700000000000000c824110006000000c62311004e000000142411004c000000602411002d000000c41a120000000000b709120034000000c41a120000000000ac0412000b000000d1221100080000008d241100340000004b0512000c0000007365745f6b65790000000000bb071200030000000000000011db110023000000582311005d000000c41a120000000000b709120034000000c41a120000000000ac0412000b000000d122110008000000d922110019000000b5231100110000004b0512000c0000007375646f5f6173000000000081dd1100030000000000000011db110023000000000000003c231100040000000000000040231100180000006c22110054000000c022110011000000c41a120000000000b709120034000000c41a120000000000ac0412000b000000d122110008000000d922110019000000f2221100180000000a231100320000004b0512000c0000002041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d206120676976656e206163636f756e742e202d204f2831292e202d204c696d697465642073746f726167652072656164732e202d204f6e6520444220777269746520286576656e74292e202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e63616c6c426f783c3c5420617320436f6e6669673e3a3a43616c6c3e2041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e202d204f6e65204442206368616e67652e2041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e20546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865205375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e202d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e5f776569676874576569676874000000000000789a1100030000000000000000000000be0712000c00000000000000000000000000000000000000000000000000000000000000c41a1200282511000000000000000000382511000100000000000000010000002a0000000000000001000000b600000040251100210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e00000000000000e82511000500000000000000f0251100010000000000000000000000f8251100010000000000000000000000002611000a0000000000000004b211000100000000000000000000000c261100010000000000000000000000142611000a00000000000000f0251100010000000000000000000000f825110001000000000000005375646964000000812611000e0000005e261100230000004b65794368616e67656400001e261100400000005375646f4173446f6e6520546865205c5b7375646f65725c5d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d4469737061746368526573756c7400a02611005b00000074000000010000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f7375646f2f7372632f6c69622e72730000000000b41f11000b0000000000000018271100010000000000000020271100200000002053656e646572206d75737420626520746865205375646f206163636f756e742a00000000000000010000003e00000050d211006f0000007d000000270000002a00000000000000010000003f00000050d211006f0000008c0000003400000050d211006f000000a00000002900000050d211006f000000b40000001f00000050d211006f000000c000000030000000436865636b5370656356657273696f6ec82711000e00000054656c65706f72742066726f6d200000512811004f00000033000000010000007375646f5f65737461626c6973685f68726d705f6368616e6e656c7375646f5f71756575655f646f776e776172645f78636d7375646f5f7363686564756c655f706172615f636c65616e75707375646f5f7363686564756c655f706172615f696e697469616c697a652f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f636f6d6d6f6e2f7372632f70617261735f7375646f5f777261707065722e727300000000f42811000f00000000000000042911000100000000000000000000000c291100150000000000000024291100020000000000000000000000ac3a11001100000000000000c03a1100010000000000000050617261446f65736e744578697374009729110039000000457863656564734d61784d65737361676553697a65000000342911005a0000008e29110009000000204120444d50206d65737361676520636f756c646e27742062652073656e742062656361757365206974206578636565647320746865206d6178696d756d2073697a6520616c6c6f77656420666f72206120646f776e77617264206d6573736167652e20546865207370656369666965642070617261636861696e206f722070617261746872656164206973206e6f7420726567697374657265642e00000000342811001d00000000000000802a1100020000000000000000000000b02a11000100000000000000000000001a2811001a00000000000000b82a1100010000000000000000000000d02a1100010000000000000000000000032811001700000000000000d82a1100020000000000000000000000082b1100040000000000000000000000e82711001b00000000000000282b1100040000000000000000000000882b1100040000000000000000000000dc2512000200000000000000e8c811000600000000000000ba2d11000700000000000000c12d11000f000000762d11004400000000000000dc2512000200000000000000e8c8110006000000332d11004300000000000000dc2512000200000000000000e8c811000600000000000000b49011000300000000000000222d1100110000007d2c110027000000c41a120000000000a42c11005a000000fe2c11002400000000000000485011000600000000000000e8c811000600000000000000fa5111000900000000000000e8c811000600000000000000612c11000c00000000000000839a110003000000000000006d2c11001000000000000000839a110003000000a82b110041000000c41a120000000000e92b1100560000003f2c11002200000020466f72636566756c6c792065737461626c6973682061206368616e6e656c2066726f6d207468652073656e64657220746f2074686520726563697069656e742e2054686973206973206571756976616c656e7420746f2073656e64696e6720616e206048726d703a3a68726d705f696e69745f6f70656e5f6368616e6e656c602065787472696e73696320666f6c6c6f776564206279206048726d703a3a68726d705f6163636570745f6f70656e5f6368616e6e656c602e6d61785f63617061636974796d61785f6d6573736167655f73697a652053656e64206120646f776e776172642058434d20746f2074686520676976656e20706172612e2054686520676976656e2070617261636861696e2073686f756c6420657869737420616e6420746865207061796c6f61642073686f756c64206e6f74206578636565642074686520707265636f6e666967757265642073697a652060636f6e6669672e6d61785f646f776e776172645f6d6573736167655f73697a65602e78636d3a3a56657273696f6e656458636d205363686564756c652061207061726120746f20626520636c65616e656420757020617420746865207374617274206f6620746865206e6578742073657373696f6e2e205363686564756c652061207061726120746f20626520696e697469616c697a656420617420746865207374617274206f6620746865206e6578742073657373696f6e2e67656e657369735061726147656e6573697341726773ffffff1f092f1100160000001f2f1100160000007c2e11005a000000b401000009000000d62e11002d000000032f110003000000062f1100030000000000000020000000000000000200000000000000020000000000000003000000010000002000000008000000020000000000000000000000020000000300000002000000200000000000000002000000000000000200000000000000030000007c2e11005a000000bd010000090000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6269747665632d302e31372e342f7372632f706f696e7465722e727342697450747220726567696f6e2063616e6e6f7420777261702074686520616464726573732073706163653a20202b20203d204269745074722063616e6e6f7420616464726573732020626974733b20746865206d6178696d756d20697320436865636b576569676874426164206d616e6461746f7279417574686f72556e636c65730000006c2f110061000000a5000000010000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f617574686f72736869702f7372632f6c69622e7273556e636c65416c7265616479496e636c75646564546f6f48696768556e636c6547656e65736973556e636c65546f6f4d616e79556e636c6573556e636c6573416c7265616479536574496e76616c6964556e636c65506172656e744f6c64556e636c65000000005c3011000a00000000000000683011000100000000000000000000008030110001000000000000007365745f756e636c6573000000000000a13011000a00000000000000ab3011000e00000088301100190000002050726f76696465206120736574206f6620756e636c65732e6e65775f756e636c65735665633c543a3a4865616465723e00000000000000532f1100060000000000000000000000c43111003a00000000000000000000000000000000000000000000000000000000000000c41a120000321100000000000000000010321100010000000000000001000000000000004d2f1100060000000000000000000000be0712000c00000000000000000000000000000000000000000000000000000000000000c41a12001832110000000000000000002832110001000000000000000000000000000000303211000c0000000000000000000000d90712000400000000000000000000000000000000000000000000000000000000000000c41a12003c32110000000000000000004c3211000100000000000000010000005665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e00002a0000000000000001000000b70000009c321100070000002a0000000000000001000000930000008332110019000000446964536574556e636c65732a000000000000000100000093000000543211002f000000205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e20417574686f72206f662063757272656e7420626c6f636b2e20556e636c657300000000001630110012000000000000006833110001000000000000000000000006301100100000000000000070331100010000000000000000000000f92f11000d0000000000000078331100010000000000000000000000ed2f11000c0000000000000080331100010000000000000000000000e12f11000c0000000000000088331100010000000000000000000000cd2f11001400000000000000903311000100000000000000000000002830110008000000000000009833110001000000000000005534110023000000343411002100000023341100110000000d34110016000000ed33110020000000ce3311001f000000a03311002e0000002054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e2054686520756e636c6520697320616c726561647920696e636c756465642e2054686520756e636c6520697320746f6f206869676820696e20636861696e2e2054686520756e636c652069732067656e657369732e20546f6f206d616e7920756e636c65732e20556e636c657320616c72656164792073657420696e2074686520626c6f636b2e2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e2a00000000000000010000003f0000003a3511006b0000006800000010000000b834110082000000370400000f000000b83411008200000037040000220000002f6e69782f73746f72652f306b696a70386d377a677a686b72713771737334366d71793978646d383530372d727573742d312e34392e302d6e696768746c792d323032302d31302d30332d3235633863353364642f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f63656c6c2e72732f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f6e706f732d656c656374696f6e732f7372632f6e6f64652e72730000002a00000000000000010000003e0000003a3511006b000000700000000d0000003a3511006b000000750000000d0000003a3511006b000000890000003b000000f83511006500000034000000120000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f72756e74696d652f7372632f63757276652e7273486973746f726963616c53657373696f6e7300b80000005000000008000000b9000000ba0000006661696c656420746f20696e7365727420696e746f20747269654661696c656420746f2067656e657261746520686973746f726963616c20616e6365737472792d696e636c7573696f6e2070726f6f662e48617368207461626c65206361706163697479206f766572666c6f77000000043711005c0000004f000000280000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6861736862726f776e2d302e382e302f7372632f7261772f6d6f642e72737672662d6e6d2d706b2f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6269747665632d302e31372e342f7372632f736c6963652e7273000000e437110014000000f83711000400000069371100580000003801000009000000496e646578206f7574206f662072616e67653a20203e3d2078381100060000007e381100100000001c3811005c000000a6040000090000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6269747665632d302e31372e342f7372632f736c6963652f6170692e7273496e64657820206f7574206f6620626f756e64733a200000093911004c0000005e000000010000007377617064697361626c655f706172617468726561645f726567697374726174696f6e656e61626c655f706172617468726561645f726567697374726174696f6e646572656769737465725f7061726174687265616472656769737465725f706172617468726561642f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f636f6d6d6f6e2f7372632f70617261735f7265676973747261722e7273000000000000001c3a11001100000000000000303a1100010000000000000000000000383a11000e00000000000000483a1100010000000000000000000000503a11000f00000000000000603a1100010000000000000000000000683a11000c00000000000000743a110001000000000000000000000090c0110010000000000000007c3a1100010000000000000000000000843a11001f00000000000000a43a1100010000000000000000000000ac3a11001100000000000000c03a1100010000000000000050617261416c72656164794578697374730000009c3b11001a000000496e76616c6964436861696e49640000863b110016000000496e76616c69645468726561644964006f3b110017000000436f6465546f6f4c61726765573b1100180000003a3b11001d0000005061726174687265616473526567697374726174696f6e44697361626c656400143b110026000000446566696e6974656c794e6f745761736d000000c83a11004c000000205468652076616c69646174696f6e20636f64652070726f766964656420646f65736e2774207374617274207769746820746865205761736d2066696c65206d6167696320737472696e672e20506172617468726561647320726567697374726174696f6e2069732064697361626c65642e20496e76616c69642070617261206865616420646174612073697a652e20496e76616c6964207061726120636f64652073697a652e20496e76616c696420706172617468726561642049442e20496e76616c69642070617261636861696e2049442e2050617261636861696e20616c7265616479206578697374732e0061736d01000000446562746f7273000000093911004c0000004b0000000100000000000000f63811001300000000000000b43c1100030000000000000000000000fc3c1100040000000000000000000000e13811001500000000000000c41a12000000000000000000000000001c3d1100070000000000000000000000c33811001e00000000000000c41a1200000000000000000000000000c41a1200000000000000000000000000a43811001f00000000000000c41a1200000000000000000000000000c41a1200000000000000000000000000a03811000400000000000000543d11000100000000000000000000006c3d1100080000000000000000000000dc2512000200000000000000e8c811000600000000000000fa4111000c0000000000000088cf11000800000000000000064211000f00000000000000154211000e0000001941110039000000c41a1200000000005241110055000000a741110053000000de3f110032000000c41a1200000000001040110048000000c41a1200000000005840110056000000ae40110051000000ff4011001a00000000000000d93f11000500000000000000e8c8110006000000ac3d110059000000053e1100590000005e3e110057000000c41a120000000000b53e1100580000000d3f1100500000005d3f110056000000b33f110026000000205377617020612070617261636861696e207769746820616e6f746865722070617261636861696e206f7220706172617468726561642e20546865206f726967696e206d7573742062652061206050617261636861696e602e2054686520737761702077696c6c2068617070656e206f6e6c7920696620746865726520697320616c726561647920616e206f70706f7369746520737761702070656e64696e672e204966207468657265206973206e6f742c2074686520737761702077696c6c2062652073746f72656420696e207468652070656e64696e67207377617073206d61702c20726561647920666f722061206c6174657220636f6e6669726d61746f727920737761702e20546865206050617261496460732072656d61696e206d617070656420746f207468652073616d652068656164206461746120616e6420636f646520736f2065787465726e616c20636f64652063616e2072656c79206f6e20605061726149646020746f2062652061206c6f6e672d7465726d206964656e746966696572206f662061206e6f74696f6e616c202270617261636861696e222e20486f77657665722c207468656972207363686564756c696e6720696e666f2028692e652e2077686574686572207468657927726520612070617261746872656164206f722070617261636861696e292c2061756374696f6e20696e666f726d6174696f6e20616e64207468652061756374696f6e206465706f736974206172652073776974636865642e6f7468657220446572656769737465722061207061726174687265616420616e6420726574726569766520746865206465706f7369742e204d7573742062652073656e742066726f6d2061206050617261636861696e60206f726967696e2077686963682069732063757272656e746c79206120706172617468726561642e20456e737572652074686174206265666f72652063616c6c696e672074686973207468617420616e792066756e647320796f752077616e7420656d70746965642066726f6d2074686520706172617468726561642773206163636f756e74206973206d6f766564206f75743b20616674657220746869732069742077696c6c20626520696d706f737369626c6520746f207265747265697665207468656d2028776974686f757420676f7665726e616e636520696e74657276656e74696f6e292e20526567697374657220612070617261746872656164207769746820676976656e20636f646520666f7220696d6d656469617465207573652e204d7573742062652073656e742066726f6d2061205369676e6564206f726967696e20746861742069732061626c6520746f20686176652060506172617468726561644465706f736974602072657365727665642e206067656e657369735f686561646020616e64206076616c69646174696f6e5f636f64656020617265207573656420746f20696e6974616c697a6520746865207061726174687265616427732073746174652e67656e657369735f6865616476616c69646174696f6e5f636f646556616c69646174696f6e436f64650000000000844311001e0000000000000000000000d90712000400000000000000000000000000000000000000000000000000000000000000c41a1200a44311000000000000000000b443110001000000000000000100000000000000bc4311000b0000000105000000000000e8c811000600000000000000e8c811000600000000000000000000000000000000000000c41a1200c84311000000000000000000d843110001000000000000000000000000000000f1ee1100050000000105000000000000e8c811000600000000000000d90712000400000000000000000000000000000000000000c41a1200e04311000000000000000000f043110001000000000000000000000000000000be3b1100070000000105000000000000e8c811000600000000000000be0712000c00000000000000000000000000000000000000c41a1200f84311000000000000000000084411000100000000000000010000005061726174687265616473526567697374726174696f6e456e61626c656400002a0000000000000001000000930000007f4411002800000050656e64696e6753776170002a0000000000000001000000bb00000066441100190000002a0000000000000001000000930000003c4411002a0000002a0000000000000001000000b6000000104411002c0000002055736572732077686f20686176652070616964206120706172617468726561642773206465706f7369742e204d6170206f6620616c6c20726567697374657265642070617261746872656164732f636861696e732e2050656e64696e672073776170206f7065726174696f6e732e20576865746865722070617261746872656164732061726520656e61626c6564206f72206e6f742e00b80000005000000008000000bc000000bd000000be000000bf000000c0000000c1000000c2000000e04411008200000025050000240000002f6e69782f73746f72652f306b696a70386d377a677a686b72713771737334366d71793978646d383530372d727573742d312e34392e302d6e696768746c792d323032302d31302d30332d3235633863353364642f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f7665632e72730000101f120087000000210200001f000000e0441100820000006504000018000000f4f311004a00000016020000150000002a00000000000000010000003f00000050d211006f000000580000001f0000000446110045000000430100000100000068726d705f636c6f73655f6368616e6e656c68726d705f6163636570745f6f70656e5f6368616e6e656c68726d705f696e69745f6f70656e5f6368616e6e656c2f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f70617261636861696e732f7372632f68726d702e727300000000000000f0471100150000000000000008481100010000000000000000000000104811001f0000000000000030481100010000000000000000000000384811001b00000000000000544811000100000000000000000000005c481100230000000000000080481100010000000000000000000000884811001e00000000000000a8481100010000000000000000000000b04811002600000000000000d8481100010000000000000000000000e04811001c00000000000000fc481100010000000000000000000000044911001f00000000000000244911000100000000000000000000002c4911001c0000000000000048491100010000000000000000000000504911001c000000000000006c49110001000000000000000000000074491100210000000000000098491100010000000000000000000000a04911001e00000000000000c0491100010000000000000000000000c84911001c00000000000000e4491100010000000000000000000000ec4911001b00000000000000084a1100010000000000000000000000104a11001f00000000000000304a110001000000000000004f70656e48726d704368616e6e656c546f53656c660000000b4d1100320000004f70656e48726d704368616e6e656c496e76616c6964526563697069656e7400e84c1100230000004f70656e48726d704368616e6e656c5a65726f436170616369747900c84c1100200000004f70656e48726d704368616e6e656c4361706163697479457863656564734c696d697400974c1100310000004f70656e48726d704368616e6e656c5a65726f4d65737361676553697a6500006e4c1100290000004f70656e48726d704368616e6e656c4d65737361676553697a65457863656564734c696d69740000234c11004b0000004f70656e48726d704368616e6e656c416c7265616479457869737473084c11001b0000004f70656e48726d704368616e6e656c416c726561647952657175657374656400d34b1100350000004f70656e48726d704368616e6e656c4c696d697445786365656465648b4b11004800000041636365707448726d704368616e6e656c446f65736e744578697374524b11003900000041636365707448726d704368616e6e656c416c7265616479436f6e6669726d6564000000304b11002200000041636365707448726d704368616e6e656c4c696d697445786365656465640000e64a11004a000000436c6f736548726d704368616e6e656c556e617574686f72697a6564904a110056000000436c6f736548726d704368616e6e656c446f65736e74457869737400684a110028000000436c6f736548726d704368616e6e656c416c7265616479556e64657277617900384a11003000000020546865206368616e6e656c20636c6f7365207265717565737420697320616c7265616479207265717565737465642e20546865206368616e6e656c20746f20626520636c6f73656420646f65736e27742065786973742e20546865206f726967696e20747269657320746f20636c6f73652061206368616e6e656c207768657265206974206973206e656974686572207468652073656e646572206e6f722074686520726563697069656e742e2054686520726563697069656e7420616c72656164792068617320746865206d6178696d756d206e756d626572206f6620616c6c6f77656420696e626f756e64206368616e6e656c732e20546865206368616e6e656c20697320616c726561647920636f6e6669726d65642e20546865206368616e6e656c2066726f6d207468652073656e64657220746f20746865206f726967696e20646f65736e27742065786973742e205468652073656e64657220616c72656164792068617320746865206d6178696d756d206e756d626572206f6620616c6c6f776564206f7574626f756e64206368616e6e656c732e20546865726520697320616c72656164792061207265717565737420746f206f70656e207468652073616d65206368616e6e656c2e20546865206368616e6e656c20616c72656164792065786973747320546865206f70656e20726571756573742072657175657374656420746865206d6573736167652073697a65207468617420657863656564732074686520676c6f62616c206c696d69742e2054686520726571756573746564206d6178696d756d206d6573736167652073697a6520697320302e205468652072657175657374656420636170616369747920657863656564732074686520676c6f62616c206c696d69742e2054686520726571756573746564206361706163697479206973207a65726f2e2054686520726563697069656e74206973206e6f7420612076616c696420706172612e205468652073656e64657220747269656420746f206f70656e2061206368616e6e656c20746f207468656d73656c7665732e0000000446110045000000200100000100000048726d704368616e6e656c436f6e74656e747348726d7057617465726d61726b7348726d704368616e6e656c446967657374730000000000ee4511001600000000000000084e1100030000000000000000000000504e11000a0000000000000000000000d64511001800000000000000a04e1100010000000000000000000000b84e1100030000000000000000000000c44511001200000000000000d04e1100010000000000000000000000e84e1100040000000000000000000000fa5111000900000000000000e8c811000600000000000000035211001500000000000000839a11000300000000000000185211001900000000000000839a1100030000004e50110054000000a25011000c000000c41a120000000000ae501100570000000551110053000000c41a1200000000005851110045000000c41a1200000000009d51110055000000f25111000800000000000000485011000600000000000000e8c8110006000000cd4f11003d000000c41a1200000000000a5011003e00000000000000b64f11000a00000000000000c04f11000d000000084f1100560000005e4f110027000000c41a120000000000854f11003100000020496e69746961746520756e696c61746572616c20636c6f73696e67206f662061206368616e6e656c2e20546865206f726967696e206d75737420626520656974686572207468652073656e646572206f722074686520726563697069656e7420696e20746865206368616e6e656c206265696e6720636c6f7365642e2054686520636c6f737572652063616e206f6e6c792068617070656e206f6e20612073657373696f6e206368616e67652e6368616e6e656c5f696448726d704368616e6e656c49642041636365707420612070656e64696e67206f70656e206368616e6e656c20726571756573742066726f6d2074686520676976656e2073656e6465722e20546865206368616e6e656c2077696c6c206265206f70656e6564206f6e6c79206f6e20746865206e6578742073657373696f6e20626f756e646172792e73656e64657220496e697469617465206f70656e696e672061206368616e6e656c2066726f6d20612070617261636861696e20746f206120676976656e20726563697069656e74207769746820676976656e206368616e6e656c20706172616d65746572732e202d206070726f706f7365645f6d61785f636170616369747960202d2073706563696669657320686f77206d616e79206d657373616765732063616e20626520696e20746865206368616e6e656c206174206f6e63652e202d206070726f706f7365645f6d61785f6d6573736167655f73697a6560202d2073706563696669657320746865206d6178696d756d2073697a65206f6620616e79206f6620746865206d657373616765732e205468657365206e756d62657273206172652061207375626a65637420746f207468652072656c61792d636861696e20636f6e66696775726174696f6e206c696d6974732e20546865206368616e6e656c2063616e206265206f70656e6564206f6e6c792061667465722074686520726563697069656e7420636f6e6669726d7320697420616e64206f6e6c79206f6e20612073657373696f6e206368616e67652e726563697069656e7470726f706f7365645f6d61785f636170616369747970726f706f7365645f6d61785f6d6573736167655f73697a6500000000000000d88911000d000000000000000000000088f711000b00000000000000000000000000000000000000000000000000000000000000c41a1200ac5611000000000000000000f889110002000000000000000100000000000000bc561100170000000105000000000000c04f11000d00000000000000d35611001600000000000000000000000000000000000000c41a1200ec5611000000000000000000fc561100060000000000000000000000000000002c5711001b0000000000000000000000475711001200000000000000000000000000000000000000000000000000000000000000c41a12005c5711000000000000000000c41a1200000000000000000001000000000000006c5711001b0000000105000000000000e8c811000600000000000000839a11000300000000000000000000000000000000000000c41a12008857110000000000000000009857110003000000000000000100000000000000b05711001f0000000105000000000000e8c811000600000000000000839a11000300000000000000000000000000000000000000c41a1200d05711000000000000000000e057110003000000000000000100000000000000f8571100180000000105000000000000c04f11000d000000000000007f2512000200000000000000000000000000000000000000c41a12001058110000000000000000002058110007000000000000000000000000000000585811001c0000000000000000000000475711001200000000000000000000000000000000000000000000000000000000000000c41a1200745811000000000000000000c41a120000000000000000000100000000000000634d11000e0000000105000000000000e8c811000600000000000000d5f711000e00000000000000000000000000000000000000c41a12008458110000000000000000009458110003000000000000000000000000000000ac5811000c0000000105000000000000c04f11000d00000000000000b85811000b00000000000000000000000000000000000000c41a1200c45811000000000000000000d458110003000000000000000000000000000000ec581100180000000105000000000000e8c81100060000000000000088f711000b00000000000000000000000000000000000000c41a1200045911000000000000000000145911000d0000000000000001000000000000007c591100170000000105000000000000e8c81100060000000000000088f711000b00000000000000000000000000000000000000c41a1200945911000000000000000000c41a120000000000000000000100000000000000504d1100130000000105000000000000c04f11000d00000000000000a45911002700000000000000000000000000000000000000c41a1200cc5911000000000000000000dc59110002000000000000000100000000000000714d1100120000000105000000000000e8c811000600000000000000ec5911002200000000000000000000000000000000000000c41a1200105a11000000000000000000205a11000700000000000000010000002a00000000000000010000004000000048726d704f70656e4368616e6e656c526571756573747348726d704f70656e4368616e6e656c526571756573740000002a000000000000000100000093000000a66211002f000000c41a1200000000002a60110030000000c41a120000000000088c11000b0000005a6011004f00000048726d704f70656e4368616e6e656c52657175657374734c6973745665633c48726d704368616e6e656c49643e0000002a0000000000000001000000c300000048726d704f70656e4368616e6e656c52657175657374436f756e74002a000000000000000100000098000000b56111005a0000000f6211005f0000006e6211003800000048726d7041636365707465644368616e6e656c52657175657374436f756e74002a000000000000000100000098000000a96011005c000000056111005b000000606111005500000048726d70436c6f73654368616e6e656c52657175657374732a000000000000000100000092000000865f110064000000ea5f110040000000c41a1200000000002a60110030000000c41a120000000000088c11000b0000005a6011004f00000048726d70436c6f73654368616e6e656c52657175657374734c6973742a0000000000000001000000c30000002a000000000000000100000093000000fa5e11002e000000088c11000b000000285f11005e00000048726d704368616e6e656c7348726d704368616e6e656c002a000000000000000100000093000000705e11002d000000088c11000b0000009d5e11005d00000048726d70496e67726573734368616e6e656c73496e6465782a000000000000000100000040000000435c110056000000995c11000b000000c41a120000000000a45c110048000000ec5c110047000000c41a120000000000df5a11000c000000335d110063000000965d11000f000000a55d110062000000075e11000f000000165e110040000000565e11001a00000048726d704567726573734368616e6e656c73496e646578002a0000000000000001000000400000005665633c496e626f756e6448726d704d6573736167653c543a3a426c6f636b4e756d6265723e3e002a000000000000000100000045000000bf5b11002b000000ea5b1100590000005665633c28543a3a426c6f636b4e756d6265722c205665633c5061726149643e293e00002a000000000000000100000045000000585a11003d000000955a11004a000000df5a11000c000000eb5a11002a000000155b11003a0000004f5b110060000000af5b110010000000204d61696e7461696e732061206d617070696e6720746861742063616e206265207573656420746f20616e7377657220746865207175657374696f6e3a20576861742070617261732073656e742061206d6573736167652061742074686520676976656e20626c6f636b206e756d62657220666f72206120676976656e2072656369657665722e20496e76617269616e74733a202d2054686520696e6e657220605665633c5061726149643e60206973206e6576657220656d7074792e202d2054686520696e6e657220605665633c5061726149643e602063616e6e6f742073746f72652074776f2073616d652060506172614964602e202d20546865206f7574657220766563746f7220697320736f7274656420617363656e64696e6720627920626c6f636b206e756d62657220616e642063616e6e6f742073746f72652074776f206974656d732077697468207468652073616d65202020626c6f636b206e756d6265722e2053746f7261676520666f7220746865206d6573736167657320666f722065616368206368616e6e656c2e20496e76617269616e743a2063616e6e6f74206265206e6f6e2d656d7074792069662074686520636f72726573706f6e64696e67206368616e6e656c20696e206048726d704368616e6e656c736020697320604e6f6e65602e20496e67726573732f65677265737320696e646578657320616c6c6f7720746f2066696e6420616c6c207468652073656e6465727320616e642072656365697665727320676976656e20746865206f70706f7369746520736964652e20492e652e2028612920696e677265737320696e64657820616c6c6f777320746f2066696e6420616c6c207468652073656e6465727320666f72206120676976656e20726563697069656e742e202862292065677265737320696e64657820616c6c6f777320746f2066696e6420616c6c2074686520726563697069656e747320666f72206120676976656e2073656e6465722e202d20666f72206561636820696e677265737320696e64657820656e74727920666f72206050602065616368206974656d2060496020696e2074686520696e6465782073686f756c642070726573656e7420696e206048726d704368616e6e656c73602020206173206028492c205029602e202d20666f7220656163682065677265737320696e64657820656e74727920666f72206050602065616368206974656d2060456020696e2074686520696e6465782073686f756c642070726573656e7420696e206048726d704368616e6e656c73602020206173206028502c204529602e202d2074686572652073686f756c64206265206e6f206f746865722064616e676c696e67206368616e6e656c7320696e206048726d704368616e6e656c73602e202d2074686520766563746f72732061726520736f727465642e2048524d50206368616e6e656c2064617461206173736f6369617465642077697468206561636820706172612e202d2065616368207061727469636970616e7420696e20746865206368616e6e656c2073686f756c642073617469736679206050617261733a3a69735f76616c69645f70617261285029602077697468696e20612073657373696f6e2e205468652048524d502077617465726d61726b206173736f6369617465642077697468206561636820706172612e202d2065616368207061726120605060207573656420686572652061732061206b65792073686f756c642073617469736679206050617261733a3a69735f76616c69645f70617261285029602077697468696e20612073657373696f6e2e204120736574206f662070656e64696e672048524d5020636c6f7365206368616e6e656c20726571756573747320746861742061726520676f696e6720746f20626520636c6f73656420647572696e67207468652073657373696f6e206368616e67652e205573656420666f7220636865636b696e67206966206120676976656e206368616e6e656c206973207265676973746572656420666f7220636c6f737572652e2054686520736574206973206163636f6d70616e6965642062792061206c69737420666f7220697465726174696f6e2e202d20546865726520617265206e6f206368616e6e656c7320746861742065786973747320696e206c69737420627574206e6f7420696e207468652073657420616e6420766963652076657273612e2054686973206d617070696e6720747261636b7320686f77206d616e79206f70656e206368616e6e656c2072657175657374732077657265206163636570746564206279206120676976656e20726563697069656e7420706172612e20496e76617269616e743a206048726d704f70656e4368616e6e656c5265717565737473602073686f756c6420636f6e7461696e207468652073616d65206e756d626572206f66206974656d732060285f2c2058296020776974682060636f6e6669726d6564602073657420746f20747275652c20617320746865206e756d626572206f66206048726d7041636365707465644368616e6e656c52657175657374436f756e746020666f72206058602e2054686973206d617070696e6720747261636b7320686f77206d616e79206f70656e206368616e6e656c2072657175657374732061726520696e6974697461746564206279206120676976656e2073656e64657220706172612e20496e76617269616e743a206048726d704f70656e4368616e6e656c5265717565737473602073686f756c6420636f6e7461696e207468652073616d65206e756d626572206f66206974656d73207468617420686173206028582c205f296020617320746865206e756d626572206f66206048726d704f70656e4368616e6e656c52657175657374436f756e746020666f72206058602e2054686520736574206f662070656e64696e672048524d50206f70656e206368616e6e656c2072657175657374732e0000000446110045000000c80100001e00000063616e277420626520604e6f6e65602064756520746f2074686520696e76617269616e74207468617420746865206c69737420636f6e7461696e73207468652073616d65206974656d7320617320746865207365743b2071656400000446110045000000c90100005a00000009641100140000001d64110030000000c663110043000000c263110003000000c563110001000000946311002e000000c263110003000000c5631100010000007468652048524d502077617465726d61726b206973206168656164207468652072656c61792d706172656e742028203e20297468652048524d502077617465726d61726b206973206e6f7420616476616e6365642072656c617469766520746f20746865206c6173742077617465726d61726b20287468652048524d502077617465726d61726b20282920646f65736e2774206c616e64206f6e206120626c6f636b2077697468206d657373616765732072656365697665644261626545717569766f636174696f6e62616265000000746411005b00000094000000010000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f626162652f7372632f6c69622e72730000000000387a1100130000000000000028651100020000000000000000000000586511000400000000000000000000009c7a11001c000000000000002865110002000000000000000000000078651100080000000000000000000000097f110012000000000000008e6611001c00000000000000457f11000f00000000000000547f110010000000b865110043000000fb651100420000003d66110044000000816611000d000000b865110043000000fb651100420000003d66110044000000816611000d0000002f7e110044000000737e110046000000b97e110046000000ff7e11000a000000205265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c20766572696679207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f6620616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c206265207265706f727465642e45717569766f636174696f6e50726f6f663c543a3a4865616465723e000000000000cc6a11000a00000000000000000000009c9f11000300000000000000000000000000000000000000000000000000000000000000c41a1200d86a11000000000000000000e86a110001000000000000000100000000000000f06a11000b0000000000000000000000fb6a11002700000000000000000000000000000000000000000000000000000000000000c41a1200246b11000000000000000000346b1100010000000000000001000000000000003c6b11000b00000000000000000000009c9f11000300000000000000000000000000000000000000000000000000000000000000c41a1200486b11000000000000000000586b110002000000000000000100000000000000686b11000b00000000000000000000009c9f11000300000000000000000000000000000000000000000000000000000000000000c41a1200746b11000000000000000000846b1100010000000000000001000000000000008c6b11000a0000000000000000000000966b11001600000000000000000000000000000000000000000000000000000000000000c41a1200ac6b11000000000000000000bc6b11000a0000000000000001000000000000000c6c11000f00000000000000000000001b6c11001400000000000000000000000000000000000000000000000000000000000000c41a1200306c11000000000000000000406c110001000000000000000000000000000000486c11000e0000000000000000000000966b11001600000000000000000000000000000000000000000000000000000000000000c41a1200586c11000000000000000000686c110001000000000000000100000000000000706c11000c0000000000000000000000839a11000300000000000000000000000000000000000000000000000000000000000000c41a12007c6c110000000000000000008c6c110009000000000000000100000000000000d46c1100110000000105000000000000839a11000300000000000000e56c11001b00000000000000000000000000000000000000c41a1200006d11000000000000000000106d110001000000000000000100000000000000186d11000b0000000000000000000000236d11000f00000000000000000000000000000000000000000000000000000000000000c41a1200346d11000000000000000000446d110002000000000000000000000000000000546d1100130000000000000000000000236d11000f00000000000000000000000000000000000000000000000000000000000000c41a1200686d11000000000000000000786d110003000000000000000100000000000000906d1100080000000000000000000000d5f711000e00000000000000000000000000000000000000000000000000000000000000c41a1200986d11000000000000000000a86d110005000000000000000100000045706f6368496e64657800002a0000000000000001000000b10000005274110015000000417574686f7269746965735665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e00002a000000000000000100000045000000377411001b00000047656e65736973536c6f74002a0000000000000001000000b1000000d57311003e000000137411002400000043757272656e74536c6f74002a0000000000000001000000b1000000c07311001500000052616e646f6d6e6573737363686e6f72726b656c3a3a52616e646f6d6e6573732a0000000000000001000000c4000000fa7111002e000000c41a120000000000287211000b000000c41a1200000000003372110041000000747211003e000000b272110045000000f7721100450000003c731100410000007d731100430000004e65787445706f6368436f6e6669674e657874436f6e66696744657363726970746f72002a000000000000000100000093000000d4711100260000004e65787452616e646f6d6e65737300002a0000000000000001000000c4000000bd711100170000005365676d656e74496e6465782a000000000000000100000098000000787011001f000000c41a120000000000977011003d000000d4701100400000001471110025000000c41a120000000000397111003b0000007471110042000000b671110007000000556e646572436f6e737472756374696f6e5665633c7363686e6f72726b656c3a3a52616e646f6d6e6573733e2a0000000000000001000000c50000003370110045000000496e697469616c697a65644d6179626552616e646f6d6e65737300002a000000000000000100000093000000ac6f110040000000ec6f110047000000417574686f7256726652616e646f6d6e657373002a000000000000000100000093000000bb6e110057000000126f110054000000666f1100460000004c6174656e6573732a000000000000000100000098000000d06d110036000000c41a120000000000066e1100450000004b6e1100440000008f6e11002c00000020486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e6564207570206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636b20657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e2054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e29207468617420696e636c756465732074686520565246206f75747075742067656e657261746564206174207468697320626c6f636b2e2054686973206669656c642073686f756c6420616c7761797320626520706f70756c6174656420647572696e6720626c6f636b2070726f63657373696e6720756e6c657373207365636f6e6461727920706c61696e20736c6f74732061726520656e61626c65642028776869636820646f6e277420636f6e7461696e206120565246206f7574707574292e2054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d6560206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e2054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e2057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f2060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e20576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572792065706f63682e204e6578742065706f63682072616e646f6d6e6573732e204e6578742065706f636820636f6e66696775726174696f6e2c206966206368616e6765642e205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e20232053656375726974792054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e792063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d626572732074686174207468697320286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e20626520757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e2043757272656e7420736c6f74206e756d6265722e2054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e2054686973206973203020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2043757272656e742065706f636820617574686f7269746965732e2043757272656e742065706f636820696e6465782e0000000000d87411000d000000000000009c9f11000300000000000000c41a1200e87411000000000000000000f8741100020000000000000000000000087511001100000000000000197511000900000000000000c41a120024751100000000000000000034751100050000000000000045706f63684475726174696f6e0000002a0000000000000001000000c60000008c76110043000000cf7611003f0000004578706563746564426c6f636b54696d65543a3a4d6f6d656e7400002a0000000000000001000000c70000005c751100410000009d75110044000000e1751100410000002276110042000000647611002800000020546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e6720626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f7574207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f74206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e20546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746f2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e65706f636820696e64696365732077696c6c206e6576657220726561636820325e3634206265666f726520746865206465617468206f662074686520756e6976657273653b2071656400746411005b000000c40100000e000000746411005b000000cc0100000e00000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c000000746411005b000000e7000000010000004772616e64706146696e616c69747950656e64696e674368616e67653a6772616e6470615f617574686f72697469657353746174654772616e64706145717569766f636174696f6e72656a656374696e6720756e7369676e6564207265706f72742065717569766f636174696f6e207472616e73616374696f6e2062656361757365206974206973206e6f74206c6f63616c2f696e2d626c6f636b2e61666700e47811005e000000be000000010000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f6772616e6470612f7372632f6c69622e7273496e76616c696445717569766f636174696f6e50726f6f66496e76616c69644b65794f776e65727368697050726f6f66546f6f536f6f6e4368616e676550656e64696e67526573756d654661696c656450617573654661696c65644475706c69636174654f6666656e63655265706f72740000000000387a110013000000000000004c7a11000200000000000000000000007c7a11000400000000000000000000009c7a11001c000000000000004c7a1100020000000000000000000000b87a1100090000000000000000000000007b11000c000000000000000c7b11000200000000000000000000003c7b110007000000000000007265706f72745f65717569766f636174696f6e0000000000097f110012000000000000001b7f11002a00000000000000457f11000f00000000000000547f1100100000005d7d110043000000a07d11003e000000de7d11003f0000001d7e1100120000007265706f72745f65717569766f636174696f6e5f756e7369676e65645d7d110043000000a07d11003e000000de7d11003f0000001d7e110012000000c41a1200000000002f7e110044000000737e110046000000b97e110046000000ff7e11000a0000006e6f74655f7374616c6c6564000000003d7d11000500000000000000d5f711000e00000000000000427d11001b00000000000000d5f711000e000000747b110047000000bb7b11004a000000057c1100480000004d7c110045000000927c11004a000000dc7c11004a000000267d110017000000204e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c6974792067616467657420686173207374616c6c65642e20546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e67206f6620746865206e6578742073657373696f6e2c20746f20626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e205468652064656c61792073686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d6520746861742074686520626c6f636b207369676e616c6c696e672074686520666f72636564206368616e67652077696c6c206e6f742062652072652d6f726765642028652e672e203130303020626c6f636b73292e20546865204752414e44504120766f746572732077696c6c20737461727420746865206e657720617574686f7269747920736574207573696e672074686520676976656e2066696e616c697a656420626c6f636b20617320626173652e204f6e6c792063616c6c61626c6520627920726f6f742e64656c6179626573745f66696e616c697a65645f626c6f636b5f6e756d626572205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c20766572696679207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f6620616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c206265207265706f727465642e20546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c7920626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c20617320737563682069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e207265706f727465722e65717569766f636174696f6e5f70726f6f6645717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e6b65795f6f776e65725f70726f6f66543a3a4b65794f776e657250726f6f660000000064781100050000000000000000000000748111001b00000000000000000000000000000000000000000000000000000000000000c41a1200908111000000000000000000a081110001000000000000000100000000000000437811000d0000000000000000000000a88111002300000000000000000000000000000000000000000000000000000000000000c41a1200cc8111000000000000000000dc81110001000000000000000000000000000000e48111000a0000000000000000000000d5f711000e00000000000000000000000000000000000000000000000000000000000000c41a1200f081110000000000000000000082110001000000000000000000000000000000088211000700000000000000000000000f8211002000000000000000000000000000000000000000000000000000000000000000c41a12003082110000000000000000004082110001000000000000000000000000000000488211000c0000000000000000000000548211000500000000000000000000000000000000000000000000000000000000000000c41a12005c82110000000000000000006c821100020000000000000001000000000000007c8211000c0000000105000000000000548211000500000000000000cfc911000c00000000000000000000000000000000000000c41a12008882110000000000000000009882110004000000000000000000000053746f72656453746174653c543a3a426c6f636b4e756d6265723e002a0000000000000001000000c8000000628411002400000053746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e002a00000000000000010000009300000031841100310000004e657874466f7263656400002a000000000000000100000093000000028411002f0000005374616c6c656428543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d62657229002a000000000000000100000093000000de8311002400000043757272656e74536574496453657449640000002a0000000000000001000000b10000005683110057000000ad83110031000000536574496453657373696f6e2a000000000000000100000093000000b8821100560000000e8311001a000000c41a120000000000288311002e0000002041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f7220776869636820697473206d656d62657273207765726520726573706f6e7369626c652e2054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e20546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c69746965732920696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e20607472756560206966207765206172652063757272656e746c79207374616c6c65642e206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e2050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e205374617465206f66207468652063757272656e7420617574686f72697479207365742e0000e47811005e000000f30000000100000000000000927911000b000000000000005c851100020000000000000000000000867911000c000000000000006c851100020000000000000000000000797911000d000000000000007c851100010000000000000000000000727911000700000000000000848511000100000000000000000000005a79110018000000000000008c851100010000000000000000000000427911001800000000000000948511000100000000000000000000009d79110016000000000000009c85110001000000000000005d871100420000009f8711002a000000ef861100450000003487110029000000b48611003b0000008486110030000000378611004d000000ea8511004d000000a485110046000000204120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e20416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e2041206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e2043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e20417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e2774207061757365642028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e20417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e000000dc87110044000000bd000000010000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f70617261636861696e732f7372632f756d702e727300000000d88911000d000000000000000000000088f711000b00000000000000000000000000000000000000000000000000000000000000c41a1200e88911000000000000000000f889110002000000000000000100000000000000088a1100130000000105000000000000e8c8110006000000000000001b8a11001700000000000000000000000000000000000000c41a1200348a11000000000000000000448a110006000000000000000100000000000000748a1100160000000105000000000000e8c8110006000000000000008a8a11000a00000000000000000000000000000000000000c41a1200948a11000000000000000000a48a11000b000000000000000100000000000000fc8a11000d000000000000000000000088f711000b00000000000000000000000000000000000000000000000000000000000000c41a12000c8b110000000000000000001c8b110005000000000000000100000000000000448b11001a0000000000000000000000e8c811000600000000000000000000000000000000000000000000000000000000000000c41a1200608b11000000000000000000708b11000500000000000000000000004f7574676f696e6750617261730000002a000000000000000100000040000000409011003b0000007b9011003100000052656c6179446973706174636851756575657356656344657175653c5570776172644d6573736167653e00002a0000000000000001000000c90000003f8f11005c000000c41a1200000000009b8f11005e000000f98f11001d000000c41a120000000000169011002a00000052656c61794469737061746368517565756553697a65287533322c20753332292a0000000000000001000000ca0000001f8d110051000000c41a120000000000708d11003c000000ac8d110038000000c41a120000000000e48d11005d000000418e11005e0000009f8e11004f000000c41a120000000000088c11000b000000ee8e1100510000004e6565647344697370617463680000002a000000000000000100000040000000568c110046000000c41a120000000000088c11000b0000009c8c11004d000000e98c1100360000004e6578744469737061746368526f756e6453746172745769746800002a0000000000000001000000bb000000988b11005f000000f78b110011000000c41a120000000000088c11000b000000138c1100430000002054686973206973207468652070617261207468617420676574732077696c6c20676574206469737061746368656420666972737420647572696e6720746865206e6578742075707761726420646973706174636861626c6520717565756520657865637574696f6e20726f756e642e20496e76617269616e743a202d2049662060536f6d65287061726129602c207468656e20607061726160206d7573742062652070726573656e7420696e20604e656564734469737061746368602e20546865206f726465726564206c697374206f6620605061726149646073207468617420686176652061206052656c6179446973706174636851756575656020656e7472792e202d2054686520736574206f66206974656d732066726f6d207468697320766563746f722073686f756c642062652065786163746c792074686520736574206f6620746865206b65797320696e2020206052656c617944697370617463685175657565736020616e64206052656c61794469737061746368517565756553697a65602e2053697a65206f6620746865206469737061746368207175657565732e204361636865732073697a6573206f66207468652071756575657320696e206052656c617944697370617463685175657565602e204669727374206974656d20696e20746865207475706c652069732074686520636f756e74206f66206d6573736167657320616e64207365636f6e642069732074686520746f74616c206c656e6774682028696e20627974657329206f6620746865206d657373616765207061796c6f6164732e204e6f74652074686174207468697320697320616e20617578696c617279206d617070696e673a206974277320706f737369626c6520746f2074656c6c2074686520627974652073697a6520616e6420746865206e756d626572206f66206d65737361676573206f6e6c79206c6f6f6b696e67206174206052656c61794469737061746368517565756573602e2054686973206d617070696e6720697320736570617261746520746f2061766f69642074686520636f7374206f66206c6f6164696e67207468652077686f6c65206d657373616765207175657565206966206f6e6c792074686520746f74616c2073697a6520616e6420636f756e74206172652072657175697265642e202d2054686520736574206f66206b6579732073686f756c642065786163746c79206d617463682074686520736574206f66206b657973206f66206052656c61794469737061746368517565756573602e20546865206d657373616765732077616974696e6720746f2062652068616e646c6564206279207468652072656c61792d636861696e206f726967696e6174696e672066726f6d2061206365727461696e2070617261636861696e2e204e6f7465207468617420736f6d6520757077617264206d65737361676573206d696768742068617665206265656e20616c72656164792070726f6365737365642062792074686520696e636c7573696f6e206c6f6769632e20452e672e206368616e6e656c206d616e6167656d656e74206d657373616765732e20546865206d65737361676573206172652070726f63657373656420696e204649464f206f726465722e20506172617320746861742061726520746f20626520636c65616e65642075702061742074686520656e64206f66207468652073657373696f6e2e2054686520656e74726965732061726520736f7274656420617363656e64696e672062792074686520706172612069642ed79011003300000078636d706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a756d704661696c656420746f206465636f64652076657273696f6e65642058434d2066726f6d20757077617264206d6573736167652e56524648617368565246526573756c747672662d696e7672662d6f757400389111005d000000e3010000010000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f73797374656d2f7372632f6c69622e72734e6f6e44656661756c74436f6d706f736974654661696c6564546f4578747261637452756e74696d6556657273696f6e5370656356657273696f6e4e65656473546f496e637265617365496e76616c6964537065634e616d654e6f6e5a65726f526566436f756e74426c6f636b486173683a65787472696e7369635f696e6465784e756d626572446967657374506172656e744861736845787472696e73696373526f6f744576656e74734576656e74546f706963730000000000049411000a0000000000000010941100010000000000000000000000289411000100000000000000000000003094110006000000000000003894110001000000000000000000000050941100070000000000000000000000889411000e0000000000000098941100010000000000000000000000b0941100080000000000000000000000f09411000800000000000000f8941100010000000000000000000000109511000a0000000000000000000000609511001700000000000000f894110001000000000000000000000078951100080000000000000000000000b89511001700000000000000d0951100010000000000000000000000e89511000a0000000000000000000000389611000b00000000000000449611000100000000000000000000005c9611000800000000000000000000009c9611000c00000000000000a8961100010000000000000000000000c0961100080000000000000000000000009711000b000000000000000c9711000200000000000000000000003c9711000b0000000000000000000000949711000700000000000000c41a12000000000000000000000000009c9711000a0000000000000066696c6c5f626c6f636b0000000000004fa01100060000000000000055a01100070000000da011004200000072656d61726b00000000000006a0110007000000000000000d9f1100070000009f9f11001b000000c41a120000000000ac0412000b0000006998110009000000ba9f110038000000f29f1100140000004b0512000c0000007365745f686561705f7061676573000000000000979f110005000000000000009c9f110003000000149f11003f000000c41a120000000000ac0412000b0000006998110009000000539f110013000000669f1100190000007f9f1100180000004b0512000c0000007365745f636f646500000000099f110004000000000000000d9f110007000000c19d11001a000000c41a120000000000ac0412000b000000db9d11004d000000379d110022000000289e11005e000000599d11000b000000869e11005f000000e59e1100240000004b0512000c0000007365745f636f64655f776974686f75745f636865636b7300cc9c110047000000c41a120000000000ac0412000b000000139d110024000000379d110022000000599d11000b000000649d11005d0000004b0512000c0000007365745f6368616e6765735f747269655f636f6e6669670000000000999c11001300000000000000ac9c110020000000cc9b110028000000c41a120000000000ac0412000b0000006998110009000000f49b11002c000000209c110036000000569c110019000000310712000d0000006f9c11002a0000004b0512000c0000007365745f73746f726167650000000000ba9b11000500000000000000bf9b11000d0000003e9b11001b000000c41a120000000000ac0412000b000000599b1100250000007e9b11001f0000009d9b11001d000000189b11001a0000004b0512000c0000006b696c6c5f73746f7261676500000000329b11000400000000000000369b110008000000869a11001e000000c41a120000000000ac0412000b000000a49a11003f000000e39a110019000000fc9a11001c000000189b11001a0000004b0512000c0000006b696c6c5f7072656669780000000000729a11000600000000000000789a110003000000000000007b9a11000800000000000000839a1100030000000199110045000000c41a120000000000469911004f0000009599110050000000c41a120000000000ac0412000b000000e5991100370000001c9a110019000000359a11001d000000529a1100200000004b0512000c0000007375696369646500ec971100590000004598110024000000c41a120000000000ac0412000b0000006998110009000000729811001f0000009198110015000000a698110017000000bd981100440000004b0512000c000000204b696c6c207468652073656e64696e67206163636f756e742c20617373756d696e6720746865726520617265206e6f207265666572656e636573206f75747374616e64696e6720616e642074686520636f6d706f73697465206461746120697320657175616c20746f206974732064656661756c742076616c75652e202d20604f28312960202d20312073746f72616765207265616420616e642064656c6574696f6e2e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2042617365205765696768743a20382e36323620c2b573204e6f2044422052656164206f72205772697465206f7065726174696f6e7320626563617573652063616c6c657220697320616c726561647920696e206f7665726c6179204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e202a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e6465722074686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e202d20604f285029602077686572652060506020616d6f756e74206f66206b657973207769746820707265666978206070726566697860202d206050602073746f726167652064656c6574696f6e732e202d2042617365205765696768743a20302e383334202a205020c2b573202d205772697465733a204e756d626572206f66207375626b657973202b20317072656669784b65795f7375626b657973753332204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e202d20604f28494b296020776865726520604960206c656e677468206f6620606b6579736020616e6420604b60206c656e677468206f66206f6e65206b6579202d206049602073746f726167652064656c6574696f6e732e202d2042617365205765696768743a202e333738202a206920c2b573202d205772697465733a204e756d626572206f66206974656d736b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e202d20604f2849296020776865726520604960206c656e677468206f6620606974656d7360202d206049602073746f72616765207772697465732028604f28312960292e202d2042617365205765696768743a20302e353638202a206920c2b5736974656d735665633c4b657956616c75653e2053657420746865206e6577206368616e676573207472696520636f6e66696775726174696f6e2e202d20312073746f72616765207772697465206f722064656c6574652028636f64656320604f28312960292e202d20312063616c6c20746f20606465706f7369745f6c6f67603a20557365732060617070656e6460204150492c20736f204f283129202d2042617365205765696768743a20372e32313820c2b57320202020202d205772697465733a204368616e67657320547269652c2053797374656d204469676573746368616e6765735f747269655f636f6e6669674f7074696f6e3c4368616e67657354726965436f6e66696775726174696f6e3e2053657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e202d20604f2843296020776865726520604360206c656e677468206f662060636f646560202d20312073746f726167652077726974652028636f64656320604f28432960292e202d2031206576656e742e2054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e2053657420746865206e65772072756e74696d6520636f64652e202d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f646560202d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e6020776869636820697320657870656e73697665292e2054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c792074686973206973207665727920657870656e736976652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e636f64655665633c75383e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e202d20312073746f726167652077726974652e202d2042617365205765696768743a20312e34303520c2b573202d203120777269746520746f20484541505f50414745537061676573753634204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e202d2042617365205765696768743a20302e36363520c2b5732c20696e646570656e64656e74206f662072656d61726b206c656e6774682e202d204e6f204442206f7065726174696f6e732e5f72656d61726b204120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e5f726174696f50657262696c6c000000002ce41100070000000102000000000000be0712000c00000000000000dca511002500000000000000000000000000000000000000c41a120004a61100000000000000000014a61100010000000000000001000000000000001ca611000e0000000000000000000000839a11000300000000000000000000000000000000000000000000000000000000000000c41a12002ca6110000000000000000003ca611000100000000000000000000000000000044a611000b00000000000000000000004fa611000e00000000000000000000000000000000000000000000000000000000000000c41a120060a61100000000000000000070a611000100000000000000010000000000000078a61100100000000000000000000000839a11000300000000000000000000000000000000000000000000000000000000000000c41a120088a61100000000000000000098a6110001000000000000000000000000000000fd911100090000000105000000000000d5f711000e00000000000000a0a611000700000000000000000000000000000000000000c41a1200a8a611000000000000000000b8a6110001000000000000000100000000000000c0a611000d0000000105000000000000839a110003000000000000000d9f11000700000000000000000000000000000000000000c41a1200d0a611000000000000000000e0a611000100000000000000010000000000000016921100060000000000000000000000d5f711000e00000000000000000000000000000000000000000000000000000000000000c41a1200e8a611000000000000000000f8a6110001000000000000000100000000000000229211000a0000000000000000000000a0a611000700000000000000000000000000000000000000000000000000000000000000c41a120000a71100000000000000000010a71100010000000000000001000000000000002c9211000e0000000000000000000000a0a611000700000000000000000000000000000000000000000000000000000000000000c41a120018a71100000000000000000028a71100010000000000000001000000000000001c92110006000000000000000000000030a711000b00000000000000000000000000000000000000000000000000000000000000c41a12003ca7110000000000000000004ca71100010000000000000001000000000000003a92110006000000000000000000000054a711002300000000000000000000000000000000000000000000000000000000000000c41a120078a71100000000000000000088a711000100000000000000010000000000000090a711000a00000000000000000000009aa711000a00000000000000000000000000000000000000000000000000000000000000c41a1200a4a711000000000000000000b4a7110001000000000000000100000000000000409211000b0000000102000000000000a0a611000700000000000000bca711002100000000000000000000000000000000000000c41a1200e0a711000000000000000000f0a711000a00000000000000010000000000000040a8110012000000000000000000000052a811001600000000000000000000000000000000000000000000000000000000000000c41a120068a81100000000000000000078a811000100000000000000000000000000000080a81100150000000000000000000000d90712000400000000000000000000000000000000000000000000000000000000000000c41a120098a811000000000000000000a8a8110001000000000000000100000000000000b0a811000e0000000000000000000000bea811000500000000000000000000000000000000000000000000000000000000000000c41a1200c4a811000000000000000000d4a811000100000000000000000000004163636f756e74496e666f3c543a3a496e6465782c20543a3a4163636f756e74446174613e0000002a0000000000000001000000cb00000022ae11003a00000045787472696e736963436f756e7400002a000000000000000100000093000000f4ad11002e000000426c6f636b576569676874436f6e73756d65645765696768740000002a0000000000000001000000cc000000d2ad110022000000416c6c45787472696e736963734c656e2a00000000000000010000009300000082ad110050000000543a3a48617368002a0000000000000001000000420000005cad11002600000045787472696e736963446174610000002a0000000000000001000000460000000dad11004f0000002a000000000000000100000098000000cbac1100420000002a000000000000000100000042000000afac11001c0000002a0000000000000001000000420000006aac1100450000004469676573744f663c543e002a0000000000000001000000cd0000002eac11003c0000005665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e002a00000000000000010000004500000006ac1100280000004576656e74436f756e744576656e74496e6465782a000000000000000100000098000000d8ab11002e0000005665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e0000002a0000000000000001000000a1000000a6a9110049000000efa9110025000000c41a12000000000014aa11005400000068aa110051000000b9aa110039000000c41a120000000000f2aa11005300000045ab11005300000098ab1100400000004c61737452756e74696d65557067726164654c61737452756e74696d6555706772616465496e666f2a00000000000000010000009300000051a91100550000005570677261646564546f553332526566436f756e740000002a000000000000000100000093000000fea8110053000000457865637574696f6e50686173655068617365002a000000000000000100000093000000dca81100220000002054686520657865637574696f6e207068617365206f662074686520626c6f636b2e2054727565206966207765206861766520757067726164656420736f207468617420607479706520526566436f756e74602069732060753332602e2046616c7365202864656661756c7429206966206e6f742e2053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e205468652063757272656e742077656967687420666f722074686520626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e0000000004af11000e00000000000000d5f711000e00000000000000c41a120014af1100000000000000000024af11000100000000000000000000002caf1100080000000000000034af11000f00000000000000c41a120044af1100000000000000000054af11000100000000000000000000005caf11000c0000000000000068af11001400000000000000c41a12007caf110000000000000000008caf11000100000000000000426c6f636b48617368436f756e7400002a0000000000000001000000ce0000002eb0110036000000446257656967687452756e74696d654462576569676874002a0000000000000001000000cf000000ecaf110042000000426c6f636b576569676874736c696d6974733a3a426c6f636b576569676874732a0000000000000001000000d000000094af110058000000205468652077656967687420636f6e66696775726174696f6e20286c696d697473202620626173652076616c7565732920666f72206561636820636c617373206f662065787472696e7369637320616e6420626c6f636b2e2054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e20546865206d6178696d756d206e756d626572206f6620626c6f636b7320746f20616c6c6f7720696e206d6f7274616c20657261732e4e6f646520697320636f6e6669677572656420746f20757365207468652073616d6520686173683b207165642a00000000000000010000000e000000389111005d0000001b0400000e000000389111005d0000002304000016000000000000009cb111001000000000000000acb11100010000000000000000000000b4b11100010000000000000000000000bcb111000f00000000000000ccb11100020000000000000000000000dcb11100010000000000000000000000e4b111000b00000000000000c41a1200000000000000000000000000f0b11100010000000000000000000000f8b111000a0000000000000004b211000100000000000000000000000cb2110001000000000000000000000014b211000d0000000000000004b2110001000000000000000000000024b21100010000000000000045787472696e73696353756363657373a0b211000c000000acb211002e00000045787472696e7369634661696c656400781c12000d000000a0b211000c0000007bb2110025000000436f6465557064617465640066b21100150000004e65774163636f756e740000fa0d12000900000047b211001f0000004b696c6c65644163636f756e740000002cb211001b00000020416e205c5b6163636f756e745c5d20776173207265617065642e2041206e6577205c5b6163636f756e745c5d2077617320637265617465642e20603a636f6465602077617320757064617465642e20416e2065787472696e736963206661696c65642e205c5b6572726f722c20696e666f5c5d4469737061746368496e666f20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e205c5b696e666f5c5d0000389111005d000000f70100000100000000000000df9111000f0000000000000078b31100020000000000000000000000c59111001a0000000000000088b31100020000000000000000000000a89111001d0000000000000098b31100030000000000000000000000959111001300000000000000b0b31100010000000000000000000000ee9111000f00000000000000b8b31100010000000000000033b51100450000001eb5110015000000cdb41100510000001eb51100150000004eb411003c000000c41a1200000000008ab41100430000000eb4110040000000c0b311004e0000002054686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e20537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e204661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e204569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e205468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d6520616e6420746865206e65772072756e74696d652e20546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d65496e76616c6964207472616e736c6174653a206661696c20746f206465636f6465206f6c642076616c7565496e76616c6964207472616e736c6174653a206661696c20746f206465636f6465206b65796672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61702f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f737570706f72742f7372632f73746f726167652f67656e657261746f722f6d61702e72733a6865617070616765733a636f64653a6368616e6765735f747269655741524e494e473a205265666572656e636564206163636f756e742064656c657465642e20546869732069732070726f6261626c792061206275672e73797374656d6672616d655f73797374656d3a5f5f50414c4c45545f56455253494f4e5f5f3a2a00000004000000040000000a0000002a000000040000000400000019000000436865636b4e6f6e6365000018b711004c00000072000000010000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f70617261636861696e732f7372632f696e697469616c697a65722e72737061726173427566666572656453657373696f6e4368616e676573000000000030b811000e00000000000000000000007f2512000200000000000000000000000000000000000000000000000000000000000000c41a120040b81100000000000000000050b811000800000000000000000000000000000069b7110016000000000000000000000090b811002a00000000000000000000000000000000000000000000000000000000000000c41a1200bcb811000000000000000000ccb81100070000000000000001000000486173496e697469616c697a656400002a00000000000000010000009200000057ba110048000000c41a1200000000009fba110047000000e6ba11005a000000c41a12000000000040bb11005d0000009dbb11005e000000fbbb1100200000005665633c427566666572656453657373696f6e4368616e67653c543a3a426c6f636b4e756d6265723e3e00002a00000000000000010000004500000004b9110056000000c41a1200000000005ab9110059000000b3b911001a000000c41a120000000000cdb911005a00000027ba1100300000002042756666657265642073657373696f6e206368616e67657320616c6f6e6720776974682074686520626c6f636b206e756d62657220617420776869636820746865792073686f756c64206265206170706c6965642e205479706963616c6c7920746869732077696c6c20626520656d707479206f72206f6e6520656c656d656e74206c6f6e672c2077697468207468652073696e676c6520656c656d656e7420686176696e67206120626c6f636b206e756d626572206f6620746865206e65787420626c6f636b2e20486f776576657220746869732069732061206056656360207265676172646c65737320746f2068616e646c6520766172696f757320656467652063617365732074686174206d6179206f636375722061742072756e74696d65207570677261646520626f756e646172696573206f7220696620676f7665726e616e636520696e74657276656e65732e2057686574686572207468652070617261636861696e73206d6f64756c65732068617665206265656e20696e697469616c697a65642077697468696e207468697320626c6f636b2e2053656d616e746963616c6c79206120626f6f6c2c2062757420746869732067756172616e746565732069742073686f756c64206e65766572206869742074686520747269652c206173207468697320697320636c656172656420696e20606f6e5f66696e616c697a656020616e64204672616d65206f7074696d697a657320604e6f6e65602076616c75657320746f20626520656d7074792076616c7565732e204173206120626f6f6c2c20607365742866616c7365296020616e64206072656d6f766528296020626f7468206c65616420746f20746865206e6578742060676574282960206265696e672066616c73652c20627574206f6e65206f66207468656d2077726974657320746f20746865207472696520616e64206f6e6520646f6573206e6f742e205468697320636f6e667573696f6e206d616b657320604f7074696f6e3c28293e60206d6f7265207375697461626c6520666f72207468652073656d616e74696373206f662074686973207661726961626c652e4d616a6f722063616e6e6f74206661696c20746f2073706c697420746865207461696c20656c656d656e74000058bc110059000000fb000000160000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6269747665632d302e31372e342f7372632f646f6d61696e2e7273000000c4bc11004a000000d0000000010000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f70617261636861696e732f7372632f696e636c7573696f6e2e727300000000000094bf11001100000000000000a8bf1100010000000000000000000000b0bf11001c00000000000000ccbf1100010000000000000000000000d4bf11001900000000000000f0bf1100010000000000000000000000f8bf1100180000000000000010c0110001000000000000000000000018c0110014000000000000002cc0110001000000000000000000000034c01100200000000000000054c011000100000000000000000000005cc011000d000000000000006cc0110001000000000000000000000074c01100130000000000000088c0110001000000000000000000000090c011001000000000000000a0c01100010000000000000000000000a8c011001400000000000000bcc01100010000000000000000000000c4c011000f00000000000000d4c01100010000000000000000000000dcc011001b00000000000000f8c0110001000000000000000000000000c11100170000000000000018c1110001000000000000000000000020c11100110000000000000034c111000100000000000000000000003cc11100130000000000000050c1110001000000000000000000000058c111000e0000000000000068c1110001000000000000000000000070c11100110000000000000084c111000100000000000000000000008cc111001a00000000000000a8c11100010000000000000000000000b0c111000d00000000000000c0c11100010000000000000000000000c8c111002000000000000000e8c11100010000000000000000000000f0c11100150000000000000008c2110001000000000000000000000010c21100180000000000000028c2110001000000000000000000000030c21100130000000000000044c21100010000000000000057726f6e674269746669656c6453697a650000006bc611002b0000004269746669656c644475706c69636174654f72556e6f72646572656417c611005400000056616c696461746f72496e6465784f75744f66426f756e6473000000f8c511001f000000496e76616c69644269746669656c645369676e6174757265e6c5110012000000556e7363686564756c656443616e646964617465bac511002c00000043616e6469646174655363686564756c65644265666f726550617261467265656dc511004d00000057726f6e67436f6c6c61746f7200000041c511002c0000005363686564756c65644f75744f664f726465720023c511001e0000004865616444617461546f6f4c61726765f9c411002a0000005072656d6174757265436f646555706772616465dfc411001a0000004e6577436f6465546f6f4c6172676500c6c411001900000043616e6469646174654e6f74496e506172656e74436f6e7465787400a5c4110021000000556e6f63637570696564426974496e4269746669656c64005cc4110049000000496e76616c696447726f7570496e64657800000034c4110028000000496e73756666696369656e744261636b696e67000fc4110025000000496e76616c69644261636b696e670000d5c311003a0000004e6f74436f6c6c61746f725369676e6564000000bac311001b00000056616c69646174696f6e44617461486173684d69736d61746368000088c3110032000000496e7465726e616c4572726f7200000046c3110042000000496e636f7272656374446f776e776172644d65737361676548616e646c696e670fc3110037000000496e76616c69645570776172644d65737361676573000000c7c211004800000048726d7057617465726d61726b4d697368616e646c696e6782c2110045000000496e76616c69644f7574626f756e6448726d70004cc2110036000000205468652048524d50206d657373616765732073656e74206279207468652063616e646964617465206973206e6f742076616c69642e205468652063616e646964617465206469646e277420666f6c6c6f77207468652072756c6573206f662048524d502077617465726d61726b20616476616e63656d656e742e204174206c65617374206f6e6520757077617264206d6573736167652073656e7420646f6573206e6f7420706173732074686520616363657074616e63652063726974657269612e2054686520646f776e77617264206d657373616765207175657565206973206e6f742070726f63657373656420636f72726563746c792e20496e7465726e616c206572726f72206f6e6c792072657475726e6564207768656e20636f6d70696c6564207769746820646562756720617373657274696f6e732e205468652076616c69646174696f6e2064617461206861736820646f6573206e6f74206d617463682065787065637465642e20436f6c6c61746f7220646964206e6f74207369676e20506f562e20496e76616c69642028626164207369676e61747572652c20756e6b6e6f776e2076616c696461746f722c206574632e29206261636b696e672e20496e73756666696369656e7420286e6f6e2d6d616a6f7269747929206261636b696e672e20496e76616c69642067726f757020696e64657820696e20636f72652061737369676e6d656e742e20546865206269746669656c6420636f6e7461696e732061206269742072656c6174696e6720746f20616e20756e61737369676e656420617661696c6162696c69747920636f72652e2043616e646964617465206e6f7420696e20706172656e7420636f6e746578742e204f757470757420636f646520697320746f6f206c6172676520436f64652075706772616465207072656d61747572656c792e2048656164206461746120657863656564732074686520636f6e66696775726564206d6178696d756d2e205363686564756c656420636f726573206f7574206f66206f726465722e2043616e64696461746520696e636c756465642077697468207468652077726f6e6720636f6c6c61746f722e2043616e646964617465207363686564756c656420646573706974652070656e64696e672063616e64696461746520616c7265616479206578697374696e6720666f722074686520706172612e2043616e646964617465207375626d6974746564206275742070617261206e6f74207363686564756c65642e20496e76616c6964207369676e61747572652056616c696461746f7220696e646578206f7574206f6620626f756e64732e204d756c7469706c65206269746669656c6473207375626d69747465642062792073616d652076616c696461746f72206f722076616c696461746f7273206f7574206f66206f7264657220627920696e6465782e20417661696c6162696c697479206269746669656c642068617320756e65787065637465642073697a652e50617261496e636c7573696f6e50656e64696e67417661696c6162696c6974790000c4bc11004a00000092000000010000000000000080c8110015000000010500000000000095c811000e00000000000000a3c811002a00000000000000000000000000000000000000c41a1200d0c811000000000000000000e0c8110001000000000000000000000000000000a3c61100130000000105000000000000e8c811000600000000000000eec811003500000000000000000000000000000000000000c41a120024c91100000000000000000034c91100010000000000000000000000000000003cc911001e0000000105000000000000e8c8110006000000000000005ac911001400000000000000000000000000000000000000c41a120070c91100000000000000000080c911000100000000000000000000000000000088c911000a000000000000000000000092c911001000000000000000000000000000000000000000000000000000000000000000c41a1200a4c911000000000000000000b4c9110001000000000000000100000000000000bcc91100130000000000000000000000cfc911000c00000000000000000000000000000000000000000000000000000000000000c41a1200dcc911000000000000000000ecc91100010000000000000001000000417661696c6162696c6974794269746669656c647356616c696461746f72496e646578417661696c6162696c6974794269746669656c645265636f72643c543a3a426c6f636b4e756d6265723e0000002a000000000000000100000093000000b4ca11005900000050617261496443616e64696461746550656e64696e67417661696c6162696c6974793c543a3a486173682c20543a3a426c6f636b4e756d6265723e002a00000000000000010000009300000087ca11002d00000050656e64696e67417661696c6162696c697479436f6d6d69746d656e747343616e646964617465436f6d6d69746d656e747300002a00000000000000010000009300000048ca11003f00000056616c696461746f72735665633c56616c696461746f7249643e00002a0000000000000001000000d10000000fca11003900000043757272656e7453657373696f6e496e64657853657373696f6e496e646578002a000000000000000100000098000000f4c911001b000000205468652063757272656e742073657373696f6e20696e6465782e205468652063757272656e742076616c696461746f72732c2062792074686569722070617261636861696e2073657373696f6e206b6579732e2054686520636f6d6d69746d656e7473206f662063616e646964617465732070656e64696e6720617661696c6162696c6974792c206279205061726149642e2043616e646964617465732070656e64696e6720617661696c6162696c6974792062792060506172614964602e20546865206c6174657374206269746669656c6420666f7220656163682076616c696461746f722c20726566657272656420746f20627920746865697220696e64657820696e207468652076616c696461746f72207365742e000000c4bc11004a0000002c01000029000000c4bc11004a0000003c0100003100000076616c696461746f72206269746669656c647320636865636b6564206e6f7420746f20636f6e7461696e206269747320636f72726573706f6e64696e6720746f20756e6f6363757069656420636f7265733b207165640000c4bc11004a0000003e010000160000000a090909090909496e636c7573696f6e3a3a70726f636573735f6269746669656c64733a0a0909090909090950656e64696e67417661696c6162696c69747920616e642050656e64696e67417661696c6162696c697479436f6d6d69746d656e74730a09090909090909617265206f7574206f662073796e632c2064696420736f6d656f6e65206d6573732077697468207468652073746f726167653f0a090909090909706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e0000c4bc11004a000000320200001f000000e4cc11003c00000020cd11001000000030cd11000a000000c4bc11004a000000d8010000280000007468697320717565727920646f6e652061626f76653b207165640000c4bc11004a0000001d0200002600000070617261636861696e735f72756e74696d655f696e636c7573696f6e56616c69646174696f6e206f75747075747320636865636b696e6720647572696e6720696e636c7573696f6e206f6620612063616e6469646174652020666f722070617261636861696e206060206661696c65643a204f7574626f756e6448726d7000002a0000000400000004000000d200000050726f636573736564446f776e776172644d657373616765730000002a0000000400000004000000d30000005570776172644d6573736167657300002a0000000400000004000000d400000048726d7057617465726d61726b0000002a0000000400000004000000d5000000d4cd11002b00000030cd11000a00000056616c69646174696f6e206f75747075747320636865636b696e6720666f722070617261636861696e2060000000000084ce11000f0000000000000094ce1100020000000000000000000000a4ce1100010000000000000000000000acce1100110000000000000094ce1100020000000000000000000000c0ce1100010000000000000000000000c8ce1100110000000000000094ce1100020000000000000000000000dcce1100010000000000000043616e6469646174654261636b65640072cf11001600000088cf11000800000043cf11002f00000043616e646964617465496e636c7564656400000012cf11003100000043616e64696461746554696d65644f7574000000e4ce11002e00000020412063616e6469646174652074696d6564206f75742e205b63616e6469646174652c20686561645f646174615d20412063616e6469646174652077617320696e636c756465642e205b63616e6469646174652c20686561645f646174615d20412063616e64696461746520776173206261636b65642e205b63616e6469646174652c20686561645f646174615d43616e646964617465526563656970743c486173683e4865616444617461a0cf110094000000a00200000e0000002f6e69782f73746f72652f306b696a70386d377a677a686b72713771737334366d71793978646d383530372d727573742d312e34392e302d6e696768746c792d323032302d31302d30332d3235633863353364642f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f7665635f64657175652e7273617373657274696f6e206661696c65643a206d6964203c3d2073656c662e6c656e282900101f120087000000bb04000009000000a0cf110094000000b80900000e000000617373657274696f6e206661696c65643a2073656c662e6361702829203d3d206f6c645f636170202a203200a0cf1100940000004b0800000d000000436865636b547856657273696f6e4f6363757069656420636f726520616c77617973206861732070656e64696e6720617661696c6162696c6974793b2071656498d11100540000007b0000001a000000436f756c64206e6f742064657465726d696e65207468652067726f757020726573706f6e7369626c6520666f7220636f7265206578747261637465642066726f6d206c697374206f6620636f72657320666f7220736f6d65207072696f7220626c6f636b20696e2073616d652073657373696f6e98d11100540000005c0000002300000098d11100540000005f0000001a0000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f70617261636861696e732f7372632f72756e74696d655f6170695f696d706c2f76312e7273706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a72756e74696d655f6170695f696d706c3a3a76310000002a00000000000000010000003f00000050d211006f000000630000001000000050d211006f000000630000002c0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f6e706f732d656c656374696f6e732f7372632f70687261676d656e2e72732f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f6e706f732d656c656374696f6e732f7372632f6c69622e72730000003cd3110070000000650000001e0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f6e706f732d656c656374696f6e732f7372632f62616c616e63696e672e727350d211006f0000009d0000001c00000050d211006f0000009e0000001f000000dcd311005f000000ac010000010000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f62616c616e6365732f7372632f6c69622e7273546f74616c49737375616e63655761726e696e673a2041207573657220686173206d6f72652063757272656e6379206c6f636b73207468616e2065787065637465642e20412072756e74696d6520636f6e66696775726174696f6e2061646a7573746d656e74206d6179206265206e65656465642e70616c6c65745f62616c616e6365734c6f636b73dcd311005f00000005010000010000004578697374696e6756657374696e675363686564756c654b656570416c6976654578697374656e7469616c4465706f736974496e73756666696369656e7442616c616e63654f766572666c6f774c69717569646974795265737472696374696f6e7356657374696e6742616c616e6365446561644163636f756e74000000000094001200080000000000000000d6110002000000000000000000000030d611001b000000000000000000000008d711000b0000000000000014d711000300000000000000000000005cd71100120000000000000000000000000212000e00000000000000ecd7110003000000000000000000000034d8110006000000000000000000000064d81100130000000000000000d6110002000000000000000000000078d811000b000000000000000000000034db1100040000000000000011db1100230000000000000038db110005000000000000003ddb11001300000098dd110036000000c41a120000000000cedd11004200000010de11004800000058de1100450000009dde11002d000000c41a120000000000cade110046000000c41a120000000000ac0412000b00000010df11004c0000005cdf1100330000008fdf11005a000000c41a120000000000e9df110013000000c41a120000000000fcdf11005400000050e011004b0000009be0110035000000d0e011005800000028e11100520000007ae111003e000000b8e1110022000000dae11100510000002be211003700000062e21100450000004b0512000c0000007365745f62616c616e6365000000000081dd1100030000000000000011db1100230000000000000084dd110008000000000000003ddb110013000000000000008cdd11000c000000000000003ddb11001300000050db110025000000c41a12000000000075db110048000000bddb110042000000ffdb11004600000045dc110040000000c41a12000000000085dc11002d000000c41a120000000000ac0412000b000000b2dc110020000000d2dc11003100000003dd11001600000019dd11000f00000028dd11001a00000042dd1100190000005bdd1100260000004b0512000c000000000000000bdb1100060000000000000011db1100230000000000000034db1100040000000000000011db1100230000000000000038db110005000000000000003ddb11001300000038da1100540000008cda11000b000000ac0412000b00000097da110050000000e7da1100240000004b0512000c0000007472616e736665725f6b6565705f616c69766500d0d811005400000024d9110010000000c41a12000000000034d911002f000000c41a12000000000063d9110031000000ac0412000b00000094d911003a000000ced9110018000000e6d91100470000002dda11000b0000002053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e73666572202d2043686561706572207468616e207472616e736665722062656361757365206163636f756e742063616e6e6f74206265206b696c6c65642e202d2042617365205765696768743a2035312e3420c2b573202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374202873656e64657220697320696e206f7665726c617920616c72656164792920233c2f7765696768743e2045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d6179206265207370656369666965642e202d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e742069732020206e6f7420617373756d656420746f20626520696e20746865206f7665726c61792e736f757263653c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263656465737476616c7565436f6d706163743c543a3a42616c616e63653e20536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e202d20496e646570656e64656e74206f662074686520617267756d656e74732e202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d2042617365205765696768743a20202020202d204372656174696e673a2032372e353620c2b57320202020202d204b696c6c696e673a2033352e313120c2b573202d204442205765696768743a203120526561642c203120577269746520746f206077686f6077686f6e65775f667265656e65775f7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e2052656c617465642066756e6374696f6e733a2020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c20636175736520202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e2020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616c2020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d2042617365205765696768743a2037332e363420c2b5732c20776f7273742063617365207363656e6172696f20286163636f756e7420637265617465642c206163636f756e742072656d6f76656429202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374696e6174696f6e206163636f756e74202d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e00000000003bd411000d000000000000000000000008e411000a00000000000000000000000000000000000000000000000000000000000000c41a120014e41100000000000000000024e41100010000000000000001000000000000002ce41100070000000102000000000000be0712000c0000000000000033e411001700000000000000000000000000000000000000c41a12004ce4110000000000000000005ce4110003000000000000000100000000000000bfd41100050000000102000000000000be0712000c0000000000000074e411001c00000000000000000000000000000000000000c41a120090e411000000000000000000a0e41100020000000000000001000000000000004cf211000e00000000000000000000005af211000800000000000000000000000000000000000000000000000000000000000000c41a1200b0e411000000000000000000c0e41100030000000000000001000000543a3a42616c616e636500002a00000000000000010000009f00000001e61100260000004163636f756e744163636f756e74446174613c543a3a42616c616e63653e00002a0000000000000001000000d600000096e511001b000000c41a120000000000b1e51100500000005665633c42616c616e63654c6f636b3c543a3a42616c616e63653e3e2a0000000000000001000000d70000001fe511002e0000004de51100490000002a00000000000000010000009b000000d8e411001f000000c41a120000000000f7e41100280000002053746f726167652076657273696f6e206f66207468652070616c6c65742e20546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e20416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e205468652062616c616e6365206f6620616e206163636f756e742e204e4f54453a2054686973206973206f6e6c79207573656420696e20746865206361736520746861742074686973206d6f64756c65206973207573656420746f2073746f72652062616c616e6365732e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e0000000000f4d41100120000000000000008e411000a00000000000000c41a120060e61100000000000000000070e6110001000000000000002a0000000000000001000000d800000078e611003500000020546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e0000000000000010e81100070000000000000018e8110002000000000000000000000028e8110001000000000000000000000030e81100080000000000000018e8110002000000000000000000000038e8110002000000000000000000000048e81100080000000000000050e8110003000000000000000000000068e8110001000000000000000000000070e811000a000000000000007ce8110003000000000000000000000094e81100010000000000000000000000600c1200070000000000000018e811000200000000000000000000009ce81100010000000000000000000000a4e81100080000000000000018e81100020000000000000000000000ace81100010000000000000000000000b4e811000a0000000000000018e81100020000000000000000000000c0e81100010000000000000000000000c8e811001200000000000000dce81100040000000000000000000000fce811000300000000000000456e646f77656400fa0d120009000000c9e91100070000008feb110049000000447573744c6f73740beb1100500000005beb1100340000005472616e73666572fa0d120009000000fa0d120009000000c9e9110007000000e3ea11002800000042616c616e63655365740000fa0d120009000000c9e9110007000000c9e9110007000000b0ea11003300000068ea110048000000526573657276656420ea110048000000556e72657365727665640000d6e911004a0000005265736572766552657061747269617465640000fa0d120009000000fa0d120009000000c9e9110007000000d0e911000600000014e911005400000068e91100370000009fe911002a00000020536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742e2046696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652e205c5b66726f6d2c20746f2c2062616c616e63652c2064657374696e6174696f6e5f7374617475735c5d42616c616e636553746174757320536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e205c5b77686f2c2076616c75655c5d20536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e205c5b77686f2c2076616c75655c5d20536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e205c5b77686f2c206465706f7369745c5d20412062616c616e6365207761732073657420627920726f6f742e205c5b77686f2c20667265652c2072657365727665645c5d205472616e73666572207375636365656465642e205c5b66726f6d2c20746f2c2076616c75655c5d20416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742c20726573756c74696e6720696e20616e206f75747269676874206c6f73732e205c5b6163636f756e742c2062616c616e63655c5d20416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e205c5b6163636f756e742c20667265655f62616c616e63655c5d0000000036d511000e00000000000000b8ec110001000000000000000000000021d511001500000000000000c0ec110001000000000000000000000019d511000800000000000000c8ec110001000000000000000000000006d511001300000000000000d0ec1100010000000000000000000000f4d411001200000000000000d8ec1100010000000000000000000000ebd411000900000000000000e0ec1100010000000000000000000000d4d411001700000000000000e8ec110001000000000000000000000044d511000b00000000000000f0ec110001000000000000001aee110027000000e8ed110032000000cbed11001d000000aded11001e00000072ed11003b0000004eed1100240000001bed110033000000f8ec1100230000002042656e6566696369617279206163636f756e74206d757374207072652d657869737420412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e74205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e742056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f7369742042616c616e636520746f6f206c6f7720746f2073656e642076616c756520476f7420616e206f766572666c6f7720616674657220616464696e67204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c756553797374656d4261626554696d657374616d7042616c616e636573417574686f72736869705374616b696e674f6666656e636573486973746f726963616c53657373696f6e4772616e647061496d4f6e6c696e65417574686f72697479446973636f7665727950617261636861696e734f726967696e50617261636861696e73436f6e66696775726174696f6e496e636c7573696f6e496e636c7573696f6e496e686572656e745363686564756c65725061726173496e697469616c697a6572446d70556d7048726d7053657373696f6e496e666f52656769737472617250617261735375646f577261707065725375646f000000000074ef11000600000000000000000000007aef11001000000000000000000000000a00000000000000000000008cef11000c0000000000000000000000726f636f636f7061726974792d726f636f636f2d76310000df6acb689907609b0300000037e397fc7c91f5e40100000040fe3ad401f8959a04000000d2bc9897eed08f1502000000f78b278be53f454c02000000af2c0297a23e6d3d01000000ed99c5acb25eedf502000000cbca25e39f14238702000000687ad44ad37f03c201000000ab3c0572291feb8b01000000bc9d89904f5b923f0100000037c8bb1350a9a2a8010000000000000040787d010065cd1d00e1f505d85aae1ec0542205b0508f1f38e4750488467020d853e903603c5121d0bf760338323222a8591903402013236039cd02480ef423a82a8f0268f8d42470955c02b8dab525c05a3302d8c4962648bd1102e0b27727a855f601e8a05828e8fedf0180773929c0cacd01586d1a2af8f1be019053fb2a50d8b201d00edc2be0fca80138edbc2c48f2a001e06d9d2d80669a01c80d7e2e500f9501c0575e2f08b6900140323f30e0278d0148202031b0418a0108a3ff3120e8870120bedf32f0fb85013856c03398698401f0fda03478218301b8d87f35d8178201d8c26036183d8101b8223e37508d800188d21c38c8fc7f0168b5f93898877f01a829d139d8297f0120d6ab3ab8db7e0168ae803b389d7e0100ca9a3b68957e014368617267655472616e73616374696f6e5061796d656e745472616e73616374696f6e5061796d656e7400000000000020f2110011000000000000000000000031f211000a00000000000000000000000000000000000000000000000000000000000000c41a12003cf211000000000000000000c41a1200000000000000000001000000000000004cf211000e00000000000000000000005af211000800000000000000000000000000000000000000000000000000000000000000c41a120064f211000000000000000000c41a12000000000000000000010000004e6578744665654d756c7469706c6965724d756c7469706c696572002a0000000000000001000000d900000053746f7261676556657273696f6e52656c656173657300002a00000000000000010000009b00000000000000e4f211001200000000000000670c12000c00000000000000c41a1200f8f21100000000000000000008f3110001000000000000000000000010f311000b000000000000001bf311002900000000000000c41a120044f31100000000000000000054f3110001000000000000005472616e73616374696f6e4279746546656500002a0000000000000001000000da0000009ff3110043000000576569676874546f4665655665633c576569676874546f466565436f656666696369656e743c42616c616e63654f663c543e3e3e2a0000000000000001000000db0000005cf31100430000002054686520706f6c796e6f6d69616c2074686174206973206170706c69656420696e206f7264657220746f20646572697665206665652066726f6d207765696768742e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e0000f4f311004a000000c4000000010000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f72756e74696d652f70617261636861696e732f7372632f7363686564756c65722e7273506172615363686564756c657200000000005cf611000f00000000000000000000006bf611001800000000000000000000000000000000000000000000000000000000000000c41a120084f61100000000000000000094f6110004000000000000000100000000000000b4f611000f0000000000000000000000c3f611001400000000000000000000000000000000000000000000000000000000000000c41a1200d8f611000000000000000000e8f611000400000000000000010000000000000008f7110011000000000000000000000019f711001900000000000000000000000000000000000000000000000000000000000000c41a120034f71100000000000000000044f711000600000000000000010000000000000074f7110014000000000000000000000088f711000b00000000000000000000000000000000000000000000000000000000000000c41a120094f711000000000000000000a4f7110004000000000000000100000000000000c4f71100110000000000000000000000d5f711000e00000000000000000000000000000000000000000000000000000000000000c41a1200e4f711000000000000000000f4f7110001000000000000000100000000000000fcf7110009000000000000000000000005f811001300000000000000000000000000000000000000000000000000000000000000c41a120018f81100000000000000000028f8110003000000000000000100000056616c696461746f7247726f7570735665633c5665633c56616c696461746f72496e6465783e3e002a0000000000000001000000450000002dfc11002d000000c41a1200000000005afc110060000000bafc11006000000050617261746872656164517565756550617261746872656164436c61696d5175657565002a0000000000000001000000dc0000004dfb110046000000c41a12000000000093fb110045000000d8fb110055000000417661696c6162696c697479436f7265735665633c4f7074696f6e3c436f72654f636375706965643e3e00002a0000000000000001000000dd0000004bfa110067000000b2fa110032000000e4fa11005000000034fb110019000000c41a120000000000adf811005300000050617261746872656164436c61696d496e6465785665633c5061726149643e002a00000000000000010000004000000069f9110056000000bff911002d000000c41a120000000000ecf911005f00000053657373696f6e5374617274426c6f636b543a3a426c6f636b4e756d626572002a00000000000000010000009800000000f91100690000005363686564756c65645665633c436f726541737369676e6d656e743e2a0000000000000001000000de00000040f811006d000000c41a120000000000adf81100530000002043757272656e746c79207363686564756c656420636f726573202d20667265652062757420757020746f206265206f636375706965642e20457068656d6572616c2073746f72616765206974656d20746861742773207769706564206f6e2066696e616c697a6174696f6e2e20426f756e64656420627920746865206e756d626572206f6620636f7265733a206f6e6520666f7220656163682070617261636861696e20616e642070617261746872656164206d756c7469706c657865722e2054686520626c6f636b206e756d626572207768657265207468652073657373696f6e207374617274206f636375727265642e205573656420746f20747261636b20686f77206d616e792067726f757020726f746174696f6e732068617665206f636375727265642e20416e20696e646578207573656420746f20656e737572652074686174206f6e6c79206f6e6520636c61696d206f6e206120706172617468726561642065786973747320696e20746865207175657565206f722069732063757272656e746c79206265696e672068616e646c656420627920616e206f6363757069656420636f72652e20426f756e64656420627920746865206e756d626572206f66207061726174687265616420636f72657320616e64207363686564756c696e67206c6f6f6b61686561642e20526561736f6e61626c792c203130202a203530203d203530302e204f6e6520656e74727920666f72206561636820617661696c6162696c69747920636f72652e20456e74726965732061726520604e6f6e65602069662074686520636f7265206973206e6f742063757272656e746c79206f636375706965642e2043616e2062652074656d706f726172696c792060536f6d6560206966207363686564756c656420627574206e6f74206f636375706965642e2054686520692774682070617261636861696e2062656c6f6e677320746f20746865206927746820636f72652c2077697468207468652072656d61696e696e6720636f72657320616c6c206265696e6720706172617468726561642d6d756c7469706c65786572732e2041207175657565206f66207570636f6d696e6720636c61696d7320616e6420776869636820636f726520746865792073686f756c64206265206d6170706564206f6e746f2e20546865206e756d626572206f662071756575656420636c61696d7320697320626f756e6465642061742074686520607363686564756c696e675f6c6f6f6b616865616460206d756c7469706c69656420627920746865206e756d626572206f662070617261746872656164206d756c7469706c6578657220636f7265732e20526561736f6e61626c792c203130202a203530203d203530302e20416c6c207468652076616c696461746f722067726f7570732e204f6e6520666f72206561636820636f72652e20426f756e643a20546865206e756d626572206f6620636f726573206973207468652073756d206f6620746865206e756d62657273206f662070617261636861696e7320616e642070617261746872656164206d756c7469706c65786572732e20526561736f6e61626c792c203130302d313030302e2054686520646f6d696e616e7420666163746f7220697320746865206e756d626572206f662076616c696461746f72733a207361666520757070657220626f756e642061742031306b2e000000000000617474656d707420746f20646976696465206279207a65726f00000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f636f7265206973206e6f74206f7574206f6620626f756e647320616e64207765206172652067756172616e7465656420746f20626520616674657220746865206d6f737420726563656e742073657373696f6e2073746172743b2071656400f4f311004a000000df0100001e000000f4f311004a000000d30100001e0000000000000000000000f4f311004a0000004d0100002a000000f4f311004a0000005101000015000000f0151200870000003702000001000000f4f311004a0000002802000016000000b6fe11002300000058fe11005e0000005a000000010000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f696e64696365732f7372632f6c69622e7273605f5f49676e6f7265602063616e206e6576657220626520636f6e73747275637465644e6f745472616e73666572496e5573654e6f744f776e65724e6f7441737369676e65645065726d616e656e7400000000000000e4ff11000500000000000000ecff1100010000000000000000000000040012001200000000000000000000009400120008000000000000009c001200020000000000000000000000cc0012001400000000000000000000006c0112000400000000000000ecff110001000000000000000000000070011200120000000000000000000000000212000e000000000000001002120003000000000000000000000058021200150000000000000000000000000312000600000000000000ecff1100010000000000000000000000080312001100000000000000636c61696d00000000000000322612000500000000000000ca0712000f000000c20a120027000000c41a120000000000e90a120038000000c41a120000000000b709120034000000c41a120000000000210b12003d000000c41a120000000000ed06120025000000c41a120000000000ac0412000b000000b70412000a000000c1041200270000001709120019000000050512000d000000120512001400000026051200250000004b0512000c0000007472616e7366657200000000bb0712000300000000000000be0712000c00000000000000322612000500000000000000ca0712000f0000003009120058000000880912002f000000c41a120000000000b709120034000000c41a120000000000eb0912004a0000004406120058000000c41a120000000000ed06120025000000c41a120000000000ac0412000b000000b70412000a000000c104120027000000350a12001a000000050512000d0000001205120014000000310712000d0000004f0a120039000000880a12003a0000004b0512000c00000066726565dd07120026000000c41a1200000000000308120058000000c41a1200000000005b08120056000000c41a120000000000b108120044000000c41a120000000000f508120022000000c41a120000000000ac0412000b000000b70412000a000000c1041200270000001709120019000000050512000d000000120512001400000026051200250000004b0512000c000000666f7263655f7472616e73666572000000000000bb0712000300000000000000be0712000c00000000000000322612000500000000000000ca0712000f00000000000000000312000600000000000000d9071200040000005705120056000000ad0512003b000000c41a120000000000e805120032000000c41a1200000000001a0612002a00000044061200580000009c06120051000000c41a120000000000ed06120025000000c41a120000000000ac0412000b000000b70412000a000000c104120027000000120712001f000000050512000d0000001205120014000000310712000d0000003e0712003e0000007c0712003f0000004b0512000c000000667265657a650000900312005a000000c41a120000000000ea03120057000000410412001c000000c41a1200000000005d0412002c000000c41a1200000000008904120023000000c41a120000000000ac0412000b000000b70412000a000000c104120027000000e80412001d000000050512000d000000120512001400000026051200250000004b0512000c00000020467265657a6520616e20696e64657820736f2069742077696c6c20616c7761797320706f696e7420746f207468652073656e646572206163636f756e742e205468697320636f6e73756d657320746865206465706f7369742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d75737420686176652061206e6f6e2d66726f7a656e206163636f756e742060696e646578602e202d2060696e646578603a2074686520696e64657820746f2062652066726f7a656e20696e20706c6163652e20456d6974732060496e64657846726f7a656e60206966207375636365737366756c2e2023203c7765696768743e202d20604f283129602e202d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202d20557020746f206f6e6520736c617368206f7065726174696f6e2e202d204f6e65206576656e742e202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d202d204442205765696768743a203120526561642f577269746520284163636f756e7473292023203c2f7765696768743e20466f72636520616e20696e64657820746f20616e206163636f756e742e205468697320646f65736e277420726571756972652061206465706f7369742e2049662074686520696e64657820697320616c72656164792068656c642c207468656e20616e79206465706f736974206973207265696d62757273656420746f206974732063757272656e74206f776e65722e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e202d2060696e646578603a2074686520696e64657820746f206265202872652d2961737369676e65642e202d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e202d2060667265657a65603a2069662073657420746f206074727565602c2077696c6c20667265657a652074686520696e64657820736f2069742063616e6e6f74206265207472616e736665727265642e20456d6974732060496e64657841737369676e656460206966207375636365737366756c2e202d20557020746f206f6e652072657365727665206f7065726174696f6e2e202d204442205765696768743a202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e657229202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e7420286f726967696e616c206f776e6572296e6577543a3a4163636f756e744964543a3a4163636f756e74496e646578626f6f6c204672656520757020616e20696e646578206f776e6564206279207468652073656e6465722e205061796d656e743a20416e792070726576696f7573206465706f73697420706c6163656420666f722074686520696e64657820697320756e726573657276656420696e207468652073656e646572206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206f776e2074686520696e6465782e202d2060696e646578603a2074686520696e64657820746f2062652066726565642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e20456d6974732060496e646578467265656460206966207375636365737366756c2e202d204f6e652072657365727665206f7065726174696f6e2e2041737369676e20616e20696e64657820616c7265616479206f776e6564206279207468652073656e64657220746f20616e6f74686572206163636f756e742e205468652062616c616e6365207265736572766174696f6e206973206566666563746976656c79207472616e7366657272656420746f20746865206e6577206163636f756e742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e202d2060696e646578603a2074686520696e64657820746f2062652072652d61737369676e65642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e202d204f6e65207472616e73666572206f7065726174696f6e2e202020202d2052656164733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e7429202020202d205772697465733a20496e6469636573204163636f756e74732c2053797374656d204163636f756e742028726563697069656e74292041737369676e20616e2070726576696f75736c7920756e61737369676e656420696e6465782e205061796d656e743a20604465706f736974602069732072657365727665642066726f6d207468652073656e646572206163636f756e742e202d2060696e646578603a2074686520696e64657820746f20626520636c61696d65642e2054686973206d757374206e6f7420626520696e207573652e496e646963657300000000000000c00b1200080000000102000000000000ca0712000f00000000000000c80b12002200000000000000000000000000000000000000c41a1200ec0b12000000000000000000fc0b12000100000000000000000000004163636f756e747328543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20626f6f6c2900002a000000000000000100000093000000040c12002200000020546865206c6f6f6b75702066726f6d20696e64657820746f206163636f756e742e000000000000600c12000700000000000000670c12000c00000000000000c41a1200740c12000000000000000000840c120001000000000000004465706f73697442616c616e63654f663c543e002a0000000000000001000000df0000008c0c12002b00000020546865206465706f736974206e656564656420666f7220726573657276696e6720616e20696e6465782e00000000003c0d12000d000000000000004c0d12000200000000000000000000005c0d1200010000000000000000000000640d12000a00000000000000700d1200010000000000000000000000780d1200010000000000000000000000800d12000b000000000000008c0d12000200000000000000000000009c0d12000100000000000000496e64657841737369676e6564000000fa0d120009000000ee0d12000c0000003d0e12002d000000496e64657846726565640000ee0d12000c000000030e12003a000000496e64657846726f7a656e00ee0d12000c000000fa0d120009000000a40d12004a0000002041206163636f756e7420696e64657820686173206265656e2066726f7a656e20746f206974732063757272656e74206163636f756e742049442e205c5b696e6465782c2077686f5c5d4163636f756e74496e6465784163636f756e7449642041206163636f756e7420696e64657820686173206265656e2066726565642075702028756e61737369676e6564292e205c5b696e6465785c5d2041206163636f756e7420696e646578207761732061737369676e65642e205c5b696e6465782c2077686f5c5d0000840e12002300000058fe11005e00000069000000010000005f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e6c6f636174696f6e20616e6420726573756c7420626567696e20657175616c3b2073616d652073697a653b207165640000e80e120041000000340000001f0000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f78636d2f78636d2d6275696c6465722f7372632f6c69622e7273000000a8281200940000008d0a00002a000000a828120094000000d30000002e000000a8281200940000009a0000003b0000005375626d697474656420424142452065717569766f636174696f6e207265706f72742e70616c6c65745f626162653a3a65717569766f636174696f6e2f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f626162652f7372632f65717569766f636174696f6e2e72735375626d6974746564204752414e4450412065717569766f636174696f6e207265706f72742e0000af1012002600000070616c6c65745f6772616e6470613a3a65717569766f636174696f6e2f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f6672616d652f6772616e6470612f7372632f65717569766f636174696f6e2e72734572726f72207375626d697474696e672065717569766f636174696f6e207265706f72743a20696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64650000004011120045000000420100001e0000004011120045000000540100001e0000004011120045000000660100001e0000004011120045000000790100001e0000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f78636d2f78636d2d6578656375746f722f7372632f6173736574732e72730000004011120045000000f70000001e0000004011120045000000010100001e0000001812120084000000ca030000220000001812120084000000e6030000150000001812120084000000f40300001e0000001812120084000000fd030000180000001812120084000000fe030000190000001812120084000000010400001a0000001812120084000000070400000d0000002f6e69782f73746f72652f306b696a70386d377a677a686b72713771737334366d71793978646d383530372d727573742d312e34392e302d6e696768746c792d323032302d31302d30332d3235633863353364642f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c6963652e72731812120084000000210300003600000072656d696e646572206f6620646976206279206320697320616c77617973206c657373207468616e20633b20716564002a0000000800000004000000ae00000015131200710000006a00000012000000726573756c742063616e6e6f742066697420696e20753132382f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f61726974686d657469632f7372632f68656c706572735f3132386269742e727373756d206f6620696e7075742063616e6e6f742066697420696e206054606c656e677468206f6620696e7075742069732067726561746572207468616e207a65726f3b206974206d757374206861766520612066697273743b20716564009c14120066000000e90000000e0000009c14120066000000cc0000003000000050726f6f662070726f766964656420696e20746865206d6f64756c6520646f633b207165642e00009c14120066000000ce000000160000009c14120066000000d80000002c0000009c14120066000000da000000120000009c14120066000000ee000000300000009c14120066000000f5000000140000009c14120066000000fd000000210000009c14120066000000ff000000140000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f61726974686d657469632f7372632f6c69622e72730000f015120087000000da010000010000004661696c656420746f20636f6e7665727471202f206365696c28712f246d617829203c20246d61782e204d6163726f2070726576656e747320616e792074797065206265696e672063726561746564207468617420646f6573206e6f74207361746973667920746869733b207165642f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f61726974686d657469632f7372632f7065725f7468696e67732e72732f6e69782f73746f72652f306b696a70386d377a677a686b72713771737334366d71793978646d383530372d727573742d312e34392e302d6e696768746c792d323032302d31302d30332d3235633863353364642f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f6f70732f61726974682e727300831512006d0000000505000001000000981612006a0000006f000000090000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f61726974686d657469632f7372632f62696775696e742e727363616e6e6f74206669742061206e756d62657220696e746f207531323800981612006a0000009e0000001b000000981612006a0000008000000009000000981612006a0000009200000009000000617474656d707420746f20646976696465206279207a65726f000000981612006a000000460000000d000000616c7265616479206d757461626c7920626f72726f7765642a00000000000000010000003f000000981612006a0000007a0100001a000000981612006a0000006801000028000000981612006a0000006901000028000000616c726561647920626f72726f7765642a00000000000000010000003e000000981612006a000000710100001b000000981612006a000000720100001b000000981612006a000000d60100001c0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f61726974686d657469632f7372632f66697865645f706f696e742e7273617474656d707420746f206469766964652077697468206f766572666c6f77000000241812006e0000004e0600000100000062616265736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214241424520696e686572656e742064617461206e6f7420666f756e6442616265565246496e4f7574436f6e7465787442414245736c6f74206e756d62657263757272656e742065706f6368636861696e2072616e646f6d6e6573732a00000000000000010000000e000000701912006f000000ce0000002a0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f72756e74696d652d696e746572666163652f7372632f696d706c732e727300c41a120000000000f0191200020000003a20486f737420746f207761736d2076616c7565732061726520656e636f64656420636f72726563746c793b207165642a00000000000000010000000e000000401a12007100000009010000260000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f72756e74696d652d696e746572666163652f7372632f706173735f62792e7273000000c41a12000000000072756e74696d650052756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e6741726974686d657469634572726f720000002a0000000400000004000000e0000000436f6d706163745374616b654f766572666c6f77436f6d706163745461726765744f766572666c6f77436f6d70616374496e76616c6964496e646578000000000000000000000000617474656d707420746f20646976696465206279207a65726f0000007c1b12006b000000600000002b0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f72756e74696d652f7372632f67656e657269632f6572612e72732f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f72756e74696d652f7372632f7472616974732e7273000000e71b1200660000004604000013000000426164206f726967696e43616e206e6f74206c6f6f6b757044697370617463684572726f725472616e73616374696f6e206469737061746368206973206d616e6461746f72793b207472616e73616374696f6e73206d6179206e6f742068617665206d616e6461746f727920646973706174636865732e412063616c6c20776173206c6162656c6c6564206173206d616e6461746f72792c2062757420726573756c74656420696e20616e204572726f722e5472616e73616374696f6e20776f756c6420657868617573742074686520626c6f636b206c696d6974735472616e73616374696f6e2068617320616e20616e6369656e7420626972746820626c6f636b5472616e73616374696f6e20686173206120626164207369676e61747572655472616e73616374696f6e206973206f757464617465645472616e73616374696f6e2077696c6c2062652076616c696420696e2074686520667574757265496e6162696c69747920746f2070617920736f6d6520666565732028652e672e206163636f756e742062616c616e636520746f6f206c6f77295472616e73616374696f6e2063616c6c206973206e6f74206578706563746564496e76616c69645472616e73616374696f6e20637573746f6d206572726f72436f756c64206e6f742066696e6420616e20756e7369676e65642076616c696461746f7220666f722074686520756e7369676e6564207472616e73616374696f6e436f756c64206e6f74206c6f6f6b757020696e666f726d6174696f6e20726571756972656420746f2076616c696461746520746865207472616e73616374696f6e556e6b6e6f776e5472616e73616374696f6e20637573746f6d206572726f723c7761736d3a73747269707065643e48617368206e6f7420657175616c4475706c69636174655265706f72744f6666656e63654572726f722f6e69782f73746f72652f306b696a70386d377a677a686b72713771737334366d71793978646d383530372d727573742d312e34392e302d6e696768746c792d323032302d31302d30332d3235633863353364642f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f736c6963652f6d6f642e727300a81f120067000000460000001f0000002f686f6d652f6261737469616e2f2e636172676f2f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f333330663563302f7072696d6974697665732f747269652f7372632f6e6f64655f636f6465632e727300a81f1200670000004f000000140000006c656e20213d20302073696e6365206c656e2025203220213d20303b20696e6e6572206861732061206c61737420656c656d656e743b2071656400006c201200640000003d000000120000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e312f7372632f6e6962626c652f6e6962626c657665632e72736c2012006400000060000000330000006c20120064000000600000000d0000006c201200640000006b0000000f0000006c201200640000006b0000003e0000006c20120064000000690000000f0000006c2012006400000091000000390000006c2012006400000091000000110000006c2012006400000093000000110000006c2012006400000094000000400000006c20120064000000940000004e00000090211200660000009800000017000000902112006600000096000000290000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e312f7372632f6e6962626c652f6e6962626c65736c6963652e727300001c2412005e0000004d0000001c000000902112006600000040000000120000009021120066000000550000003200000090211200660000004f0000002d0000009021120066000000df0000000f0000009021120066000000dd0000000f0000009021120066000000df0000003d0000006361706163697479206f766572666c6f770000008c22120057000000fb000000360000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f736d616c6c7665632d312e352e312f7372632f6c69622e7273617373657274696f6e206661696c65643a206e65775f636170203e3d206c656e008c221200570000002f0300000d000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e00008c221200570000005c050000090000001c2412005e0000008d0000003c0000001c2412005e0000008d000000510000001c2412005e0000008d0000003100000094231200580000004b0000004200000094231200580000004a0000003e0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e312f7372632f6e6f64652e727394231200580000006b0000002200000094231200580000009a000000320000009423120058000000aa0000003e0000002f686f6d652f6261737469616e2f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e312f7372632f6e6962626c652f6d6f642e727300001c2412005e00000086000000310000001c2412005e00000086000000420000001c2412005e00000086000000260000001c2412005e000000870000001d0000001c2412005e000000870000000d0000001c2412005e0000008e000000180000001c2412005e0000008e0000000d0000006c656e202b20707265666978206d696e757320322a736b6970706564206973206c657373207468616e20343b207165642a0000000000000001000000230000003c2512004300000076010000200000002f686f6d652f6261737469616e2f70726f6a656374732f7061726974792f706f6c6b61646f742f78636d2f7372632f76302f6d756c74695f6c6f636174696f6e2e727328295834002a0000000400000004000000e10000004e756c6c5831583258334b7573616d61416e794e616d65642a0000000400000004000000e2000000506f6c6b61646f744f6e6c794368696c64506172656e7450617261636861696e696400002a00000004000000040000001c0000004163636f756e74496433326e6574776f726b00002a0000000400000004000000e30000002a0000000400000004000000e40000004163636f756e74496e6465783634696e646578002a00000004000000040000000c0000004163636f756e744b657932306b6579002a0000000400000004000000e500000050616c6c6574496e7374616e636500002a00000004000000040000000a00000047656e6572616c496e6465782a00000004000000040000001900000047656e6572616c4b657900002a00000004000000040000000a00000063616c6c65642060526573756c743a3a756e77726170282960206f6e20616e2060457272602076616c756500f42612002a000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a20617373657274696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e686569676874202d2031000090271200950000008202000009000000617373657274696f6e206661696c65643a20696478203c204341504143495459902712009500000086020000090000002f6e69782f73746f72652f306b696a70386d377a677a686b72713771737334366d71793978646d383530372d727573742d312e34392e302d6e696768746c792d323032302d31302d30332d3235633863353364642f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6e6f64652e7273617373657274696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e6e6f64652e686569676874202d203100009027120095000000ec0300000900000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c756500a828120094000000210600002f0000002f6e69782f73746f72652f306b696a70386d377a677a686b72713771737334366d71793978646d383530372d727573742d312e34392e302d6e696768746c792d323032302d31302d30332d3235633863353364642f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6d61702e7273a828120094000000d70900002e0000000041ccd2c8000b0c4f8167f7c41a1200c81110000041d8d2c8000b08000000000000000000d9a805046e616d6501d0a805d008001d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f31011c6578745f6d6973635f7072696e745f6e756d5f76657273696f6e5f31021c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f3103226578745f6d6973635f72756e74696d655f76657273696f6e5f76657273696f6e5f3104206578745f6f6666636861696e5f696e6465785f7365745f76657273696f6e5f3105196578745f6c6f6767696e675f6c6f675f76657273696f6e5f31062a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f3107256578745f63727970746f5f656432353531395f67656e65726174655f76657273696f6e5f3108236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f3109286578745f63727970746f5f66696e6973685f62617463685f7665726966795f76657273696f6e5f310a376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f310b256578745f63727970746f5f737232353531395f67656e65726174655f76657273696f6e5f310c286578745f63727970746f5f737232353531395f7075626c69635f6b6579735f76657273696f6e5f310d216578745f63727970746f5f737232353531395f7369676e5f76657273696f6e5f310e236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f320f276578745f63727970746f5f73746172745f62617463685f7665726966795f76657273696f6e5f3110206578745f68617368696e675f626c616b65325f3132385f76657273696f6e5f3111206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f31121e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f31131d6578745f68617368696e675f74776f785f36345f76657273696f6e5f31141c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31151e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f3116236578745f6f6666636861696e5f69735f76616c696461746f725f76657273696f6e5f3117346578745f6f6666636861696e5f6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365745f76657273696f6e5f3118286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f6765745f76657273696f6e5f3119286578745f6f6666636861696e5f6c6f63616c5f73746f726167655f7365745f76657273696f6e5f311a246578745f6f6666636861696e5f6e6574776f726b5f73746174655f76657273696f6e5f311b226578745f6f6666636861696e5f72616e646f6d5f736565645f76657273696f6e5f311c296578745f6f6666636861696e5f7375626d69745f7472616e73616374696f6e5f76657273696f6e5f311d1c6578745f73746f726167655f617070656e645f76657273696f6e5f311e226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f311f1b6578745f73746f726167655f636c6561725f76657273696f6e5f3120226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f31211c6578745f73746f726167655f6578697374735f76657273696f6e5f3122196578745f73746f726167655f6765745f76657273696f6e5f31231e6578745f73746f726167655f6e6578745f6b65795f76657273696f6e5f31241a6578745f73746f726167655f726561645f76657273696f6e5f31251a6578745f73746f726167655f726f6f745f76657273696f6e5f3126196578745f73746f726167655f7365745f76657273696f6e5f31273e73705f636f6e73656e7375735f626162653a3a636865636b5f65717569766f636174696f6e5f70726f6f663a3a6837303531316666336263336562643432283373705f72756e74696d653a3a7472616974733a3a4865616465723a3a686173683a3a6837353137643533376435323463623161298c0173705f636f6e73656e7375735f626162653a3a646967657374733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f636f6e73656e7375735f626162653a3a646967657374733a3a5072654469676573743e3a3a6465636f64653a3a68323437363534303037303933333731302a4b73705f636f6e73656e7375735f626162653a3a636865636b5f65717569766f636174696f6e5f70726f6f663a3a7b7b636c6f737572657d7d3a3a68666238333632363534663865633562662b2b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a68666639643639613761313533356133382c0e5f5f727573745f6465616c6c6f632d4c73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7665726966793a3a68333962346639346162326439666262342e3c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68393363303539393433393131356462612f37616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6833366365663532636533643631323362303a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6837393037646634316130393535323163313a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6831373165376537323339623261623561320c5f5f727573745f616c6c6f63330a5f5f72675f616c6c6f63340c5f5f72675f6465616c6c6f63350e5f5f727573745f7265616c6c6f63360c5f5f72675f7265616c6c6f6337135f5f727573745f616c6c6f635f7a65726f656438115f5f72675f616c6c6f635f7a65726f65643933616c6c6f633a3a616c6c6f633a3a68616e646c655f616c6c6f635f6572726f723a3a68663232383265316664303965326130363a08727573745f6f6f6d3b34616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68343964666464653637363465663738643c29636f72653a3a70616e69636b696e673a3a70616e69633a3a68633838366134636234343739623036653d25616c6c6f633a3a666d743a3a666f726d61743a3a68623738366265386637656163646666353e23636f72653a3a666d743a3a77726974653a3a68623339356639343661356365326361623f36636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68633364393631653966356566663265644033636f72653a3a6f7074696f6e3a3a6578706563745f6e6f6e655f6661696c65643a3a6836383738623934383533663765636636413a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6835646333613037656635323064636230423b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6839363431363231306635333935663638433a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6834396363616164353831383833613832443c616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a6173736572745f6661696c65643a3a6838636333356466316137396664663161454e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a6866373638383862656362646538396234462d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a6836616132613866383434383462356637473c616c6c6f633a3a7665633a3a5665633c543e3a3a72656d6f76653a3a6173736572745f6661696c65643a3a68643934303063383131643864363461654839636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a6834643438383131306338613637356333492f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a68393366356263313935363232653036314a11727573745f626567696e5f756e77696e644b2b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a68303063303861616238303432336238384c313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a68313238653233633939663634343661354d35636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68303565653631333331393561353262634e43636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a68383164643066386231633964316464334f3f636f72653a3a736c6963653a3a696e6465783a3a736c6963655f656e645f696e6465785f6c656e5f6661696c3a3a6837336139333731313264343266626532502c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6862303131323737613139303166396637512e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a683236323738623232353966623635383252323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6831613531303636643135626539613533534a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683265343661356330643435653031666554323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68353437326632396333336634633463395547636f72653a3a756e69636f64653a3a756e69636f64655f646174613a3a6772617068656d655f657874656e643a3a6c6f6f6b75703a3a68653363633233613639636133366436615639636f72653a3a756e69636f64653a3a7072696e7461626c653a3a69735f7072696e7461626c653a3a68303466326566626336396133323131385749636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68653336376438326537626264323166355841636f72653a3a736c6963653a3a696e6465783a3a736c6963655f73746172745f696e6465785f6c656e5f6661696c3a3a6836303764643661326236333338643933593d636f72653a3a736c6963653a3a696e6465783a3a736c6963655f696e6465785f6f726465725f6661696c3a3a68646532663562363836663337666465325a453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68643364633532326531663238336466395b483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68636564336561393464376162633763335c2e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a68616665363433646339396632666233335d303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68663039373061303062343266356261325e323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68616430343635313033333765353764665f533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6834346365386538653631313837373935603a636f72653a3a666d743a3a6275696c646572733a3a44656275675374727563743a3a6669656c643a3a6838623566386235393037613161393562612f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a6830363630343236626135643033376261622e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a6833373831666438633261383261666661633a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6865383363653164623136626466353030643b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6832363730363337623461663237643131653a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68626138393565373565626163336363326639636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a68366337643238346261376333326561316737636f72653a3a666d743a3a6275696c646572733a3a44656275675365743a3a656e7472793a3a683464613961633066643434336336323768443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a683838613465393139663539653762333669313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68346533376130653466373437663238366a47636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a42696e61727920666f722069383e3a3a666d743a3a68313432343635383830643366373164636b4a636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a557070657248657820666f72206933323e3a3a666d743a3a68326330323432326266653965623539346c4a636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f7220753132383e3a3a666d743a3a68346635613865643439356334666430616d3e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68646264373064336261626566636461636e5a637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313a3a746f5f62797465733a3a68623238393164373933353937313036646f9201637572766532353531395f64616c656b3a3a6669656c643a3a3c696d706c20737562746c653a3a436f6e7374616e7454696d65457120666f7220637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313e3a3a63745f65713a3a68323832356462633566303363353935387024737562746c653a3a626c61636b5f626f783a3a68633530363863653264383039656132307157637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313a3a706f77326b3a3a6861373334373435653630303765653265727e637572766532353531395f64616c656b3a3a6669656c643a3a3c696d706c20637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313e3a3a737172745f726174696f5f693a3a6838366564323834616633623261316631735c637572766532353531395f64616c656b3a3a6261636b656e643a3a73657269616c3a3a7536343a3a6669656c643a3a4669656c64456c656d656e7435313a3a66726f6d5f62797465733a3a6863353066386339313834363338643632745a637572766532353531395f64616c656b3a3a72697374726574746f3a3a52697374726574746f506f696e743a3a656c6c696761746f725f72697374726574746f5f666c61766f723a3a68353530343634626364393939616536627549637572766532353531395f64616c656b3a3a7363616c61723a3a5363616c61723a3a66726f6d5f63616e6f6e6963616c5f62797465733a3a683236363836653362313032323434326376483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6837626634623965373131626163633661776c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683863346533613538613030363338633178483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864653338373866366239373730346437793a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68656639393733643231363235623138377a3a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68303238393033663433333938396234657b3a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68383031646431626432653339366537397c3a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68623531313336343864646664383538617d3a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68613132376132633134396534343666317e533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a5370656346726f6d497465723c542c493e3e3a3a66726f6d5f697465723a3a68363637306364303763373139666632647f4d3c6672616d655f737570706f72743a3a64656275673a3a52756e74696d654c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a68666262623133386639333266373338648001493c6672616d655f737570706f72743a3a64656275673a3a52756e74696d654c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a68333133373031373435633636383831308101323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a683636353636626339643666396161613182014273705f696f3a3a6c6f6767696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f673a3a683338363666316464643335303635386483014c6672616d655f73797374656d3a3a6c696d6974733a3a426c6f636b576569676874734275696c6465723a3a6275696c645f6f725f70616e69633a3a68316536616532323730333338326265638401206b656363616b3a3a66313630303a3a68326537333566663535353537396438638501383c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a68323139306334626466323032306430378601343c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a68306333333061333939373835303838618701363c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a666c7573683a3a68643361663634623433663137326237668801366d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a6e65773a3a68313562343339353365343836363064388901366d65726c696e3a3a7374726f62653a3a5374726f62653132383a3a626567696e5f6f703a3a68633635373035383165663635643031658a01303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68313065323737633536313536616332388b01416d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a617070656e645f6d6573736167653a3a68643833303439626137313064343861648c013d6d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a617070656e645f7536343a3a68383965396332636431663433613961628d01426d65726c696e3a3a7472616e7363726970743a3a5472616e7363726970743a3a6368616c6c656e67655f62797465733a3a68633935643636393366363865653338358e017f7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72202851302c5230293e3a3a656e636f64655f746f3a3a68623638616335363362633762323834628f01437061726974795f7363616c655f636f6465633a3a636f6465633a3a636f6d706163745f656e636f64655f6c656e5f746f3a3a68323130396534613130613235343138359001663c70616c6c65745f7374616b696e673a3a6f6666636861696e5f656c656374696f6e3a3a4f6666636861696e456c656374696f6e4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686433663361643735626164623438316191012d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a68373934653135613431326232396432629201643c70616c6c65745f7374616b696e673a3a436f6d7061637441737369676e6d656e7473206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a683361386336333664363565616365646193014570616c6c65745f7374616b696e673a3a436f6d7061637441737369676e6d656e74733a3a756e697175655f746172676574733a3a683066356538646330316162346533363794017970616c6c65745f7374616b696e673a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722070616c6c65745f7374616b696e673a3a56616c696461746f7250726566733e3a3a656e636f64653a3a686363633361396637336262663830313195014d3c70616c6c65745f7374616b696e673a3a456c656374696f6e436f6d7075746520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686665643632363764353164663030373096014470616c6c65745f7374616b696e673a3a736c617368696e673a3a536c617368696e675370616e733a3a656e645f7370616e3a3a686665306536646230353136656664623097013a70616c6c65745f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a68666435653965363135313438373961669801453c737472206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6838333036303130666161383033656566990146706f6c6b61646f745f7072696d6974697665733a3a76313a3a43616e646964617465436f6d6d69746d656e74733a3a686173683a3a68656461306565376262333537653537619a014973705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3235363a3a68333936303038653932346265656163629b013d706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a426c6f636b576569676874733a3a6765743a3a68653763373736356463343062386462379c01323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68306432383138636463346263313761349d015e706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a50617261746872656164436c61696d51756575653a3a656e71756575655f656e7472793a3a68303866393733343239643165353635659e018a0178636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3e3a3a6465636f64653a3a68346135353630626230626161303639319f017978636d3a3a76303a3a6a756e6374696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e3e3a3a6465636f64653a3a6862643231356330393038303861396639a0018a0178636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3e3a3a6465636f64653a3a6865333361343235333166356261303436a1017978636d3a3a76303a3a6a756e6374696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e3e3a3a6465636f64653a3a6834623962376339626230303865333165a2012b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6832303362393332303038343564323538a301483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6866323036383134366539336137356138a4013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6864396431343733623262313263306435a5013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6835656530333939353665323930333464a6013a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6830346438356436306338643265383061a7013a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6864393464346363653062636131373064a801423c73705f7374643a3a57726974657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6837626137636130373063356337663931a9013b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6830313438633530643631366265636334aa013a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6834323534633961626136386135303264ab013873705f6e706f735f656c656374696f6e733a3a62616c616e63696e673a3a62616c616e63653a3a6831316665653266616466653231313730ac0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834373732386535623537643537383136ad012c616c6c6f633a3a736c6963653a3a696e736572745f686561643a3a6831663461383863666662383437376234ae012e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a6832646235663236363832336239623134af014d73705f6e706f735f656c656374696f6e733a3a566f7465723c4163636f756e7449643e3a3a7472795f6e6f726d616c697a655f656c65637465643a3a6861653333653564396637653031626435b001763c78636d5f6578656375746f723a3a7472616974733a3a4973436f6e63726574653c543e2061732078636d5f6578656375746f723a3a7472616974733a3a4d61746368657346756e6769626c653c423e3e3a3a6d6174636865735f66756e6769626c653a3a6830613962326139616537663633356233b1016e3c6672616d655f737570706f72743a3a73746f726167653a3a5072656669784974657261746f723c543e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832616165326231313638653134663130b2014773705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6e6578745f6b65793a3a6838623065633531323034336635336330b3014273705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6765743a3a6861653464373531643565666632353838b4014473705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636c6561723a3a6830613761613762336632663631366238b501403c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862306566396133313164333338386537b6016e3c6672616d655f737570706f72743a3a73746f726167653a3a5072656669784974657261746f723c543e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6835333236316431386534646335376265b7016e3c6672616d655f737570706f72743a3a73746f726167653a3a5072656669784974657261746f723c543e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6861313761316364646437396162653636b8016e3c6672616d655f737570706f72743a3a73746f726167653a3a5072656669784974657261746f723c543e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6863383938316137383130633363353731b9016e3c6672616d655f737570706f72743a3a73746f726167653a3a5072656669784974657261746f723c543e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6865656330646139393663336131656262ba013c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6832383038383137373961306165366339bb01483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6830613730653036393466383962343664bc012c616c6c6f633a3a736c6963653a3a696e736572745f686561643a3a6838316538333638663039653666353030bd012c616c6c6f633a3a736c6963653a3a696e736572745f686561643a3a6836356130663839646639653763323433be01713c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a646d703a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6834373635613262396361363764323463bf017c3c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a646d703a3a43616c6c3c543e206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6839393436623731363832393436663738c0013f7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64655f746f3a3a6833386230396430393531373434343065c10150706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a646d703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6838393439323937356139346134396134c2018b013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a646d703a3a5f5f47657442797465537472756374446f776e776172644d6573736167655175657565733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833366532373461323562346538613134c301433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6837616638643635363661643863393630c40156706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a646d703a3a4d6f64756c653c543e3a3a71756575655f646f776e776172645f6d6573736167653a3a6866623961643961633437323439633632c5014773705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a74776f785f3132383a3a6838386261326336626635333635323733c601386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6832633433323931313765653064313035c7014673705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a74776f785f36343a3a6835316136386134303038393635326534c80137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839383864646562326362316331613234c901386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6834663537373730616338376235363330ca013473705f72756e74696d653a3a7472616974733a3a486173683a3a686173685f6f663a3a6861373337303639616266306463636262cb013473705f72756e74696d653a3a7472616974733a3a486173683a3a686173685f6f663a3a6865306461366666363266343631396437cc01386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6833633862393030303463653531616637cd01386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6832656665653064663832656232366339ce0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6836346539373439613732333862363636cf01386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6838666162663131613631633162616263d001303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863396134366331643264643363306335d1014f70616c6c65745f7374616b696e673a3a6f6666636861696e5f656c656374696f6e3a3a636f6d707574655f6f6666636861696e5f656c656374696f6e3a3a6864323062326664323631353064386631d2014b73705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a72616e646f6d5f736565643a3a6837633530336465333564303966646664d301386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6865356261343334306562333061316432d40139636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a6862323463333731313133383232666532d50137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6836363261356365323766323837393038d60137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831343230343837303464306562336538d70139636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a6838663763316538613134366262383065d801746672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a6765743a3a6833316237323633323565383039353261d901453c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6861643730306633353330613938316336da013273705f6e706f735f656c656374696f6e733a3a73657475705f696e707574733a3a6837313639343064653364343365363631db014173705f6e706f735f656c656374696f6e733a3a70687261676d656e3a3a7365715f70687261676d656e5f636f72653a3a6865366161623362353835326162636333dc0168636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4d75743c413e20666f7220266d757420463e3a3a63616c6c5f6d75743a3a6838663937633261386338653137303738dd0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832313366383562623437616137646639de012b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6834376461346533386161373964313264df014c73705f6e706f735f656c656374696f6e733a3a41737369676e6d656e743c4163636f756e7449642c503e3a3a7472795f6e6f726d616c697a653a3a6861393561303138613034316437313737e00137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6833643962393639366238613230346535e101386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6834616563316464626337613531666265e2014973705f6e706f735f656c656374696f6e733a3a68656c706572733a3a61737369676e6d656e745f726174696f5f746f5f7374616b65643a3a6863393161353762356339336438623237e3013473705f6e706f735f656c656374696f6e733a3a7265647563653a3a7265647563653a3a6839353339616365353662383430396436e4017a3c73705f61726974686d657469633a3a7065725f7468696e67733a3a5065725531362061732073705f61726974686d657469633a3a7065725f7468696e67733a3a5065725468696e673e3a3a66726f6d5f726174696f6e616c5f617070726f78696d6174696f6e3a3a6830346439346430336537306132623731e50137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6838353366313861353235306266333461e6014670616c6c65745f7374616b696e673a3a436f6d7061637441737369676e6d656e74733a3a66726f6d5f61737369676e6d656e743a3a6863326532643365346461376134393865e70147636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207533323e3a3a666d743a3a6861326233636161333065323165643236e80147636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207536343e3a3a666d743a3a6834393737613636346265333932353634e9012b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6861396165646530663363656661393431ea01303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833336561666136636535346434633734eb0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6835333164613033396566363433303466ec0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832626537303532653561376231356235ed0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6838333234633231356132303465366339ee0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6862393162363039313665623461623562ef0137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6861303865663331633566663064616231f00137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6865336465353135626461383065336137f10137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839376333663465306461313161623239f20137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832613531386330326534326533313833f30137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6864616231653230646465313438303731f40137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834373362303239643336633635313139f50137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6864366666643131613165656264653130f60137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6835666437653030656465646163646331f70137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839626463323232623364313830353437f80137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6835343764306132616633623966323636f90137616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6865353861366437363830646463623064fa014670616c6c65745f7374616b696e673a3a436f6d7061637441737369676e6d656e74733a3a696e746f5f61737369676e6d656e743a3a6863373632633037663236633163333638fb01443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831613363303132326433643232306230fc013773705f6e706f735f656c656374696f6e733a3a6275696c645f737570706f72745f6d61703a3a6837343663366564616364646237646366fd013673705f6e706f735f656c656374696f6e733a3a6576616c756174655f737570706f72743a3a6834313231316137383738363936623637fe017a3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a496e746f4974657261746f723e3a3a696e746f5f697465723a3a6838643466366662346639316539363866ff012b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6866383734303631366665306637616262800247636f72653a3a61727261793a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72205b543b204e5d3e3a3a666d743a3a683064336431303933303933366231656281023e73705f72756e74696d653a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a683937366161616438653766613536306482025273705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7375626d69745f7472616e73616374696f6e3a3a6865366139333861643935393532333230830230636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a68313462663334303466316636366162382e3834303884026f3c73705f72756e74696d653a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a683765643631356232373534666461373685023a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68626263306338366466376139656634318602910173705f72756e74696d653a3a67656e657269633a3a6469676573743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f72756e74696d653a3a67656e657269633a3a6469676573743a3a4469676573743c486173683e3e3a3a6465636f64653a3a686364353336616335653738663034393287026b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68363832653832396433616662333837628802483c5b543b20345d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383832386438333330336539333939658902593c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68363664333561373031336465643336308a02543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68666361653436353238396232326366648b02493c78636d5f6578656375746f723a3a6173736574733a3a4173736574496420617320636f72653a3a636d703a3a4f72643e3a3a636d703a3a68343962663236633936383538363439348c02473c78636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e20617320636f72653a3a636d703a3a4f72643e3a3a636d703a3a68346335363132393663633134663863368d0241616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365617263683a3a7365617263685f747265653a3a68333065356533646635623338626237388e0241616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365617263683a3a7365617263685f747265653a3a68373039396163653066656231666134328f0244636f72653a3a7475706c653a3a3c696d706c20636f72653a3a636d703a3a4f726420666f722028412c42293e3a3a636d703a3a6863653361356437343531356532633535900241616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365617263683a3a7365617263685f747265653a3a6837383637666134306331626563636231910241616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365617263683a3a7365617263685f747265653a3a68616362323066333366313962333964329202766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a68346434356430633462393639383030359302960173705f7374616b696e673a3a6f6666656e63653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f7374616b696e673a3a6f6666656e63653a3a4f6666656e636544657461696c733c5265706f727465722c4f6666656e6465723e3e3a3a6465636f64653a3a6863623830313731646234363164346666940237616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6861383239363436356434336161626231950237616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831343734613466373834633662653664960237616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a683463306366316431656234643261376297022b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a68393461613764616131376361303430319802303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683061623063656638363465363464353899023f70616c6c65745f6f6666656e6365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68343631323636626334656565393566379a02773c70616c6c65745f6f6666656e6365733a3a5f5f476574427974655374727563745265706f72747342794b696e64496e6465783c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68396562313432393033303261333033389b02433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a68346330396430323130303966393537399c027b3c70616c6c65745f6f6666656e6365733a3a5f5f47657442797465537472756374436f6e63757272656e745265706f727473496e6465783c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68363235366365333035353765316539339d02753c70616c6c65745f6f6666656e6365733a3a5f5f4765744279746553747275637444656665727265644f6666656e6365733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68653437643830636462363665323565399e023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68636532393637646362643461373937339f026c3c70616c6c65745f6f6666656e6365733a3a5f5f476574427974655374727563745265706f7274733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835373462666130636332656338363362a002706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6861666266333461616234643866646164a1024a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6831646434363763613533643966363539a2025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6864303238343934313535363466343361a3024670616c6c65745f6f6666656e6365733a3a4d6f64756c653c543e3a3a7265706f72745f6f725f73746f72655f6f6666656e63653a3a6866343839383038303837663935656365a402fa013c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e2061732073705f7374616b696e673a3a6f6666656e63653a3a4f6e4f6666656e636548616e646c65723c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449642c283c542061732070616c6c65745f73657373696f6e3a3a436f6e6669673e3a3a56616c696461746f7249642c3c542061732070616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a436f6e6669673e3a3a46756c6c4964656e74696669636174696f6e292c7536343e3e3a3a6f6e5f6f6666656e63653a3a6866616235626362376539643438663265a502443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6834393861323336306338613732313735a602443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6866333565313762346264623832333964a7024273705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7365743a3a6834623134616439333436343531303266a8026b3c70616c6c65745f6f6666656e6365733a3a43616c6c3c543e206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6834386261646164393634383562373733a9025b3c726f636f636f5f72756e74696d653a3a53657373696f6e4b6579732061732073705f72756e74696d653a3a7472616974733a3a4f70617175654b6579733e3a3a6765745f7261773a3a6831333436666363323566393162623837aa0248726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6672616d655f73797374656d3a3a6863303837653764616362656532303034ab024a726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f696e64696365733a3a6836323638656338353734353861353639ac024b726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f62616c616e6365733a3a6830376434336261386336666235363532ad024a726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f7374616b696e673a3a6837643531636665666665633134643130ae024b726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f6f6666656e6365733a3a6862333638393463303932623537356338af024a726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f73657373696f6e3a3a6864326565643436323662323736323833b0024a726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f6772616e6470613a3a6865656535336239663265646262333361b1024c726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f696d5f6f6e6c696e653a3a6861316337656534343265613232363165b20250726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70617261636861696e735f696e636c7573696f6e3a3a6839613631646638633363363831653238b30247726f636f636f5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f70616c6c65745f7375646f3a3a6830373661623737643562386161343965b40230636f72653a3a6f70733a3a66756e6374696f6e3a3a466e3a3a63616c6c3a3a6833663734636237373931636332393631b50237636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4d75743a3a63616c6c5f6d75743a3a6834613237323662333363396438646238b60248636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63657b7b767461626c652e7368696d7d7d3a3a6837336466376238393335613436663063b702673c726f636f636f5f72756e74696d653a3a43616c6c206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6833326663363835663932386638363262b802763c70616c6c65745f617574686f726974795f646973636f766572793a3a43616c6c3c543e206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6866666134663063363366643734643930b90282013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a43616c6c3c543e206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6837616333306264393661366661663336ba0282013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a43616c6c3c543e206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6838636434326138633933666233666562bb027e3c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a70617261733a3a43616c6c3c543e206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6839363432626564326139313462613366bc0284013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e697469616c697a65723a3a43616c6c3c543e206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6830633636626366353234613338623839bd027c3c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a756d703a3a43616c6c3c543e206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6835346162626535646565653863656265be0285013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a73657373696f6e5f696e666f3a3a43616c6c3c543e206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6831633636633132336664633438663839bf02573c726f636f636f5f72756e74696d653a3a43616c6c2061732073705f72756e74696d653a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6835663734323566316334383936366563c002723c726f636f636f5f72756e74696d653a3a43616c6c206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6836336264643163616139383735656561c1022b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6863306363643664376131373865636238c2022b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6833353361383132336639383137613134c3022b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6834316561656666333364613363633138c4022b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6834643335376236643230386136656536c50230636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a68656536306537663261313862336633392e38343235c6022e6672616d655f73797374656d3a3a656e737572655f7369676e65643a3a6830303862343634393664613030623965c702363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a6838373162353166326462633462343764c802416672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e745f696e64657865643a3a6864313335316638666463633361653262c902386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6837393064363935393636623261346439ca02733c6672616d655f73797374656d3a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6865323139623530396462623939386130cb024170616c6c65745f626162653a3a4d6f64756c653c543e3a3a646f5f7265706f72745f65717569766f636174696f6e3a3a6834346361386562346334343033386531cc022c6672616d655f73797374656d3a3a656e737572655f6e6f6e653a3a6862666566666534363563333563363535cd023770616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a617574686f723a3a6864383333646265656663613933343133ce024573705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6578697374733a3a6832386536333235376334303161393064cf02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837613661396262666636663832343363d0025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6834303066326637633862393064313665d102386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864323362613261613534386264303332d2028f013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6864663162356436346236626261633163d3027b70616c6c65745f696e64696365733a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f696e64696365733a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6838353030633133333939346339376139d402386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6861613663643564396139306663343165d5024a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6834646232646232636130353037376464d602386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6865396436643031356564346637333731d7027f70616c6c65745f62616c616e6365733a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f62616c616e6365733a3a4572726f723c542c493e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6836636333376637646361663236393064d802386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6838383333366634346436336230313032d90291013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a6865323333373038613336613238363264da022c6672616d655f73797374656d3a3a656e737572655f726f6f743a3a6862326536373361643138636438613733db0286013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449643e3e3a3a7472616e736665723a3a6837373031663664643636646637376237dc02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6835363535393730343564623335363537dd02810170616c6c65745f617574686f72736869703a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f617574686f72736869703a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6830616436396530653763363930396537de02766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6864363238316633663932343665353563df0237616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6861346464393664613435303062343662e0023b70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a7265776172645f62795f6964733a3a6863363461653639383762353530363137e1023f70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a6e6f74655f617574686f72736869703a3a6838376466396638313263613234663365e202753c70616c6c65745f7374616b696e673a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6831303038373334646465373738313634e302bc013c70616c6c65745f7374616b696e673a3a53746173684f663c543e2061732073705f72756e74696d653a3a7472616974733a3a436f6e766572743c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449642c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449643e3e3e3a3a636f6e766572743a3a6832646630633938303939393037323435e4024a3c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6861376339666264356362663638306462e502386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838333065363136393766383833316436e6025c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6839353634316263646436666131363232e702336672616d655f73797374656d3a3a4d6f64756c653c543e3a3a696e635f7265663a3a6863323635373664396138646565626261e802336672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6465635f7265663a3a6834346339303662353338323533346665e9024470616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a646f5f7265706f72745f65717569766f636174696f6e3a3a6862653766663838346330333732306438ea02386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6834633131626663303730326463313836eb02706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6865363161383338333633643864336235ec02766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6837393238613338303937383063656164ed0291013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a636f6e66696775726174696f6e3a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6838663034663937613465333235613632ee0258706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e5f696e686572656e743a3a4d6f64756c653c543e3a3a696e636c7573696f6e3a3a6836653565353337363666656232646139ef0248706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a6f726967696e3a3a656e737572655f70617261636861696e3a3a6834323964373636303961633764653761f00252706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a68726d703a3a4d6f64756c653c543e3a3a696e69745f6f70656e5f6368616e6e656c3a3a6865393263303861313434663066353531f102a101706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a68726d703a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a68726d703a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6834323766303935323862643136373364f20254706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a68726d703a3a4d6f64756c653c543e3a3a6163636570745f6f70656e5f6368616e6e656c3a3a6838646636336136626166623034323937f302386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864356231616434366466643465393332f4024573705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a617070656e643a3a6836313263303032616431656535313835f502386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838616462633066393361363761643339f6026378636d3a3a76303a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722078636d3a3a76303a3a58636d3e3a3a656e636f64655f746f3a3a6835653130303162623463326331313265f7022b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6833623764313666343539383964656264f8028f013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261735f7265676973747261723a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6834633638333135366431303665636333f90248706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c655f706172615f696e697469616c697a653a3a6836313538623536636233386332383931fa0245706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c655f706172615f636c65616e75703a3a6838656234353839346163363864316138fb024f706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a70617261733a3a4d6f64756c653c543e3a3a69735f76616c69645f706172613a3a6866336661646362316234333564623364fc022b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6865653630653766326131386233663339fd023c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6831616136386138636134383664303631fe0284016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65732c434f6e52756e74696d65557067726164653e3a3a696e697469616c697a655f626c6f636b3a3a6865303166373635663630353838333932ff022b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a683539666362616237343738623734316280033a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68313630356435383130623863636634318103386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68323461366465623833346430326562338203386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68303361666132633139313432343733628303366672616d655f73797374656d3a3a4d6f64756c653c543e3a3a696e697469616c697a653a3a68383430353437353932336236373565618403753c285475706c65456c656d656e74302c5475706c65456c656d656e743129206173206672616d655f737570706f72743a3a7472616974733a3a4f6e496e697469616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a68313564343864356338363931386637338503386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68356337633861343832346431376539328603386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68343535383764323366653638313865368703386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a683437353933623562313463663536653288038c016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65732c434f6e52756e74696d65557067726164653e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a683737623162316365356339663133616289039f013c73705f72756e74696d653a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e2061732073705f72756e74696d653a3a7472616974733a3a436865636b61626c653c4c6f6f6b75703e3e3a3a636865636b3a3a68666436383730623638656335633566378a03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68333633306531653538636335623163388b038b013c73705f72756e74696d653a3a67656e657269633a3a636865636b65645f65787472696e7369633a3a436865636b656445787472696e7369633c4163636f756e7449642c43616c6c2c45787472613e2061732073705f72756e74696d653a3a7472616974733a3a4170706c7961626c653e3a3a6170706c793a3a68396132663731376435363639643833318c03563c73705f72756e74696d653a3a44697370617463684572726f722061732073705f72756e74696d653a3a7472616974733a3a5072696e7461626c653e3a3a7072696e743a3a68663535353562333066356664663237328d03aa0173705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a5472616e73616374696f6e56616c69646974794572726f723e3a3a656e636f64655f746f3a3a68366461386633643563373336616131618e03363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a68383730353565323537323635313662618f0341747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a636f6d6d69745f6368696c643a3a6862303332626165653039373335313363900343616c6c6f633a3a636f6c6c656374696f6e733a3a7665635f64657175653a3a56656344657175653c543e3a3a67726f773a3a68343563393335653832636638663734619103653c73705f747269653a3a6e6f64655f6865616465723a3a4e6f6465486561646572206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68636636373362323661333462313861639203633c73705f747269653a3a6e6f64655f636f6465633a3a4e6f6465436f6465633c483e20617320747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633e3a3a6c6561665f6e6f64653a3a6839323765623333636361326336336430930360747269655f64623a3a6e6962626c653a3a6e6962626c65736c6963653a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c65536c6963653e3a3a72696768745f697465723a3a6833643161343335393366316330383438940372747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a617070656e645f6f7074696f6e616c5f736c6963655f616e645f6e6962626c653a3a686466366134366638333361393135336195035c747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a64726f705f6c617374733a3a68643331616563303366313035326662319603683c73705f747269653a3a6e6f64655f636f6465633a3a4e6f6465436f6465633c483e20617320747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633e3a3a657874656e73696f6e5f6e6f64653a3a68643234393235656432633531643631649703653c73705f747269653a3a6e6f64655f636f6465633a3a4e6f6465436f6465633c483e20617320747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633e3a3a6272616e63685f6e6f64653a3a683233663961303161633764386238306598032b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a683138386438346639343463643838616199033c747269655f64623a3a7472696564626d75743a3a4e6f646553746f726167653c483e3a3a616c6c6f633a3a68393838373263303462336533663165349a03543c747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e20617320747269655f64623a3a547269654d75743c4c3e3e3a3a696e736572743a3a68623034343931383038373930623432639b033e747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a696e736572745f61743a3a68346461656364623062303439643261649c033c747269655f64623a3a7472696564626d75743a3a4e6f64653c4f3e3a3a66726f6d5f656e636f6465643a3a68666233323234313266373637306262639d0345747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a696e736572745f696e73706563746f723a3a68313339653938346461663932616538319e03363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a68343066653930643965383165646334629f03376861736862726f776e3a3a7365743a3a486173685365743c542c533e3a3a696e736572743a3a6838666636376562363234383166356562a00339747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633a3a6465636f64653a3a6864383638326165653632366532383931a1033e747269655f64623a3a7472696564626d75743a3a4e6f64653c4f3e3a3a696e6c696e655f6f725f686173683a3a6861613536373432393839656361616138a20365747269655f64623a3a6e6962626c653a3a6e6962626c65736c6963653a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c65536c6963653e3a3a746f5f73746f7265645f72616e67653a3a6837643733383634303062363432363033a30335747269655f64623a3a7472696564626d75743a3a656d7074795f6368696c6472656e3a3a6838376635313930653165336566343362a403773c736d616c6c7665633a3a536d616c6c5665633c413e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a457874656e643c3c4120617320736d616c6c7665633a3a41727261793e3a3a4974656d3e3e3a3a657874656e643a3a6830616665373138333534356236393762a5034d636f72653a3a686173683a3a696d706c733a3a3c696d706c20636f72653a3a686173683a3a4861736820666f722028412c42293e3a3a686173683a3a6834323331636538653064393236646336a6033e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6864366331383562396233316339316630a70388013c285475706c65456c656d656e74302c5475706c65456c656d656e74312c5475706c65456c656d656e74322c5475706c65456c656d656e7433292061732078636d5f6578656375746f723a3a7472616974733a3a436f6e766572744f726967696e3c4f3e3e3a3a636f6e766572745f6f726967696e3a3a6833336534303761326366366337393539a803783c285475706c65456c656d656e74302c5475706c65456c656d656e7431292061732078636d5f6578656375746f723a3a7472616974733a3a4c6f636174696f6e436f6e76657273696f6e3c4163636f756e7449643e3e3a3a66726f6d5f6c6f636174696f6e3a3a6861333162303735666234363232633162a9033c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6834383635356633663333336330663836aa033a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6830383838626533666564323438333439ab038b0173705f66696e616c6974795f6772616e6470613a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f66696e616c6974795f6772616e6470613a3a45717569766f636174696f6e50726f6f663c482c4e3e3e3a3a6465636f64653a3a6838383931333663373138303134336437ac03493c5b543b2036345d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834393631613539373863346261643965ad038b0173705f66696e616c6974795f6772616e6470613a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f66696e616c6974795f6772616e6470613a3a45717569766f636174696f6e50726f6f663c482c4e3e3e3a3a6465636f64653a3a6865616536333732363131373233636130ae03a401706f6c6b61646f745f7072696d6974697665733a3a76303a3a76616c696461746f725f6170703a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220706f6c6b61646f745f7072696d6974697665733a3a76303a3a76616c696461746f725f6170703a3a5369676e61747572653e3a3a6465636f64653a3a6837643535643863346365643334333037af039c013c73705f72756e74696d653a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834356235356133633636663133653737b0036b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866623933633439623634383438653064b1036c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6835656439643930376138383433356338b2036f726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220726f636f636f5f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6831656239306462613030386537326532b3032b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6831346266333430346631663636616238b40372726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220726f636f636f5f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a6866393332313739313730653166643864b5038e017061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220284c302c4d302c4e302c4f302c50302c51302c5230293e3a3a656e636f64655f746f3a3a6863646536303864376335386131386366b603553c73705f72756e74696d653a3a4d756c74695369676e61747572652061732073705f72756e74696d653a3a7472616974733a3a5665726966793e3a3a7665726966793a3a6837313833663032376262623638626366b70354706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7574696c3a3a6d616b655f7065727369737465645f76616c69646174696f6e5f646174613a3a6834356331633936393963383431363066b803386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837323337353032616261303732333061b903386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862666336633338633763666566363331ba0350706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a70617261733a3a4d6f64756c653c543e3a3a6e6f74655f706173745f636f64653a3a6832626166316361373765313561373163bb03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6861386362633262353635393562303166bc0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6833656165623065666135353035366438bd033a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6837336539636664663063396636323961be033a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6833343661346435313538306363623330bf035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6863646637356638653963633465653235c003766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6835623836323936616537356531326636c103386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6836383430303534653836313561653839c20352706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a70617261733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6832646635633864396463306235343139c30384013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a70617261733a3a5f5f4765744279746553747275637450617374436f64654d6574613c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837383134656563663934613930303830c40383013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a70617261733a3a5f5f4765744279746553747275637450617261746872656164733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866383030643132663034326434386536c5033c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6861613962666665613535343966646666c60382013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a70617261733a3a5f5f4765744279746553747275637450617261636861696e733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835336230663037333037323636623662c703433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6864613662373665376362313531616334c80353706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a70617261733a3a4d6f64756c653c543e3a3a6c6173745f636f64655f757067726164653a3a6832333436663166653333666330643030c903a201706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a70617261733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a70617261733a3a5061726147656e65736973417267733e3a3a6465636f64653a3a6833386631303766346261366361353263ca03543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838663432656534393738303531333634cb03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838626634373161313332383963313132cc03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6866663239303131343332396339336230cd034b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6836373835346436373534343162613038ce03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6831383162323433366331336661623464cf032b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6861346134666335386136626332343966d003706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6834323735366336643339666536643137d103706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6831663266323463333736313332316533d203386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6835383936653764643963653566383231d3035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6864303564366165383931383532333036d403776672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a696e736572743a3a6830623639373136623738346138366636d503483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6837323138373663353634386637353662d6033970616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6368696c6c5f73746173683a3a6832336639383366353830666565383839d7035270616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a736c61736861626c655f62616c616e63655f6f665f666e3a3a7b7b636c6f737572657d7d3a3a6864303830383136383132623330613561d803386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837313634656438663835306161303464d90348636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63657b7b767461626c652e7368696d7d7d3a3a6834326330333238623361636133393663da03706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a6861313966386539653534626434376262db033c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6837303366343066663232333862373939dc033e70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6862346165373864323435306662383263dd03723c70616c6c65745f7374616b696e673a3a5f5f4765744279746553747275637453746f7261676556657273696f6e3c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838663036393938373931646139626631de03753c70616c6c65745f7374616b696e673a3a5f5f47657442797465537472756374457261456c656374696f6e5374617475733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839333430333634383761356235646339df03763c70616c6c65745f7374616b696e673a3a5f5f47657442797465537472756374536e617073686f744e6f6d696e61746f72733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831366263616265623337643635646637e0033c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6838386662613763613238366666666162e1036d3c70616c6c65745f7374616b696e673a3a5f5f476574427974655374727563745370616e536c6173683c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862333935396530633561343031643332e203743c70616c6c65745f7374616b696e673a3a5f5f47657442797465537472756374556e6170706c696564536c61736865733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834346135306662343466383534313837e3033c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6864613033333832396631333965333864e403723c70616c6c65745f7374616b696e673a3a5f5f4765744279746553747275637445726173546f74616c5374616b653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863363762313861366130343237393461e503743c70616c6c65745f7374616b696e673a3a5f5f4765744279746553747275637445726173526577617264506f696e74733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831313036366364313232336232653338e6033a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6830353161323039366563646564383439e703763c70616c6c65745f7374616b696e673a3a5f5f476574427974655374727563744572617356616c696461746f7250726566733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866613662643434393262633666613862e803763c70616c6c65745f7374616b696e673a3a5f5f47657442797465537472756374457261735374616b657273436c69707065643c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861336339383834336631303138643933e903723c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6862313461396138373233376338643236ea036a3c70616c6c65745f7374616b696e673a3a5f5f476574427974655374727563744c65646765723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834323538316632303166346665333962eb03713c70616c6c65745f7374616b696e673a3a5f5f47657442797465537472756374496e76756c6e657261626c65733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835646561623932633435623933343634ec03433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6837653838633164333731376565353839ed03703c70616c6c65745f7374616b696e673a3a5f5f47657442797465537472756374486973746f727944657074683c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834316532356434646264303434356339ee034770616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6834343036666135616238613638663261ef03ac013c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f7244656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866363661313635376538373765613833f003a0013c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e536f6c7574696f6e53636f726542756d7044656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835376639396665393238653863613839f10399013c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d6178497465726174696f6e7344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839613733343637336334633630373163f2039d013c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a456c656374696f6e4c6f6f6b616865616444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833346463643138343464313061323232f3039e013c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a536c61736844656665724475726174696f6e44656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834613739326134613534323763626239f4039b013c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426f6e64696e674475726174696f6e44656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837386333613065656538616138383965f5039a013c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a53657373696f6e7350657245726144656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834383135386263373964646462383561f603860170616c6c65745f7374616b696e673a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722070616c6c65745f7374616b696e673a3a4578706f737572653c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6837303461636636333262336334623738f7036c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831633864336631383433366331666435f803890170616c6c65745f7374616b696e673a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722070616c6c65745f7374616b696e673a3a4578706f737572653c4163636f756e7449642c42616c616e63653e3e3a3a656e636f64655f746f3a3a6839613064386437383132643766373036f903643c70616c6c65745f7374616b696e673a3a436f6d7061637441737369676e6d656e7473206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836613638333939653038386232633130fa036b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7531363e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6863303362363666343164613563326563fb0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6830383230356263613433663839386430fc0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6836343561363239333037616633333437fd0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6830323739323133313039333366646438fe0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6830663864323630623932363138643265ff0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6830393064336435666333366462326265800437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6838343365336163646335313336336430810437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831363838336630616463386162396138820437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6865393833373564396139363861653831830437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6838343737303434316637656239323464840437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6835306436316135343831343437313237850437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6866363939313932366462373137343462860437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a68366166643337393731376434353362388704643c70616c6c65745f7374616b696e673a3a436f6d7061637441737369676e6d656e7473206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683662393236356231613162343063393388046b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7531363e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68333033323539653763623737346135348904386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68323436343130383737633637666336308a04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68653363393365373634623964363934338b044970616c6c65745f7374616b696e673a3a736c617368696e673a3a496e7370656374696e675370616e733c543e3a3a6572615f7370616e3a3a68396438663239313165616236643233398c04753c542061732070616c6c65745f7374616b696e673a3a53657373696f6e496e746572666163653c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449643e3e3a3a64697361626c655f76616c696461746f723a3a68323137643533376463653039633831308d04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68336365353635623563336162356435318e04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68393937353363663433663631643265348f042b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a683164646266356634316264626539343590045e70616c6c65745f7374616b696e673a3a736c617368696e673a3a496e7370656374696e675370616e733c543e3a3a636f6d706172655f616e645f7570646174655f7370616e5f736c6173683a3a68366164613564386664343839656137659104386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6834363962613836303536616439393961920437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a683738376436626438393964326533363793043570616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6e65775f6572613a3a686362666533623139373566356464336394044370616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a636c6561725f6572615f696e666f726d6174696f6e3a3a68386662663537373430663862336330339504543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686537363033663566366638376531353896043c73705f6e706f735f656c656374696f6e733a3a70687261676d656e3a3a7365715f70687261676d656e3a3a68353064616337643335323231393237639704533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a5370656346726f6d497465723c542c493e3e3a3a66726f6d5f697465723a3a683965323762306535393165323436336398044370616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a636c6f73655f656c656374696f6e5f77696e646f773a3a68376234373534663934373134346632659904706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a68303534343636616535653531633162399a04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68336333306236646435326536326136359b04706672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a646f75626c655f6d61703a3a53746f72616765446f75626c654d61703a3a73746f726167655f646f75626c655f6d61705f66696e616c5f6b65793a3a68656131363462636536623938346365329c04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68656334663066343865646431356662309d044b73705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636c6561725f7072656669783a3a68316233316432636466363861333664319e043770616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a73746172745f6572613a3a68636532633633346338376365643730369f043a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6830356138663363326366333334656261a004386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6836376236303463373839366331616638a104386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6865653532343637376330326166666234a2043870616c6c65745f7374616b696e673a3a736c617368696e673a3a6170706c795f736c6173683a3a6830663439626332363835646434613739a304d7023c70616c6c65745f7374616b696e673a3a4578706f737572654f663c543e2061732073705f72756e74696d653a3a7472616974733a3a436f6e766572743c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449642c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c70616c6c65745f7374616b696e673a3a4578706f737572653c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449642c3c3c542061732070616c6c65745f7374616b696e673a3a436f6e6669673e3a3a43757272656e6379206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3e3a3a636f6e766572743a3a6835373765636237633534383130646264a404386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6831383866363930333966343166666265a5046a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6862333461356338623336333566313038a6045f3c70616c6c65745f7374616b696e673a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6831353536383437643232316366383838a7044170616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a7072655f64697370617463685f636865636b733a3a6862386230356537643934313931303531a8047b70616c6c65745f7374616b696e673a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f7374616b696e673a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6830386566326266616264616138306538a904483c5b543b20335d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838353134653862616432373966636339aa04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6861356363396236356636646437313063ab048e013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6834643032636633643738643965366264ac04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6830346539653134663363343632336663ad0437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6836613734396135643330353230363164ae043870616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6b696c6c5f73746173683a3a6865396533376138303961323237323437af0491013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449643e3e3a3a72656d6f76655f6c6f636b3a3a6865303861343335323661643561653335b0043a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6833326233336332666234356337626137b104386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6866353437303536636132393638353961b2044870616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a636865636b5f616e645f7265706c6163655f736f6c7574696f6e3a3a6866653635393237643964363066653962b3047b3c73705f61726974686d657469633a3a7065725f7468696e67733a3a50657262696c6c2061732073705f61726974686d657469633a3a7065725f7468696e67733a3a5065725468696e673e3a3a66726f6d5f726174696f6e616c5f617070726f78696d6174696f6e3a3a6836643064363361386635373666353936b4043970616c6c65745f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a6835393230393262303032623361376130b504b4013c6672616d655f73797374656d3a3a4d6f64756c653c543e206173206672616d655f737570706f72743a3a7472616974733a3a53746f7265644d61703c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449642c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74446174613e3e3a3a7472795f6d75746174655f6578697374733a3a6833363266336236333430666137623334b60493013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a6837303764666137653065623231313136b7044373705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726561643a3a6839613036326336376635343533353232b804463c73705f6e706f735f656c656374696f6e733a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837646339386130323165663334326130b9046b3c636f72653a3a697465723a3a61646170746572733a3a526573756c745368756e743c492c453e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6830346230653435656665343731613965ba044073705f696e686572656e74733a3a436865636b496e686572656e7473526573756c743a3a7075745f6572726f723a3a6861313661353130363330346663373036bb042b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6837333663303234613263663462626265bc044b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6866366637666663666237363336633636bd044073705f696e686572656e74733a3a436865636b496e686572656e7473526573756c743a3a7075745f6572726f723a3a6863653763336130306265336237616366be046178636d3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a56657273696f6e656458636d3e3a3a6465636f64653a3a6835373663613730353965383733633164bf04543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837386337636261373130303731373335c004543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839323165636565346232343238356332c1046b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7536343e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862663964326632353136333335633661c2046178636d3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a56657273696f6e656458636d3e3a3a6465636f64653a3a6862383330656663653730633938663932c304543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839663931306135633463363934386230c404543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832306234653465333838663532623661c5046b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7536343e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838306266313638353136643530323139c604543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862633662316662333464653363396634c7043473705f72756e74696d653a3a7472616974733a3a486173683a3a686173685f6f663a3a6833396439356233353037363364663837c8043a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6835343734616265393263366535313537c9044973705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3132383a3a6861626633643839656164323630383763ca04463c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6836303937656262306363363536653835cb04493c5b543b2031365d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834613133303930626232313364316435cc0468636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4d75743c413e20666f7220266d757420463e3a3a63616c6c5f6d75743a3a6836656263363365363036303232313936cd0437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834333831663337653238646236323865ce042e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a6831663865346431353739363437353038cf0437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6838653436333062643662636235396563d00437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6863346332363435343731653437616531d104386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6838616561313464323464666238316563d20437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6863316236626164616663363236626163d304753c285475706c65456c656d656e74302c5475706c65456c656d656e743129206173206672616d655f737570706f72743a3a7472616974733a3a4f6e496e697469616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a6863663237643735386239663265656163d4043870616c6c65745f626162653a3a4d6f64756c653c543e3a3a646f5f696e697469616c697a653a3a6863323231316630633439656232303736d50497013c70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e2061732070616c6c65745f73657373696f6e3a3a4f6e6553657373696f6e48616e646c65723c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449643e3e3a3a6f6e5f6265666f72655f73657373696f6e5f656e64696e673a3a6835313936663138356330396238393632d60437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832303761656334623531613764353861d7044973705f696f3a3a6f6666636861696e5f696e6465783a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7365743a3a6835646231333136633361333233656462d80476726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220726f636f636f5f72756e74696d653a3a53657373696f6e4b6579733e3a3a6465636f64653a3a6864656461346365616636363735333136d90437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832306430303331666539333637633338da04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6839626361666532353330613730366331db044b70616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a50726f76696e67547269653c543e3a3a67656e65726174655f666f723a3a6864643764303232636466396263666234dc04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6861306638616131323934383837653139dd042b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6831373137626539653530303235643764de04a1013c285475706c65456c656d656e74302c5475706c65456c656d656e74312c5475706c65456c656d656e74322c5475706c65456c656d656e74332c5475706c65456c656d656e74342c5475706c65456c656d656e7435292061732070616c6c65745f73657373696f6e3a3a53657373696f6e48616e646c65723c4149643e3e3a3a6f6e5f6e65775f73657373696f6e3a3a6866353834353561396536363737613332df043c70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6839663835386337393836663963613632e0043e70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6834646132363137313639333662383366e104763c70616c6c65745f73657373696f6e3a3a5f5f4765744279746553747275637444697361626c656456616c696461746f72733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836356364363536656336656366326561e204703c70616c6c65745f73657373696f6e3a3a5f5f4765744279746553747275637443757272656e74496e6465783c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834393532646634323937653535616532e3045f3c70616c6c65745f73657373696f6e3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6835393733653762316266393261353461e4043c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6834643635313837353732663864333437e5043c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6832376230643331313239393432363638e6043c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6837373039356664386463386437333362e704593c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6865656330363264393838363530613263e804386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6835353834356162373436613136633635e904386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6836303131333832393465346639326132ea04543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866383834613239376665663261366233eb04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6836376534626530373739633235626461ec04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6836623166653862643138333662373963ed0437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6833643436316639663362383836663433ee04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6836663362323930626132653165393730ef049401706f6c6b61646f745f7072696d6974697665733a3a76313a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220706f6c6b61646f745f7072696d6974697665733a3a76313a3a43616e646964617465436f6d6d69746d656e74733c4e3e3e3a3a6465636f64653a3a6834323665616266356634313236643536f004386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6837626536336366656266383539623163f104386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838653066366362646566626539386337f20437616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6862636563653039326165383637313866f304386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6839303030646363333536386431336261f404bc01706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a43616e64696461746550656e64696e67417661696c6162696c6974793c482c4e3e3e3a3a6465636f64653a3a6830666264346337653961353033333433f504386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6839306635373734646635623938653035f604386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862323261343539333762616436323036f704386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862336164323864613132303632363630f804543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861306330393166656464613565653331f904386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6862376665336665633431346137666165fa04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6863343866306635656262346239656530fb04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6863663463336433626532313637653637fc04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864306165643538396263616639346637fd04543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866356637346164353836313562333562fe04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6864356365383736333263666165663863ff04386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68646130303532643239383531353334668005543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68386238316434366630326135346338338105386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6865373337646166623538356634646431820537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a68396638376663383436326533353362318305386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68663334323931383132363361363733658405543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683032383662623666333866643032383185053d616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276655f65786163743a3a68316134336363663864313964386530318605386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a686663643638653933353262363837333487053a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68303863633539346162656364623535338805386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68326531386163643537316232633234638905386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68326539323561656561633731656338368a05386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68353864613736643161653737393732318b05386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68356262343632653932633939633339618c05386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68373833623039623935393562353438318d05386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68376232333463336334346561313533338e05386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68376330323561393066616236636661628f053a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68306130306434373530633664386134389005386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a683931663232656231633836666332343291053a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a68633566316462353630303865666431309205386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6861663262616263623263363561666261930537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831316366316162393762323434626431940537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831363234336164336130376535653138950537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832666439613730363930373339383435960537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6834353766333939653466303239306631970537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6837663530636363336534626637346161980537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6839656131343332336235383639616131990537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a68623033366639646339336162333333309a0537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a68623135663936373235363531333432379b0537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a68626463373734313533623833396165649c0537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a68646234663134326563363262386465659d0537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a68646433313534363932643762626235629e05746672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a6765743a3a68333961303463656432613937623834359f0559706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a73657373696f6e5f696e666f3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6834623936646462663437666361303163a00587013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a73657373696f6e5f696e666f3a3a5f5f4765744279746553747275637453657373696f6e733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833623832663765323861323535363963a1055c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6833396361313564373233633661316438a205776672616d655f73797374656d3a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c6672616d655f73797374656d3a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6865643766373366303334613865303736a3057b70616c6c65745f6772616e6470613a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c70616c6c65745f6772616e6470613a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6837313139666334393237336530643562a405af01706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261735f7265676973747261723a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261735f7265676973747261723a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6834333438373165346633383139636164a505ab01706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a4572726f723c543e3e20666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a66726f6d3a3a6831316364666439333737383733353531a6054c73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a656432353531395f7665726966793a3a6830303262383161333330383632363335a7056073705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a736563703235366b315f65636473615f7265636f7665725f636f6d707265737365643a3a6865313566333137316466383533333563a805593c73705f72756e74696d653a3a44697370617463684572726f7257697468506f7374496e666f3c496e666f3e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6861666634383133356265666634383764a9055d3c73705f72756e74696d653a3a44697370617463684572726f7257697468506f7374496e666f3c543e20617320636f72653a3a636f6e766572743a3a46726f6d3c453e3e3a3a66726f6d3a3a6832383339323833336334656162303237aa053a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6833636532313639663363666439643765ab05723c73705f72756e74696d653a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834353432316631353634396539643634ac05723c73705f72756e74696d653a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834623831386233376633346165316535ad05303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835326263386630383735356166353864ae05303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835343533393938366561386538346135af05303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835626463393665623932623463353865b005383c2a636f6e7374205420617320636f72653a3a666d743a3a506f696e7465723e3a3a666d743a3a6862353463376232633064356538643465b1058d01706f6c6b61646f745f7072696d6974697665733a3a76313a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220706f6c6b61646f745f7072696d6974697665733a3a76313a3a5363686564756c6564436f72653e3a3a656e636f64655f746f3a3a6837366666633736386530623331313464b2059401706f6c6b61646f745f7072696d6974697665733a3a76313a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220706f6c6b61646f745f7072696d6974697665733a3a76313a3a43616e646964617465436f6d6d69746d656e74733c4e3e3e3a3a6465636f64653a3a6831376138393930633364303033353639b305543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838663535313566646564316163633862b4059301706f6c6b61646f745f7072696d6974697665733a3a76313a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220706f6c6b61646f745f7072696d6974697665733a3a76313a3a43616e64696461746544657363726970746f723c483e3e3a3a6465636f64653a3a6839373331343962393863343935623733b5059701706f6c6b61646f745f7072696d6974697665733a3a76313a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220706f6c6b61646f745f7072696d6974697665733a3a76313a3a43616e646964617465436f6d6d69746d656e74733c4e3e3e3a3a656e636f64655f746f3a3a6864646431643334343334353664303232b6053a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6834333462386161646534306430353163b7059a01706f6c6b61646f745f7072696d6974697665733a3a76313a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220706f6c6b61646f745f7072696d6974697665733a3a76313a3a50657273697374656456616c69646174696f6e446174613c4e3e3e3a3a656e636f64655f746f3a3a6833343961323138313035353538636662b8053a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6833353331366339383261353632633434b9050c436f72655f76657273696f6eba0512436f72655f657865637574655f626c6f636bbb05543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836333734663139313463646263383036bc055373705f696f3a3a747269653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3235365f6f7264657265645f726f6f743a3a6838306435363165376265663936353933bd055073705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a73746172745f62617463685f7665726966793a3a6861326534343864643237653730383963be05446672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a6838623765353266663039613834393364bf05713c285475706c65456c656d656e74302c5475706c65456c656d656e743129206173206672616d655f737570706f72743a3a7472616974733a3a4f6e46696e616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6832393832323565336262653963366264c0055173705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a66696e6973685f62617463685f7665726966793a3a6833633233373066336366306664393565c105346672616d655f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6864373563326561613366646138303261c20515436f72655f696e697469616c697a655f626c6f636bc305114d657461646174615f6d65746164617461c405693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6834623763336636366461616532356161c5051c426c6f636b4275696c6465725f6170706c795f65787472696e736963c6051b426c6f636b4275696c6465725f66696e616c697a655f626c6f636bc70520426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373c8056f3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864653663353835303061643230373665c905543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862646461303161326239313762383433ca05543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831613933376365666532363437663231cb05656269747665633a3a7665633a3a7472616974733a3a3c696d706c20636f72653a3a636c6f6e653a3a436c6f6e6520666f72206269747665633a3a7665633a3a4269745665633c4f2c543e3e3a3a636c6f6e653a3a6833363937636231666330376532376635cc05443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6839383435323966343636653330373737cd05443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6864363664386137353632646638613137ce05443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6861303433346666666239646435366432cf051c426c6f636b4275696c6465725f636865636b5f696e686572656e7473d00518426c6f636b4275696c6465725f72616e646f6d5f73656564d1052b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6ed2058e013c73705f72756e74696d653a3a67656e657269633a3a636865636b65645f65787472696e7369633a3a436865636b656445787472696e7369633c4163636f756e7449642c43616c6c2c45787472613e2061732073705f72756e74696d653a3a7472616974733a3a4170706c7961626c653e3a3a76616c69646174653a3a6830626535343065356430343336373434d305214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572d4054c73705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a69735f76616c696461746f723a3a6834663964626163643338616331373434d5055173705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7075626c69635f6b6579733a3a6832616263313534663035393036323462d605633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6839363137623836326333656365346537d705583c70616c6c65745f696d5f6f6e6c696e653a3a4f6666636861696e4572723c426c6f636b4e756d6265723e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830626662666232386431363361313835d8055173705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f63616c5f73746f726167655f6765743a3a6832373931666665643463346664313230d9055d73705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f63616c5f73746f726167655f636f6d706172655f616e645f7365743a3a6865373733373463323436643831356134da051850617261636861696e486f73745f76616c696461746f7273db05433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6861326131386535636230306466316564dc051e50617261636861696e486f73745f76616c696461746f725f67726f757073dd0559706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a4d6f64756c653c543e3a3a67726f75705f726f746174696f6e5f696e666f3a3a6861323961336133343964363030636337de052050617261636861696e486f73745f617661696c6162696c6974795f636f726573df055a706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a4d6f64756c653c543e3a3a6e6578745f75705f6f6e5f617661696c61626c653a3a6838353364323830356266323662646335e00559706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a4d6f64756c653c543e3a3a6e6578745f75705f6f6e5f74696d655f6f75743a3a6865323434323331313261363862633637e1055c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a4d6f64756c653c543e3a3a67726f75705f61737369676e65645f746f5f636f72653a3a6838326265646336653830643162643237e2053a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6865346663313938653464633563383665e3053a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6833363365366432366666353061386632e4053a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6835303562363737303864313237636139e5052250617261636861696e486f73745f66756c6c5f76616c69646174696f6e5f64617461e605633c54206173207061726974795f7363616c655f636f6465633a3a64657074685f6c696d69743a3a4465636f64654c696d69743e3a3a6465636f64655f616c6c5f776974685f64657074685f6c696d69743a3a6832393863323732383162353736336461e70567706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a72756e74696d655f6170695f696d706c3a3a76313a3a66756c6c5f76616c69646174696f6e5f646174613a3a7b7b636c6f737572657d7d3a3a6833383563663466363665633332626534e80551706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a4d6f64756c653c543e3a3a666f7263655f656e6163743a3a6839383635653430393661343565333437e9052750617261636861696e486f73745f7065727369737465645f76616c69646174696f6e5f64617461ea052650617261636861696e486f73745f636865636b5f76616c69646174696f6e5f6f757470757473eb056d706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a43616e646964617465436865636b436f6e746578743c543e3a3a636865636b5f76616c69646174696f6e5f6f7574707574733a3a6838323136303233363166343234393732ec05753c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a416363657074616e6365436865636b4572723c426c6f636b4e756d6265723e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6861313334353737313362643263326262ed052550617261636861696e486f73745f73657373696f6e5f696e6465785f666f725f6368696c64ee051d50617261636861696e486f73745f76616c69646174696f6e5f636f6465ef052850617261636861696e486f73745f686973746f726963616c5f76616c69646174696f6e5f636f6465f0052c50617261636861696e486f73745f63616e6469646174655f70656e64696e675f617661696c6162696c697479f1051e50617261636861696e486f73745f63616e6469646174655f6576656e7473f20570726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220726f636f636f5f72756e74696d653a3a4576656e743e3a3a6465636f64653a3a6862366435613131326264373733393363f3052b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6838366636663132623266633133636133f4052b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6865396134363963633534333766326162f50568636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4d75743c413e20666f7220266d757420463e3a3a63616c6c5f6d75743a3a6865376563313431613434666437623936f6053a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6865346662663537636234363531666261f7051a50617261636861696e486f73745f73657373696f6e5f696e666ff8052b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6865326630326236373039346136646263f9051a50617261636861696e486f73745f646d715f636f6e74656e7473fa052c50617261636861696e486f73745f696e626f756e645f68726d705f6368616e6e656c735f636f6e74656e7473fb05723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6866666635616438346636613535653030fc051e4772616e6470614170695f6772616e6470615f617574686f726974696573fd05543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6863373038343966653262396637343439fe0537616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6833636665356438656663356234336536ff05384772616e6470614170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e7369638006303c282920617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68343666316332393163353061313439388106274772616e6470614170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f6682064470616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a50726f76696e67547269653c543e3a3a70726f76653a3a6861376466616333373436616238656439830615426162654170695f636f6e66696775726174696f6e84061b426162654170695f63757272656e745f65706f63685f7374617274850624426162654170695f67656e65726174655f6b65795f6f776e6572736869705f70726f6f66860635426162654170695f7375626d69745f7265706f72745f65717569766f636174696f6e5f756e7369676e65645f65787472696e73696387068f0173705f636f6e73656e7375735f736c6f74733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f636f6e73656e7375735f736c6f74733a3a45717569766f636174696f6e50726f6f663c4865616465722c49643e3e3a3a6465636f64653a3a6835323662373839623339663034366435880621417574686f72697479446973636f766572794170695f617574686f72697469657389064570616c6c65745f617574686f726974795f646973636f766572793a3a4d6f64756c653c543e3a3a617574686f7269746965733a3a68316136326631656333313233663533308a062153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b6579738b064e73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a656432353531395f67656e65726174653a3a68666239316432386436636330356461328c064e73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f67656e65726174653a3a68303464643632343134386465613537668d061f53657373696f6e4b6579735f6465636f64655f73657373696f6e5f6b6579738e0638616c6c6f633a3a7665633a3a5665633c543e3a3a657874656e645f66726f6d5f736c6963653a3a68373333623262303566393735656264358f062e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a683864343066656639316334396365623090061d4163636f756e744e6f6e63654170695f6163636f756e745f6e6f6e63659106205472616e73616374696f6e5061796d656e744170695f71756572795f696e666f92064970616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a636f6d707574655f6665655f7261773a3a683165626433656639343562346433623993063e70616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683664306262363631633332323132306394064070616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a683330303839343462623430356362396195064970616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a686236323637336431326632646563376296069b013c70616c6c65745f74696d657374616d703a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4d696e696d756d506572696f6444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683065306330373866613936396135333197062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a68633734333263333937303264656332339806713c285475706c65456c656d656e74302c5475706c65456c656d656e743129206173206672616d655f737570706f72743a3a7472616974733a3a4f6e46696e616c697a653c426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68346566653832633764373765633964659906443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68636436656231653231373235383832329a06376672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a68393664646332323935326563633063389b063c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68616464376665636431306462633232619c064673705f61726974686d657469633a3a68656c706572735f3132386269743a3a6d756c7469706c795f62795f726174696f6e616c3a3a68613666643134643532373365363638349d06653c73705f61726974686d657469633a3a66697865645f706f696e743a3a46697865645531323820617320636f72653a3a6f70733a3a61726974683a3a4469763e3a3a6469763a3a7b7b636c6f737572657d7d3a3a68313938613635666537353138353362309e0657706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a4d6f64756c653c543e3a3a70726f636573735f6269746669656c64733a3a68393732333732626137393038663434389f0639636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a6839646537373666356331616136643839a00671706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a4d6f64756c653c543e3a3a617661696c6162696c6974795f74696d656f75745f7072656469636174653a3a7b7b636c6f737572657d7d3a3a6861653663643431373237643431363964a1062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6835613565633431623364393934326332a2062e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a6836383136653865356262323464663665a306766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a7365743a3a6864613638393436663239326237633962a406766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a7365743a3a6863613665613933396536346135663834a506766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a7365743a3a6834396338623061646130323762663563a60658706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a4d6f64756c653c543e3a3a70726f636573735f63616e646964617465733a3a6831386438643234343261636663333964a7063c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6862333134313735336133356535363631a806623c78636d5f6578656375746f723a3a58636d4578656375746f723c436f6e6669673e2061732078636d3a3a76303a3a7472616974733a3a4578656375746558636d3e3a3a657865637574655f78636d3a3a6830303465666230343863303735633337a906723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6862626236643333363366303032613165aa062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6839613931333239323734316639663333ab0680013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e5f696e686572656e743a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6835643334353437323662333930376639ac065d706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e5f696e686572656e743a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6863343337643739316436623366636438ad065f706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e5f696e686572656e743a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6861356331313863396466303264326536ae066b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861373338373533633733343332313465af063f73705f747269653a3a6e6f64655f6865616465723a3a656e636f64655f73697a655f616e645f7072656669783a3a6838383832363766306363343432393535b0067d7061726974795f7363616c655f636f6465633a3a6269745f7665633a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72206269747665633a3a7665633a3a4269745665633c4f2c543e3e3a3a6465636f64653a3a6833623062333331353330343861336562b106376269747665633a3a7665633a3a4269745665633c4f2c543e3a3a66726f6d5f736c6963653a3a6861323237353331653730313339646231b2064d6269747665633a3a7665633a3a6170693a3a3c696d706c206269747665633a3a7665633a3a4269745665633c4f2c543e3e3a3a7365745f6c656e3a3a6831356164373139616435313935653338b3067d7061726974795f7363616c655f636f6465633a3a6269745f7665633a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72206269747665633a3a7665633a3a4269745665633c4f2c543e3e3a3a6465636f64653a3a6864373137303931316635613063353435b406336269747665633a3a7665633a3a4269745665633c4f2c543e3a3a7265706561743a3a6835346435303964336662663338333832b5066b3c70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e2061732073705f72756e74696d653a3a7472616974733a3a56616c6964617465556e7369676e65643e3a3a76616c69646174655f756e7369676e65643a3a6835316639346561636263646365333536b6063d70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a69735f6f6e6c696e655f6175783a3a6864626432333737643966303266633939b7064d73705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6e6574776f726b5f73746174653a3a6837396631386562626462316163643236b8064a73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7369676e3a3a6864313464396662376161663463376265b906473c70616c6c65745f696d5f6f6e6c696e653a3a43616c6c3c543e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862643266613730653433353732636233ba065173705f696f3a3a6f6666636861696e3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6c6f63616c5f73746f726167655f7365743a3a6839666561663063323236356435656134bb06373c285431302c5431312920617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832316362393837383334633635306232bc06303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834666633333230653630336362306462bd06693c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832393862353537373636633566336462be06443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6861653962643061653661643530623534bf06437061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6865353665656239306335346535323735c0062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6832326337376562383161383637323863c1063e70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862343066333661633233653833626536c2064070616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6836336632323366333065333530613235c306613c70616c6c65745f696d5f6f6e6c696e653a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6833363766306634326162653166613766c4062e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a6834323836323530616237393337613934c5064e616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a636f6e7461696e735f6b65793a3a6861333731663839313835663061626332c60647616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a656e7472793a3a6866306564636463313736393237373762c7064b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6834666439643333663238653832326333c8062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6838623533623733376338363432613632c9063973705f6e706f735f656c656374696f6e733a3a6e6f64653a3a4e6f64653c413e3a3a726f6f743a3a6831666366633130353539633234386632ca064173705f6e706f735f656c656374696f6e733a3a6e6f64653a3a4e6f64653c413e3a3a69735f706172656e745f6f663a3a6831666332646438346432333334386661cb06723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6836303161383030333336396439303664cc065a6672616d655f73797374656d3a3a657874656e73696f6e733a3a636865636b5f7765696768743a3a436865636b5765696768743c543e3a3a646f5f7072655f64697370617463683a3a6838313734343961363165353731326266cd0686013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f737570706f72743a3a7472616974733a3a43757272656e63793c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a6835336563386336396432613239666137ce0695013c70616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a4d6f64756c653c543e206173206672616d655f737570706f72743a3a7472616974733a3a4b65794f776e657250726f6f6653797374656d3c2873705f636f72653a3a63727970746f3a3a4b65795479706549642c44293e3e3a3a636865636b5f70726f6f663a3a6861613761333335373637623561623134cf062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6837313731653236383033386433333665d006446672616d655f737570706f72743a3a7472616974733a3a43757272656e63793a3a7265736f6c76655f6372656174696e673a3a6835623261336130663666313333396534d1065373705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a56616c69645472616e73616374696f6e3a3a636f6d62696e655f776974683a3a6834633137326336636534346536646537d206566672616d655f73797374656d3a3a657874656e73696f6e733a3a636865636b5f7765696768743a3a436865636b5765696768743c543e3a3a646f5f76616c69646174653a3a6836663637613333393264383432353834d306623c73705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a496e76616c69645472616e73616374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862326432656634666666663237363234d4067b3c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a636f6e66696775726174696f6e3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6833656331393030363638343337396233d506c401706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a636f6e66696775726174696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a636f6e66696775726174696f6e3a3a486f7374436f6e66696775726174696f6e3c426c6f636b4e756d6265723e3e3a3a656e636f64655f746f3a3a6839306234626130386538386561643734d60658706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a636f6e66696775726174696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6833363262663366353536653931393032d7065a706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a636f6e66696775726174696f6e3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6862336263376532313766316238383764d8068c013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a636f6e66696775726174696f6e3a3a5f5f47657442797465537472756374416374697665436f6e6669673c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839336432316533623739656431636233d90687016672616d655f737570706f72743a3a776569676874733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72206672616d655f737570706f72743a3a776569676874733a3a4469737061746368496e666f3e3a3a6465636f64653a3a6863343564346630383132333631323835da0652616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a526f6f743c4b2c563e3a3a707573685f696e7465726e616c5f6c6576656c3a3a6831616665663062616230386165363437db0652616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a526f6f743c4b2c563e3a3a707573685f696e7465726e616c5f6c6576656c3a3a6866316565353833323233633463393831dc0647616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a526f6f743c4b2c563e3a3a6e65775f6c6561663a3a6832383639363662643532666264646233dd0647616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a526f6f743c4b2c563e3a3a6e65775f6c6561663a3a6866633936626166316137666366366666de063970616c6c65745f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6865396139353361646562316364646232df063b70616c6c65745f7375646f3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6838653733346366316537356661303964e0065c3c70616c6c65745f7375646f3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6838306433303639326432313663366464e1063d73705f61726974686d657469633a3a68656c706572735f3132386269743a3a746f5f6269675f75696e743a3a6830346165323437333335303736353462e2063773705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6d756c3a3a6832663665306666613934363063363936e30668636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4d75743c413e20666f7220266d757420463e3a3a63616c6c5f6d75743a3a6835653538666363396166643465303136e40646616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365743a3a42547265655365743c543e3a3a696e736572743a3a6831376138373635656235666466333834e50646616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365743a3a42547265655365743c543e3a3a696e736572743a3a6837386533633162633431303931333639e6062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6831363636663439356437666638333763e7064d3c78636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6863366133303765346366376161383635e8063d3c28292061732078636d3a3a76303a3a7472616974733a3a53656e6458636d3e3a3a73656e645f78636d3a3a6837666162383662656634383366653839e9063f78636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3a3a707573683a3a6863363064623532323864396164623432ea06a9013c78636d5f6275696c6465723a3a63757272656e63795f616461707465723a3a43757272656e6379416461707465723c43757272656e63792c4d6174636865722c4163636f756e744964436f6e7665727465722c4163636f756e7449643e2061732078636d5f6578656375746f723a3a7472616974733a3a5472616e7361637441737365743e3a3a77697468647261775f61737365743a3a6839323863373836373965373334386134eb064378636d5f6578656375746f723a3a6173736574733a3a4173736574733a3a73617475726174696e675f73756273756d653a3a6836633865313664306331663639353663ec062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6830636630366264303434643266383063ed067a3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a496e746f4974657261746f723e3a3a696e746f5f697465723a3a6861666166346261336134303833356464ee062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6838643465383234336432373361646636ef067a3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a496e746f4974657261746f723e3a3a696e746f5f697465723a3a6835396337663839363431613638653438f0062b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6839316462366666346231313162353932f106543c78636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833343137646432356132313230616539f20681013c78636d5f6578656375746f723a3a6173736574733a3a41737365747320617320636f72653a3a636f6e766572743a3a46726f6d3c616c6c6f633a3a7665633a3a5665633c78636d3a3a76303a3a6d756c74695f61737365743a3a4d756c746941737365743e3e3e3a3a66726f6d3a3a6838363564343537316231633636626639f3066f726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220726f636f636f5f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6866336231666262316363613963393932f4064578636d5f6578656375746f723a3a58636d4578656375746f723c436f6e6669673e3a3a657865637574655f656666656374733a3a6862393439316462396136383361383332f50630636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a68323033623933323030383435643235382e38343236f6064078636d5f6578656375746f723a3a6173736574733a3a4173736574733a3a73617475726174696e675f74616b653a3a6832626263643438383932643963626330f706723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6830616565623465633032353663616461f806723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832326461373437333533336162663037f906a8013c78636d5f6275696c6465723a3a63757272656e63795f616461707465723a3a43757272656e6379416461707465723c43757272656e63792c4d6174636865722c4163636f756e744964436f6e7665727465722c4163636f756e7449643e2061732078636d5f6578656375746f723a3a7472616974733a3a5472616e7361637441737365743e3a3a6465706f7369745f61737365743a3a6833356564323139646234333862643966fa066e3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a636c6f6e655f737562747265653a3a6835393061653965373437343938303134fb066e3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a636c6f6e655f737562747265653a3a6838336137366338363265386339643534fc0646616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a697465723a3a6831646234383639376438333562646134fd06583c78636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6838643765626664633833376462323961fe0645616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a6765743a3a6866333931333934326436363331396263ff064c78636d5f6578656375746f723a3a6173736574733a3a4173736574733a3a73617475726174696e675f73756273756d655f66756e6769626c653a3a6832336633383531343964646165373931800744616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365743a3a42547265655365743c543e3a3a697465723a3a683534633438623830653266333832383381076a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a68323936396636316463353665353762648207573c78636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e20617320636f72653a3a636d703a3a5061727469616c45713e3a3a65713a3a68623630326564383933336663636435348307753c78636d5f6275696c6465723a3a4c6f636174696f6e496e7665727465723c416e6365737472793e2061732078636d5f6578656375746f723a3a7472616974733a3a496e766572744c6f636174696f6e3e3a3a696e766572745f6c6f636174696f6e3a3a686531393137663563373136396438616584073978636d5f6578656375746f723a3a6173736574733a3a4173736574733a3a7265616e63686f723a3a68396631396134313537376630653333308507533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a5370656346726f6d497465723c542c493e3e3a3a66726f6d5f697465723a3a683032333834656439373236343434333286072b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a686366636339356666313433393465396287077c3c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261735f7375646f5f777261707065723a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6836356238636364343561393139373036880759706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261735f7375646f5f777261707065723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68316364633537376638626130643637318907766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a68306431363134383336396337626466668a073f70616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68646239363433366364643165643064338b074170616c6c65745f617574686f72736869703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68656130306562363639356366356635398c076d3c70616c6c65745f617574686f72736869703a3a5f5f47657442797465537472756374556e636c65733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68633164343238343737373139653461358d07623c70616c6c65745f617574686f72736869703a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a68633430363531626561336464373963348e07746672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e20666f7220473e3a3a6765743a3a68333434366534396162323266646635328f07553c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320636f72653a3a64656661756c743a3a44656661756c743e3a3a64656661756c743a3a68336636623533376135373663633235319007523c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a696e736572743a3a683836366231623130646233626337366691074470616c6c65745f73657373696f6e3a3a686973746f726963616c3a3a50726f76696e67547269653c543e3a3a71756572793a3a68373531656463623635346361343462369207366861736862726f776e3a3a6d61703a3a486173684d61703c4b2c562c533e3a3a6765743a3a6834326461373666643333303930343037930725747269655f64623a3a547269653a3a6765743a3a683738316364363534316636303637356294072b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a683932303935623238343637333766336595074d3c747269655f64623a3a7472696564623a3a5472696544423c4c3e20617320747269655f64623a3a547269653c4c3e3e3a3a6765745f776974683a3a683364666363373938653961303531396596073e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a68383130356232663030346162653938309707546269747665633a3a736c6963653a3a6170693a3a3c696d706c206269747665633a3a736c6963653a3a426974536c6963653c4f2c543e3e3a3a73706c69745f61743a3a68396633303965316462636563313836649807683c73705f636f6e73656e7375735f7672663a3a7363686e6f72726b656c3a3a56524650726f6f66206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864333066666637343164336530376463990782017061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72202850302c51302c5230293e3a3a656e636f64655f746f3a3a68646633643431353461383066346466329a07793c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261735f7265676973747261723a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a68333262363236653266356532336137319b0756706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261735f7265676973747261723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68396133626336303231613864663930379c0758706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261735f7265676973747261723a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68366631623962623233316432653435309d0785013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261735f7265676973747261723a3a5f5f47657442797465537472756374446562746f72733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68613639356364393734356635623735389e0789013c706f6c6b61646f745f72756e74696d655f636f6d6d6f6e3a3a70617261735f7265676973747261723a3a5f5f4765744279746553747275637450656e64696e67537761703c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68343465366265313363386532313964309f075b3c636f72653a3a726573756c743a3a526573756c743c542c453e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864376438616230653264313537323630a0074f3c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a6765743a3a6863666264633862303766663838346663a107533c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a656d706c6163653a3a6862393634356335316562343533663566a207386861736862726f776e3a3a6d61703a3a486173684d61703c4b2c562c533e3a3a656e7472793a3a6863633138623034343835333662373035a3073d6861736862726f776e3a3a6d61703a3a566163616e74456e7472793c4b2c562c533e3a3a696e736572743a3a6834663464326133313863623561386133a407523c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a72656d6f76653a3a6838326339303033333366303262396363a507543c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a636f6e7461696e733a3a6866633531653261376439343961626266a607583c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a41734861736844423c482c543e3e3a3a61735f686173685f64623a3a6866656666323961613263306237366462a7075c3c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a41734861736844423c482c543e3e3a3a61735f686173685f64625f6d75743a3a6836303261616632343163373432393238a807523c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844425265663c482c543e3e3a3a6765743a3a6864353831336266353238303364306133a907573c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844425265663c482c543e3e3a3a636f6e7461696e733a3a6832636662303664383863333261643338aa073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6830326665386366303134333031316432ab073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6831396161316532623339383538616635ac073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6831623431623662393163336361623734ad073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6833383635383935356232636265353262ae073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6835396430356436323637333065343037af073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6838633266346333326266656331356631b0073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6836643431613031306637356534393632b1073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6866623766373338633162383965363566b2073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6839323238336437396461356166303433b3073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6839363830313834323761633763323962b4073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6861623430653339613238393766323165b5073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6862306665373061373033326134366535b6073a7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573683a3a6864666632643464366632316362383336b707433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6830306235383430313031353961383464b807433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6863353662636263333138646433633563b907443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837363432633564646433313031383135ba07543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6835623230356530613131303039353630bb07840178636d3a3a76303a3a6d756c74695f61737365743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a6d756c74695f61737365743a3a4173736574496e7374616e63653e3a3a6465636f64653a3a6866343264323038643061373363383033bc07840178636d3a3a76303a3a6d756c74695f61737365743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a6d756c74695f61737365743a3a4173736574496e7374616e63653e3a3a6465636f64653a3a6832386333316630663135613866633036bd07543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866396366313730626532343538316261be07533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6866326663623963306134663865646631bf076c3c636f72653a3a697465723a3a61646170746572733a3a636861696e3a3a436861696e3c412c423e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6838356133383831613233386366623230c0072b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6863306438376230636438306562356631c107723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6839356136373536396231323733373665c207723c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a68726d703a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6830363562313532303036336265666138c3074b706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a68726d703a3a4d6f64756c653c543e3a3a7072756e655f68726d703a3a6837633133303637303836333537363731c407723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6836623735393564336235663031633338c5074f706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a68726d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6864386537353061623061343535343734c60751706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a68726d703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6835346363383666323333363964323930c70792013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a68726d703a3a5f5f4765744279746553747275637448726d704f70656e4368616e6e656c52657175657374734c6973743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864373864386332643336623132343430c8075b706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a68726d703a3a4d6f64756c653c543e3a3a696e697469616c697a65725f6f6e5f6e65775f73657373696f6e3a3a6864643639653133396563393939666164c907303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6836396661623962616138633236363063ca07303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6866633165326135666565393762393263cb073970616c6c65745f626162653a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6836376632623432656262306633376164cc073b70616c6c65745f626162653a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6832363831393961656335346131393166cd07723c70616c6c65745f626162653a3a5f5f47657442797465537472756374556e646572436f6e737472756374696f6e3c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835636538636562626664396363633136ce076b3c70616c6c65745f626162653a3a5f5f4765744279746553747275637452616e646f6d6e6573733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861323263656465306562333834623864cf074470616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6838396465376165383531316532643932d0079a013c70616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4578706563746564426c6f636b54696d6544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862643232653939383439333633373064d10796013c70616c6c65745f626162653a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a45706f63684475726174696f6e44656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835653666643836653533356234333963d207457363686e6f72726b656c3a3a706f696e74733a3a52697374726574746f426f74683a3a66726f6d5f636f6d707265737365643a3a6863626234326232663662386130306330d307407363686e6f72726b656c3a3a7672663a3a5652464f75747075743a3a6174746163685f696e7075745f686173683a3a6839393134663636633963633163316466d4072b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6862343866343566306539373339633266d5073c70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6837346532626662356662326634653665d6073e70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6866303539343564616335306663643432d707703c70616c6c65745f6772616e6470613a3a5f5f4765744279746553747275637443757272656e7453657449643c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833656532366163366134623238383562d807693c70616c6c65745f6772616e6470613a3a5f5f4765744279746553747275637453746174653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862326436643435623861333639396562d9075c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6865393931616633643364366536616539da07633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6839353635383135333137616233666332db07683c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a73697a655f68696e743a3a6831316138386330323261653636613765dc073d70616c6c65745f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6862386234376430376164343339316538dd07633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6830633563613563666234646166616266de07633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6837303939303434383632336330616132df07633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6862333634393238353862656162633766e007766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6861373334623535616566343338373330e107633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6835306239343766326633376130616534e207633c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6831643465643331303166633633353936e307723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6866343663633439343462383735393861e4072b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6837393061626338383332343236386330e5073673705f72756e74696d653a3a7472616974733a3a4f70617175654b6579733a3a6765743a3a6866356132373239363436383563353038e6075f3c70616c6c65745f6772616e6470613a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6830613438313633646364373935663964e7072b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6833396465326264373336336465333365e80750706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a756d703a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6861333165333736653065323936623137e9078c013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a756d703a3a5f5f4765744279746553747275637452656c61794469737061746368517565756553697a653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862383939316530383966386636636536ea0789013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a756d703a3a5f5f4765744279746553747275637452656c617944697370617463685175657565733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837343161363939346436383466663432eb07303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864613538363734646438633835653864ec0773726f636f636f5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220726f636f636f5f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6862343634643465313334356331666661ed073a6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6863666231383465383938646266663839ee073c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6833623961393964373362666334313133ef07703c6672616d655f73797374656d3a3a5f5f47657442797465537472756374457865637574696f6e50686173653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833303032373734663230363966633961f0076d3c6672616d655f73797374656d3a3a5f5f476574427974655374727563744576656e74546f706963733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862306633613035376662643735616565f107683c6672616d655f73797374656d3a3a5f5f476574427974655374727563744469676573743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863396533363030643232393738356333f207703c6672616d655f73797374656d3a3a5f5f4765744279746553747275637445787472696e73696373526f6f743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835633232666263653034633239316236f3076d3c6672616d655f73797374656d3a3a5f5f47657442797465537472756374426c6f636b5765696768743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838333464663366393831353564313631f407693c6672616d655f73797374656d3a3a5f5f476574427974655374727563744163636f756e743c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830303863356636353363666630316264f507456672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6834373330613234653036646263643061f60796013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b5765696768747344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866303963343961393132306633313063f70792013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a446257656967687444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861383563646163326463323362626230f80798013c6672616d655f73797374656d3a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b48617368436f756e7444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832643931366231343534353032386234f9074373705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726f6f743a3a6838613964653034343836313466623632fa074b73705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6368616e6765735f726f6f743a3a6830363766663766333165643331613631fb075d3c6672616d655f73797374656d3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6837326366363661313333383966336163fc077773705f72756e74696d655f696e746572666163653a3a706173735f62793a3a3c696d706c2073705f72756e74696d655f696e746572666163653a3a7761736d3a3a46726f6d46464956616c756520666f7220543e3a3a66726f6d5f6666695f76616c75653a3a6864653334386638356264653264313666fd073c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6838323037636337376261653431613261fe078f0173705f636f6e73656e7375735f736c6f74733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f636f6e73656e7375735f736c6f74733a3a45717569766f636174696f6e50726f6f663c4865616465722c49643e3e3a3a6465636f64653a3a6832323962643535616464333835353330ff0760706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a4d6f64756c653c543e3a3a696e697469616c697a65725f6f6e5f6e65775f73657373696f6e3a3a6866663333626135316630616130343333800839636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a6838363439323964333536623032656562810839636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a6866623464343565626437303864373563820858706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e697469616c697a65723a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68613038376637346438626633643664318308773c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a4d6f64756c653c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a6830616239303736366136623032643632840855706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a4d6f64756c653c543e3a3a656e6163745f63616e6469646174653a3a68386264356632373661623937383333308508673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6834613932653836303135376634653463860856706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6831353765383839386630653339636663870886013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a696e636c7573696f6e3a3a5f5f4765744279746553747275637456616c696461746f72733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686131656261613966306533313338376688083d70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7570646174655f6c6f636b733a3a683131666465616366353664663261633889083c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a68636632393263316362313163353664648a083f70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a68646234336563356133303832666566398b084170616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f726167655f6d657461646174613a3a68373164643832323063316261613131368c086c3c70616c6c65745f62616c616e6365733a3a5f5f476574427974655374727563744c6f636b733c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68663232383366386438636563313933358d086e3c70616c6c65745f62616c616e6365733a3a5f5f476574427974655374727563744163636f756e743c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68646436656430356539663539313538368e084a70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68353432343862383839336564363362658f08a3013c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4578697374656e7469616c4465706f73697444656661756c74427974654765747465723c542c493e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68323133323030663535326639363966359008623c70616c6c65745f62616c616e6365733a3a4d6f64756c653c542c493e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a68633137623131383038646564633462669108466672616d655f737570706f72743a3a776569676874733a3a576569676874546f466565506f6c796e6f6d69616c3a3a63616c633a3a683334306361376234323030353563333992084a70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6863646461643463323635386562336437930881013c70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a5f5f476574427974655374727563744e6578744665654d756c7469706c6965723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683638333332363831323237653565323894085370616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68643839653161393766393032366339309508a3013c70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a576569676874546f46656544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68363636306431653638316338613838349608aa013c70616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5472616e73616374696f6e4279746546656544656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862376438386334323337363731656261970856706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a6865346234613438623066656435306434980885013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a5f5f476574427974655374727563745363686564756c65643c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683231323238356263616632373031353399088d013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a5f5f47657442797465537472756374417661696c6162696c697479436f7265733c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68386663386339353438353130356661379a088b013c706f6c6b61646f745f72756e74696d655f70617261636861696e733a3a7363686564756c65723a3a5f5f476574427974655374727563745061726174687265616451756575653c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68353766326637306536643562396462389b08766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a7365743a3a68346639373239366463663033366164399c083c70616c6c65745f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68393730356464643961323636666462399d083e70616c6c65745f696e64696365733a3a4d6f64756c653c543e3a3a73746f726167655f6d657461646174613a3a68393532366162363430363439333265329e084770616c6c65745f696e64696365733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a68356430633764666537373138336535309f0893013c70616c6c65745f696e64696365733a3a4d6f64756c653c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a4465706f73697444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838663332646665366330636231383663a00835736d616c6c7665633a3a536d616c6c5665633c413e3a3a7472795f726573657276653a3a6835306531373464396264656137393264a108723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6836386265623438326161643863316533a20848616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6839333562333961653163306533323661a30841616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365617263683a3a7365617263685f747265653a3a6838646238386163326432633466653264a4084f3c78636d5f6578656375746f723a3a6173736574733a3a4173736574496420617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6838356334633033333339623536646666a5083570616c6c65745f7374616b696e673a3a736c617368696e673a3a646f5f736c6173683a3a6863656436653036653434386361666361a60846616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365743a3a42547265655365743c543e3a3a696e736572743a3a6863623064366165303036343637396136a708513c78636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e20617320636f72653a3a636d703a3a5061727469616c45713e3a3a65713a3a68386539396337373230313731663636372e39333933a808443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6862623266643863323737383965653361a90837616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6831383332313038623935373563376331aa083a73705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6c73747269703a3a6839336262623839373734316661353139ab084473705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6469763a3a7b7b636c6f737572657d7d3a3a6864646662643765306364303466653731ac083773705f61726974686d657469633a3a62696775696e743a3a42696755696e743a3a6164643a3a6838343965353162383831633062363564ad083d3c5420617320636f72653a3a636f6e766572743a3a547279496e746f3c553e3e3a3a7472795f696e746f3a3a6864373839326135353534356338663632ae08413c73705f696e686572656e74733a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862366135336431626162313734656332af08543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864366432393263616230306439353964b0087773705f72756e74696d655f696e746572666163653a3a706173735f62793a3a3c696d706c2073705f72756e74696d655f696e746572666163653a3a7761736d3a3a496e746f46464956616c756520666f7220543e3a3a696e746f5f6666695f76616c75653a3a6866346430376663336336336465643934b1084573705f696f3a3a616c6c6f6361746f723a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a667265653a3a6839346233313734383737643639326335b2084773705f696f3a3a616c6c6f6361746f723a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6d616c6c6f633a3a6862373064616365616436626534373935b308323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6834376635313837633934666638636333b408303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838646365623936646633656237373462b5082e616c6c6f633a3a7665633a3a5665633c543e3a3a726573657276653a3a6832343538616435363136376165626130b608573c73705f72756e74696d653a3a72756e74696d655f737472696e673a3a52756e74696d65537472696e6720617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6836613830623235353631633731643331b70856747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a707573683a3a6861633637616663343135323630623839b80834736d616c6c7665633a3a536d616c6c5665633c413e3a3a66726f6d5f736c6963653a3a6834336364363232356266316236373832b9084478636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3a3a74616b655f6c6173743a3a6838333365666138346235303165656666ba08303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832373234326434396432393963326230bb08303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864373131326161633636643965393861bc08303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831306133373066393436303935666339bd082b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6863393464663035333034643235636238be08463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6835633137623839323663633530383538bf082b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6862613533663535383965663761616431c008303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837633037366266666461363832653332c108303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864356335316638333734613264653863c2083a78636d5f6578656375746f723a3a6173736574733a3a417373657449643a3a7265616e63686f723a3a6861653962353633306463353465626231c308533c78636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68633661333037653463663761613836352e3132303537c408443c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6835316135386339393730313339366361c5084b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6864376563306164663732303664373838c608095f5f6c736872746933c708095f5f756d6f64746933c808095f5f75646976746933c908066d656d637079ca08076d656d6d6f7665cb08066d656d736574cc080462636d70cd08095f5f6173686c746933ce08085f5f6d756c746933cf083d636f6d70696c65725f6275696c74696e733a3a696e743a3a756469763a3a5f5f756469766d6f647469343a3a686463383935636135313535323938376500550970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d62790105727573746325312e34392e302d6e696768746c79202832356338633533646420323032302d31302d303329", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a00d3cb0425699a66772616e804bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f5bc812467e867ac7061726180669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee816": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x2062475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a040402a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b1602ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a008062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da914076ec446ba6876ba5cb99bdb7129be8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47": "0x000000000100000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x2818726f636f636f", + "0xcec5070d609dd3497f72bde07fc96ba0ff3ae12770bea2e48d9bde7385e7a25f": "0x0000000002000000", + "0x2762c81376aaa894b6f64c67e58cc650878d434d6125b40443fe11fd292d13a4": "0x00000800", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a31727416d0095b96772616e80e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0x3fba98689ebed1138735e0e7a5a790ab878d434d6125b40443fe11fd292d13a4": "0x0000081b", + "0x5c0d1176a568c1f92944340dbfed9e9c878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3328718e032416872520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a": "0xfcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee81668bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80df6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19508248d97b4996007070617261806a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac01": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e887ec3d30b64e896173676e80481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195043d506aedab0d2ce696d6f6e8048a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xd8bbe27baf3aa64bb483afabc240f68e878d434d6125b40443fe11fd292d13a4": "0x0000081b", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb393c0875f4080dabc8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47": "0x4ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dccda6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa834992156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507d9c46786caf74af6261626580d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bad35ce880ec90d4696d6f6e80c4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3c25dd840975e8979fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00": "0x4bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11ffab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f", + "0x1cb6f36e027abb2091cfb5110ab5087f878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195012b62e212b6a7a9c696d6f6e808e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e592f5ef74f560666173676e8068bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80d": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f7aec8a47707294b61756469802c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xe246ba972f494475d003f3da3e57da21878d434d6125b40443fe11fd292d13a4": "0x00000800", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d560e0b6940e074462475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a": "0x0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfaa076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed3586975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef7430e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477bf49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c", + "0x5f3e4907f716ac89b6347d15ececedca878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99677d775b618280f5c76d192b43ea38c38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404": "0x000000000100000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950deeb3985cefbdfa47061726180882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3dc18ebe8d771cfa002ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864": "0xd9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5bc4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff351efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c4c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a", + "0x06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385": "0x580200002c010000b004000000005000008000000000200300000000000000001400000004000000040000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b483908290ae9b936c519917440306ea62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a": "0x000000000100000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503eaa3e59477bc9506261626580720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950585cf1f6f8e46326696d6f6e8086975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef743": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0x5f3e4907f716ac89b6347d15ececedca5579297f4dfb9609e7e4c2ebab9ce40a": "0x00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195043f25e7a03a30387696d6f6e8092156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950636f684eb09a15046772616e80d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e193783dd6b845ea6173676e80ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477b": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0xcec5070d609dd3497f72bde07fc96ba0878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0x3f1467a096bcd71a5b6a0c8155e20810878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d1e1b030b162ca447061726180042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950feca8028a77ba7626772616e804ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90d10cc4959af6a68eba3bc06d5c7bc28520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a": "0x000000000100000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x63f78c98723ddc9073523ef3beefda0c878d434d6125b40443fe11fd292d13a4": "0x00000800", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195021e85cbadb3ce9a26772616e806c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c81": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195054435a901133fb946173676e8016c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950149cf457032f53e57061726180d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d": "0x8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47", + "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x20f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3cf6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f3492c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950091b1bd4e8d4c12061756469802496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e7240ce913e160eb6261626580bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0x2b06af9719ac64d755623cda8ddd9b94878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0x5f3e4907f716ac89b6347d15ececedca28dccb559b95c40168a1b2696581b5a7": "0x00000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507acca078b878d43a70617261801efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da942cd783ab1dc80a5347fe6c6f20ea02b9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00": "0x0000000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb33bb8d7990ae3975438f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404": "0x36be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe218e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b752496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500a3d203cf823b13d6173676e80821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b75": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xf5207f03cfdce586301014700e2c2593878d434d6125b40443fe11fd292d13a4": "0x00000800", + "0x5f3e4907f716ac89b6347d15ececedcaad811cd65a470ddc5f1d628ff0550982b4def25cfda6ef3a00000000": "0x00000000", + "0x5f3e4907f716ac89b6347d15ececedca0b6a45321efae92aea15e0740ec7afe7": "0x00000000", + "0x5f3e4907f716ac89b6347d15ececedcac29a0310e1bb45d20cace77ccb62c97d": "0x00000000", + "0x5f3e4907f716ac89b6347d15ececedcaf7dad0317324aecae8744b87fc95f2f3": "0x00", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ee41af0530f856db6772616e8036be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4": "0x38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501b1525326b5d47776772616e80fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0x5f3e4907f716ac89b6347d15ececedcab49a2738eeb30896aacb8b3fb46471bd": "0x00000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ef9482dba3e5b0d862616265807c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813": "0x02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da995445d4efb6eae1971fb125f6190c49202a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16": "0x000000000100000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x6a0da05ca59913bc38a8630590f2627c878d434d6125b40443fe11fd292d13a4": "0x00000800", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a606acaa4558183a2102457959a213a192ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f": "0x000000000100000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x2086975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef74348a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae86298788e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2cd2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1ac4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca65192156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950776743a4ae520892617564698064d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0xcd710b30bd2eab0352ddcc26417aa194878d434d6125b40443fe11fd292d13a4": "0x00000800", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503c0791148c7780b8626162658038757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f": "0x520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195097e3e605d1b3579b6173676e804c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22": "0x02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864", + "0x26aa394eea5630e07c48ae0c9558cef7878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0x2099d7f109d6e535fb000bba623fd440878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0x2f85f1e1378cb2d7b83adbaf0b5869c2878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0x3a6772616e6470615f617574686f726974696573": "0x01200e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa0100000000000000fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d0100000000000000e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1010000000000000036be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef401000000000000006c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c810100000000000000d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc3301000000000000004bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf1401000000000000004ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc0100000000000000", + "0x5f3e4907f716ac89b6347d15ececedcaea07de2b8f010516dca3f7ef52f7ac5a": "0x040000000000000000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f8df002813b43b80696d6f6e80560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0x5f3e4907f716ac89b6347d15ececedca487df464e44a534ba6b0cbb32407b587": "0x0000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3df32aff68041374f02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16": "0x6c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c817c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac0116c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531", + "0x31a3a2ce3603138b8b352e8f192ca55a878d434d6125b40443fe11fd292d13a4": "0x00000800", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507f532159f03d44eb6175646980f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501e69501baac264d4696d6f6e80ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0x3db7a24cfdc9de785974746c14a99df9878d434d6125b40443fe11fd292d13a4": "0x00000800", + "0xd57bce545fb382c34570e5dfbf338f5e878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195012fefbc5e5cee2846173676e80fab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f": "0xfa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00", + "0x1a736d37504c2e3fb73dad160c55b291878d434d6125b40443fe11fd292d13a4": "0x02000000", + "0x2371e21684d2fae99bcb4d579242f74ad47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", + "0x5f3e4907f716ac89b6347d15ececedcaac0a2cbf8e355f5ea6cb2de8727bfb0c": "0x54000000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195009ab51029a10e53570617261800e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205": "0x62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da945315c068df2baa1c677b9b3e81f7439fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00": "0x000000000100000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0xa6b4d5720c90ecd39576e0b9b422f799878d434d6125b40443fe11fd292d13a4": "0x00000800", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502d2937d2d9650f057061726180a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037": "0x92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f", + "0xd5c41b52a371aa36c9254ce34324f2a5878d434d6125b40443fe11fd292d13a4": "0x02000000" + }, + "childrenDefault": {} + } + } +} diff --git a/service/res/westend.json b/node/service/res/westend.json similarity index 100% rename from service/res/westend.json rename to node/service/res/westend.json diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index 6a21478e2f21e7769aeeba1988cde4648d1df517..67dece91f3c9ee108888206b68b244e07bd27d2b 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -16,28 +16,31 @@ //! Polkadot chain configurations. -use sp_core::{Pair, Public, crypto::UncheckedInto, sr25519}; -use polkadot_primitives::v1::{AccountId, AccountPublic, ValidatorId}; -use polkadot_runtime as polkadot; +use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; +use babe_primitives::AuthorityId as BabeId; +use grandpa::AuthorityId as GrandpaId; +use hex_literal::hex; +use kusama::constants::currency::DOTS as KSM; use kusama_runtime as kusama; -use westend_runtime as westend; +use pallet_im_online::sr25519::AuthorityId as ImOnlineId; +use pallet_staking::Forcing; use polkadot::constants::currency::DOTS; -use kusama::constants::currency::DOTS as KSM; -use westend::constants::currency::DOTS as WND; +use polkadot_primitives::v1::{AccountId, AccountPublic, ValidatorId, AssignmentId}; +use polkadot_runtime as polkadot; +use rococo_runtime as rococo; +use rococo_runtime::constants::currency::DOTS as ROC; use sc_chain_spec::{ChainSpecExtension, ChainType}; +use serde::{Deserialize, Serialize}; +use sp_core::{crypto::UncheckedInto, sr25519, Pair, Public}; use sp_runtime::{traits::IdentifyAccount, Perbill}; -use serde::{Serialize, Deserialize}; use telemetry::TelemetryEndpoints; -use hex_literal::hex; -use babe_primitives::AuthorityId as BabeId; -use grandpa::AuthorityId as GrandpaId; -use pallet_im_online::sr25519::{AuthorityId as ImOnlineId}; -use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; -use pallet_staking::Forcing; +use westend::constants::currency::DOTS as WND; +use westend_runtime as westend; const POLKADOT_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; const KUSAMA_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; const WESTEND_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; +const ROCOCO_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; const DEFAULT_PROTOCOL_ID: &str = "dot"; /// Node `ChainSpec` extensions. @@ -53,64 +56,129 @@ pub struct Extensions { pub bad_blocks: sc_client_api::BadBlocks, } -/// The `ChainSpec parametrised for polkadot runtime`. -pub type PolkadotChainSpec = service::GenericChainSpec< - polkadot::GenesisConfig, - Extensions, ->; +/// The `ChainSpec` parametrised for the polkadot runtime. +pub type PolkadotChainSpec = service::GenericChainSpec; + +/// The `ChainSpec` parametrised for the kusama runtime. +pub type KusamaChainSpec = service::GenericChainSpec; -/// The `ChainSpec parametrised for kusama runtime`. -pub type KusamaChainSpec = service::GenericChainSpec< - kusama::GenesisConfig, - Extensions, ->; +/// The `ChainSpec` parametrised for the westend runtime. +pub type WestendChainSpec = service::GenericChainSpec; -/// The `ChainSpec parametrised for westend runtime`. -pub type WestendChainSpec = service::GenericChainSpec< - westend::GenesisConfig, - Extensions, ->; +/// The `ChainSpec` parametrized for the rococo runtime. +pub type RococoChainSpec = service::GenericChainSpec; + +/// Extension for the Rococo genesis config to support a custom changes to the genesis state. +#[derive(serde::Serialize, serde::Deserialize)] +pub struct RococoGenesisExt { + /// The runtime genesis config. + runtime_genesis_config: rococo::GenesisConfig, + /// The session length in blocks. + /// + /// If `None` is supplied, the default value is used. + session_length_in_blocks: Option, +} + +impl sp_runtime::BuildStorage for RococoGenesisExt { + fn assimilate_storage( + &self, + storage: &mut sp_core::storage::Storage, + ) -> Result<(), String> { + sp_state_machine::BasicExternalities::execute_with_storage(storage, || { + if let Some(length) = self.session_length_in_blocks.as_ref() { + rococo::constants::time::EpochDurationInBlocks::set(length); + } + }); + self.runtime_genesis_config.assimilate_storage(storage) + } +} pub fn polkadot_config() -> Result { - PolkadotChainSpec::from_json_bytes(&include_bytes!("../../../service/res/polkadot.json")[..]) + PolkadotChainSpec::from_json_bytes(&include_bytes!("../res/polkadot.json")[..]) } pub fn kusama_config() -> Result { - KusamaChainSpec::from_json_bytes(&include_bytes!("../../../service/res/kusama.json")[..]) + KusamaChainSpec::from_json_bytes(&include_bytes!("../res/kusama.json")[..]) } pub fn westend_config() -> Result { - PolkadotChainSpec::from_json_bytes(&include_bytes!("../../../service/res/westend.json")[..]) + PolkadotChainSpec::from_json_bytes(&include_bytes!("../res/westend.json")[..]) +} + +pub fn rococo_config() -> Result { + PolkadotChainSpec::from_json_bytes(&include_bytes!("../res/rococo.json")[..]) } fn polkadot_session_keys( babe: BabeId, grandpa: GrandpaId, im_online: ImOnlineId, - parachain_validator: ValidatorId, - authority_discovery: AuthorityDiscoveryId + para_validator: ValidatorId, + para_assignment: AssignmentId, + authority_discovery: AuthorityDiscoveryId, ) -> polkadot::SessionKeys { - polkadot::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } + polkadot::SessionKeys { + babe, + grandpa, + im_online, + para_validator, + para_assignment, + authority_discovery, + } } fn kusama_session_keys( babe: BabeId, grandpa: GrandpaId, im_online: ImOnlineId, - parachain_validator: ValidatorId, - authority_discovery: AuthorityDiscoveryId + para_validator: ValidatorId, + para_assignment: AssignmentId, + authority_discovery: AuthorityDiscoveryId, ) -> kusama::SessionKeys { - kusama::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } + kusama::SessionKeys { + babe, + grandpa, + im_online, + para_validator, + para_assignment, + authority_discovery, + } } fn westend_session_keys( babe: BabeId, grandpa: GrandpaId, im_online: ImOnlineId, - parachain_validator: ValidatorId, - authority_discovery: AuthorityDiscoveryId + para_validator: ValidatorId, + para_assignment: AssignmentId, + authority_discovery: AuthorityDiscoveryId, ) -> westend::SessionKeys { - westend::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } + westend::SessionKeys { + babe, + grandpa, + im_online, + para_validator, + para_assignment, + authority_discovery, + } +} + +fn rococo_session_keys( + babe: BabeId, + grandpa: GrandpaId, + im_online: ImOnlineId, + para_validator: ValidatorId, + para_assignment: AssignmentId, + authority_discovery: AuthorityDiscoveryId +) -> rococo_runtime::SessionKeys { + rococo_runtime::SessionKeys { + babe, + grandpa, + im_online, + para_validator, + para_assignment, + authority_discovery, + } } fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { @@ -124,7 +192,8 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene GrandpaId, ImOnlineId, ValidatorId, - AuthorityDiscoveryId + AssignmentId, + AuthorityDiscoveryId, )> = vec![]; const ENDOWMENT: u128 = 1_000_000 * DOTS; @@ -136,32 +205,50 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene changes_trie_config: Default::default(), }), pallet_balances: Some(polkadot::BalancesConfig { - balances: endowed_accounts.iter() + balances: endowed_accounts + .iter() .map(|k: &AccountId| (k.clone(), ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }), - pallet_indices: Some(polkadot::IndicesConfig { - indices: vec![], - }), + pallet_indices: Some(polkadot::IndicesConfig { indices: vec![] }), pallet_session: Some(polkadot::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - polkadot_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), + keys: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + polkadot_session_keys( + x.2.clone(), + x.3.clone(), + x.4.clone(), + x.5.clone(), + x.6.clone(), + x.7.clone(), + ), + ) + }) + .collect::>(), }), pallet_staking: Some(polkadot::StakingConfig { validator_count: 50, minimum_validator_count: 4, stakers: initial_authorities .iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, polkadot::StakerStatus::Validator)) + .map(|x| { + ( + x.0.clone(), + x.1.clone(), + STASH, + polkadot::StakerStatus::Validator, + ) + }) .collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), force_era: Forcing::ForceNone, slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() + ..Default::default() }), pallet_elections_phragmen: Some(Default::default()), pallet_democracy: Some(Default::default()), @@ -177,21 +264,18 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene pallet_babe: Some(Default::default()), pallet_grandpa: Some(Default::default()), pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { - keys: vec![], - }), + pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![] }), claims: Some(polkadot::ClaimsConfig { claims: vec![], vesting: vec![], }), - pallet_vesting: Some(polkadot::VestingConfig { - vesting: vec![], - }), + pallet_vesting: Some(polkadot::VestingConfig { vesting: vec![] }), + pallet_treasury: Some(Default::default()), } } fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { -// subkey inspect "$SECRET" + // subkey inspect "$SECRET" let endowed_accounts = vec![ // 5ENpP27BrVdJTdUfY6djmcw3d3xEJ6NzSUU52CCPmGpMrdEY hex!["6648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f7342"].into(), @@ -201,7 +285,7 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi // for i in 1 2 3 4; do for j in babe; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done // for i in 1 2 3 4; do for j in grandpa; do subkey --ed25519 inspect "$SECRET//$i//$j"; done; done // for i in 1 2 3 4; do for j in im_online; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in parachains; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done + // for i in 1 2 3 4; do for j in para_validator para_assignment; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done let initial_authorities: Vec<( AccountId, AccountId, @@ -209,68 +293,106 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi GrandpaId, ImOnlineId, ValidatorId, - AuthorityDiscoveryId - )> = vec![( - // 5FZoQhgUCmqBxnkHX7jCqThScS2xQWiwiF61msg63CFL3Y8f - hex!["9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d"].into(), - // 5ExdKyXFhtrjiFhexnyQPDyGSP8xU9qHc4KDwVrtWxaP2RP6 - hex!["8011fb3641f0641f5570ba8787a64a0ff7d9c9999481f333d7207c4abd7e981c"].into(), - // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 - hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(), - // 5FSscBiPfaPaEhFbAt2qRhcYjryKBKf714X76F5nFfwtdXLa - hex!["959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd652"].unchecked_into(), - // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 - hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(), - // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 - hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(), - // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 - hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(), - ),( - // 5G1ojzh47Yt8KoYhuAjXpHcazvsoCXe3G8LZchKDvumozJJJ - hex!["aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934"].into(), - // 5GeoZ1Mzix6Xnj32X8Xpj7q89X1SQHU5XTK1cnUVNXKTvXdK - hex!["caf27345aebc2fefeca85c9a67f4859eab3178d28ef92244714402290f3f415a"].into(), - // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 - hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(), - // 5Hpn3HVViECsuxMDFtinWjRj2dNfpRp1kB24nZHvQCJsSUek - hex!["feca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff93"].unchecked_into(), - // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 - hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(), - // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 - hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(), - // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 - hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(), - ),( - // 5HYYWyhyUQ7Ae11f8fCid58bhJ7ikLHM9bU8A6Ynwoc3dStR - hex!["f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836"].into(), - // 5DnUXT3xiQn6ZRttFT6eSCJbT9P2tiLdexr5WsvnbLG8igqW - hex!["4c17a9bfdd19411f452fa32420fa7acab622e87e57351f4ba3248ae40ce75123"].into(), - // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure - hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(), - // 5Hmvd2qjb1zatrJTkPwgFicxPfZuwaTwa2L7adSRmz6mVxfb - hex!["fc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a91956"].unchecked_into(), - // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure - hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(), - // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure - hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(), - // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure - hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(), - ),( - // 5CFPcUJgYgWryPaV1aYjSbTpbTLu42V32Ytw1L9rfoMAsfGh - hex!["08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d"].into(), - // 5F6z64cYZFRAmyMUhp7rnge6jaZmbY6o7XfA9czJyuAUiaFD - hex!["8671d451c3d4f6de8c16ea0bc61cf714914d6b2ffa2899872620525419327478"].into(), - // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD - hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(), - // 5FgBijJLL6p7nDZgQed56L3BM7ovgwc4t4FYsv9apYtRGAGv - hex!["9fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2d"].unchecked_into(), - // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD - hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(), - // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD - hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(), - // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD - hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(), - )]; + AssignmentId, + AuthorityDiscoveryId, + )> = vec![ + ( + // 5FZoQhgUCmqBxnkHX7jCqThScS2xQWiwiF61msg63CFL3Y8f + hex!["9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d"].into(), + // 5ExdKyXFhtrjiFhexnyQPDyGSP8xU9qHc4KDwVrtWxaP2RP6 + hex!["8011fb3641f0641f5570ba8787a64a0ff7d9c9999481f333d7207c4abd7e981c"].into(), + // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 + hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"] + .unchecked_into(), + // 5FSscBiPfaPaEhFbAt2qRhcYjryKBKf714X76F5nFfwtdXLa + hex!["959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd652"] + .unchecked_into(), + // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 + hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"] + .unchecked_into(), + // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 + hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"] + .unchecked_into(), + // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 + hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"] + .unchecked_into(), + // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 + hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"] + .unchecked_into(), + ), + ( + // 5G1ojzh47Yt8KoYhuAjXpHcazvsoCXe3G8LZchKDvumozJJJ + hex!["aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934"].into(), + // 5GeoZ1Mzix6Xnj32X8Xpj7q89X1SQHU5XTK1cnUVNXKTvXdK + hex!["caf27345aebc2fefeca85c9a67f4859eab3178d28ef92244714402290f3f415a"].into(), + // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 + hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"] + .unchecked_into(), + // 5Hpn3HVViECsuxMDFtinWjRj2dNfpRp1kB24nZHvQCJsSUek + hex!["feca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff93"] + .unchecked_into(), + // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 + hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"] + .unchecked_into(), + // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 + hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"] + .unchecked_into(), + // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 + hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"] + .unchecked_into(), + // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 + hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"] + .unchecked_into(), + ), + ( + // 5HYYWyhyUQ7Ae11f8fCid58bhJ7ikLHM9bU8A6Ynwoc3dStR + hex!["f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836"].into(), + // 5DnUXT3xiQn6ZRttFT6eSCJbT9P2tiLdexr5WsvnbLG8igqW + hex!["4c17a9bfdd19411f452fa32420fa7acab622e87e57351f4ba3248ae40ce75123"].into(), + // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure + hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"] + .unchecked_into(), + // 5Hmvd2qjb1zatrJTkPwgFicxPfZuwaTwa2L7adSRmz6mVxfb + hex!["fc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a91956"] + .unchecked_into(), + // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure + hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"] + .unchecked_into(), + // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure + hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"] + .unchecked_into(), + // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure + hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"] + .unchecked_into(), + // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure + hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"] + .unchecked_into(), + ), + ( + // 5CFPcUJgYgWryPaV1aYjSbTpbTLu42V32Ytw1L9rfoMAsfGh + hex!["08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d"].into(), + // 5F6z64cYZFRAmyMUhp7rnge6jaZmbY6o7XfA9czJyuAUiaFD + hex!["8671d451c3d4f6de8c16ea0bc61cf714914d6b2ffa2899872620525419327478"].into(), + // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD + hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"] + .unchecked_into(), + // 5FgBijJLL6p7nDZgQed56L3BM7ovgwc4t4FYsv9apYtRGAGv + hex!["9fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2d"] + .unchecked_into(), + // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD + hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"] + .unchecked_into(), + // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD + hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"] + .unchecked_into(), + // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD + hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"] + .unchecked_into(), + // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD + hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"] + .unchecked_into(), + ), + ]; const ENDOWMENT: u128 = 1_000_000 * WND; const STASH: u128 = 100 * WND; @@ -281,42 +403,56 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi changes_trie_config: Default::default(), }), pallet_balances: Some(westend::BalancesConfig { - balances: endowed_accounts.iter() + balances: endowed_accounts + .iter() .map(|k: &AccountId| (k.clone(), ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }), - pallet_indices: Some(westend::IndicesConfig { - indices: vec![], - }), + pallet_indices: Some(westend::IndicesConfig { indices: vec![] }), pallet_session: Some(westend::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - westend_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), + keys: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + westend_session_keys( + x.2.clone(), + x.3.clone(), + x.4.clone(), + x.5.clone(), + x.6.clone(), + x.7.clone(), + ), + ) + }) + .collect::>(), }), pallet_staking: Some(westend::StakingConfig { validator_count: 50, minimum_validator_count: 4, stakers: initial_authorities .iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, westend::StakerStatus::Validator)) + .map(|x| { + ( + x.0.clone(), + x.1.clone(), + STASH, + westend::StakerStatus::Validator, + ) + }) .collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), force_era: Forcing::ForceNone, slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() + ..Default::default() }), pallet_babe: Some(Default::default()), pallet_grandpa: Some(Default::default()), pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { - keys: vec![], - }), - pallet_vesting: Some(westend::VestingConfig { - vesting: vec![], - }), + pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { keys: vec![] }), + pallet_vesting: Some(westend::VestingConfig { vesting: vec![] }), pallet_sudo: Some(westend::SudoConfig { key: endowed_accounts[0].clone(), }), @@ -334,7 +470,7 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC // for i in 1 2 3 4; do for j in babe; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done // for i in 1 2 3 4; do for j in grandpa; do subkey --ed25519 inspect "$SECRET//$i//$j"; done; done // for i in 1 2 3 4; do for j in im_online; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in parachains; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done + // for i in 1 2 3 4; do for j in para_validator para_assignment; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done let initial_authorities: Vec<( AccountId, AccountId, @@ -342,68 +478,106 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC GrandpaId, ImOnlineId, ValidatorId, - AuthorityDiscoveryId - )> = vec![( - // 5DD7Q4VEfPTLEdn11CnThoHT5f9xKCrnofWJL5SsvpTghaAT - hex!["32a5718e87d16071756d4b1370c411bbbb947eb62f0e6e0b937d5cbfc0ea633b"].into(), - // 5GNzaEqhrZAtUQhbMe2gn9jBuNWfamWFZHULryFwBUXyd1cG - hex!["bee39fe862c85c91aaf343e130d30b643c6ea0b4406a980206f1df8331f7093b"].into(), - // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 - hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"].unchecked_into(), - // 5EjvdwATjyFFikdZibVvx1q5uBHhphS2Mnsq5c7yfaYK25vm - hex!["76620f7c98bce8619979c2b58cf2b0aff71824126d2b039358729dad993223db"].unchecked_into(), - // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 - hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"].unchecked_into(), - // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 - hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"].unchecked_into(), - // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 - hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"].unchecked_into(), - ),( - // 5G9VGb8ESBeS8Ca4or43RfhShzk9y7T5iTmxHk5RJsjZwsRx - hex!["b496c98a405ceab59b9e970e59ef61acd7765a19b704e02ab06c1cdfe171e40f"].into(), - // 5F7V9Y5FcxKXe1aroqvPeRiUmmeQwTFcL3u9rrPXcMuMiCNx - hex!["86d3a7571dd60139d297e55d8238d0c977b2e208c5af088f7f0136b565b0c103"].into(), - // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY - hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"].unchecked_into(), - // 5HBDAaybNqjmY7ww8ZcZZY1L5LHxvpnyfqJwoB7HhR6raTmG - hex!["e2234d661bee4a04c38392c75d1566200aa9e6ae44dd98ee8765e4cc9af63cb7"].unchecked_into(), - // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY - hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"].unchecked_into(), - // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY - hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"].unchecked_into(), - // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY - hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"].unchecked_into(), - ),( - // 5FzwpgGvk2kk9agow6KsywLYcPzjYc8suKej2bne5G5b9YU3 - hex!["ae12f70078a22882bf5135d134468f77301927aa67c376e8c55b7ff127ace115"].into(), - // 5EqoZhVC2BcsM4WjvZNidu2muKAbu5THQTBKe3EjvxXkdP7A - hex!["7addb914ec8486bbc60643d2647685dcc06373401fa80e09813b630c5831d54b"].into(), - // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 - hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"].unchecked_into(), - // 5E8ULLQrDAtWhfnVfZmX41Yux86zNAwVJYguWJZVWrJvdhBe - hex!["5b57ed1443c8967f461db1f6eb2ada24794d163a668f1cf9d9ce3235dfad8799"].unchecked_into(), - // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 - hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"].unchecked_into(), - // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 - hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"].unchecked_into(), - // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 - hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"].unchecked_into(), - ),( - // 5CFj6Kg9rmVn1vrqpyjau2ztyBzKeVdRKwNPiA3tqhB5HPqq - hex!["0867dbb49721126df589db100dda728dc3b475cbf414dad8f72a1d5e84897252"].into(), - // 5CwQXP6nvWzigFqNhh2jvCaW9zWVzkdveCJY3tz2MhXMjTon - hex!["26ab2b4b2eba2263b1e55ceb48f687bb0018130a88df0712fbdaf6a347d50e2a"].into(), - // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd - hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"].unchecked_into(), - // 5HGLmrZsiTFTPp3QoS1W8w9NxByt8PVq79reqvdxNcQkByqK - hex!["e60d23f49e93c1c1f2d7c115957df5bbd7faf5ebf138d1e9d02e8b39a1f63df0"].unchecked_into(), - // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd - hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"].unchecked_into(), - // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd - hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"].unchecked_into(), - // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd - hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"].unchecked_into(), - )]; + AssignmentId, + AuthorityDiscoveryId, + )> = vec![ + ( + // 5DD7Q4VEfPTLEdn11CnThoHT5f9xKCrnofWJL5SsvpTghaAT + hex!["32a5718e87d16071756d4b1370c411bbbb947eb62f0e6e0b937d5cbfc0ea633b"].into(), + // 5GNzaEqhrZAtUQhbMe2gn9jBuNWfamWFZHULryFwBUXyd1cG + hex!["bee39fe862c85c91aaf343e130d30b643c6ea0b4406a980206f1df8331f7093b"].into(), + // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 + hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"] + .unchecked_into(), + // 5EjvdwATjyFFikdZibVvx1q5uBHhphS2Mnsq5c7yfaYK25vm + hex!["76620f7c98bce8619979c2b58cf2b0aff71824126d2b039358729dad993223db"] + .unchecked_into(), + // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 + hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"] + .unchecked_into(), + // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 + hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"] + .unchecked_into(), + // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 + hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"] + .unchecked_into(), + // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 + hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"] + .unchecked_into(), + ), + ( + // 5G9VGb8ESBeS8Ca4or43RfhShzk9y7T5iTmxHk5RJsjZwsRx + hex!["b496c98a405ceab59b9e970e59ef61acd7765a19b704e02ab06c1cdfe171e40f"].into(), + // 5F7V9Y5FcxKXe1aroqvPeRiUmmeQwTFcL3u9rrPXcMuMiCNx + hex!["86d3a7571dd60139d297e55d8238d0c977b2e208c5af088f7f0136b565b0c103"].into(), + // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY + hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"] + .unchecked_into(), + // 5HBDAaybNqjmY7ww8ZcZZY1L5LHxvpnyfqJwoB7HhR6raTmG + hex!["e2234d661bee4a04c38392c75d1566200aa9e6ae44dd98ee8765e4cc9af63cb7"] + .unchecked_into(), + // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY + hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"] + .unchecked_into(), + // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY + hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"] + .unchecked_into(), + // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY + hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"] + .unchecked_into(), + // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY + hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"] + .unchecked_into(), + ), + ( + // 5FzwpgGvk2kk9agow6KsywLYcPzjYc8suKej2bne5G5b9YU3 + hex!["ae12f70078a22882bf5135d134468f77301927aa67c376e8c55b7ff127ace115"].into(), + // 5EqoZhVC2BcsM4WjvZNidu2muKAbu5THQTBKe3EjvxXkdP7A + hex!["7addb914ec8486bbc60643d2647685dcc06373401fa80e09813b630c5831d54b"].into(), + // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 + hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"] + .unchecked_into(), + // 5E8ULLQrDAtWhfnVfZmX41Yux86zNAwVJYguWJZVWrJvdhBe + hex!["5b57ed1443c8967f461db1f6eb2ada24794d163a668f1cf9d9ce3235dfad8799"] + .unchecked_into(), + // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 + hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"] + .unchecked_into(), + // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 + hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"] + .unchecked_into(), + // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 + hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"] + .unchecked_into(), + // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 + hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"] + .unchecked_into(), + ), + ( + // 5CFj6Kg9rmVn1vrqpyjau2ztyBzKeVdRKwNPiA3tqhB5HPqq + hex!["0867dbb49721126df589db100dda728dc3b475cbf414dad8f72a1d5e84897252"].into(), + // 5CwQXP6nvWzigFqNhh2jvCaW9zWVzkdveCJY3tz2MhXMjTon + hex!["26ab2b4b2eba2263b1e55ceb48f687bb0018130a88df0712fbdaf6a347d50e2a"].into(), + // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd + hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"] + .unchecked_into(), + // 5HGLmrZsiTFTPp3QoS1W8w9NxByt8PVq79reqvdxNcQkByqK + hex!["e60d23f49e93c1c1f2d7c115957df5bbd7faf5ebf138d1e9d02e8b39a1f63df0"] + .unchecked_into(), + // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd + hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"] + .unchecked_into(), + // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd + hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"] + .unchecked_into(), + // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd + hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"] + .unchecked_into(), + // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd + hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"] + .unchecked_into(), + ), + ]; const ENDOWMENT: u128 = 1_000_000 * KSM; const STASH: u128 = 100 * KSM; @@ -414,32 +588,50 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC changes_trie_config: Default::default(), }), pallet_balances: Some(kusama::BalancesConfig { - balances: endowed_accounts.iter() + balances: endowed_accounts + .iter() .map(|k: &AccountId| (k.clone(), ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }), - pallet_indices: Some(kusama::IndicesConfig { - indices: vec![], - }), + pallet_indices: Some(kusama::IndicesConfig { indices: vec![] }), pallet_session: Some(kusama::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - kusama_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), + keys: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + kusama_session_keys( + x.2.clone(), + x.3.clone(), + x.4.clone(), + x.5.clone(), + x.6.clone(), + x.7.clone(), + ), + ) + }) + .collect::>(), }), pallet_staking: Some(kusama::StakingConfig { validator_count: 50, minimum_validator_count: 4, stakers: initial_authorities .iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, kusama::StakerStatus::Validator)) + .map(|x| { + ( + x.0.clone(), + x.1.clone(), + STASH, + kusama::StakerStatus::Validator, + ) + }) .collect(), - invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - force_era: Forcing::ForceNone, - slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() + invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), + force_era: Forcing::ForceNone, + slash_reward_fraction: Perbill::from_percent(10), + ..Default::default() }), pallet_elections_phragmen: Some(Default::default()), pallet_democracy: Some(Default::default()), @@ -455,15 +647,233 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC pallet_babe: Some(Default::default()), pallet_grandpa: Some(Default::default()), pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { - keys: vec![], - }), + pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { keys: vec![] }), claims: Some(kusama::ClaimsConfig { claims: vec![], vesting: vec![], }), - pallet_vesting: Some(kusama::VestingConfig { - vesting: vec![], + pallet_vesting: Some(kusama::VestingConfig { vesting: vec![] }), + pallet_treasury: Some(Default::default()), + } +} + +fn rococo_staging_testnet_config_genesis(wasm_binary: &[u8]) -> rococo_runtime::GenesisConfig { + // subkey inspect "$SECRET" + let endowed_accounts = vec![ + // 5FeyRQmjtdHoPH56ASFW76AJEP1yaQC1K9aEMvJTF9nzt9S9 + hex!["9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00"].into(), + ]; + + // ./scripts/prepare-test-net.sh 8 + let initial_authorities: Vec<( + AccountId, + AccountId, + BabeId, + GrandpaId, + ImOnlineId, + ValidatorId, + AssignmentId, + AuthorityDiscoveryId + )> = vec![( + //5EHZkbp22djdbuMFH9qt1DVzSCvqi3zWpj6DAYfANa828oei + hex!["62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a"].into(), + //5FeSEpi9UYYaWwXXb3tV88qtZkmSdB3mvgj3pXkxKyYLGhcd + hex!["9e6e781a76810fe93187af44c79272c290c2b9e2b8b92ee11466cd79d8023f50"].into(), + //5Fh6rDpMDhM363o1Z3Y9twtaCPfizGQWCi55BSykTQjGbP7H + hex!["a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35"].unchecked_into(), + //5CPd3zoV9Aaah4xWucuDivMHJ2nEEmpdi864nPTiyRZp4t87 + hex!["0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa"].unchecked_into(), + //5F7BEa1LGFksUihyatf3dCDYneB8pWzVyavnByCsm5nBgezi + hex!["86975a37211f8704e947a365b720f7a3e2757988eaa7d0f197e83dba355ef743"].unchecked_into(), + //5CP6oGfwqbEfML8efqm1tCZsUgRsJztp9L8ZkEUxA16W8PPz + hex!["0e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205"].unchecked_into(), + //5HQdwiDh8Qtd5dSNWajNYpwDvoyNWWA16Y43aEkCNactFc2b + hex!["ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477b"].unchecked_into(), + //5HbSgM72xVuscsopsdeG3sCSCYdAeM1Tay9p79N6ky6vwDGq + hex!["f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c"].unchecked_into(), + ), + ( + //5DvH8oEjQPYhzCoQVo7WDU91qmQfLZvxe9wJcrojmJKebCmG + hex!["520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a"].into(), + //5ENZvCRzyXJJYup8bM6yEzb2kQHEb1NDpY2ZEyVGBkCfRdj3 + hex!["6618289af7ae8621981ffab34591e7a6486e12745dfa3fd3b0f7e6a3994c7b5b"].into(), + //5DLjSUfqZVNAADbwYLgRvHvdzXypiV1DAEaDMjcESKTcqMoM + hex!["38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f"].unchecked_into(), + //5HnDVBN9mD6mXyx8oryhDbJtezwNSj1VRXgLoYCBA6uEkiao + hex!["fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d"].unchecked_into(), + //5DhyXZiuB1LvqYKFgT5tRpgGsN3is2cM9QxgW7FikvakbAZP + hex!["48a910c0af90898f11bd57d37ceaea53c78994f8e1833a7ade483c9a84bde055"].unchecked_into(), + //5EPEWRecy2ApL5n18n3aHyU1956zXTRqaJpzDa9DoqiggNwF + hex!["669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee816"].unchecked_into(), + //5ES3fw5X4bndSgLNmtPfSbM2J1kLqApVB2CCLS4CBpM1UxUZ + hex!["68bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80d"].unchecked_into(), + //5HeXbwb5PxtcRoopPZTp5CQun38atn2UudQ8p2AxR5BzoaXw + hex!["f6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349"].unchecked_into(), + ), + ( + //5FPMzsezo1PRxYbVpJMWK7HNbR2kUxidsAAxH4BosHa4wd6S + hex!["92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f"].into(), + //5G6NQidFG7YiXsvV7hQTLGArir9tsYqD4JDxByhgxKvSKwRx + hex!["b235f57244230589523271c27b8a490922ffd7dccc83b044feaf22273c1dc735"].into(), + //5GpZhzAVg7SAtzLvaAC777pjquPEcNy1FbNUAG2nZvhmd6eY + hex!["d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a"].unchecked_into(), + //5HAes2RQYPbYKbLBfKb88f4zoXv6pPA6Ke8CjN7dob3GpmSP + hex!["e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1"].unchecked_into(), + //5HTXBf36LXmkFWJLokNUK6fPxVpkr2ToUnB1pvaagdGu4c1T + hex!["ee93e26259decb89afcf17ef2aa0fa2db2e1042fb8f56ecfb24d19eae8629878"].unchecked_into(), + //5FtAGDZYJKXkhVhAxCQrXmaP7EE2mGbBMfmKDHjfYDgq2BiU + hex!["a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037"].unchecked_into(), + //5CtK7JHv3h6UQZ44y54skxdwSVBRtuxwPE1FYm7UZVhg8rJV + hex!["244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e"].unchecked_into(), + //5D4r6YaB6F7A7nvMRHNFNF6zrR9g39bqDJFenrcaFmTCRwfa + hex!["2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d"].unchecked_into(), + ), + ( + //5DMNx7RoX6d7JQ38NEM7DWRcW2THu92LBYZEWvBRhJeqcWgR + hex!["38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404"].into(), + //5GGdKNDr9P47dpVnmtq3m8Tvowwf1ot1abw6tPsTYYFoKm2v + hex!["ba0898c1964196474c0be08d364cdf4e9e1d47088287f5235f70b0590dfe1704"].into(), + //5EjkyPCzR2SjhDZq8f7ufsw6TfkvgNRepjCRQFc4TcdXdaB1 + hex!["764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21"].unchecked_into(), + //5DJV3zCBTJBLGNDCcdWrYxWDacSz84goGTa4pFeKVvehEBte + hex!["36be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4"].unchecked_into(), + //5FHf8kpK4fPjEJeYcYon2gAPwEBubRvtwpzkUbhMWSweKPUY + hex!["8e95b9b5b4dc69790b67b566567ca8bf8cdef3a3a8bb65393c0d1d1c87cd2d2c"].unchecked_into(), + //5F9FsRjpecP9GonktmtFL3kjqNAMKjHVFjyjRdTPa4hbQRZA + hex!["882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b"].unchecked_into(), + //5F1FZWZSj3JyTLs8sRBxU6QWyGLSL9BMRtmSKDmVEoiKFxSP + hex!["821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b75"].unchecked_into(), + //5CtgRR74VypK4h154s369abs78hDUxZSJqcbWsfXvsjcHJNA + hex!["2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c"].unchecked_into(), + ), + ( + //5C8AL1Zb4bVazgT3EgDxFgcow1L4SJjVu44XcLC9CrYqFN4N + hex!["02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16"].into(), + //5FLYy3YKsAnooqE4hCudttAsoGKbVG3hYYBtVzwMjJQrevPa + hex!["90cab33f0bb501727faa8319f0845faef7d31008f178b65054b6629fe531b772"].into(), + //5Et3tfbVf1ByFThNAuUq5pBssdaPPskip5yob5GNyUFojXC7 + hex!["7c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813"].unchecked_into(), + //5EX1JBghGbQqWohTPU6msR9qZ2nYPhK9r3RTQ2oD1K8TCxaG + hex!["6c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c81"].unchecked_into(), + //5GqL8RbVAuNXpDhjQi1KrS1MyNuKhvus2AbmQwRGjpuGZmFu + hex!["d2f9d537ffa59919a4028afdb627c14c14c97a1547e13e8e82203d2049b15b1a"].unchecked_into(), + //5EUNaBpX9mJgcmLQHyG5Pkms6tbDiKuLbeTEJS924Js9cA1N + hex!["6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac01"].unchecked_into(), + //5CaZuueRVpMATZG4hkcrgDoF4WGixuz7zu83jeBdY3bgWGaG + hex!["16c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33"].unchecked_into(), + //5DABsdQCDUGuhzVGWe5xXzYQ9rtrVxRygW7RXf9Tsjsw1aGJ + hex!["306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531"].unchecked_into(), + ), + ( + //5C8XbDXdMNKJrZSrQURwVCxdNdk8AzG6xgLggbzuA399bBBF + hex!["02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864"].into(), + //5GsyzFP8qtF8tXPSsjhjxAeU1v7D1PZofuQKN9TdCc7Dp1JM + hex!["d4ffc4c05b47d1115ad200f7f86e307b20b46c50e1b72a912ec4f6f7db46b616"].into(), + //5GHWB8ZDzegLcMW7Gdd1BS6WHVwDdStfkkE4G7KjPjZNJBtD + hex!["bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b"].unchecked_into(), + //5GzDPGbUM9uH52ZEwydasTj8edokGUJ7vEpoFWp9FE1YNuFB + hex!["d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33"].unchecked_into(), + //5GWZbVkJEfWZ7fRca39YAQeqri2Z7pkeHyd7rUctUHyQifLp + hex!["c4a980da30939d5bb9e4a734d12bf81259ae286aa21fa4b65405347fa40eff35"].unchecked_into(), + //5CmLCFeSurRXXtwMmLcVo7sdJ9EqDguvJbuCYDcHkr3cpqyE + hex!["1efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c"].unchecked_into(), + //5DnsSy8a8pfE2aFjKBDtKw7WM1V4nfE5sLzP15MNTka53GqS + hex!["4c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22"].unchecked_into(), + //5CZdFnyzZvKetZTeUwj5APAYskVJe4QFiTezo5dQNsrnehGd + hex!["160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a"].unchecked_into(), + ), + ( + //5HinEonzr8MywkqedcpsmwpxKje2jqr9miEwuzyFXEBCvVXM + hex!["fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00"].into(), + //5EHJbj6Td6ks5HDnyfN4ttTSi57osxcQsQexm7XpazdeqtV7 + hex!["62145d721967bd88622d08625f0f5681463c0f1b8bcd97eb3c2c53f7660fd513"].into(), + //5EeCsC58XgJ1DFaoYA1WktEpP27jvwGpKdxPMFjicpLeYu96 + hex!["720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372"].unchecked_into(), + //5DnEySxbnppWEyN8cCLqvGjAorGdLRg2VmkY96dbJ1LHFK8N + hex!["4bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14"].unchecked_into(), + //5E1Y1FJ7dVP7qtE3wm241pTm72rTMcDT5Jd8Czv7Pwp7N3AH + hex!["560d90ca51e9c9481b8a9810060e04d0708d246714960439f804e5c6f40ca651"].unchecked_into(), + //5CAC278tFCHAeHYqE51FTWYxHmeLcENSS1RG77EFRTvPZMJT + hex!["042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11f"].unchecked_into(), + //5HjRTLWcQjZzN3JDvaj1UzjNSayg5ZD9ZGWMstaL7Ab2jjAa + hex!["fab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f"].unchecked_into(), + //5ELv74v7QcsS6FdzvG4vL2NnYDGWmRnJUSMKYwdyJD7Xcdi7 + hex!["64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f"].unchecked_into(), + ), + ( + //5Ey3NQ3dfabaDc16NUv7wRLsFCMDFJSqZFzKVycAsWuUC6Di + hex!["8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47"].into(), + //5HiWsuSBqt8nS9pnggexXuHageUifVPKPHDE2arTKqhTp1dV + hex!["fa0388fa88f3f0cb43d583e2571fbc0edad57dff3a6fd89775451dd2c2b8ea00"].into(), + //5H168nKX2Yrfo3bxj7rkcg25326Uv3CCCnKUGK6uHdKMdPt8 + hex!["da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349"].unchecked_into(), + //5DrA2fZdzmNqT5j6DXNwVxPBjDV9jhkAqvjt6Us3bQHKy3cF + hex!["4ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc"].unchecked_into(), + //5FNFDUGNLUtqg5LgrwYLNmBiGoP8KRxsvQpBkc7GQP6qaBUG + hex!["92156f54a114ee191415898f2da013d9db6a5362d6b36330d5fc23e27360ab66"].unchecked_into(), + //5Gx6YeNhynqn8qkda9QKpc9S7oDr4sBrfAu516d3sPpEt26F + hex!["d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d"].unchecked_into(), + //5DhDcHqwxoes5s89AyudGMjtZXx1nEgrk5P45X88oSTR3iyx + hex!["481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c"].unchecked_into(), + //5DqAvikdpfRdk5rR35ZobZhqaC5bJXZcEuvzGtexAZP1hU3T + hex!["4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26"].unchecked_into(), + )]; + + const ENDOWMENT: u128 = 1_000_000 * ROC; + const STASH: u128 = 100 * ROC; + + rococo_runtime::GenesisConfig { + frame_system: Some(rococo_runtime::SystemConfig { + code: wasm_binary.to_vec(), + changes_trie_config: Default::default(), + }), + pallet_balances: Some(rococo_runtime::BalancesConfig { + balances: endowed_accounts.iter() + .map(|k: &AccountId| (k.clone(), ENDOWMENT)) + .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) + .collect(), + }), + pallet_indices: Some(rococo_runtime::IndicesConfig { + indices: vec![], + }), + pallet_session: Some(rococo_runtime::SessionConfig { + 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::>(), + }), + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(rococo_runtime::AuthorityDiscoveryConfig { + keys: vec![], + }), + pallet_staking: Some(Default::default()), + pallet_sudo: Some(rococo_runtime::SudoConfig { + key: endowed_accounts[0].clone(), + }), + parachains_configuration: Some(rococo_runtime::ParachainsConfigurationConfig { + config: polkadot_runtime_parachains::configuration::HostConfiguration { + validation_upgrade_frequency: 600u32, + validation_upgrade_delay: 300, + acceptance_period: 1200, + max_code_size: 5 * 1024 * 1024, + max_pov_size: 50 * 1024 * 1024, + max_head_data_size: 32 * 1024, + group_rotation_frequency: 20, + chain_availability_period: 4, + thread_availability_period: 4, + no_show_slots: 10, + ..Default::default() + }, }), } } @@ -479,8 +889,10 @@ pub fn polkadot_staging_testnet_config() -> Result { ChainType::Live, move || polkadot_staging_testnet_config_genesis(wasm_binary), boot_nodes, - Some(TelemetryEndpoints::new(vec![(POLKADOT_STAGING_TELEMETRY_URL.to_string(), 0)]) - .expect("Polkadot Staging telemetry url is valid; qed")), + Some( + TelemetryEndpoints::new(vec![(POLKADOT_STAGING_TELEMETRY_URL.to_string(), 0)]) + .expect("Polkadot Staging telemetry url is valid; qed"), + ), Some(DEFAULT_PROTOCOL_ID), None, Default::default(), @@ -498,8 +910,10 @@ pub fn kusama_staging_testnet_config() -> Result { ChainType::Live, move || kusama_staging_testnet_config_genesis(wasm_binary), boot_nodes, - Some(TelemetryEndpoints::new(vec![(KUSAMA_STAGING_TELEMETRY_URL.to_string(), 0)]) - .expect("Kusama Staging telemetry url is valid; qed")), + Some( + TelemetryEndpoints::new(vec![(KUSAMA_STAGING_TELEMETRY_URL.to_string(), 0)]) + .expect("Kusama Staging telemetry url is valid; qed"), + ), Some(DEFAULT_PROTOCOL_ID), None, Default::default(), @@ -517,8 +931,34 @@ pub fn westend_staging_testnet_config() -> Result { ChainType::Live, move || westend_staging_testnet_config_genesis(wasm_binary), boot_nodes, - Some(TelemetryEndpoints::new(vec![(WESTEND_STAGING_TELEMETRY_URL.to_string(), 0)]) - .expect("Westend Staging telemetry url is valid; qed")), + Some( + TelemetryEndpoints::new(vec![(WESTEND_STAGING_TELEMETRY_URL.to_string(), 0)]) + .expect("Westend Staging telemetry url is valid; qed"), + ), + Some(DEFAULT_PROTOCOL_ID), + None, + Default::default(), + )) +} + +/// Rococo staging testnet config. +pub fn rococo_staging_testnet_config() -> Result { + let wasm_binary = rococo::WASM_BINARY.ok_or("Rococo development wasm not available")?; + let boot_nodes = vec![]; + + Ok(RococoChainSpec::from_genesis( + "Rococo Staging Testnet", + "rococo_staging_testnet", + ChainType::Live, + move || RococoGenesisExt { + runtime_genesis_config: rococo_staging_testnet_config_genesis(wasm_binary), + session_length_in_blocks: None, + }, + boot_nodes, + Some( + TelemetryEndpoints::new(vec![(ROCOCO_STAGING_TELEMETRY_URL.to_string(), 0)]) + .expect("Rococo Staging telemetry url is valid; qed"), + ), Some(DEFAULT_PROTOCOL_ID), None, Default::default(), @@ -532,23 +972,26 @@ pub fn get_from_seed(seed: &str) -> ::Pu .public() } - /// Helper function to generate an account ID from seed -pub fn get_account_id_from_seed(seed: &str) -> AccountId where - AccountPublic: From<::Public> +pub 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 -pub fn get_authority_keys_from_seed(seed: &str) -> ( +pub fn get_authority_keys_from_seed( + seed: &str, +) -> ( AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, - AuthorityDiscoveryId + AssignmentId, + AuthorityDiscoveryId, ) { ( get_account_id_from_seed::(&format!("{}//stash", seed)), @@ -557,6 +1000,7 @@ pub fn get_authority_keys_from_seed(seed: &str) -> ( get_from_seed::(seed), get_from_seed::(seed), get_from_seed::(seed), + get_from_seed::(seed), get_from_seed::(seed), ) } @@ -581,7 +1025,16 @@ fn testnet_accounts() -> Vec { /// Helper function to create polkadot GenesisConfig for testing pub fn polkadot_testnet_genesis( wasm_binary: &[u8], - initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, + initial_authorities: Vec<( + AccountId, + AccountId, + BabeId, + GrandpaId, + ImOnlineId, + ValidatorId, + AssignmentId, + AuthorityDiscoveryId, + )>, _root_key: AccountId, endowed_accounts: Option>, ) -> polkadot::GenesisConfig { @@ -595,29 +1048,50 @@ pub fn polkadot_testnet_genesis( code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - pallet_indices: Some(polkadot::IndicesConfig { - indices: vec![], - }), + pallet_indices: Some(polkadot::IndicesConfig { indices: vec![] }), pallet_balances: Some(polkadot::BalancesConfig { - balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), + balances: endowed_accounts + .iter() + .map(|k| (k.clone(), ENDOWMENT)) + .collect(), }), pallet_session: Some(polkadot::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - polkadot_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), + keys: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + polkadot_session_keys( + x.2.clone(), + x.3.clone(), + x.4.clone(), + x.5.clone(), + x.6.clone(), + x.7.clone(), + ), + ) + }) + .collect::>(), }), pallet_staking: Some(polkadot::StakingConfig { minimum_validator_count: 1, validator_count: 2, - stakers: initial_authorities.iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, polkadot::StakerStatus::Validator)) + stakers: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.1.clone(), + STASH, + polkadot::StakerStatus::Validator, + ) + }) .collect(), - invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - force_era: Forcing::NotForcing, - slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() + invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), + force_era: Forcing::NotForcing, + slash_reward_fraction: Perbill::from_percent(10), + ..Default::default() }), pallet_elections_phragmen: Some(Default::default()), pallet_democracy: Some(polkadot::DemocracyConfig::default()), @@ -633,23 +1107,29 @@ pub fn polkadot_testnet_genesis( pallet_babe: Some(Default::default()), pallet_grandpa: Some(Default::default()), pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { - keys: vec![], - }), + pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![] }), claims: Some(polkadot::ClaimsConfig { claims: vec![], vesting: vec![], }), - pallet_vesting: Some(polkadot::VestingConfig { - vesting: vec![], - }), + pallet_vesting: Some(polkadot::VestingConfig { vesting: vec![] }), + pallet_treasury: Some(Default::default()), } } /// Helper function to create kusama GenesisConfig for testing pub fn kusama_testnet_genesis( wasm_binary: &[u8], - initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, + initial_authorities: Vec<( + AccountId, + AccountId, + BabeId, + GrandpaId, + ImOnlineId, + ValidatorId, + AssignmentId, + AuthorityDiscoveryId, + )>, _root_key: AccountId, endowed_accounts: Option>, ) -> kusama::GenesisConfig { @@ -663,29 +1143,50 @@ pub fn kusama_testnet_genesis( code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - pallet_indices: Some(kusama::IndicesConfig { - indices: vec![], - }), + pallet_indices: Some(kusama::IndicesConfig { indices: vec![] }), pallet_balances: Some(kusama::BalancesConfig { - balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), + balances: endowed_accounts + .iter() + .map(|k| (k.clone(), ENDOWMENT)) + .collect(), }), pallet_session: Some(kusama::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - kusama_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), + keys: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + kusama_session_keys( + x.2.clone(), + x.3.clone(), + x.4.clone(), + x.5.clone(), + x.6.clone(), + x.7.clone(), + ), + ) + }) + .collect::>(), }), pallet_staking: Some(kusama::StakingConfig { minimum_validator_count: 1, validator_count: 2, - stakers: initial_authorities.iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, kusama::StakerStatus::Validator)) + stakers: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.1.clone(), + STASH, + kusama::StakerStatus::Validator, + ) + }) .collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), force_era: Forcing::NotForcing, slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() + ..Default::default() }), pallet_elections_phragmen: Some(Default::default()), pallet_democracy: Some(kusama::DemocracyConfig::default()), @@ -701,23 +1202,29 @@ pub fn kusama_testnet_genesis( pallet_babe: Some(Default::default()), pallet_grandpa: Some(Default::default()), pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { - keys: vec![], - }), + pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { keys: vec![] }), claims: Some(kusama::ClaimsConfig { claims: vec![], vesting: vec![], }), - pallet_vesting: Some(kusama::VestingConfig { - vesting: vec![], - }), + pallet_vesting: Some(kusama::VestingConfig { vesting: vec![] }), + pallet_treasury: Some(Default::default()), } } -/// Helper function to create polkadot GenesisConfig for testing +/// Helper function to create westend GenesisConfig for testing pub fn westend_testnet_genesis( wasm_binary: &[u8], - initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, + initial_authorities: Vec<( + AccountId, + AccountId, + BabeId, + GrandpaId, + ImOnlineId, + ValidatorId, + AssignmentId, + AuthorityDiscoveryId, + )>, root_key: AccountId, endowed_accounts: Option>, ) -> westend::GenesisConfig { @@ -731,41 +1238,149 @@ pub fn westend_testnet_genesis( code: wasm_binary.to_vec(), changes_trie_config: Default::default(), }), - pallet_indices: Some(westend::IndicesConfig { - indices: vec![], - }), + pallet_indices: Some(westend::IndicesConfig { indices: vec![] }), pallet_balances: Some(westend::BalancesConfig { - balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), + balances: endowed_accounts + .iter() + .map(|k| (k.clone(), ENDOWMENT)) + .collect(), }), pallet_session: Some(westend::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - westend_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), + keys: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + westend_session_keys( + x.2.clone(), + x.3.clone(), + x.4.clone(), + x.5.clone(), + x.6.clone(), + x.7.clone(), + ), + ) + }) + .collect::>(), }), pallet_staking: Some(westend::StakingConfig { minimum_validator_count: 1, validator_count: 2, - stakers: initial_authorities.iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, westend::StakerStatus::Validator)) + stakers: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.1.clone(), + STASH, + westend::StakerStatus::Validator, + ) + }) .collect(), invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), force_era: Forcing::NotForcing, slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() + ..Default::default() }), pallet_babe: Some(Default::default()), pallet_grandpa: Some(Default::default()), pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { - keys: vec![], + pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { keys: vec![] }), + pallet_vesting: Some(westend::VestingConfig { vesting: vec![] }), + pallet_sudo: Some(westend::SudoConfig { key: root_key }), + } +} + +/// Helper function to create rococo GenesisConfig for testing +pub fn rococo_testnet_genesis( + wasm_binary: &[u8], + initial_authorities: Vec<( + AccountId, + AccountId, + BabeId, + GrandpaId, + ImOnlineId, + ValidatorId, + AssignmentId, + AuthorityDiscoveryId, + )>, + root_key: AccountId, + endowed_accounts: Option>, +) -> rococo_runtime::GenesisConfig { + let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); + + const ENDOWMENT: u128 = 1_000_000 * DOTS; + + rococo_runtime::GenesisConfig { + frame_system: Some(rococo_runtime::SystemConfig { + code: wasm_binary.to_vec(), + changes_trie_config: Default::default(), }), - pallet_vesting: Some(westend::VestingConfig { - vesting: vec![], + pallet_indices: Some(rococo_runtime::IndicesConfig { + indices: vec![], }), - pallet_sudo: Some(westend::SudoConfig { - key: root_key, + pallet_balances: Some(rococo_runtime::BalancesConfig { + balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), + }), + pallet_session: Some(rococo_runtime::SessionConfig { + 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::>(), + }), + pallet_babe: Some(Default::default()), + pallet_grandpa: Some(Default::default()), + pallet_im_online: Some(Default::default()), + pallet_authority_discovery: Some(rococo_runtime::AuthorityDiscoveryConfig { + keys: vec![], + }), + pallet_staking: Some(Default::default()), + pallet_sudo: Some(rococo_runtime::SudoConfig { key: root_key }), + parachains_configuration: Some(rococo_runtime::ParachainsConfigurationConfig { + config: polkadot_runtime_parachains::configuration::HostConfiguration { + validation_upgrade_frequency: 600u32, + validation_upgrade_delay: 300, + acceptance_period: 1200, + max_code_size: 5 * 1024 * 1024, + max_pov_size: 50 * 1024 * 1024, + max_head_data_size: 32 * 1024, + group_rotation_frequency: 20, + chain_availability_period: 4, + thread_availability_period: 4, + no_show_slots: 10, + max_upward_queue_count: 8, + max_upward_queue_size: 8 * 1024, + max_downward_message_size: 1024, + // this is approximatelly 4ms. + // + // Same as `4 * frame_support::weights::WEIGHT_PER_MILLIS`. We don't bother with + // an import since that's a made up number and should be replaced with a constant + // obtained by benchmarking anyway. + preferred_dispatchable_upward_messages_step_weight: 4 * 1_000_000_000, + max_upward_message_size: 1024, + max_upward_message_num_per_candidate: 5, + hrmp_open_request_ttl: 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_max_parathread_inbound_channels: 4, + hrmp_channel_max_message_size: 1024, + hrmp_max_parachain_outbound_channels: 4, + hrmp_max_parathread_outbound_channels: 4, + hrmp_max_message_num_per_candidate: 5, + ..Default::default() + }, }), } } @@ -773,9 +1388,7 @@ pub fn westend_testnet_genesis( fn polkadot_development_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { polkadot_testnet_genesis( wasm_binary, - vec![ - get_authority_keys_from_seed("Alice"), - ], + vec![get_authority_keys_from_seed("Alice")], get_account_id_from_seed::("Alice"), None, ) @@ -784,9 +1397,7 @@ fn polkadot_development_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisC fn kusama_development_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { kusama_testnet_genesis( wasm_binary, - vec![ - get_authority_keys_from_seed("Alice"), - ], + vec![get_authority_keys_from_seed("Alice")], get_account_id_from_seed::("Alice"), None, ) @@ -795,9 +1406,7 @@ fn kusama_development_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfi fn westend_development_config_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { westend_testnet_genesis( wasm_binary, - vec![ - get_authority_keys_from_seed("Alice"), - ], + vec![get_authority_keys_from_seed("Alice")], get_account_id_from_seed::("Alice"), None, ) @@ -940,3 +1549,36 @@ pub fn westend_local_testnet_config() -> Result { Default::default(), )) } + +fn rococo_local_testnet_genesis(wasm_binary: &[u8]) -> rococo_runtime::GenesisConfig { + rococo_testnet_genesis( + wasm_binary, + 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) +pub fn rococo_local_testnet_config() -> Result { + let wasm_binary = rococo::WASM_BINARY.ok_or("Rococo development wasm not available")?; + + Ok(RococoChainSpec::from_genesis( + "Rococo Local Testnet", + "rococo_local_testnet", + ChainType::Local, + move || RococoGenesisExt { + runtime_genesis_config: rococo_local_testnet_genesis(wasm_binary), + // Use 1 minute session length. + session_length_in_blocks: Some(10), + }, + vec![], + None, + Some(DEFAULT_PROTOCOL_ID), + None, + Default::default(), + )) +} diff --git a/node/service/src/client.rs b/node/service/src/client.rs index 28d2bccabbe5e270dce5bdd66253e343233c8b60..0074803219cf88484befa21e228729bd54c0e2ee 100644 --- a/node/service/src/client.rs +++ b/node/service/src/client.rs @@ -16,38 +16,402 @@ //! Polkadot Client meta trait -use sp_api::{ProvideRuntimeApi, ConstructRuntimeApi, CallApiAt}; +use std::sync::Arc; +use sp_api::{ProvideRuntimeApi, CallApiAt, NumberFor}; use sp_blockchain::HeaderBackend; -use sp_runtime::traits::Block as BlockT; -use sc_client_api::{Backend as BackendT, BlockchainEvents}; +use sp_runtime::{ + Justification, generic::{BlockId, SignedBlock}, traits::{Block as BlockT, BlakeTwo256}, +}; +use sc_client_api::{Backend as BackendT, BlockchainEvents, KeyIterator}; +use sp_storage::{StorageData, StorageKey, ChildInfo, PrefixedStorageKey}; +use polkadot_primitives::v1::{Block, ParachainHost, AccountId, Nonce, Balance, Header, BlockNumber, Hash}; +use consensus_common::BlockStatus; -/// Polkadot client abstraction, this super trait only pulls in functionality required for -/// polkadot internal crates like polkadot-collator. -pub trait PolkadotClient: +/// A set of APIs that polkadot-like runtimes must implement. +pub trait RuntimeApiCollection: + sp_transaction_pool::runtime_api::TaggedTransactionQueue + + sp_api::ApiExt + + babe_primitives::BabeApi + + grandpa_primitives::GrandpaApi + + ParachainHost + + sp_block_builder::BlockBuilder + + frame_system_rpc_runtime_api::AccountNonceApi + + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + + sp_api::Metadata + + sp_offchain::OffchainWorkerApi + + sp_session::SessionKeys + + sp_authority_discovery::AuthorityDiscoveryApi +where + >::StateBackend: sp_api::StateBackend, +{} + +impl RuntimeApiCollection for Api +where + Api: sp_transaction_pool::runtime_api::TaggedTransactionQueue + + sp_api::ApiExt + + babe_primitives::BabeApi + + grandpa_primitives::GrandpaApi + + ParachainHost + + sp_block_builder::BlockBuilder + + frame_system_rpc_runtime_api::AccountNonceApi + + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + + sp_api::Metadata + + sp_offchain::OffchainWorkerApi + + sp_session::SessionKeys + + sp_authority_discovery::AuthorityDiscoveryApi, + >::StateBackend: sp_api::StateBackend, +{} + +/// Trait that abstracts over all available client implementations. +/// +/// For a concrete type there exists [`Client`]. +pub trait AbstractClient: BlockchainEvents + Sized + Send + Sync - + ProvideRuntimeApi + + ProvideRuntimeApi + HeaderBackend + CallApiAt< Block, Error = sp_blockchain::Error, - StateBackend = Backend ::State + StateBackend = Backend::State > where Block: BlockT, Backend: BackendT, - Runtime: ConstructRuntimeApi + Backend::State: sp_api::StateBackend, + Self::Api: RuntimeApiCollection, {} -impl PolkadotClient for Client +impl AbstractClient for Client where Block: BlockT, - Runtime: ConstructRuntimeApi, Backend: BackendT, - Client: BlockchainEvents + ProvideRuntimeApi + HeaderBackend + Backend::State: sp_api::StateBackend, + Client: BlockchainEvents + ProvideRuntimeApi + HeaderBackend + Sized + Send + Sync + CallApiAt< Block, Error = sp_blockchain::Error, - StateBackend = Backend ::State - > + StateBackend = Backend::State + >, + Client::Api: RuntimeApiCollection, {} + +/// Execute something with the client instance. +/// +/// As there exist multiple chains inside Polkadot, like Polkadot itself, Kusama, Westend etc, +/// there can exist different kinds of client types. As these client types differ in the generics +/// that are being used, we can not easily return them from a function. For returning them from a +/// function there exists [`Client`]. However, the problem on how to use this client instance still +/// exists. This trait "solves" it in a dirty way. It requires a type to implement this trait and +/// than the [`execute_with_client`](ExecuteWithClient::execute_with_client) function can be called +/// with any possible client instance. +/// +/// In a perfect world, we could make a closure work in this way. +pub trait ExecuteWithClient { + /// The return type when calling this instance. + type Output; + + /// Execute whatever should be executed with the given client instance. + fn execute_with_client(self, client: Arc) -> Self::Output + where + >::StateBackend: sp_api::StateBackend, + Backend: sc_client_api::Backend + 'static, + Backend::State: sp_api::StateBackend, + Api: crate::RuntimeApiCollection, + Client: AbstractClient + 'static; +} + +/// A handle to a Polkadot client instance. +/// +/// The Polkadot service supports multiple different runtimes (Westend, Polkadot itself, etc). As each runtime has a +/// specialized client, we need to hide them behind a trait. This is this trait. +/// +/// When wanting to work with the inner client, you need to use `execute_with`. +/// +/// See [`ExecuteWithClient`](trait.ExecuteWithClient.html) for more information. +pub trait ClientHandle { + /// Execute the given something with the client. + fn execute_with(&self, t: T) -> T::Output; +} + +/// A client instance of Polkadot. +/// +/// See [`ExecuteWithClient`] for more information. +#[derive(Clone)] +pub enum Client { + Polkadot(Arc>), + Westend(Arc>), + Kusama(Arc>), + Rococo(Arc>), +} + +impl ClientHandle for Client { + fn execute_with(&self, t: T) -> T::Output { + match self { + Self::Polkadot(client) => { + T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) + }, + Self::Westend(client) => { + T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) + }, + Self::Kusama(client) => { + T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) + }, + Self::Rococo(client) => { + T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) + } + } + } +} + +impl sc_client_api::UsageProvider for Client { + fn usage_info(&self) -> sc_client_api::ClientInfo { + match self { + Self::Polkadot(client) => client.usage_info(), + Self::Westend(client) => client.usage_info(), + Self::Kusama(client) => client.usage_info(), + Self::Rococo(client) => client.usage_info(), + } + } +} + +impl sc_client_api::BlockBackend for Client { + fn block_body( + &self, + id: &BlockId + ) -> sp_blockchain::Result::Extrinsic>>> { + match self { + Self::Polkadot(client) => client.block_body(id), + Self::Westend(client) => client.block_body(id), + Self::Kusama(client) => client.block_body(id), + Self::Rococo(client) => client.block_body(id), + } + } + + fn block(&self, id: &BlockId) -> sp_blockchain::Result>> { + match self { + Self::Polkadot(client) => client.block(id), + Self::Westend(client) => client.block(id), + Self::Kusama(client) => client.block(id), + Self::Rococo(client) => client.block(id), + } + } + + fn block_status(&self, id: &BlockId) -> sp_blockchain::Result { + match self { + Self::Polkadot(client) => client.block_status(id), + Self::Westend(client) => client.block_status(id), + Self::Kusama(client) => client.block_status(id), + Self::Rococo(client) => client.block_status(id), + } + } + + fn justification( + &self, + id: &BlockId + ) -> sp_blockchain::Result> { + match self { + Self::Polkadot(client) => client.justification(id), + Self::Westend(client) => client.justification(id), + Self::Kusama(client) => client.justification(id), + Self::Rococo(client) => client.justification(id), + } + } + + fn block_hash( + &self, + number: NumberFor + ) -> sp_blockchain::Result::Hash>> { + match self { + Self::Polkadot(client) => client.block_hash(number), + Self::Westend(client) => client.block_hash(number), + Self::Kusama(client) => client.block_hash(number), + Self::Rococo(client) => client.block_hash(number), + } + } +} + +impl sc_client_api::StorageProvider for Client { + fn storage( + &self, + id: &BlockId, + key: &StorageKey, + ) -> sp_blockchain::Result> { + match self { + Self::Polkadot(client) => client.storage(id, key), + Self::Westend(client) => client.storage(id, key), + Self::Kusama(client) => client.storage(id, key), + Self::Rococo(client) => client.storage(id, key), + } + } + + fn storage_keys( + &self, + id: &BlockId, + key_prefix: &StorageKey, + ) -> sp_blockchain::Result> { + match self { + Self::Polkadot(client) => client.storage_keys(id, key_prefix), + Self::Westend(client) => client.storage_keys(id, key_prefix), + Self::Kusama(client) => client.storage_keys(id, key_prefix), + Self::Rococo(client) => client.storage_keys(id, key_prefix), + } + } + + fn storage_hash( + &self, + id: &BlockId, + key: &StorageKey, + ) -> sp_blockchain::Result::Hash>> { + match self { + Self::Polkadot(client) => client.storage_hash(id, key), + Self::Westend(client) => client.storage_hash(id, key), + Self::Kusama(client) => client.storage_hash(id, key), + Self::Rococo(client) => client.storage_hash(id, key), + } + } + + fn storage_pairs( + &self, + id: &BlockId, + key_prefix: &StorageKey, + ) -> sp_blockchain::Result> { + match self { + Self::Polkadot(client) => client.storage_pairs(id, key_prefix), + Self::Westend(client) => client.storage_pairs(id, key_prefix), + Self::Kusama(client) => client.storage_pairs(id, key_prefix), + Self::Rococo(client) => client.storage_pairs(id, key_prefix), + } + } + + fn storage_keys_iter<'a>( + &self, + id: &BlockId, + prefix: Option<&'a StorageKey>, + start_key: Option<&StorageKey>, + ) -> sp_blockchain::Result>::State, Block>> { + match self { + Self::Polkadot(client) => client.storage_keys_iter(id, prefix, start_key), + Self::Westend(client) => client.storage_keys_iter(id, prefix, start_key), + Self::Kusama(client) => client.storage_keys_iter(id, prefix, start_key), + Self::Rococo(client) => client.storage_keys_iter(id, prefix, start_key), + } + } + + fn child_storage( + &self, + id: &BlockId, + child_info: &ChildInfo, + key: &StorageKey, + ) -> sp_blockchain::Result> { + match self { + Self::Polkadot(client) => client.child_storage(id, child_info, key), + Self::Westend(client) => client.child_storage(id, child_info, key), + Self::Kusama(client) => client.child_storage(id, child_info, key), + Self::Rococo(client) => client.child_storage(id, child_info, key), + } + } + + fn child_storage_keys( + &self, + id: &BlockId, + child_info: &ChildInfo, + key_prefix: &StorageKey, + ) -> sp_blockchain::Result> { + match self { + Self::Polkadot(client) => client.child_storage_keys(id, child_info, key_prefix), + Self::Westend(client) => client.child_storage_keys(id, child_info, key_prefix), + Self::Kusama(client) => client.child_storage_keys(id, child_info, key_prefix), + Self::Rococo(client) => client.child_storage_keys(id, child_info, key_prefix), + } + } + + fn child_storage_hash( + &self, + id: &BlockId, + child_info: &ChildInfo, + key: &StorageKey, + ) -> sp_blockchain::Result::Hash>> { + match self { + Self::Polkadot(client) => client.child_storage_hash(id, child_info, key), + Self::Westend(client) => client.child_storage_hash(id, child_info, key), + Self::Kusama(client) => client.child_storage_hash(id, child_info, key), + Self::Rococo(client) => client.child_storage_hash(id, child_info, key), + } + } + + fn max_key_changes_range( + &self, + first: NumberFor, + last: BlockId, + ) -> sp_blockchain::Result, BlockId)>> { + match self { + Self::Polkadot(client) => client.max_key_changes_range(first, last), + Self::Westend(client) => client.max_key_changes_range(first, last), + Self::Kusama(client) => client.max_key_changes_range(first, last), + Self::Rococo(client) => client.max_key_changes_range(first, last), + } + } + + fn key_changes( + &self, + first: NumberFor, + last: BlockId, + storage_key: Option<&PrefixedStorageKey>, + key: &StorageKey, + ) -> sp_blockchain::Result, u32)>> { + match self { + Self::Polkadot(client) => client.key_changes(first, last, storage_key, key), + Self::Westend(client) => client.key_changes(first, last, storage_key, key), + Self::Kusama(client) => client.key_changes(first, last, storage_key, key), + Self::Rococo(client) => client.key_changes(first, last, storage_key, key), + } + } +} + +impl sp_blockchain::HeaderBackend for Client { + fn header(&self, id: BlockId) -> sp_blockchain::Result> { + match self { + Self::Polkadot(client) => client.header(&id), + Self::Westend(client) => client.header(&id), + Self::Kusama(client) => client.header(&id), + Self::Rococo(client) => client.header(&id), + } + } + + fn info(&self) -> sp_blockchain::Info { + match self { + Self::Polkadot(client) => client.info(), + Self::Westend(client) => client.info(), + Self::Kusama(client) => client.info(), + Self::Rococo(client) => client.info(), + } + } + + fn status(&self, id: BlockId) -> sp_blockchain::Result { + match self { + Self::Polkadot(client) => client.status(id), + Self::Westend(client) => client.status(id), + Self::Kusama(client) => client.status(id), + Self::Rococo(client) => client.status(id), + } + } + + fn number(&self, hash: Hash) -> sp_blockchain::Result> { + match self { + Self::Polkadot(client) => client.number(hash), + Self::Westend(client) => client.number(hash), + Self::Kusama(client) => client.number(hash), + Self::Rococo(client) => client.number(hash), + } + } + + fn hash(&self, number: BlockNumber) -> sp_blockchain::Result> { + match self { + Self::Polkadot(client) => client.hash(number), + Self::Westend(client) => client.hash(number), + Self::Kusama(client) => client.hash(number), + Self::Rococo(client) => client.hash(number), + } + } +} diff --git a/node/service/src/grandpa_support.rs b/node/service/src/grandpa_support.rs index 666595f1027b296a5a09b66cb700aeebbdaf57e5..f2acda3a6c69d731c185a103c8529d8ad6a3d0f5 100644 --- a/node/service/src/grandpa_support.rs +++ b/node/service/src/grandpa_support.rs @@ -16,6 +16,7 @@ //! Polkadot-specific GRANDPA integration utilities. +#[cfg(feature = "full-node")] use polkadot_primitives::v1::Hash; use sp_runtime::traits::{Block as BlockT, NumberFor}; @@ -25,7 +26,8 @@ use sp_runtime::traits::{Block as BlockT, NumberFor}; /// `N` + `M`, the voter will keep voting for block `N`. pub(crate) struct PauseAfterBlockFor(pub(crate) N, pub(crate) N); -impl grandpa::VotingRule for PauseAfterBlockFor> where +impl grandpa::VotingRule for PauseAfterBlockFor> +where Block: BlockT, B: sp_blockchain::HeaderBackend, { @@ -40,10 +42,7 @@ impl grandpa::VotingRule for PauseAfterBlockFor, - current_header: &Block::Header - | { + let find_target = |target_number: NumberFor, current_header: &Block::Header| { let mut target_hash = current_header.hash(); let mut target_header = current_header.clone(); @@ -96,6 +95,7 @@ impl grandpa::VotingRule for PauseAfterBlockFor Vec<( grandpa_primitives::SetId, (Hash, polkadot_primitives::v1::BlockNumber), @@ -233,38 +233,30 @@ pub(crate) fn kusama_hard_forks() -> Vec<( #[cfg(test)] mod tests { - use polkadot_test_runtime_client::prelude::*; - use polkadot_test_runtime_client::sp_consensus::BlockOrigin; - use sc_block_builder::BlockBuilderProvider; use grandpa::VotingRule; + use polkadot_test_client::{ + TestClientBuilder, TestClientBuilderExt, DefaultTestClientBuilderExt, InitPolkadotBlockBuilder, + ClientBlockImportExt, + }; use sp_blockchain::HeaderBackend; - use sp_runtime::generic::BlockId; - use sp_runtime::traits::Header; + use sp_runtime::{generic::BlockId, traits::Header}; + use consensus_common::BlockOrigin; use std::sync::Arc; #[test] fn grandpa_pause_voting_rule_works() { let _ = env_logger::try_init(); - let client = Arc::new(polkadot_test_runtime_client::new()); + let client = Arc::new(TestClientBuilder::new().build()); let mut push_blocks = { let mut client = client.clone(); - let mut base = 0; move |n| { - for i in 0..n { - let mut builder = client.new_block(Default::default()).unwrap(); - - for extrinsic in polkadot_test_runtime_client::needed_extrinsics(base + i) { - builder.push(extrinsic).unwrap() - } - - let block = builder.build().unwrap().block; + for _ in 0..n { + let block = client.init_polkadot_block_builder().build().unwrap().block; client.import(BlockOrigin::Own, block).unwrap(); } - - base += n; } }; @@ -279,20 +271,12 @@ mod tests { // add 10 blocks push_blocks(10); - assert_eq!( - client.info().best_number, - 10, - ); + assert_eq!(client.info().best_number, 10); // we have not reached the pause block // therefore nothing should be restricted assert_eq!( - voting_rule.restrict_vote( - &*client, - &get_header(0), - &get_header(10), - &get_header(10), - ), + voting_rule.restrict_vote(&*client, &get_header(0), &get_header(10), &get_header(10)), None, ); @@ -303,12 +287,7 @@ mod tests { // we are targeting the pause block, // the vote should not be restricted assert_eq!( - voting_rule.restrict_vote( - &*client, - &get_header(10), - &get_header(20), - &get_header(20), - ), + voting_rule.restrict_vote(&*client, &get_header(10), &get_header(20), &get_header(20)), None, ); @@ -316,12 +295,7 @@ mod tests { // be limited to the pause block. let pause_block = get_header(20); assert_eq!( - voting_rule.restrict_vote( - &*client, - &get_header(10), - &get_header(21), - &get_header(21), - ), + voting_rule.restrict_vote(&*client, &get_header(10), &get_header(21), &get_header(21)), Some((pause_block.hash(), *pause_block.number())), ); diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index c8295c29c55c4f5ac4f0b669f5f3307b405229cf..ed86833888ad98653381788816cf7cd994ce0423 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -16,46 +16,62 @@ //! Polkadot service. Specialized wrapper over substrate service. +#![deny(unused_results)] + pub mod chain_spec; mod grandpa_support; mod client; -use std::sync::Arc; -use std::time::Duration; -use polkadot_primitives::v1::{AccountId, Nonce, Balance}; -use service::{error::Error as ServiceError}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; -use sc_executor::native_executor_instance; -use log::info; -use sp_blockchain::HeaderBackend; -use polkadot_overseer::{self as overseer, AllSubsystems, BlockInfo, Overseer, OverseerHandler}; -use polkadot_subsystem::DummySubsystem; -use polkadot_node_core_proposer::ProposerFactory; -use sp_trie::PrefixedMemoryDB; +#[cfg(feature = "full-node")] +use { + std::convert::TryInto, + std::time::Duration, + tracing::info, + polkadot_node_core_av_store::Config as AvailabilityConfig, + polkadot_node_core_av_store::Error as AvailabilityError, + polkadot_node_core_proposer::ProposerFactory, + polkadot_overseer::{AllSubsystems, BlockInfo, Overseer, OverseerHandler}, + polkadot_primitives::v1::ParachainHost, + sc_authority_discovery::Service as AuthorityDiscoveryService, + sp_blockchain::HeaderBackend, + sp_keystore::SyncCryptoStorePtr, + sp_trie::PrefixedMemoryDB, + sc_client_api::ExecutorProvider, +}; + use sp_core::traits::SpawnNamed; -use sc_client_api::ExecutorProvider; + + +use polkadot_subsystem::jaeger; + +use std::sync::Arc; + +use prometheus_endpoint::Registry; +use sc_executor::native_executor_instance; +use service::RpcHandlers; + +pub use self::client::{AbstractClient, Client, ClientHandle, ExecuteWithClient, RuntimeApiCollection}; +pub use chain_spec::{PolkadotChainSpec, KusamaChainSpec, WestendChainSpec, RococoChainSpec}; +pub use consensus_common::{Proposal, SelectChain, BlockImport, RecordProof, block_validation::Chain}; +pub use polkadot_parachain::wasm_executor::IsolationStrategy; +pub use polkadot_primitives::v1::{Block, BlockId, CollatorId, Hash, Id as ParaId}; +pub use sc_client_api::{Backend, ExecutionStrategy, CallExecutor}; +pub use sc_consensus::LongestChain; +pub use sc_executor::NativeExecutionDispatch; pub use service::{ - Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, + Role, PruningMode, TransactionPoolOptions, Error as SubstrateServiceError, RuntimeGenesis, TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, Configuration, ChainSpec, TaskManager, }; pub use service::config::{DatabaseConfig, PrometheusConfig}; -pub use sc_executor::NativeExecutionDispatch; -pub use sc_client_api::{Backend, ExecutionStrategy, CallExecutor}; -pub use sc_consensus::LongestChain; pub use sp_api::{ApiRef, Core as CoreApi, ConstructRuntimeApi, ProvideRuntimeApi, StateBackend}; -pub use sp_runtime::traits::{DigestFor, HashFor, NumberFor}; -pub use consensus_common::{Proposal, SelectChain, BlockImport, RecordProof, block_validation::Chain}; -pub use polkadot_primitives::v1::{Block, BlockId, CollatorId, Id as ParaId}; -pub use sp_runtime::traits::{Block as BlockT, self as runtime_traits, BlakeTwo256}; -pub use chain_spec::{PolkadotChainSpec, KusamaChainSpec, WestendChainSpec}; -#[cfg(feature = "full-node")] -pub use codec::Codec; -pub use polkadot_runtime; +pub use sp_runtime::traits::{DigestFor, HashFor, NumberFor, Block as BlockT, self as runtime_traits, BlakeTwo256}; + pub use kusama_runtime; +pub use polkadot_runtime; +pub use rococo_runtime; pub use westend_runtime; -use prometheus_endpoint::Registry; -pub use self::client::PolkadotClient; native_executor_instance!( pub PolkadotExecutor, @@ -78,39 +94,46 @@ native_executor_instance!( frame_benchmarking::benchmarking::HostFunctions, ); -/// A set of APIs that polkadot-like runtimes must implement. -pub trait RuntimeApiCollection: - sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::ApiExt - + babe_primitives::BabeApi - + grandpa_primitives::GrandpaApi - + sp_block_builder::BlockBuilder - + frame_system_rpc_runtime_api::AccountNonceApi - + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi - + sp_api::Metadata - + sp_offchain::OffchainWorkerApi - + sp_session::SessionKeys - + authority_discovery_primitives::AuthorityDiscoveryApi -where - >::StateBackend: sp_api::StateBackend>, -{} +native_executor_instance!( + pub RococoExecutor, + rococo_runtime::api::dispatch, + rococo_runtime::native_version, + frame_benchmarking::benchmarking::HostFunctions, +); -impl RuntimeApiCollection for Api -where - Api: - sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::ApiExt - + babe_primitives::BabeApi - + grandpa_primitives::GrandpaApi - + sp_block_builder::BlockBuilder - + frame_system_rpc_runtime_api::AccountNonceApi - + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi - + sp_api::Metadata - + sp_offchain::OffchainWorkerApi - + sp_session::SessionKeys - + authority_discovery_primitives::AuthorityDiscoveryApi, - >::StateBackend: sp_api::StateBackend>, -{} +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error(transparent)] + Io(#[from] std::io::Error), + + #[error(transparent)] + AddrFormatInvalid(#[from] std::net::AddrParseError), + + #[error(transparent)] + Sub(#[from] SubstrateServiceError), + + #[error(transparent)] + Blockchain(#[from] sp_blockchain::Error), + + #[error(transparent)] + Consensus(#[from] consensus_common::Error), + + #[error("Failed to create an overseer")] + Overseer(#[from] polkadot_overseer::SubsystemError), + + #[error(transparent)] + Prometheus(#[from] prometheus_endpoint::PrometheusError), + + #[error(transparent)] + Jaeger(#[from] polkadot_subsystem::jaeger::JaegerError), + + #[cfg(feature = "full-node")] + #[error(transparent)] + Availability(#[from] AvailabilityError), + + #[error("Authorities require the real overseer implementation")] + AuthoritiesRequireRealOverseer, +} /// Can be called for a `Configuration` to check if it is a configuration for the `Kusama` network. pub trait IdentifyVariant { @@ -119,6 +142,9 @@ pub trait IdentifyVariant { /// Returns if this is a configuration for the `Westend` network. fn is_westend(&self) -> bool; + + /// Returns if this is a configuration for the `Rococo` network. + fn is_rococo(&self) -> bool; } impl IdentifyVariant for Box { @@ -128,10 +154,13 @@ impl IdentifyVariant for Box { fn is_westend(&self) -> bool { self.id().starts_with("westend") || self.id().starts_with("wnd") } + fn is_rococo(&self) -> bool { + self.id().starts_with("rococo") || self.id().starts_with("rco") + } } // If we're using prometheus, use a registry with a prefix of `polkadot`. -fn set_prometheus_registry(config: &mut Configuration) -> Result<(), ServiceError> { +fn set_prometheus_registry(config: &mut Configuration) -> Result<(), Error> { if let Some(PrometheusConfig { registry, .. }) = config.prometheus_config.as_mut() { *registry = Registry::new_custom(Some("polkadot".into()), None)?; } @@ -139,9 +168,25 @@ fn set_prometheus_registry(config: &mut Configuration) -> Result<(), ServiceErro Ok(()) } -type FullBackend = service::TFullBackend; +/// Initialize the `Jeager` collector. The destination must listen +/// on the given address and port for `UDP` packets. +fn jaeger_launch_collector_with_agent(spawner: impl SpawnNamed, config: &Configuration, agent: Option) -> Result<(), Error> { + if let Some(agent) = agent { + let cfg = jaeger::JaegerConfig::builder() + .agent(agent) + .named(&config.network.node_name) + .build(); + + jaeger::Jaeger::new(cfg).launch(spawner)?; + } + Ok(()) +} + +pub type FullBackend = service::TFullBackend; +#[cfg(feature = "full-node")] type FullSelectChain = sc_consensus::LongestChain; -type FullClient = service::TFullClient; +pub type FullClient = service::TFullClient; +#[cfg(feature = "full-node")] type FullGrandpaBlockImport = grandpa::GrandpaBlockImport< FullBackend, Block, FullClient, FullSelectChain >; @@ -152,7 +197,7 @@ type LightClient = service::TLightClientWithBackend; #[cfg(feature = "full-node")] -fn new_partial(config: &mut Configuration) -> Result< +fn new_partial(config: &mut Configuration, jaeger_agent: Option) -> Result< service::PartialComponents< FullClient, FullBackend, FullSelectChain, consensus_common::DefaultImportQueue>, @@ -182,12 +227,15 @@ fn new_partial(config: &mut Configuration) -> Result< { set_prometheus_registry(config)?; + let inherent_data_providers = inherents::InherentDataProviders::new(); - let (client, backend, keystore, task_manager) = + let (client, backend, keystore_container, task_manager) = service::new_full_parts::(&config)?; let client = Arc::new(client); + jaeger_launch_collector_with_agent(task_manager.spawn_handle(), &*config, jaeger_agent)?; + let select_chain = sc_consensus::LongestChain::new(backend.clone()); let transaction_pool = sc_transaction_pool::BasicPool::new_full( @@ -223,7 +271,6 @@ fn new_partial(config: &mut Configuration) -> Result< babe_link.clone(), block_import.clone(), Some(Box::new(justification_import)), - None, client.clone(), select_chain.clone(), inherent_data_providers.clone(), @@ -235,6 +282,8 @@ fn new_partial(config: &mut Configuration) -> Result< let justification_stream = grandpa_link.justification_stream(); let shared_authority_set = grandpa_link.shared_authority_set().clone(); let shared_voter_state = grandpa::SharedVoterState::empty(); + let finality_proof_provider = + GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); let import_setup = (block_import.clone(), grandpa_link, babe_link.clone()); let rpc_setup = shared_voter_state.clone(); @@ -244,15 +293,17 @@ fn new_partial(config: &mut Configuration) -> Result< let rpc_extensions_builder = { let client = client.clone(); - let keystore = keystore.clone(); + let keystore = keystore_container.sync_keystore(); let transaction_pool = transaction_pool.clone(); let select_chain = select_chain.clone(); + let chain_spec = config.chain_spec.cloned_box(); move |deny_unsafe, subscription_executor| -> polkadot_rpc::RpcExtension { let deps = polkadot_rpc::FullDeps { client: client.clone(), pool: transaction_pool.clone(), select_chain: select_chain.clone(), + chain_spec: chain_spec.cloned_box(), deny_unsafe, babe: polkadot_rpc::BabeDeps { babe_config: babe_config.clone(), @@ -264,6 +315,7 @@ fn new_partial(config: &mut Configuration) -> Result< shared_authority_set: shared_authority_set.clone(), justification_stream: justification_stream.clone(), subscription_executor, + finality_provider: finality_proof_provider.clone(), }, }; @@ -272,80 +324,250 @@ fn new_partial(config: &mut Configuration) -> Result< }; Ok(service::PartialComponents { - client, backend, task_manager, keystore, select_chain, import_queue, transaction_pool, + client, + backend, + task_manager, + keystore_container, + select_chain, + import_queue, + transaction_pool, inherent_data_providers, other: (rpc_extensions_builder, import_setup, rpc_setup) }) } -fn real_overseer( +#[cfg(all(feature="full-node", not(feature = "real-overseer")))] +fn real_overseer( + leaves: impl IntoIterator, + _: SyncCryptoStorePtr, + _: Arc, + _: AvailabilityConfig, + _: Arc>, + _: AuthorityDiscoveryService, + registry: Option<&Registry>, + spawner: Spawner, + _: IsCollator, + _: IsolationStrategy, +) -> Result<(Overseer, OverseerHandler), Error> +where + RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend, + RuntimeClient::Api: ParachainHost, + Spawner: 'static + SpawnNamed + Clone + Unpin, +{ + Overseer::new( + leaves, + AllSubsystems::<()>::dummy(), + registry, + spawner, + ).map_err(|e| e.into()) +} + +#[cfg(all(feature = "full-node", feature = "real-overseer"))] +fn real_overseer( leaves: impl IntoIterator, - prometheus_registry: Option<&Registry>, - s: S, -) -> Result<(Overseer, OverseerHandler), ServiceError> { + keystore: SyncCryptoStorePtr, + runtime_client: Arc, + availability_config: AvailabilityConfig, + network_service: Arc>, + authority_discovery: AuthorityDiscoveryService, + registry: Option<&Registry>, + spawner: Spawner, + is_collator: IsCollator, + isolation_strategy: IsolationStrategy, +) -> Result<(Overseer, OverseerHandler), Error> +where + RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend, + RuntimeClient::Api: ParachainHost, + Spawner: 'static + SpawnNamed + Clone + Unpin, +{ + use polkadot_node_subsystem_util::metrics::Metrics; + + use polkadot_availability_distribution::AvailabilityDistributionSubsystem; + use polkadot_node_core_av_store::AvailabilityStoreSubsystem; + use polkadot_availability_bitfield_distribution::BitfieldDistribution as BitfieldDistributionSubsystem; + use polkadot_node_core_bitfield_signing::BitfieldSigningSubsystem; + use polkadot_node_core_backing::CandidateBackingSubsystem; + use polkadot_node_core_candidate_selection::CandidateSelectionSubsystem; + use polkadot_node_core_candidate_validation::CandidateValidationSubsystem; + use polkadot_node_core_chain_api::ChainApiSubsystem; + use polkadot_node_collation_generation::CollationGenerationSubsystem; + use polkadot_collator_protocol::{CollatorProtocolSubsystem, ProtocolSide}; + use polkadot_network_bridge::NetworkBridge as NetworkBridgeSubsystem; + use polkadot_pov_distribution::PoVDistribution as PoVDistributionSubsystem; + use polkadot_node_core_provisioner::ProvisioningSubsystem as ProvisionerSubsystem; + use polkadot_node_core_runtime_api::RuntimeApiSubsystem; + use polkadot_statement_distribution::StatementDistribution as StatementDistributionSubsystem; + let all_subsystems = AllSubsystems { - candidate_validation: DummySubsystem, - candidate_backing: DummySubsystem, - candidate_selection: DummySubsystem, - statement_distribution: DummySubsystem, - availability_distribution: DummySubsystem, - bitfield_signing: DummySubsystem, - bitfield_distribution: DummySubsystem, - provisioner: DummySubsystem, - pov_distribution: DummySubsystem, - runtime_api: DummySubsystem, - availability_store: DummySubsystem, - network_bridge: DummySubsystem, - chain_api: DummySubsystem, - collation_generation: DummySubsystem, - collator_protocol: DummySubsystem, + availability_distribution: AvailabilityDistributionSubsystem::new( + keystore.clone(), + Metrics::register(registry)?, + ), + availability_store: AvailabilityStoreSubsystem::new_on_disk( + availability_config, + Metrics::register(registry)?, + )?, + bitfield_distribution: BitfieldDistributionSubsystem::new( + Metrics::register(registry)?, + ), + bitfield_signing: BitfieldSigningSubsystem::new( + spawner.clone(), + keystore.clone(), + Metrics::register(registry)?, + ), + candidate_backing: CandidateBackingSubsystem::new( + spawner.clone(), + keystore.clone(), + Metrics::register(registry)?, + ), + candidate_selection: CandidateSelectionSubsystem::new( + spawner.clone(), + keystore.clone(), + Metrics::register(registry)?, + ), + candidate_validation: CandidateValidationSubsystem::new( + spawner.clone(), + Metrics::register(registry)?, + isolation_strategy, + ), + chain_api: ChainApiSubsystem::new( + runtime_client.clone(), + Metrics::register(registry)?, + ), + collation_generation: CollationGenerationSubsystem::new( + Metrics::register(registry)?, + ), + collator_protocol: { + let side = match is_collator { + IsCollator::Yes(id) => ProtocolSide::Collator(id, Metrics::register(registry)?), + IsCollator::No => ProtocolSide::Validator(Metrics::register(registry)?), + }; + CollatorProtocolSubsystem::new( + side, + ) + }, + network_bridge: NetworkBridgeSubsystem::new( + network_service, + authority_discovery, + ), + pov_distribution: PoVDistributionSubsystem::new( + Metrics::register(registry)?, + ), + provisioner: ProvisionerSubsystem::new( + spawner.clone(), + (), + Metrics::register(registry)?, + ), + runtime_api: RuntimeApiSubsystem::new( + runtime_client, + Metrics::register(registry)?, + spawner.clone(), + ), + statement_distribution: StatementDistributionSubsystem::new( + Metrics::register(registry)?, + ), }; Overseer::new( leaves, all_subsystems, - prometheus_registry, - s, - ).map_err(|e| ServiceError::Other(format!("Failed to create an Overseer: {:?}", e))) + registry, + spawner, + ).map_err(|e| e.into()) +} + +#[cfg(feature = "full-node")] +pub struct NewFull { + pub task_manager: TaskManager, + pub client: C, + pub overseer_handler: Option, + pub network: Arc::Hash>>, + pub network_status_sinks: service::NetworkStatusSinks, + pub rpc_handlers: RpcHandlers, + pub backend: Arc, +} + +#[cfg(feature = "full-node")] +impl NewFull { + /// Convert the client type using the given `func`. + pub fn with_client(self, func: impl FnOnce(C) -> NC) -> NewFull { + NewFull { + client: func(self.client), + task_manager: self.task_manager, + overseer_handler: self.overseer_handler, + network: self.network, + network_status_sinks: self.network_status_sinks, + rpc_handlers: self.rpc_handlers, + backend: self.backend, + } + } } +/// Is this node a collator? #[cfg(feature = "full-node")] -fn new_full( +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum IsCollator { + /// This node is a collator. + Yes(CollatorId), + /// This node is not a collator. + No, +} + +#[cfg(feature = "full-node")] +impl IsCollator { + /// Is this a collator? + fn is_collator(&self) -> bool { + matches!(self, Self::Yes(_)) + } +} + +/// Create a new full node of arbitrary runtime and executor. +/// +/// This is an advanced feature and not recommended for general use. Generally, `build_full` is +/// a better choice. +#[cfg(feature = "full-node")] +pub fn new_full( mut config: Configuration, - collating_for: Option<(CollatorId, ParaId)>, - _max_block_data_size: Option, - _authority_discovery_enabled: bool, - _slot_duration: u64, + is_collator: IsCollator, grandpa_pause: Option<(u32, u32)>, -) -> Result<( - TaskManager, - Arc>, -), Error> + jaeger_agent: Option, + isolation_strategy: IsolationStrategy, +) -> Result>>, Error> where RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, RuntimeApi::RuntimeApi: RuntimeApiCollection>, Executor: NativeExecutionDispatch + 'static, { - use sp_core::traits::BareCryptoStorePtr; - - let is_collator = collating_for.is_some(); let role = config.role.clone(); - let is_authority = role.is_authority() && !is_collator; let force_authoring = config.force_authoring; + let backoff_authoring_blocks = + Some(sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging::default()); let disable_grandpa = config.disable_grandpa; let name = config.network.node_name.clone(); let service::PartialComponents { - client, backend, mut task_manager, keystore, select_chain, import_queue, transaction_pool, + client, + backend, + mut task_manager, + keystore_container, + select_chain, + import_queue, + transaction_pool, inherent_data_providers, other: (rpc_extensions_builder, import_setup, rpc_setup) - } = new_partial::(&mut config)?; + } = new_partial::(&mut config, jaeger_agent)?; let prometheus_registry = config.prometheus_registry().cloned(); - let finality_proof_provider = - GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); + let shared_voter_state = rpc_setup; + + // 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. + config.network.extra_sets.push(grandpa::grandpa_peers_set_config()); + #[cfg(feature = "real-overseer")] + config.network.extra_sets.extend(polkadot_network_bridge::peers_sets_info()); let (network, network_status_sinks, system_rpc_tx, network_starter) = service::build_network(service::BuildNetworkParams { @@ -356,23 +578,23 @@ fn new_full( import_queue, on_demand: None, block_announce_validator_builder: None, - finality_proof_request_builder: None, - finality_proof_provider: Some(finality_proof_provider.clone()), })?; if config.offchain_worker.enabled { - service::build_offchain_workers( + let _ = service::build_offchain_workers( &config, backend.clone(), task_manager.spawn_handle(), client.clone(), network.clone(), ); } let telemetry_connection_sinks = service::TelemetryConnectionSinks::default(); - service::spawn_tasks(service::SpawnTasksParams { + let availability_config = config.database.clone().try_into().map_err(Error::Availability)?; + + let rpc_handlers = service::spawn_tasks(service::SpawnTasksParams { config, backend: backend.clone(), client: client.clone(), - keystore: keystore.clone(), + keystore: keystore_container.sync_keystore(), network: network.clone(), rpc_extensions_builder: Box::new(rpc_extensions_builder), transaction_pool: transaction_pool.clone(), @@ -380,13 +602,12 @@ fn new_full( on_demand: None, remote_blockchain: None, telemetry_connection_sinks: telemetry_connection_sinks.clone(), - network_status_sinks, system_rpc_tx, + network_status_sinks: network_status_sinks.clone(), + system_rpc_tx, })?; let (block_import, link_half, babe_link) = import_setup; - let shared_voter_state = rpc_setup; - let overseer_client = client.clone(); let spawner = task_manager.spawn_handle(); let leaves: Vec<_> = select_chain.clone() @@ -405,41 +626,89 @@ fn new_full( }) .collect(); - let (overseer, handler) = real_overseer(leaves, prometheus_registry.as_ref(), spawner)?; - let handler_clone = handler.clone(); + let authority_discovery_service = if role.is_authority() || is_collator.is_collator() { + use sc_network::Event; + use futures::StreamExt; + + let authority_discovery_role = if role.is_authority() { + sc_authority_discovery::Role::PublishAndDiscover( + keystore_container.keystore(), + ) + } else { + // don't publish our addresses when we're only a collator + sc_authority_discovery::Role::Discover + }; + let dht_event_stream = network.event_stream("authority-discovery") + .filter_map(|e| async move { match e { + Event::Dht(e) => Some(e), + _ => None, + }}); + let (worker, service) = sc_authority_discovery::new_worker_and_service( + client.clone(), + network.clone(), + Box::pin(dht_event_stream), + authority_discovery_role, + prometheus_registry.clone(), + ); - task_manager.spawn_essential_handle().spawn_blocking("overseer", Box::pin(async move { - use futures::{pin_mut, select, FutureExt}; + task_manager.spawn_handle().spawn("authority-discovery-worker", worker.run()); + Some(service) + } else { + None + }; + + // we'd say let overseer_handler = authority_discovery_service.map(|authority_discovery_service|, ...), + // but in that case we couldn't use ? to propagate errors + let overseer_handler = if let Some(authority_discovery_service) = authority_discovery_service { + let (overseer, overseer_handler) = real_overseer( + leaves, + keystore_container.sync_keystore(), + overseer_client.clone(), + availability_config, + network.clone(), + authority_discovery_service, + prometheus_registry.as_ref(), + spawner, + is_collator, + isolation_strategy, + )?; + let overseer_handler_clone = overseer_handler.clone(); - let forward = overseer::forward_events(overseer_client, handler); + task_manager.spawn_essential_handle().spawn_blocking("overseer", Box::pin(async move { + use futures::{pin_mut, select, FutureExt}; - let forward = forward.fuse(); - let overseer_fut = overseer.run().fuse(); + let forward = polkadot_overseer::forward_events(overseer_client, overseer_handler_clone); - pin_mut!(overseer_fut); - pin_mut!(forward); + let forward = forward.fuse(); + let overseer_fut = overseer.run().fuse(); + + pin_mut!(overseer_fut); + pin_mut!(forward); - loop { select! { - _ = forward => break, - _ = overseer_fut => break, - complete => break, + _ = forward => (), + _ = overseer_fut => (), + complete => (), } - } - })); + })); + + Some(overseer_handler) + } else { None }; if role.is_authority() { let can_author_with = consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()); let proposer = ProposerFactory::new( + task_manager.spawn_handle(), client.clone(), transaction_pool, - handler_clone, + overseer_handler.as_ref().ok_or(Error::AuthoritiesRequireRealOverseer)?.clone(), + prometheus_registry.as_ref(), ); let babe_config = babe::BabeParams { - keystore: keystore.clone(), + keystore: keystore_container.sync_keystore(), client: client.clone(), select_chain, block_import, @@ -447,6 +716,7 @@ fn new_full( sync_oracle: network.clone(), inherent_data_providers: inherent_data_providers.clone(), force_authoring, + backoff_authoring_blocks, babe_link, can_author_with, }; @@ -457,8 +727,8 @@ fn new_full( // if the node isn't actively participating in consensus then it doesn't // need a keystore, regardless of which protocol we use below. - let keystore = if is_authority { - Some(keystore.clone() as BareCryptoStorePtr) + let keystore_opt = if role.is_authority() { + Some(keystore_container.sync_keystore()) } else { None }; @@ -469,7 +739,7 @@ fn new_full( justification_period: 512, name: Some(name), observer_enabled: false, - keystore, + keystore: keystore_opt, is_authority: role.is_network_authority(), }; @@ -487,7 +757,10 @@ fn new_full( // given delay. let voting_rule = match grandpa_pause { Some((block, delay)) => { - info!("GRANDPA scheduled voting pause set for block #{} with a duration of {} blocks.", + info!( + block_number = %block, + delay = %delay, + "GRANDPA scheduled voting pause set for block #{} with a duration of {} blocks.", block, delay, ); @@ -495,20 +768,17 @@ fn new_full( grandpa::VotingRulesBuilder::default() .add(grandpa_support::PauseAfterBlockFor(block, delay)) .build() - }, - None => - grandpa::VotingRulesBuilder::default() - .build(), + } + None => grandpa::VotingRulesBuilder::default().build(), }; let grandpa_config = grandpa::GrandpaParams { config, link: link_half, network: network.clone(), - inherent_data_providers: inherent_data_providers.clone(), telemetry_on_connect: Some(telemetry_connection_sinks.on_connect_stream()), voting_rule, - prometheus_registry, + prometheus_registry: prometheus_registry.clone(), shared_voter_state, }; @@ -516,23 +786,23 @@ fn new_full( "grandpa-voter", grandpa::run_grandpa_voter(grandpa_config)? ); - } else { - grandpa::setup_disabled_grandpa( - client.clone(), - &inherent_data_providers, - network.clone(), - )?; } network_starter.start_network(); - Ok((task_manager, client)) + Ok(NewFull { + task_manager, + client, + overseer_handler, + network, + network_status_sinks, + rpc_handlers, + backend, + }) } -pub struct FullNodeHandles; - /// Builds a new service for a light client. -fn new_light(mut config: Configuration) -> Result +fn new_light(mut config: Configuration) -> Result<(TaskManager, RpcHandlers), Error> where Runtime: 'static + Send + Sync + ConstructRuntimeApi>, >>::RuntimeApi: @@ -542,7 +812,7 @@ fn new_light(mut config: Configuration) -> Result(&config)?; let select_chain = sc_consensus::LongestChain::new(backend.clone()); @@ -555,14 +825,12 @@ fn new_light(mut config: Configuration) -> Result), - Arc::new(on_demand.checker().clone()), + let (grandpa_block_import, _) = grandpa::block_import( + client.clone(), + &(client.clone() as Arc<_>), + select_chain.clone(), )?; - - let finality_proof_import = grandpa_block_import.clone(); - let finality_proof_request_builder = - finality_proof_import.create_finality_proof_request_builder(); + let justification_import = grandpa_block_import.clone(); let (babe_block_import, babe_link) = babe::block_import( babe::Config::get_or_compute(&*client)?, @@ -576,8 +844,7 @@ fn new_light(mut config: Configuration) -> Result(mut config: Configuration) -> Result(mut config: Configuration) -> Result(mut config: Configuration) -> Result(mut config: &mut Configuration) -> Result< +pub fn new_chain_ops(mut config: &mut Configuration, jaeger_agent: Option) -> Result< ( - Arc>, + Arc, Arc, consensus_common::import_queue::BasicQueue>, TaskManager, ), - ServiceError + Error > -where - Runtime: ConstructRuntimeApi> + Send + Sync + 'static, - Runtime::RuntimeApi: - RuntimeApiCollection>, - Dispatch: NativeExecutionDispatch + 'static, { config.keystore = service::config::KeystoreConfig::InMemory; - let service::PartialComponents { client, backend, import_queue, task_manager, .. } - = new_partial::(config)?; - Ok((client, backend, import_queue, task_manager)) -} - -/// Create a new Polkadot service for a full node. -#[cfg(feature = "full-node")] -pub fn polkadot_new_full( - config: Configuration, - collating_for: Option<(CollatorId, ParaId)>, - max_block_data_size: Option, - authority_discovery_enabled: bool, - slot_duration: u64, - grandpa_pause: Option<(u32, u32)>, -) - -> Result<( - TaskManager, - Arc>, - FullNodeHandles, - ), ServiceError> -{ - let (components, client) = new_full::( - config, - collating_for, - max_block_data_size, - authority_discovery_enabled, - slot_duration, - grandpa_pause, - )?; - - Ok((components, client, FullNodeHandles)) + if config.chain_spec.is_rococo() { + let service::PartialComponents { client, backend, import_queue, task_manager, .. } + = new_partial::(config, jaeger_agent)?; + Ok((Arc::new(Client::Rococo(client)), backend, import_queue, task_manager)) + } else if config.chain_spec.is_kusama() { + let service::PartialComponents { client, backend, import_queue, task_manager, .. } + = new_partial::(config, jaeger_agent)?; + Ok((Arc::new(Client::Kusama(client)), backend, import_queue, task_manager)) + } else if config.chain_spec.is_westend() { + let service::PartialComponents { client, backend, import_queue, task_manager, .. } + = new_partial::(config, jaeger_agent)?; + Ok((Arc::new(Client::Westend(client)), backend, import_queue, task_manager)) + } else { + let service::PartialComponents { client, backend, import_queue, task_manager, .. } + = new_partial::(config, jaeger_agent)?; + Ok((Arc::new(Client::Polkadot(client)), backend, import_queue, task_manager)) + } } -/// Create a new Kusama service for a full node. -#[cfg(feature = "full-node")] -pub fn kusama_new_full( - config: Configuration, - collating_for: Option<(CollatorId, ParaId)>, - max_block_data_size: Option, - authority_discovery_enabled: bool, - slot_duration: u64, - grandpa_pause: Option<(u32, u32)>, -) -> Result<( - TaskManager, - Arc - >, - FullNodeHandles, - ), ServiceError> -{ - let (components, client) = new_full::( - config, - collating_for, - max_block_data_size, - authority_discovery_enabled, - slot_duration, - grandpa_pause, - )?; - - Ok((components, client, FullNodeHandles)) +/// Build a new light node. +pub fn build_light(config: Configuration) -> Result<(TaskManager, RpcHandlers), Error> { + if config.chain_spec.is_rococo() { + new_light::(config) + } else if config.chain_spec.is_kusama() { + new_light::(config) + } else if config.chain_spec.is_westend() { + new_light::(config) + } else { + new_light::(config) + } } -/// Create a new Kusama service for a full node. #[cfg(feature = "full-node")] -pub fn westend_new_full( +pub fn build_full( config: Configuration, - collating_for: Option<(CollatorId, ParaId)>, - max_block_data_size: Option, - authority_discovery_enabled: bool, - slot_duration: u64, + is_collator: IsCollator, grandpa_pause: Option<(u32, u32)>, -) - -> Result<( - TaskManager, - Arc>, - FullNodeHandles, - ), ServiceError> -{ - let (components, client) = new_full::( - config, - collating_for, - max_block_data_size, - authority_discovery_enabled, - slot_duration, - grandpa_pause, - )?; - - Ok((components, client, FullNodeHandles)) -} - -/// Create a new Polkadot service for a light client. -pub fn polkadot_new_light(config: Configuration) -> Result -{ - new_light::(config) -} - -/// Create a new Kusama service for a light client. -pub fn kusama_new_light(config: Configuration) -> Result -{ - new_light::(config) -} - -/// Create a new Westend service for a light client. -pub fn westend_new_light(config: Configuration, ) -> Result -{ - new_light::(config) + jaeger_agent: Option, +) -> Result, Error> { + if config.chain_spec.is_rococo() { + new_full::( + config, + is_collator, + grandpa_pause, + jaeger_agent, + Default::default(), + ).map(|full| full.with_client(Client::Rococo)) + } else if config.chain_spec.is_kusama() { + new_full::( + config, + is_collator, + grandpa_pause, + jaeger_agent, + Default::default(), + ).map(|full| full.with_client(Client::Kusama)) + } else if config.chain_spec.is_westend() { + new_full::( + config, + is_collator, + grandpa_pause, + jaeger_agent, + Default::default(), + ).map(|full| full.with_client(Client::Westend)) + } else { + new_full::( + config, + is_collator, + grandpa_pause, + jaeger_agent, + Default::default(), + ).map(|full| full.with_client(Client::Polkadot)) + } } diff --git a/node/subsystem-test-helpers/Cargo.toml b/node/subsystem-test-helpers/Cargo.toml index 220af40deb938a85c0023d47d1a6937dbc31d730..48bb1f0f21555ff6ef0439159f7ea41bb8e565b8 100644 --- a/node/subsystem-test-helpers/Cargo.toml +++ b/node/subsystem-test-helpers/Cargo.toml @@ -6,19 +6,22 @@ edition = "2018" description = "Subsystem traits and message definitions" [dependencies] -async-trait = "0.1" -derive_more = "0.99.9" -futures = "0.3.5" +async-trait = "0.1.42" +futures = "0.3.8" futures-timer = "3.0.2" -log = "0.4.8" -parity-scale-codec = "1.3.4" -parking_lot = "0.10.0" -pin-project = "0.4.23" +tracing = "0.1.22" +tracing-futures = "0.2.4" +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +parking_lot = "0.11.1" +pin-project = "1.0.3" polkadot-node-primitives = { path = "../primitives" } polkadot-node-subsystem = { path = "../subsystem" } polkadot-node-subsystem-util = { path = "../subsystem-util" } polkadot-primitives = { path = "../../primitives" } polkadot-statement-table = { path = "../../statement-table" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -smallvec = "1.4.1" +smallvec = "1.6.1" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[dev-dependencies] +polkadot-overseer = { path = "../overseer" } diff --git a/node/subsystem-test-helpers/src/lib.rs b/node/subsystem-test-helpers/src/lib.rs index 817cad37f0dae8f63a5c7650a4391237b1dea8a5..512d761afed17797f40622e5dd97583a5ffeeda3 100644 --- a/node/subsystem-test-helpers/src/lib.rs +++ b/node/subsystem-test-helpers/src/lib.rs @@ -16,8 +16,13 @@ //! Utilities for testing subsystems. +#![warn(missing_docs)] + use polkadot_node_subsystem::messages::AllMessages; -use polkadot_node_subsystem::{FromOverseer, SubsystemContext, SubsystemError, SubsystemResult}; +use polkadot_node_subsystem::{ + FromOverseer, SubsystemContext, SubsystemError, SubsystemResult, Subsystem, + SpawnedSubsystem, OverseerSignal, +}; use polkadot_node_subsystem_util::TimeoutExt; use futures::channel::mpsc; @@ -166,7 +171,8 @@ impl SubsystemContext } async fn recv(&mut self) -> SubsystemResult> { - self.rx.next().await.ok_or(SubsystemError) + self.rx.next().await + .ok_or_else(|| SubsystemError::Context("Receiving end closed".to_owned())) } async fn spawn( @@ -185,15 +191,14 @@ impl SubsystemContext Ok(()) } - async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()> { + async fn send_message(&mut self, msg: AllMessages) { self.tx .send(msg) .await .expect("test overseer no longer live"); - Ok(()) } - async fn send_messages(&mut self, msgs: T) -> SubsystemResult<()> + async fn send_messages(&mut self, msgs: T) where T: IntoIterator + Send, T::IntoIter: Send, @@ -203,8 +208,6 @@ impl SubsystemContext .send_all(&mut iter) .await .expect("test overseer no longer live"); - - Ok(()) } } @@ -283,3 +286,59 @@ pub fn subsystem_test_harness( .expect("test timed out instead of completing") }); } + +/// A forward subsystem that implements [`Subsystem`]. +/// +/// It forwards all communication from the overseer to the internal message +/// channel. +/// +/// This subsystem is useful for testing functionality that interacts with the overseer. +pub struct ForwardSubsystem(pub mpsc::Sender); + +impl, Msg: Send + 'static> Subsystem for ForwardSubsystem { + fn start(mut self, mut ctx: C) -> SpawnedSubsystem { + let future = Box::pin(async move { + loop { + match ctx.recv().await { + Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return Ok(()), + Ok(FromOverseer::Communication { msg }) => { + let _ = self.0.send(msg).await; + }, + Err(_) => return Ok(()), + _ => (), + } + } + }); + + SpawnedSubsystem { + name: "forward-subsystem", + future, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use polkadot_overseer::{Overseer, AllSubsystems}; + use futures::executor::block_on; + use polkadot_node_subsystem::messages::CandidateSelectionMessage; + + #[test] + fn forward_subsystem_works() { + let spawner = sp_core::testing::TaskExecutor::new(); + let (tx, rx) = mpsc::channel(2); + let all_subsystems = AllSubsystems::<()>::dummy().replace_candidate_selection(ForwardSubsystem(tx)); + let (overseer, mut handler) = Overseer::new( + Vec::new(), + all_subsystems, + None, + spawner.clone(), + ).unwrap(); + + spawner.spawn("overseer", overseer.run().then(|_| async { () }).boxed()); + + block_on(handler.send_msg(CandidateSelectionMessage::Invalid(Default::default(), Default::default()))); + assert!(matches!(block_on(rx.into_future()).0.unwrap(), CandidateSelectionMessage::Invalid(_, _))); + } +} diff --git a/node/subsystem-util/Cargo.toml b/node/subsystem-util/Cargo.toml index 2c189419cc15e88939ab8bfc35fa00d6bf383cb4..0be519cf2d7354848366c30615731281ef48ef0c 100644 --- a/node/subsystem-util/Cargo.toml +++ b/node/subsystem-util/Cargo.toml @@ -6,28 +6,33 @@ edition = "2018" description = "Subsystem traits and message definitions" [dependencies] -async-trait = "0.1" -derive_more = "0.99.9" -futures = "0.3.5" +async-trait = "0.1.42" +futures = "0.3.8" futures-timer = "3.0.2" -keystore = { package = "sc-keystore", git = "https://github.com/paritytech/substrate", branch = "master" } -log = "0.4.8" -parity-scale-codec = "1.3.4" -parking_lot = { version = "0.10.0", optional = true } -pin-project = "0.4.22" +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +parking_lot = { version = "0.11.1", optional = true } +pin-project = "1.0.3" +streamunordered = "0.5.1" +thiserror = "1.0.23" +tracing = "0.1.22" +tracing-futures = "0.2.4" + polkadot-node-primitives = { path = "../primitives" } polkadot-node-subsystem = { path = "../subsystem" } +polkadot-node-jaeger = { path = "../jaeger" } polkadot-primitives = { path = "../../primitives" } -polkadot-statement-table = { path = "../../statement-table" } + sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -smallvec = "1.4.1" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -streamunordered = "0.5.1" +sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } +substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } [dev-dependencies] -assert_matches = "1.3.0" -async-trait = "0.1" -futures = { version = "0.3.5", features = ["thread-pool"] } -parking_lot = "0.10.0" +assert_matches = "1.4.0" +async-trait = "0.1.42" +env_logger = "0.8.2" +futures = { version = "0.3.8", features = ["thread-pool"] } +log = "0.4.11" +parking_lot = "0.11.1" polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } -env_logger = "0.7.1" diff --git a/node/subsystem-util/src/lib.rs b/node/subsystem-util/src/lib.rs index 0a44a327d61bdac2b59022d6e0d7662fd3845388..e9fd475f10be58846ddae96580a04b0d2f576834 100644 --- a/node/subsystem-util/src/lib.rs +++ b/node/subsystem-util/src/lib.rs @@ -19,41 +19,37 @@ //! Many subsystems have common interests such as canceling a bunch of spawned jobs, //! or determining what their validator ID is. These common interests are factored into //! this module. +//! +//! This crate also reexports Prometheus metric types which are expected to be implemented by subsystems. + +#![warn(missing_docs)] use polkadot_node_subsystem::{ - errors::{ChainApiError, RuntimeApiError}, - messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest, RuntimeApiSender}, + errors::RuntimeApiError, + messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest, RuntimeApiSender, BoundToRelayParent}, FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, SubsystemResult, - metrics, -}; -use futures::{ - channel::{mpsc, oneshot}, - future::Either, - prelude::*, - select, - stream::Stream, - task, }; +use polkadot_node_jaeger::JaegerSpan; +use futures::{channel::{mpsc, oneshot}, prelude::*, select, stream::Stream}; use futures_timer::Delay; -use keystore::KeyStorePtr; use parity_scale_codec::Encode; -use pin_project::{pin_project, pinned_drop}; +use pin_project::pin_project; use polkadot_primitives::v1::{ CandidateEvent, CommittedCandidateReceipt, CoreState, EncodeAs, PersistedValidationData, GroupRotationInfo, Hash, Id as ParaId, ValidationData, OccupiedCoreAssumption, - SessionIndex, Signed, SigningContext, ValidationCode, ValidatorId, ValidatorIndex, - ValidatorPair, + SessionIndex, Signed, SigningContext, ValidationCode, ValidatorId, ValidatorIndex, SessionInfo, }; -use sp_core::{Pair, traits::SpawnNamed}; +use sp_core::{traits::SpawnNamed, Public}; +use sp_application_crypto::AppKey; +use sp_keystore::{CryptoStore, SyncCryptoStorePtr, Error as KeystoreError}; use std::{ - collections::HashMap, - convert::{TryFrom, TryInto}, - marker::Unpin, - pin::Pin, - task::{Poll, Context}, - time::Duration, + collections::{HashMap, hash_map::Entry}, convert::{TryFrom, TryInto}, marker::Unpin, pin::Pin, task::{Poll, Context}, + time::Duration, fmt, sync::Arc, }; use streamunordered::{StreamUnordered, StreamYield}; +use thiserror::Error; + +pub mod validator_discovery; /// These reexports are required so that external crates can use the `delegated_subsystem` macro properly. pub mod reexports { @@ -65,41 +61,37 @@ pub mod reexports { }; } - /// Duration a job will wait after sending a stop signal before hard-aborting. pub const JOB_GRACEFUL_STOP_DURATION: Duration = Duration::from_secs(1); /// Capacity of channels to and from individual jobs pub const JOB_CHANNEL_CAPACITY: usize = 64; - /// Utility errors -#[derive(Debug, derive_more::From)] +#[derive(Debug, Error)] pub enum Error { /// Attempted to send or receive on a oneshot channel which had been canceled - #[from] - Oneshot(oneshot::Canceled), + #[error(transparent)] + Oneshot(#[from] oneshot::Canceled), /// Attempted to send on a MPSC channel which has been canceled - #[from] - Mpsc(mpsc::SendError), + #[error(transparent)] + Mpsc(#[from] mpsc::SendError), /// A subsystem error - #[from] - Subsystem(SubsystemError), - /// An error in the Chain API. - #[from] - ChainApi(ChainApiError), + #[error(transparent)] + Subsystem(#[from] SubsystemError), /// An error in the Runtime API. - #[from] - RuntimeApi(RuntimeApiError), + #[error(transparent)] + RuntimeApi(#[from] RuntimeApiError), /// The type system wants this even though it doesn't make sense - #[from] - Infallible(std::convert::Infallible), + #[error(transparent)] + Infallible(#[from] std::convert::Infallible), /// Attempted to convert from an AllMessages to a FromJob, and failed. + #[error("AllMessage not relevant to Job")] SenderConversion(String), /// The local node is not a validator. + #[error("Node is not a validator")] NotAValidator, - /// The desired job is not present in the jobs list. - JobNotFound(Hash), /// Already forwarding errors to another sender + #[error("AlreadyForwarding")] AlreadyForwarding, } @@ -114,18 +106,11 @@ pub async fn request_from_runtime( ) -> Result, Error> where RequestBuilder: FnOnce(RuntimeApiSender) -> RuntimeApiRequest, - FromJob: TryFrom, - >::Error: std::fmt::Debug, + FromJob: From, { let (tx, rx) = oneshot::channel(); - sender - .send( - AllMessages::RuntimeApi(RuntimeApiMessage::Request(parent, request_builder(tx))) - .try_into() - .map_err(|err| Error::SenderConversion(format!("{:?}", err)))?, - ) - .await?; + sender.send(AllMessages::RuntimeApi(RuntimeApiMessage::Request(parent, request_builder(tx))).into()).await?; Ok(rx) } @@ -154,8 +139,7 @@ macro_rules! specialize_requests { sender: &mut mpsc::Sender, ) -> Result, Error> where - FromJob: TryFrom, - >::Error: std::fmt::Debug, + FromJob: From, { request_from_runtime(parent, sender, |tx| RuntimeApiRequest::$request_variant( $( $param_name, )* tx @@ -191,6 +175,7 @@ specialize_requests! { fn request_validation_code(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; ValidationCode; fn request_candidate_pending_availability(para_id: ParaId) -> Option; CandidatePendingAvailability; fn request_candidate_events() -> Vec; CandidateEvents; + fn request_session_info(index: SessionIndex) -> Option; SessionInfo; } /// Request some data from the `RuntimeApi` via a SubsystemContext. @@ -205,13 +190,11 @@ where { let (tx, rx) = oneshot::channel(); - ctx - .send_message( - AllMessages::RuntimeApi(RuntimeApiMessage::Request(parent, request_builder(tx))) - .try_into() - .map_err(|err| Error::SenderConversion(format!("{:?}", err)))?, - ) - .await?; + ctx.send_message( + AllMessages::RuntimeApi(RuntimeApiMessage::Request(parent, request_builder(tx))) + .try_into() + .map_err(|err| Error::SenderConversion(format!("{:?}", err)))?, + ).await; Ok(rx) } @@ -274,23 +257,27 @@ specialize_requests_ctx! { fn request_validation_code_ctx(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option; ValidationCode; fn request_candidate_pending_availability_ctx(para_id: ParaId) -> Option; CandidatePendingAvailability; fn request_candidate_events_ctx() -> Vec; CandidateEvents; + fn request_session_info_ctx(index: SessionIndex) -> Option; SessionInfo; } /// From the given set of validators, find the first key we can sign with, if any. -pub fn signing_key(validators: &[ValidatorId], keystore: &KeyStorePtr) -> Option { - let keystore = keystore.read(); - validators - .iter() - .find_map(|v| keystore.key_pair::(&v).ok()) +pub async fn signing_key(validators: &[ValidatorId], keystore: SyncCryptoStorePtr) -> Option { + for v in validators.iter() { + if CryptoStore::has_keys(&*keystore, &[(v.to_raw_vec(), ValidatorId::ID)]).await { + return Some(v.clone()); + } + } + None } /// Local validator information /// /// It can be created if the local node is a validator in the context of a particular /// relay chain block. +#[derive(Debug)] pub struct Validator { signing_context: SigningContext, - key: ValidatorPair, + key: ValidatorId, index: ValidatorIndex, } @@ -298,12 +285,11 @@ impl Validator { /// Get a struct representing this node's validator if this node is in fact a validator in the context of the given block. pub async fn new( parent: Hash, - keystore: KeyStorePtr, + keystore: SyncCryptoStorePtr, mut sender: mpsc::Sender, ) -> Result where - FromJob: TryFrom, - >::Error: std::fmt::Debug, + FromJob: From, { // Note: request_validators and request_session_index_for_child do not and cannot // run concurrently: they both have a mutable handle to the same sender. @@ -320,22 +306,22 @@ impl Validator { let validators = validators?; - Self::construct(&validators, signing_context, keystore) + Self::construct(&validators, signing_context, keystore).await } /// Construct a validator instance without performing runtime fetches. /// /// This can be useful if external code also needs the same data. - pub fn construct( + pub async fn construct( validators: &[ValidatorId], signing_context: SigningContext, - keystore: KeyStorePtr, + keystore: SyncCryptoStorePtr, ) -> Result { - let key = signing_key(validators, &keystore).ok_or(Error::NotAValidator)?; + let key = signing_key(validators, keystore).await.ok_or(Error::NotAValidator)?; let index = validators .iter() .enumerate() - .find(|(_, k)| k == &&key.public()) + .find(|(_, k)| k == &&key) .map(|(idx, _)| idx as ValidatorIndex) .expect("signing_key would have already returned NotAValidator if the item we're searching for isn't in this list; qed"); @@ -348,7 +334,7 @@ impl Validator { /// Get this validator's id. pub fn id(&self) -> ValidatorId { - self.key.public() + self.key.clone() } /// Get this validator's local index. @@ -362,11 +348,12 @@ impl Validator { } /// Sign a payload with this validator - pub fn sign, RealPayload: Encode>( + pub async fn sign, RealPayload: Encode>( &self, + keystore: SyncCryptoStorePtr, payload: Payload, - ) -> Signed { - Signed::sign(payload, &self.signing_context, self.index, &self.key) + ) -> Result, KeystoreError> { + Signed::sign(&keystore, payload, &self.signing_context, self.index, &self.key).await } /// Validate the payload with this validator @@ -385,23 +372,18 @@ impl Validator { } } -/// ToJob is expected to be an enum declaring the set of messages of interest to a particular job. -/// -/// Normally, this will be some subset of `Allmessages`, and a `Stop` variant. -pub trait ToJobTrait: TryFrom { - /// The `Stop` variant of the ToJob enum. - const STOP: Self; +struct AbortOnDrop(future::AbortHandle); - /// If the message variant contains its relay parent, return it here - fn relay_parent(&self) -> Option; +impl Drop for AbortOnDrop { + fn drop(&mut self) { + self.0.abort(); + } } /// A JobHandle manages a particular job for a subsystem. struct JobHandle { - abort_handle: future::AbortHandle, + _abort_handle: AbortOnDrop, to_job: mpsc::Sender, - finished: oneshot::Receiver<()>, - outgoing_msgs_handle: usize, } impl JobHandle { @@ -411,41 +393,76 @@ impl JobHandle { } } -impl JobHandle { - /// Stop this job gracefully. +/// This module reexports Prometheus types and defines the [`Metrics`] trait. +pub mod metrics { + /// Reexport Substrate Prometheus types. + pub use substrate_prometheus_endpoint as prometheus; + + + /// Subsystem- or job-specific Prometheus metrics. /// - /// If it hasn't shut itself down after `JOB_GRACEFUL_STOP_DURATION`, abort it. - async fn stop(mut self) { - // we don't actually care if the message couldn't be sent - if let Err(_) = self.to_job.send(ToJob::STOP).await { - // no need to wait further here: the job is either stalled or - // disconnected, and in either case, we can just abort it immediately - self.abort_handle.abort(); - return; + /// Usually implemented as a wrapper for `Option` + /// to ensure `Default` bounds or as a dummy type (). + /// Prometheus metrics internally hold an `Arc` reference, so cloning them is fine. + pub trait Metrics: Default + Clone { + /// Try to register metrics in the Prometheus registry. + fn try_register(registry: &prometheus::Registry) -> Result; + + /// Convenience method to register metrics in the optional Promethius registry. + /// + /// If no registry is provided, returns `Default::default()`. Otherwise, returns the same + /// thing that `try_register` does. + fn register(registry: Option<&prometheus::Registry>) -> Result { + match registry { + None => Ok(Self::default()), + Some(registry) => Self::try_register(registry), + } + } + } + + // dummy impl + impl Metrics for () { + fn try_register(_registry: &prometheus::Registry) -> Result<(), prometheus::PrometheusError> { + Ok(()) } - let stop_timer = Delay::new(JOB_GRACEFUL_STOP_DURATION); + } +} - match future::select(stop_timer, self.finished).await { - Either::Left((_, _)) => {} - Either::Right((_, _)) => { - self.abort_handle.abort(); - } +/// Commands from a job to the broader subsystem. +pub enum FromJobCommand { + /// Send a message to another subsystem. + SendMessage(AllMessages), + /// Spawn a child task on the executor. + Spawn(&'static str, Pin + Send>>), + /// Spawn a blocking child task on the executor's dedicated thread pool. + SpawnBlocking(&'static str, Pin + Send>>), +} + +impl fmt::Debug for FromJobCommand { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + match self { + Self::SendMessage(msg) => write!(fmt, "FromJobCommand::SendMessage({:?})", msg), + Self::Spawn(name, _) => write!(fmt, "FromJobCommand::Spawn({})", name), + Self::SpawnBlocking(name, _) => write!(fmt, "FromJobCommand::SpawnBlocking({})", name), } } } +impl From for FromJobCommand { + fn from(msg: AllMessages) -> Self { + Self::SendMessage(msg) + } +} + /// This trait governs jobs. /// /// Jobs are instantiated and killed automatically on appropriate overseer messages. -/// Other messages are passed along to and from the job via the overseer to other -/// subsystems. +/// Other messages are passed along to and from the job via the overseer to other subsystems. pub trait JobTrait: Unpin { - /// Message type to the job. Typically a subset of AllMessages. - type ToJob: 'static + ToJobTrait + Send; - /// Message type from the job. Typically a subset of AllMessages. - type FromJob: 'static + Into + Send; + /// Message type used to send messages to the job. + type ToJob: 'static + BoundToRelayParent + Send; /// Job runtime error. - type Error: 'static + std::fmt::Debug + Send; + type Error: 'static + std::error::Error + Send; /// Extra arguments this job needs to run properly. /// /// If no extra information is needed, it is perfectly acceptable to set it to `()`. @@ -460,40 +477,30 @@ pub trait JobTrait: Unpin { /// Name of the job, i.e. `CandidateBackingJob` const NAME: &'static str; - /// Run a job for the parent block indicated + /// Run a job for the given relay `parent`. + /// + /// The job should be ended when `receiver` returns `None`. fn run( parent: Hash, + span: Arc, run_args: Self::RunArgs, metrics: Self::Metrics, receiver: mpsc::Receiver, - sender: mpsc::Sender, + sender: mpsc::Sender, ) -> Pin> + Send>>; - - /// Handle a message which has no relay parent, and therefore can't be dispatched to a particular job - /// - /// By default, this is implemented with a NOP function. However, if - /// ToJob occasionally has messages which do not correspond to a particular - /// parent relay hash, then this function will be spawned as a one-off - /// task to handle those messages. - // TODO: the API here is likely not precisely what we want; figure it out more - // once we're implementing a subsystem which actually needs this feature. - // In particular, we're quite likely to want this to return a future instead of - // interrupting the active thread for the duration of the handler. - fn handle_unanchored_msg(_msg: Self::ToJob) -> Result<(), Self::Error> { - Ok(()) - } } /// Error which can be returned by the jobs manager /// /// Wraps the utility error type and the job-specific error -#[derive(Debug, derive_more::From)] -pub enum JobsError { +#[derive(Debug, Error)] +pub enum JobsError { /// utility error - #[from] - Utility(Error), + #[error("Utility")] + Utility(#[source] Error), /// internal job error - Job(JobError), + #[error("Internal")] + Job(#[source] JobError), } /// Jobs manager for a subsystem @@ -503,12 +510,12 @@ pub enum JobsError { /// - Dispatches messages to the appropriate job for a given relay-parent. /// - When dropped, aborts all remaining jobs. /// - implements `Stream`, collecting all messages from subordinate jobs. -#[pin_project(PinnedDrop)] +#[pin_project] pub struct Jobs { spawner: Spawner, running: HashMap>, + outgoing_msgs: StreamUnordered>, #[pin] - outgoing_msgs: StreamUnordered>, job: std::marker::PhantomData, errors: Option, JobsError)>>, } @@ -543,55 +550,45 @@ impl Jobs { } /// Spawn a new job for this `parent_hash`, with whatever args are appropriate. - fn spawn_job(&mut self, parent_hash: Hash, run_args: Job::RunArgs, metrics: Job::Metrics) -> Result<(), Error> { + fn spawn_job( + &mut self, + parent_hash: Hash, + span: Arc, + run_args: Job::RunArgs, + metrics: Job::Metrics, + ) -> Result<(), Error> { let (to_job_tx, to_job_rx) = mpsc::channel(JOB_CHANNEL_CAPACITY); let (from_job_tx, from_job_rx) = mpsc::channel(JOB_CHANNEL_CAPACITY); - let (finished_tx, finished) = oneshot::channel(); - // clone the error transmitter to move into the future let err_tx = self.errors.clone(); let (future, abort_handle) = future::abortable(async move { - if let Err(e) = Job::run(parent_hash, run_args, metrics, to_job_rx, from_job_tx).await { - log::error!( - "{}({}) finished with an error {:?}", - Job::NAME, - parent_hash, - e, + if let Err(e) = Job::run(parent_hash, span, run_args, metrics, to_job_rx, from_job_tx).await { + tracing::error!( + job = Job::NAME, + parent_hash = %parent_hash, + err = ?e, + "job finished with an error", ); if let Some(mut err_tx) = err_tx { // if we can't send the notification of error on the error channel, then // there's no point trying to propagate this error onto the channel too - // all we can do is warn that error propagatio has failed + // all we can do is warn that error propagation has failed if let Err(e) = err_tx.send((Some(parent_hash), JobsError::Job(e))).await { - log::warn!("failed to forward error: {:?}", e); + tracing::warn!(err = ?e, "failed to forward error"); } } } }); - // the spawn mechanism requires that the spawned future has no output - let future = async move { - // job errors are already handled within the future, meaning - // that any errors here are due to the abortable mechanism. - // failure to abort isn't of interest. - let _ = future.await; - // transmission failure here is only possible if the receiver is closed, - // which means the handle is dropped, which means we don't care anymore - let _ = finished_tx.send(()); - }; - self.spawner.spawn(Job::NAME, future.boxed()); + self.spawner.spawn(Job::NAME, future.map(drop).boxed()); - // this handle lets us remove the appropriate receiver from self.outgoing_msgs - // when it's time to stop the job. - let outgoing_msgs_handle = self.outgoing_msgs.push(from_job_rx); + self.outgoing_msgs.push(from_job_rx); let handle = JobHandle { - abort_handle, + _abort_handle: AbortOnDrop(abort_handle), to_job: to_job_tx, - finished, - outgoing_msgs_handle, }; self.running.insert(parent_hash, handle); @@ -600,64 +597,54 @@ impl Jobs { } /// Stop the job associated with this `parent_hash`. - pub async fn stop_job(&mut self, parent_hash: Hash) -> Result<(), Error> { - match self.running.remove(&parent_hash) { - Some(handle) => { - Pin::new(&mut self.outgoing_msgs).remove(handle.outgoing_msgs_handle); - handle.stop().await; - Ok(()) - } - None => Err(Error::JobNotFound(parent_hash)), - } + pub async fn stop_job(&mut self, parent_hash: Hash) { + self.running.remove(&parent_hash); } /// Send a message to the appropriate job for this `parent_hash`. - /// Will not return an error if the job is not running. - async fn send_msg(&mut self, parent_hash: Hash, msg: Job::ToJob) -> Result<(), Error> { - match self.running.get_mut(&parent_hash) { - Some(job) => job.send_msg(msg).await?, - None => { - // don't bring down the subsystem, this can happen to due a race condition - }, + async fn send_msg(&mut self, parent_hash: Hash, msg: Job::ToJob) { + if let Entry::Occupied(mut job) = self.running.entry(parent_hash) { + if job.get_mut().send_msg(msg).await.is_err() { + job.remove(); + } } - Ok(()) } } -// Note that on drop, we don't have the chance to gracefully spin down each of the remaining handles; -// we just abort them all. Still better than letting them dangle. -#[pinned_drop] -impl PinnedDrop for Jobs { - fn drop(self: Pin<&mut Self>) { - for job_handle in self.running.values() { - job_handle.abort_handle.abort(); +impl Stream for Jobs +where + Spawner: SpawnNamed, + Job: JobTrait, +{ + type Item = FromJobCommand; + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { + loop { + match Pin::new(&mut self.outgoing_msgs).poll_next(cx) { + Poll::Pending => return Poll::Pending, + Poll::Ready(r) => match r.map(|v| v.0) { + Some(StreamYield::Item(msg)) => return Poll::Ready(Some(msg)), + // If a job is finished, rerun the loop + Some(StreamYield::Finished(_)) => continue, + // Don't end if there are no jobs running + None => return Poll::Pending, + } + } } } } -impl Stream for Jobs +impl stream::FusedStream for Jobs where Spawner: SpawnNamed, Job: JobTrait, { - type Item = Job::FromJob; - - fn poll_next(self: Pin<&mut Self>, cx: &mut task::Context) -> task::Poll> { - // pin-project the outgoing messages - let result = self.project().outgoing_msgs.poll_next(cx).map(|opt| { - opt.and_then(|(stream_yield, _)| match stream_yield { - StreamYield::Item(msg) => Some(msg), - StreamYield::Finished(_) => None, - }) - }); - // we don't want the stream to end if the jobs are empty at some point - match result { - task::Poll::Ready(None) => task::Poll::Pending, - otherwise => otherwise, - } + fn is_terminated(&self) -> bool { + false } } + /// A basic implementation of a subsystem. /// /// This struct is responsible for handling message traffic between @@ -679,7 +666,7 @@ where Context: SubsystemContext, Job: 'static + JobTrait, Job::RunArgs: Clone, - Job::ToJob: TryFrom + TryFrom<::Message> + Sync, + Job::ToJob: From<::Message> + Sync, { /// Creates a new `Subsystem`. pub fn new(spawner: Spawner, run_args: Job::RunArgs, metrics: Job::Metrics) -> Self { @@ -736,14 +723,27 @@ where loop { select! { - incoming = ctx.recv().fuse() => if Self::handle_incoming(incoming, &mut jobs, &run_args, &metrics, &mut err_tx).await { break }, - outgoing = jobs.next().fuse() => Self::handle_outgoing(outgoing, &mut ctx, &mut err_tx).await, + incoming = ctx.recv().fuse() => + if Self::handle_incoming( + incoming, + &mut jobs, + &run_args, + &metrics, + &mut err_tx, + ).await { + break + }, + outgoing = jobs.next() => { + if let Err(e) = Self::handle_from_job(outgoing, &mut ctx).await { + tracing::warn!(err = ?e, "failed to handle command from job"); + } + } complete => break, } } } - // if we have a channel on which to forward errors, do so + /// Forward a given error to the higher context using the given error channel. async fn fwd_err( hash: Option, err: JobsError, @@ -753,12 +753,14 @@ where // if we can't send on the error transmission channel, we can't do anything useful about it // still, we can at least log the failure if let Err(e) = err_tx.send((hash, err)).await { - log::warn!("failed to forward error: {:?}", e); + tracing::warn!(err = ?e, "failed to forward error"); } } } - // handle an incoming message. return true if we should break afterwards. + /// Handle an incoming message. + /// + /// Returns `true` when this job manager should shutdown. async fn handle_incoming( incoming: SubsystemResult>, jobs: &mut Jobs, @@ -775,88 +777,58 @@ where activated, deactivated, }))) => { - for hash in activated { + for (hash, span) in activated { let metrics = metrics.clone(); - if let Err(e) = jobs.spawn_job(hash, run_args.clone(), metrics) { - log::error!("Failed to spawn a job: {:?}", e); - Self::fwd_err(Some(hash), e.into(), err_tx).await; + if let Err(e) = jobs.spawn_job(hash, span, run_args.clone(), metrics) { + tracing::error!( + job = Job::NAME, + err = ?e, + "failed to spawn a job", + ); + Self::fwd_err(Some(hash), JobsError::Utility(e), err_tx).await; return true; } } for hash in deactivated { - if let Err(e) = jobs.stop_job(hash).await { - log::error!("Failed to stop a job: {:?}", e); - Self::fwd_err(Some(hash), e.into(), err_tx).await; - return true; - } + jobs.stop_job(hash).await; } } Ok(Signal(Conclude)) => { - // Breaking the loop ends fn run, which drops `jobs`, which immediately drops all ongoing work. - // We can afford to wait a little while to shut them all down properly before doing that. - // - // Forwarding the stream to a drain means we wait until all of the items in the stream - // have completed. Contrast with `into_future`, which turns it into a future of `(head, rest_stream)`. - use futures::sink::drain; - use futures::stream::FuturesUnordered; - use futures::stream::StreamExt; - - if let Err(e) = jobs - .running - .drain() - .map(|(_, handle)| handle.stop()) - .collect::>() - .map(Ok) - .forward(drain()) - .await - { - log::error!("failed to stop all jobs on conclude signal: {:?}", e); - Self::fwd_err(None, Error::from(e).into(), err_tx).await; - } - + jobs.running.clear(); return true; } Ok(Communication { msg }) => { if let Ok(to_job) = ::try_from(msg) { - match to_job.relay_parent() { - Some(hash) => { - if let Err(err) = jobs.send_msg(hash, to_job).await { - log::error!("Failed to send a message to a job: {:?}", err); - Self::fwd_err(Some(hash), err.into(), err_tx).await; - return true; - } - } - None => { - if let Err(err) = Job::handle_unanchored_msg(to_job) { - log::error!("Failed to handle unhashed message: {:?}", err); - Self::fwd_err(None, JobsError::Job(err), err_tx).await; - return true; - } - } - } + jobs.send_msg(to_job.relay_parent(), to_job).await; } } - Ok(Signal(BlockFinalized(_))) => {} + Ok(Signal(BlockFinalized(..))) => {} Err(err) => { - log::error!("error receiving message from subsystem context: {:?}", err); - Self::fwd_err(None, Error::from(err).into(), err_tx).await; + tracing::error!( + job = Job::NAME, + err = ?err, + "error receiving message from subsystem context for job", + ); + Self::fwd_err(None, JobsError::Utility(Error::from(err)), err_tx).await; return true; } } false } - // handle an outgoing message. - async fn handle_outgoing( - outgoing: Option, + // handle a command from a job. + async fn handle_from_job( + outgoing: Option, ctx: &mut Context, - err_tx: &mut Option, JobsError)>>, - ) { - let msg = outgoing.expect("the Jobs stream never ends; qed"); - if let Err(e) = ctx.send_message(msg.into()).await { - Self::fwd_err(None, Error::from(e).into(), err_tx).await; + ) -> SubsystemResult<()> { + match outgoing.expect("the Jobs stream never ends; qed") { + FromJobCommand::SendMessage(msg) => ctx.send_message(msg).await, + FromJobCommand::Spawn(name, task) => ctx.spawn(name, task).await?, + FromJobCommand::SpawnBlocking(name, task) => ctx.spawn_blocking(name, task).await?, } + + Ok(()) } } @@ -864,14 +836,11 @@ impl Subsystem for JobManager::Message: Into, Job: 'static + JobTrait + Send, Job::RunArgs: Clone + Sync, - Job::ToJob: TryFrom + Sync, + Job::ToJob: From<::Message> + Sync, Job::Metrics: Sync, { - type Metrics = Job::Metrics; - fn start(self, ctx: Context) -> SpawnedSubsystem { let spawner = self.spawner.clone(); let run_args = self.run_args.clone(); @@ -880,6 +849,7 @@ where let future = Box::pin(async move { Self::run(ctx, run_args, metrics, spawner, errors).await; + Ok(()) }); SpawnedSubsystem { @@ -943,7 +913,7 @@ macro_rules! delegated_subsystem { where Spawner: Clone + $crate::reexports::SpawnNamed + Send + Unpin, Context: $crate::reexports::SubsystemContext, - ::Message: Into<$to_job>, + $to_job: From<::Message>, { #[doc = "Creates a new "] #[doc = $subsystem_name] @@ -954,6 +924,7 @@ macro_rules! delegated_subsystem { } /// Run this subsystem + #[tracing::instrument(skip(ctx, run_args, metrics, spawner), fields(subsystem = $subsystem_name))] pub async fn run(ctx: Context, run_args: $run_args, metrics: $metrics, spawner: Spawner) { >::run(ctx, run_args, metrics, spawner, None).await } @@ -963,10 +934,8 @@ macro_rules! delegated_subsystem { where Spawner: $crate::reexports::SpawnNamed + Send + Clone + Unpin + 'static, Context: $crate::reexports::SubsystemContext, - ::Message: Into<$to_job>, + $to_job: From<::Message>, { - type Metrics = $metrics; - fn start(self, ctx: Context) -> $crate::reexports::SpawnedSubsystem { self.manager.start(ctx) } @@ -985,6 +954,8 @@ pub struct Timeout { /// Extends `Future` to allow time-limited futures. pub trait TimeoutExt: Future { + /// Adds a timeout of `duration` to the given `Future`. + /// Returns a new `Future`. fn timeout(self, duration: Duration) -> Timeout where Self: Sized, @@ -1018,21 +989,17 @@ impl Future for Timeout { #[cfg(test)] mod tests { - use super::{Error as UtilError, JobManager, JobTrait, JobsError, TimeoutExt, ToJobTrait}; + use super::*; + use thiserror::Error; use polkadot_node_subsystem::{ - messages::{AllMessages, CandidateSelectionMessage}, - ActiveLeavesUpdate, FromOverseer, OverseerSignal, SpawnedSubsystem, Subsystem, + messages::{AllMessages, CandidateSelectionMessage}, ActiveLeavesUpdate, FromOverseer, OverseerSignal, + SpawnedSubsystem, JaegerSpan, }; use assert_matches::assert_matches; - use futures::{ - channel::mpsc, - executor, - stream::{self, StreamExt}, - future, Future, FutureExt, SinkExt, - }; + use futures::{channel::mpsc, executor, StreamExt, future, Future, FutureExt, SinkExt}; use polkadot_primitives::v1::Hash; use polkadot_node_subsystem_test_helpers::{self as test_helpers, make_subsystem_context}; - use std::{collections::HashMap, convert::TryFrom, pin::Pin, time::Duration}; + use std::{pin::Pin, time::Duration, sync::Arc}; // basic usage: in a nutshell, when you want to define a subsystem, just focus on what its jobs do; // you can leave the subsystem itself to the job manager. @@ -1043,90 +1010,22 @@ mod tests { // job structs are constructed within JobTrait::run // most will want to retain the sender and receiver, as well as whatever other data they like struct FakeCandidateSelectionJob { - receiver: mpsc::Receiver, - } - - // ToJob implementations require the following properties: - // - // - have a Stop variant (to impl ToJobTrait) - // - impl ToJobTrait - // - impl TryFrom - // - impl From (from SubsystemContext::Message) - // - // Mostly, they are just a type-safe subset of AllMessages that this job is prepared to receive - enum ToJob { - CandidateSelection(CandidateSelectionMessage), - Stop, - } - - impl ToJobTrait for ToJob { - const STOP: Self = ToJob::Stop; - - fn relay_parent(&self) -> Option { - match self { - Self::CandidateSelection(csm) => csm.relay_parent(), - Self::Stop => None, - } - } - } - - impl TryFrom for ToJob { - type Error = (); - - fn try_from(msg: AllMessages) -> Result { - match msg { - AllMessages::CandidateSelection(csm) => Ok(ToJob::CandidateSelection(csm)), - _ => Err(()), - } - } - } - - impl From for ToJob { - fn from(csm: CandidateSelectionMessage) -> ToJob { - ToJob::CandidateSelection(csm) - } - } - - // FromJob must be infallibly convertable into AllMessages. - // - // It exists to be a type-safe subset of AllMessages that this job is specified to send. - // - // Note: the Clone impl here is not generally required; it's just ueful for this test context because - // we include it in the RunArgs - #[derive(Clone)] - enum FromJob { - Test, - } - - impl From for AllMessages { - fn from(from_job: FromJob) -> AllMessages { - match from_job { - FromJob::Test => AllMessages::CandidateSelection(CandidateSelectionMessage::default()), - } - } + receiver: mpsc::Receiver, } // Error will mostly be a wrapper to make the try operator more convenient; // deriving From implementations for most variants is recommended. // It must implement Debug for logging. - #[derive(Debug, derive_more::From)] + #[derive(Debug, Error)] enum Error { - #[from] - Sending(mpsc::SendError), + #[error(transparent)] + Sending(#[from]mpsc::SendError), } impl JobTrait for FakeCandidateSelectionJob { - type ToJob = ToJob; - type FromJob = FromJob; + type ToJob = CandidateSelectionMessage; type Error = Error; - // RunArgs can be anything that a particular job needs supplied from its external context - // in order to create the Job. In this case, they're a hashmap of parents to the mock outputs - // expected from that job. - // - // Note that it's not recommended to use something as heavy as a hashmap in production: the - // RunArgs get cloned so that each job gets its own owned copy. If you need that, wrap it in - // an Arc. Within a testing context, that efficiency is less important. - type RunArgs = HashMap>; + type RunArgs = bool; type Metrics = (); const NAME: &'static str = "FakeCandidateSelectionJob"; @@ -1135,21 +1034,24 @@ mod tests { // // this function is in charge of creating and executing the job's main loop fn run( - parent: Hash, - mut run_args: Self::RunArgs, + _: Hash, + _: Arc, + run_args: Self::RunArgs, _metrics: Self::Metrics, - receiver: mpsc::Receiver, - mut sender: mpsc::Sender, + receiver: mpsc::Receiver, + mut sender: mpsc::Sender, ) -> Pin> + Send>> { async move { let job = FakeCandidateSelectionJob { receiver }; - // most jobs will have a request-response cycle at the heart of their run loop. - // however, in this case, we never receive valid messages, so we may as well - // just send all of our (mock) output messages now - let mock_output = run_args.remove(&parent).unwrap_or_default(); - let mut stream = stream::iter(mock_output.into_iter().map(Ok)); - sender.send_all(&mut stream).await?; + if run_args { + sender.send(FromJobCommand::SendMessage( + CandidateSelectionMessage::Invalid( + Default::default(), + Default::default(), + ).into(), + )).await?; + } // it isn't necessary to break run_loop into its own function, // but it's convenient to separate the concerns in this way @@ -1161,12 +1063,12 @@ mod tests { impl FakeCandidateSelectionJob { async fn run_loop(mut self) -> Result<(), Error> { - while let Some(msg) = self.receiver.next().await { - match msg { - ToJob::CandidateSelection(_csm) => { + loop { + match self.receiver.next().await { + Some(_csm) => { unimplemented!("we'd report the collator to the peer set manager here, but that's not implemented yet"); } - ToJob::Stop => break, + None => break, } } @@ -1182,7 +1084,7 @@ mod tests { type OverseerHandle = test_helpers::TestSubsystemContextHandle; fn test_harness>( - run_args: HashMap>, + run_args: bool, test: impl FnOnce(OverseerHandle, mpsc::Receiver<(Option, JobsError)>) -> T, ) { let _ = env_logger::builder() @@ -1213,16 +1115,11 @@ mod tests { #[test] fn starting_and_stopping_job_works() { let relay_parent: Hash = [0; 32].into(); - let mut run_args = HashMap::new(); - run_args.insert( - relay_parent.clone(), - vec![FromJob::Test], - ); - test_harness(run_args, |mut overseer_handle, err_rx| async move { + test_harness(true, |mut overseer_handle, err_rx| async move { overseer_handle .send(FromOverseer::Signal(OverseerSignal::ActiveLeaves( - ActiveLeavesUpdate::start_work(relay_parent), + ActiveLeavesUpdate::start_work(relay_parent, Arc::new(JaegerSpan::Disabled)), ))) .await; assert_matches!( @@ -1244,41 +1141,14 @@ mod tests { }); } - #[test] - fn stopping_non_running_job_fails() { - let relay_parent: Hash = [0; 32].into(); - let run_args = HashMap::new(); - - test_harness(run_args, |mut overseer_handle, err_rx| async move { - overseer_handle - .send(FromOverseer::Signal(OverseerSignal::ActiveLeaves( - ActiveLeavesUpdate::stop_work(relay_parent), - ))) - .await; - - let errs: Vec<_> = err_rx.collect().await; - assert_eq!(errs.len(), 1); - assert_eq!(errs[0].0, Some(relay_parent)); - assert_matches!( - errs[0].1, - JobsError::Utility(UtilError::JobNotFound(match_relay_parent)) if relay_parent == match_relay_parent - ); - }); - } - #[test] fn sending_to_a_non_running_job_do_not_stop_the_subsystem() { let relay_parent = Hash::repeat_byte(0x01); - let mut run_args = HashMap::new(); - run_args.insert( - relay_parent.clone(), - vec![FromJob::Test], - ); - test_harness(run_args, |mut overseer_handle, err_rx| async move { + test_harness(true, |mut overseer_handle, err_rx| async move { overseer_handle .send(FromOverseer::Signal(OverseerSignal::ActiveLeaves( - ActiveLeavesUpdate::start_work(relay_parent), + ActiveLeavesUpdate::start_work(relay_parent, Arc::new(JaegerSpan::Disabled)), ))) .await; @@ -1310,7 +1180,7 @@ mod tests { let (context, _) = make_subsystem_context::(pool.clone()); let SpawnedSubsystem { name, .. } = - FakeCandidateSelectionSubsystem::new(pool, HashMap::new(), ()).start(context); + FakeCandidateSelectionSubsystem::new(pool, false, ()).start(context); assert_eq!(name, "FakeCandidateSelection"); } } diff --git a/node/subsystem-util/src/validator_discovery.rs b/node/subsystem-util/src/validator_discovery.rs new file mode 100644 index 0000000000000000000000000000000000000000..9472d44d40cf917af9935def3f1f202757e6758e --- /dev/null +++ b/node/subsystem-util/src/validator_discovery.rs @@ -0,0 +1,422 @@ +// Copyright 2020 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 . + +//! Utility function to make it easier to connect to validators. + +use std::collections::HashMap; +use std::pin::Pin; + +use futures::{ + channel::mpsc, + task::{Poll, self}, + stream, + StreamExt, +}; +use streamunordered::{StreamUnordered, StreamYield}; + +use polkadot_node_subsystem::{ + errors::RuntimeApiError, + messages::{AllMessages, NetworkBridgeMessage}, + SubsystemContext, +}; +use polkadot_primitives::v1::{Hash, ValidatorId, AuthorityDiscoveryId, SessionIndex}; +use sc_network::PeerId; +use crate::Error; + +/// Utility function to make it easier to connect to validators. +pub async fn connect_to_validators( + ctx: &mut Context, + relay_parent: Hash, + validators: Vec, +) -> Result { + let current_index = crate::request_session_index_for_child_ctx(relay_parent, ctx).await?.await??; + connect_to_past_session_validators(ctx, relay_parent, validators, current_index).await +} + +/// Utility function to make it easier to connect to validators in the past sessions. +pub async fn connect_to_past_session_validators( + ctx: &mut Context, + relay_parent: Hash, + validators: Vec, + session_index: SessionIndex, +) -> Result { + let session_info = crate::request_session_info_ctx( + relay_parent, + session_index, + ctx, + ).await?.await??; + + let (session_validators, discovery_keys) = match session_info { + Some(info) => (info.validators, info.discovery_keys), + None => return Err(RuntimeApiError::from( + format!("No SessionInfo found for the index {}", session_index) + ).into()), + }; + + let id_to_index = session_validators.iter() + .zip(0usize..) + .collect::>(); + + // We assume the same ordering in authorities as in validators so we can do an index search + let maybe_authorities: Vec<_> = validators.iter() + .map(|id| { + let validator_index = id_to_index.get(&id); + validator_index.and_then(|i| discovery_keys.get(*i).cloned()) + }) + .collect(); + + let authorities: Vec<_> = maybe_authorities.iter() + .cloned() + .filter_map(|id| id) + .collect(); + + let validator_map = validators.into_iter() + .zip(maybe_authorities.into_iter()) + .filter_map(|(k, v)| v.map(|v| (v, k))) + .collect::>(); + + let connections = connect_to_authorities(ctx, authorities).await; + + Ok(ConnectionRequest { + validator_map, + connections, + }) +} + +async fn connect_to_authorities( + ctx: &mut Context, + validator_ids: Vec, +) -> mpsc::Receiver<(AuthorityDiscoveryId, PeerId)> { + const PEERS_CAPACITY: usize = 8; + + let (connected, connected_rx) = mpsc::channel(PEERS_CAPACITY); + + ctx.send_message(AllMessages::NetworkBridge( + NetworkBridgeMessage::ConnectToValidators { + validator_ids, + connected, + } + )).await; + + connected_rx +} + +/// Represents a discovered validator. +/// +/// Result of [`ConnectionRequests::next`]. +#[derive(Debug, PartialEq)] +pub struct DiscoveredValidator { + /// The relay parent associated with the connection request that returned a result. + pub relay_parent: Hash, + /// The [`ValidatorId`] that was resolved. + pub validator_id: ValidatorId, + /// The [`PeerId`] associated to the validator id. + pub peer_id: PeerId, +} + +/// Used by [`ConnectionRequests::requests`] to map a [`ConnectionRequest`] item to a [`DiscoveredValidator`]. +struct ConnectionRequestForRelayParent { + request: ConnectionRequest, + relay_parent: Hash, +} + +impl stream::Stream for ConnectionRequestForRelayParent { + type Item = DiscoveredValidator; + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut task::Context) -> Poll> { + self.request + .poll_next_unpin(cx) + .map(|r| r.map(|(validator_id, peer_id)| DiscoveredValidator { + validator_id, + peer_id, + relay_parent: self.relay_parent, + })) + } +} + +/// A struct that assists performing multiple concurrent connection requests. +/// +/// This allows concurrent connections to validator sets at different `relay_parents`. +/// Use [`ConnectionRequests::next`] to wait for results of the added connection requests. +#[derive(Default)] +pub struct ConnectionRequests { + /// Connection requests relay_parent -> StreamUnordered token + id_map: HashMap, + + /// Connection requests themselves. + requests: StreamUnordered, +} + +impl ConnectionRequests { + /// Insert a new connection request. + /// + /// If a `ConnectionRequest` under a given `relay_parent` already exists it will + /// be revoked and substituted with the given one. + pub fn put(&mut self, relay_parent: Hash, request: ConnectionRequest) { + self.remove(&relay_parent); + let token = self.requests.push(ConnectionRequestForRelayParent { relay_parent, request }); + + self.id_map.insert(relay_parent, token); + } + + /// Remove a connection request by a given `relay_parent`. + pub fn remove(&mut self, relay_parent: &Hash) { + if let Some(token) = self.id_map.remove(relay_parent) { + Pin::new(&mut self.requests).remove(token); + } + } + + /// Is a connection at this relay parent already present in the request + pub fn contains_request(&self, relay_parent: &Hash) -> bool { + self.id_map.contains_key(relay_parent) + } + + /// Returns the next available connection request result. + /// + /// # Note + /// + /// When there are no active requests this will wait indefinitely, like an always pending future. + pub async fn next(&mut self) -> DiscoveredValidator { + loop { + match self.requests.next().await { + Some((StreamYield::Item(item), _)) => { + return item + }, + // Ignore finished requests, they are required to be removed. + Some((StreamYield::Finished(_), _)) => (), + None => futures::pending!(), + } + } + } +} + +/// A pending connection request to validators. +/// This struct implements `Stream` to allow for asynchronous +/// discovery of validator addresses. +/// +/// NOTE: the request will be revoked on drop. +#[must_use = "dropping a request will result in its immediate revokation"] +pub struct ConnectionRequest { + validator_map: HashMap, + #[must_use = "streams do nothing unless polled"] + connections: mpsc::Receiver<(AuthorityDiscoveryId, PeerId)>, +} + +impl stream::Stream for ConnectionRequest { + type Item = (ValidatorId, PeerId); + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut task::Context) -> Poll> { + if self.validator_map.is_empty() { + return Poll::Ready(None); + } + match Pin::new(&mut self.connections).poll_next(cx) { + Poll::Ready(Some((id, peer_id))) => { + if let Some(validator_id) = self.validator_map.remove(&id) { + return Poll::Ready(Some((validator_id, peer_id))); + } else { + // unknown authority_id + // should be unreachable + } + } + _ => {}, + } + Poll::Pending + } +} + +#[cfg(test)] +mod tests { + use super::*; + use polkadot_primitives::v1::ValidatorPair; + use sp_core::{Pair, Public}; + + use futures::{executor, poll, SinkExt}; + + async fn check_next_is_pending(connection_requests: &mut ConnectionRequests) { + let next = connection_requests.next(); + futures::pin_mut!(next); + assert_eq!(poll!(next), Poll::Pending); + } + + #[test] + fn adding_a_connection_request_works() { + let mut connection_requests = ConnectionRequests::default(); + + executor::block_on(async move { + check_next_is_pending(&mut connection_requests).await; + + let validator_1 = ValidatorPair::generate().0.public(); + let validator_2 = ValidatorPair::generate().0.public(); + + let auth_1 = AuthorityDiscoveryId::from_slice(&[1; 32]); + let auth_2 = AuthorityDiscoveryId::from_slice(&[2; 32]); + + let mut validator_map = HashMap::new(); + validator_map.insert(auth_1.clone(), validator_1.clone()); + validator_map.insert(auth_2.clone(), validator_2.clone()); + + let (mut rq1_tx, rq1_rx) = mpsc::channel(8); + + let peer_id_1 = PeerId::random(); + let peer_id_2 = PeerId::random(); + + let connection_request_1 = ConnectionRequest { + validator_map, + connections: rq1_rx, + }; + + let relay_parent_1 = Hash::repeat_byte(1); + + connection_requests.put(relay_parent_1.clone(), connection_request_1); + + rq1_tx.send((auth_1, peer_id_1.clone())).await.unwrap(); + rq1_tx.send((auth_2, peer_id_2.clone())).await.unwrap(); + + let res = connection_requests.next().await; + assert_eq!( + res, + DiscoveredValidator { relay_parent: relay_parent_1, validator_id: validator_1, peer_id: peer_id_1 }, + ); + + let res = connection_requests.next().await; + assert_eq!( + res, + DiscoveredValidator { relay_parent: relay_parent_1, validator_id: validator_2, peer_id: peer_id_2 }, + ); + + check_next_is_pending(&mut connection_requests).await; + }); + } + + #[test] + fn adding_two_connection_requests_works() { + let mut connection_requests = ConnectionRequests::default(); + + executor::block_on(async move { + check_next_is_pending(&mut connection_requests).await; + + let validator_1 = ValidatorPair::generate().0.public(); + let validator_2 = ValidatorPair::generate().0.public(); + + let auth_1 = AuthorityDiscoveryId::from_slice(&[1; 32]); + let auth_2 = AuthorityDiscoveryId::from_slice(&[2; 32]); + + let mut validator_map_1 = HashMap::new(); + let mut validator_map_2 = HashMap::new(); + + validator_map_1.insert(auth_1.clone(), validator_1.clone()); + validator_map_2.insert(auth_2.clone(), validator_2.clone()); + + let (mut rq1_tx, rq1_rx) = mpsc::channel(8); + + let (mut rq2_tx, rq2_rx) = mpsc::channel(8); + + let peer_id_1 = PeerId::random(); + let peer_id_2 = PeerId::random(); + + let connection_request_1 = ConnectionRequest { + validator_map: validator_map_1, + connections: rq1_rx, + }; + + let connection_request_2 = ConnectionRequest { + validator_map: validator_map_2, + connections: rq2_rx, + }; + + let relay_parent_1 = Hash::repeat_byte(1); + let relay_parent_2 = Hash::repeat_byte(2); + + connection_requests.put(relay_parent_1.clone(), connection_request_1); + connection_requests.put(relay_parent_2.clone(), connection_request_2); + + rq1_tx.send((auth_1, peer_id_1.clone())).await.unwrap(); + rq2_tx.send((auth_2, peer_id_2.clone())).await.unwrap(); + + let res = connection_requests.next().await; + assert_eq!( + res, + DiscoveredValidator { relay_parent: relay_parent_1, validator_id: validator_1, peer_id: peer_id_1 }, + ); + + let res = connection_requests.next().await; + assert_eq!( + res, + DiscoveredValidator { relay_parent: relay_parent_2, validator_id: validator_2, peer_id: peer_id_2 }, + ); + + check_next_is_pending(&mut connection_requests).await; + }); + } + + #[test] + fn replacing_a_connection_request_works() { + let mut connection_requests = ConnectionRequests::default(); + + executor::block_on(async move { + check_next_is_pending(&mut connection_requests).await; + + let validator_1 = ValidatorPair::generate().0.public(); + let validator_2 = ValidatorPair::generate().0.public(); + + let auth_1 = AuthorityDiscoveryId::from_slice(&[1; 32]); + let auth_2 = AuthorityDiscoveryId::from_slice(&[2; 32]); + + let mut validator_map_1 = HashMap::new(); + let mut validator_map_2 = HashMap::new(); + + validator_map_1.insert(auth_1.clone(), validator_1.clone()); + validator_map_2.insert(auth_2.clone(), validator_2.clone()); + + let (mut rq1_tx, rq1_rx) = mpsc::channel(8); + + let (mut rq2_tx, rq2_rx) = mpsc::channel(8); + + let peer_id_1 = PeerId::random(); + let peer_id_2 = PeerId::random(); + + let connection_request_1 = ConnectionRequest { + validator_map: validator_map_1, + connections: rq1_rx, + }; + + let connection_request_2 = ConnectionRequest { + validator_map: validator_map_2, + connections: rq2_rx, + }; + + let relay_parent = Hash::repeat_byte(3); + + connection_requests.put(relay_parent.clone(), connection_request_1); + + rq1_tx.send((auth_1.clone(), peer_id_1.clone())).await.unwrap(); + + let res = connection_requests.next().await; + assert_eq!(res, DiscoveredValidator { relay_parent, validator_id: validator_1, peer_id: peer_id_1.clone() }); + + connection_requests.put(relay_parent.clone(), connection_request_2); + + assert!(rq1_tx.send((auth_1, peer_id_1.clone())).await.is_err()); + + rq2_tx.send((auth_2, peer_id_2.clone())).await.unwrap(); + + let res = connection_requests.next().await; + assert_eq!(res, DiscoveredValidator { relay_parent, validator_id: validator_2, peer_id: peer_id_2 }); + + check_next_is_pending(&mut connection_requests).await; + }); + } +} diff --git a/node/subsystem/Cargo.toml b/node/subsystem/Cargo.toml index f7283d40aadd4ae0f8851e876a58375f9c817276..e01287d9bb4004177fb62d75af474776bc5c115d 100644 --- a/node/subsystem/Cargo.toml +++ b/node/subsystem/Cargo.toml @@ -6,26 +6,32 @@ edition = "2018" description = "Subsystem traits and message definitions" [dependencies] -async-trait = "0.1" -derive_more = "0.99.9" -futures = "0.3.5" +async-std = "1.8.0" +async-trait = "0.1.42" +derive_more = "0.99.11" +futures = "0.3.8" futures-timer = "3.0.2" -log = "0.4.8" -parity-scale-codec = "1.3.4" -parking_lot = { version = "0.10.0", optional = true } -pin-project = "0.4.22" +mick-jaeger = "0.1.2" +lazy_static = "1.4" +tracing = "0.1.22" +tracing-futures = "0.2.4" +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +parking_lot = "0.11.1" +pin-project = "1.0.3" polkadot-node-primitives = { path = "../primitives" } polkadot-node-network-protocol = { path = "../network/protocol" } polkadot-primitives = { path = "../../primitives" } polkadot-statement-table = { path = "../../statement-table" } +polkadot-node-jaeger = { path = "../jaeger" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -smallvec = "1.4.1" +smallvec = "1.6.1" sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } +thiserror = "1.0.23" +log = "0.4.11" [dev-dependencies] -assert_matches = "1.3.0" -async-trait = "0.1" -futures = { version = "0.3.5", features = ["thread-pool"] } -parking_lot = "0.10.0" +assert_matches = "1.4.0" +async-trait = "0.1.42" +futures = { version = "0.3.8", features = ["thread-pool"] } polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } diff --git a/node/subsystem/src/errors.rs b/node/subsystem/src/errors.rs index 40edb1b3c148014f179c942c0723cbf7106352f3..5af573c87fc1984890637c699b4f1000f1772530 100644 --- a/node/subsystem/src/errors.rs +++ b/node/subsystem/src/errors.rs @@ -32,6 +32,8 @@ impl core::fmt::Display for RuntimeApiError { } } +impl std::error::Error for RuntimeApiError {} + /// A description of an error causing the chain API request to be unservable. #[derive(Debug, Clone)] pub struct ChainApiError { @@ -55,3 +57,5 @@ impl core::fmt::Display for ChainApiError { write!(f, "{}", self.msg) } } + +impl std::error::Error for ChainApiError {} diff --git a/node/subsystem/src/lib.rs b/node/subsystem/src/lib.rs index 77ad27a2c1d46b3443c0a41f111446a957002892..ad049bf39d253c6d6dcfd979e1f9248c6e23715a 100644 --- a/node/subsystem/src/lib.rs +++ b/node/subsystem/src/lib.rs @@ -19,18 +19,16 @@ //! Node-side logic for Polkadot is mostly comprised of Subsystems, which are discrete components //! that communicate via message-passing. They are coordinated by an overseer, provided by a //! separate crate. -//! -//! This crate also reexports Prometheus metric types which are expected to be implemented by subsystems. #![warn(missing_docs)] -use std::pin::Pin; +use std::{pin::Pin, sync::Arc, fmt}; use futures::prelude::*; use futures::channel::{mpsc, oneshot}; use futures::future::BoxFuture; -use polkadot_primitives::v1::Hash; +use polkadot_primitives::v1::{Hash, BlockNumber}; use async_trait::async_trait; use smallvec::SmallVec; @@ -39,6 +37,9 @@ use crate::messages::AllMessages; pub mod errors; pub mod messages; +pub use polkadot_node_jaeger as jaeger; +pub use jaeger::*; + /// How many slots are stack-reserved for active leaves updates /// /// If there are fewer than this number of slots, then we've wasted some stack space. @@ -48,23 +49,31 @@ const ACTIVE_LEAVES_SMALLVEC_CAPACITY: usize = 8; /// Changes in the set of active leaves: the parachain heads which we care to work on. /// /// Note that the activated and deactivated fields indicate deltas, not complete sets. -#[derive(Clone, Debug, Default, Eq)] +#[derive(Clone, Default)] pub struct ActiveLeavesUpdate { - /// New relay chain block hashes of interest. - pub activated: SmallVec<[Hash; ACTIVE_LEAVES_SMALLVEC_CAPACITY]>, + /// New relay chain block hashes of interest and their associated [`JaegerSpan`]. + /// + /// NOTE: Each span should only be kept active as long as the leaf is considered active and should be dropped + /// when the leaf is deactivated. + pub activated: SmallVec<[(Hash, Arc); ACTIVE_LEAVES_SMALLVEC_CAPACITY]>, /// Relay chain block hashes no longer of interest. pub deactivated: SmallVec<[Hash; ACTIVE_LEAVES_SMALLVEC_CAPACITY]>, } impl ActiveLeavesUpdate { /// Create a ActiveLeavesUpdate with a single activated hash - pub fn start_work(hash: Hash) -> Self { - Self { activated: [hash].as_ref().into(), ..Default::default() } + pub fn start_work(hash: Hash, span: Arc) -> Self { + Self { activated: [(hash, span)][..].into(), ..Default::default() } } /// Create a ActiveLeavesUpdate with a single deactivated hash pub fn stop_work(hash: Hash) -> Self { - Self { deactivated: [hash].as_ref().into(), ..Default::default() } + Self { deactivated: [hash][..].into(), ..Default::default() } + } + + /// Is this update empty and doesn't contain any information? + pub fn is_empty(&self) -> bool { + self.activated.is_empty() && self.deactivated.is_empty() } } @@ -73,9 +82,25 @@ impl PartialEq for ActiveLeavesUpdate { /// /// Instead, it means equality when `activated` and `deactivated` are considered as sets. fn eq(&self, other: &Self) -> bool { - use std::collections::HashSet; - self.activated.iter().collect::>() == other.activated.iter().collect::>() && - self.deactivated.iter().collect::>() == other.deactivated.iter().collect::>() + self.activated.len() == other.activated.len() && self.deactivated.len() == other.deactivated.len() + && self.activated.iter().all(|a| other.activated.iter().any(|o| a.0 == o.0)) + && self.deactivated.iter().all(|a| other.deactivated.contains(a)) + } +} + +impl fmt::Debug for ActiveLeavesUpdate { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + struct Activated<'a>(&'a [(Hash, Arc)]); + impl fmt::Debug for Activated<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.0.iter().map(|e| e.0)).finish() + } + } + + f.debug_struct("ActiveLeavesUpdate") + .field("activated", &Activated(&self.activated)) + .field("deactivated", &self.deactivated) + .finish() } } @@ -84,8 +109,8 @@ impl PartialEq for ActiveLeavesUpdate { pub enum OverseerSignal { /// Subsystems should adjust their jobs to start and stop work on appropriate block hashes. ActiveLeaves(ActiveLeavesUpdate), - /// `Subsystem` is informed of a finalized block by its block hash. - BlockFinalized(Hash), + /// `Subsystem` is informed of a finalized block by its block hash and number. + BlockFinalized(Hash, BlockNumber), /// Conclude the work of the `Overseer` and all `Subsystem`s. Conclude, } @@ -107,6 +132,7 @@ pub enum FromOverseer { }, } + /// An error type that describes faults that may happen /// /// These are: @@ -114,30 +140,47 @@ pub enum FromOverseer { /// * Subsystems dying when they are not expected to /// * Subsystems not dying when they are told to die /// * etc. -#[derive(Debug, PartialEq, Eq)] -pub struct SubsystemError; +#[derive(thiserror::Error, Debug)] +#[allow(missing_docs)] +pub enum SubsystemError { + #[error(transparent)] + NotifyCancellation(#[from] oneshot::Canceled), -impl From for SubsystemError { - fn from(_: mpsc::SendError) -> Self { - Self - } -} + #[error(transparent)] + QueueError(#[from] mpsc::SendError), -impl From for SubsystemError { - fn from(_: oneshot::Canceled) -> Self { - Self - } -} + #[error(transparent)] + TaskSpawn(#[from] futures::task::SpawnError), -impl From for SubsystemError { - fn from(_: futures::task::SpawnError) -> Self { - Self - } + #[error(transparent)] + Infallible(#[from] std::convert::Infallible), + + #[error(transparent)] + Prometheus(#[from] substrate_prometheus_endpoint::PrometheusError), + + #[error(transparent)] + Jaeger(#[from] JaegerError), + + #[error("Failed to {0}")] + Context(String), + + #[error("Subsystem stalled: {0}")] + SubsystemStalled(&'static str), + + /// Per origin (or subsystem) annotations to wrap an error. + #[error("Error originated in {origin}")] + FromOrigin { + /// An additional anotation tag for the origin of `source`. + origin: &'static str, + /// The wrapped error. Marked as source for tracking the error chain. + #[source] source: Box + }, } -impl From for SubsystemError { - fn from(e: std::convert::Infallible) -> Self { - match e {} +impl SubsystemError { + /// Adds a `str` as `origin` to the given error `err`. + pub fn with_origin(origin: &'static str, err: E) -> Self { + Self::FromOrigin { origin, source: Box::new(err) } } } @@ -148,7 +191,7 @@ pub struct SpawnedSubsystem { /// Name of the subsystem being spawned. pub name: &'static str, /// The task of the subsystem being spawned. - pub future: BoxFuture<'static, ()>, + pub future: BoxFuture<'static, SubsystemResult<()>>, } /// A `Result` type that wraps [`SubsystemError`]. @@ -188,10 +231,10 @@ pub trait SubsystemContext: Send + 'static { ) -> SubsystemResult<()>; /// Send a direct message to some other `Subsystem`, routed based on message type. - async fn send_message(&mut self, msg: AllMessages) -> SubsystemResult<()>; + async fn send_message(&mut self, msg: AllMessages); /// Send multiple direct messages to other `Subsystem`s, routed based on message type. - async fn send_messages(&mut self, msgs: T) -> SubsystemResult<()> + async fn send_messages(&mut self, msgs: T) where T: IntoIterator + Send, T::IntoIter: Send; } @@ -204,9 +247,6 @@ pub trait SubsystemContext: Send + 'static { /// [`Overseer`]: struct.Overseer.html /// [`Subsystem`]: trait.Subsystem.html pub trait Subsystem { - /// Subsystem-specific Prometheus metrics. - type Metrics: metrics::Metrics; - /// Start this `Subsystem` and return `SpawnedSubsystem`. fn start(self, ctx: C) -> SpawnedSubsystem; } @@ -215,60 +255,31 @@ pub trait Subsystem { /// types of messages. Used for tests or as a placeholder. pub struct DummySubsystem; -impl Subsystem for DummySubsystem { - type Metrics = (); - +impl Subsystem for DummySubsystem +where + C::Message: std::fmt::Debug +{ fn start(self, mut ctx: C) -> SpawnedSubsystem { let future = Box::pin(async move { loop { match ctx.recv().await { - Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return, - Err(_) => return, - _ => continue, + Err(_) => return Ok(()), + Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return Ok(()), + Ok(overseer_msg) => { + tracing::debug!( + target: "dummy-subsystem", + "Discarding a message sent from overseer {:?}", + overseer_msg + ); + continue; + } } } }); SpawnedSubsystem { - name: "DummySubsystem", + name: "dummy-subsystem", future, } } } - -/// This module reexports Prometheus types and defines the [`Metrics`] trait. -pub mod metrics { - /// Reexport Prometheus types. - pub use substrate_prometheus_endpoint as prometheus; - - /// Subsystem- or job-specific Prometheus metrics. - /// - /// Usually implemented as a wrapper for `Option` - /// to ensure `Default` bounds or as a dummy type (). - /// Prometheus metrics internally hold an `Arc` reference, so cloning them is fine. - pub trait Metrics: Default + Clone { - /// Try to register metrics in the Prometheus registry. - fn try_register(registry: &prometheus::Registry) -> Result; - - /// Convience method to register metrics in the optional Prometheus registry. - /// If the registration fails, prints a warning and returns `Default::default()`. - fn register(registry: Option<&prometheus::Registry>) -> Self { - registry.map(|r| { - match Self::try_register(r) { - Err(e) => { - log::warn!("Failed to register metrics: {:?}", e); - Default::default() - }, - Ok(metrics) => metrics, - } - }).unwrap_or_default() - } - } - - // dummy impl - impl Metrics for () { - fn try_register(_registry: &prometheus::Registry) -> Result<(), prometheus::PrometheusError> { - Ok(()) - } - } -} diff --git a/node/subsystem/src/messages.rs b/node/subsystem/src/messages.rs index ad8b5a3bb11d3738503e42d1e3b85d42dee70790..995256d5d409889abb8056a404aabd877e36feb4 100644 --- a/node/subsystem/src/messages.rs +++ b/node/subsystem/src/messages.rs @@ -23,26 +23,29 @@ //! Subsystems' APIs are defined separately from their implementation, leading to easier mocking. use futures::channel::{mpsc, oneshot}; - +use thiserror::Error; use polkadot_node_network_protocol::{ - v1 as protocol_v1, NetworkBridgeEvent, ReputationChange, PeerId, PeerSet, + v1 as protocol_v1, NetworkBridgeEvent, ReputationChange, PeerId, }; use polkadot_node_primitives::{ CollationGenerationConfig, MisbehaviorReport, SignedFullStatement, ValidationResult, }; use polkadot_primitives::v1::{ - AvailableData, BackedCandidate, BlockNumber, CandidateDescriptor, CandidateEvent, - CandidateReceipt, CollatorId, CommittedCandidateReceipt, - CoreState, ErasureChunk, GroupRotationInfo, Hash, Id as ParaId, - OccupiedCoreAssumption, PersistedValidationData, PoV, SessionIndex, SignedAvailabilityBitfield, - TransientValidationData, ValidationCode, ValidatorId, ValidationData, ValidatorIndex, - ValidatorSignature, + AuthorityDiscoveryId, AvailableData, BackedCandidate, BlockNumber, SessionInfo, + Header as BlockHeader, CandidateDescriptor, CandidateEvent, CandidateReceipt, + CollatorId, CommittedCandidateReceipt, CoreState, ErasureChunk, + GroupRotationInfo, Hash, Id as ParaId, OccupiedCoreAssumption, + PersistedValidationData, PoV, SessionIndex, SignedAvailabilityBitfield, + ValidationCode, ValidatorId, ValidationData, CandidateHash, + ValidatorIndex, ValidatorSignature, InboundDownwardMessage, InboundHrmpMessage, }; -use std::sync::Arc; +use std::{sync::Arc, collections::btree_map::BTreeMap}; -/// A notification of a new backed candidate. -#[derive(Debug)] -pub struct NewBackedCandidate(pub BackedCandidate); +/// Subsystem messages where each message is always bound to a relay parent. +pub trait BoundToRelayParent { + /// Returns the relay parent this message is bound to. + fn relay_parent(&self) -> Hash; +} /// Messages received by the Candidate Selection subsystem. #[derive(Debug)] @@ -54,12 +57,11 @@ pub enum CandidateSelectionMessage { Invalid(Hash, CandidateReceipt), } -impl CandidateSelectionMessage { - /// If the current variant contains the relay parent hash, return it. - pub fn relay_parent(&self) -> Option { +impl BoundToRelayParent for CandidateSelectionMessage { + fn relay_parent(&self) -> Hash { match self { - Self::Collation(hash, ..) => Some(*hash), - Self::Invalid(hash, _) => Some(*hash), + Self::Collation(hash, ..) => *hash, + Self::Invalid(hash, _) => *hash, } } } @@ -75,7 +77,7 @@ impl Default for CandidateSelectionMessage { pub enum CandidateBackingMessage { /// Requests a set of backable candidates that could be backed in a child of the given /// relay-parent, referenced by its hash. - GetBackedCandidates(Hash, oneshot::Sender>), + GetBackedCandidates(Hash, Vec, 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. Second(Hash, CandidateReceipt, PoV), @@ -84,19 +86,19 @@ pub enum CandidateBackingMessage { Statement(Hash, SignedFullStatement), } -impl CandidateBackingMessage { - /// If the current variant contains the relay parent hash, return it. - pub fn relay_parent(&self) -> Option { +impl BoundToRelayParent for CandidateBackingMessage { + fn relay_parent(&self) -> Hash { match self { - Self::GetBackedCandidates(hash, _) => Some(*hash), - Self::Second(hash, _, _) => Some(*hash), - Self::Statement(hash, _) => Some(*hash), + Self::GetBackedCandidates(hash, _, _) => *hash, + Self::Second(hash, _, _) => *hash, + Self::Statement(hash, _) => *hash, } } } /// Blanket error for validation failing for internal reasons. -#[derive(Debug)] +#[derive(Debug, Error)] +#[error("Validation failed with {0:?}")] pub struct ValidationFailed(pub String); /// Messages received by the Validation subsystem. @@ -114,6 +116,8 @@ pub enum CandidateValidationMessage { /// from the runtime API of the chain, based on the `relay_parent` /// of the `CandidateDescriptor`. /// + /// This will also perform checking of validation outputs against the acceptance criteria. + /// /// If there is no state available which can provide this data or the core for /// the para is not free at the relay-parent, an error is returned. ValidateFromChainState( @@ -124,11 +128,14 @@ pub enum CandidateValidationMessage { /// Validate a candidate with provided, exhaustive parameters for validation. /// /// Explicitly provide the `PersistedValidationData` and `ValidationCode` so this can do full - /// validation without needing to access the state of the relay-chain. Optionally provide the - /// `TransientValidationData` for further checks on the outputs. + /// validation without needing to access the state of the relay-chain. + /// + /// This request doesn't involve acceptance criteria checking, therefore only useful for the + /// cases where the validity of the candidate is established. This is the case for the typical + /// use-case: secondary checkers would use this request relying on the full prior checks + /// performed by the relay-chain. ValidateFromExhaustive( PersistedValidationData, - Option, ValidationCode, CandidateDescriptor, Arc, @@ -141,7 +148,7 @@ impl CandidateValidationMessage { pub fn relay_parent(&self) -> Option { match self { Self::ValidateFromChainState(_, _, _) => None, - Self::ValidateFromExhaustive(_, _, _, _, _, _) => None, + Self::ValidateFromExhaustive(_, _, _, _, _) => None, } } } @@ -196,11 +203,25 @@ pub enum NetworkBridgeMessage { /// Send a message to one or more peers on the collation peer-set. SendCollationMessage(Vec, protocol_v1::CollationProtocol), - /// Connect to peers who represent the given `ValidatorId`s at the given relay-parent. + /// Send a batch of validation messages. + SendValidationMessages(Vec<(Vec, protocol_v1::ValidationProtocol)>), + + /// Send a batch of collation messages. + SendCollationMessages(Vec<(Vec, protocol_v1::CollationProtocol)>), + + /// Connect to peers who represent the given `validator_ids`. /// - /// Also accepts a response channel by which the issuer can learn the `PeerId`s of those - /// validators. - ConnectToValidators(PeerSet, Vec, oneshot::Sender>), + /// Also ask the network to stay connected to these peers at least + /// until the request is revoked. + /// This can be done by dropping the receiver. + ConnectToValidators { + /// Ids of the validators to connect to. + validator_ids: Vec, + /// Response sender by which the issuer can learn the `PeerId`s of + /// the validators as they are connected. + /// The response is sent immediately for already connected peers. + connected: mpsc::Sender<(AuthorityDiscoveryId, PeerId)>, + }, } impl NetworkBridgeMessage { @@ -210,13 +231,15 @@ impl NetworkBridgeMessage { Self::ReportPeer(_, _) => None, Self::SendValidationMessage(_, _) => None, Self::SendCollationMessage(_, _) => None, - Self::ConnectToValidators(_, _, _) => None, + Self::SendValidationMessages(_) => None, + Self::SendCollationMessages(_) => None, + Self::ConnectToValidators { .. } => None, } } } /// Availability Distribution Message. -#[derive(Debug)] +#[derive(Debug, derive_more::From)] pub enum AvailabilityDistributionMessage { /// Event from the network bridge. NetworkBridgeUpdateV1(NetworkBridgeEvent), @@ -257,10 +280,9 @@ impl BitfieldDistributionMessage { #[derive(Debug)] pub enum BitfieldSigningMessage {} -impl BitfieldSigningMessage { - /// If the current variant contains the relay parent hash, return it. - pub fn relay_parent(&self) -> Option { - None +impl BoundToRelayParent for BitfieldSigningMessage { + fn relay_parent(&self) -> Hash { + match *self {} } } @@ -268,47 +290,51 @@ impl BitfieldSigningMessage { #[derive(Debug)] pub enum AvailabilityStoreMessage { /// Query a `AvailableData` from the AV store. - QueryAvailableData(Hash, oneshot::Sender>), + QueryAvailableData(CandidateHash, oneshot::Sender>), /// Query whether a `AvailableData` exists within the AV Store. /// /// This is useful in cases when existence /// matters, but we don't want to necessarily pass around multiple /// megabytes of data to get a single bit of information. - QueryDataAvailability(Hash, oneshot::Sender), + QueryDataAvailability(CandidateHash, oneshot::Sender), /// Query an `ErasureChunk` from the AV store by the candidate hash and validator index. - QueryChunk(Hash, ValidatorIndex, oneshot::Sender>), + QueryChunk(CandidateHash, ValidatorIndex, oneshot::Sender>), /// Query whether an `ErasureChunk` exists within the AV Store. /// /// This is useful in cases like bitfield signing, when existence /// matters, but we don't want to necessarily pass around large /// quantities of data to get a single bit of information. - QueryChunkAvailability(Hash, ValidatorIndex, oneshot::Sender), + QueryChunkAvailability(CandidateHash, ValidatorIndex, oneshot::Sender), /// Store an `ErasureChunk` in the AV store. /// /// Return `Ok(())` if the store operation succeeded, `Err(())` if it failed. - StoreChunk(Hash, ValidatorIndex, ErasureChunk, oneshot::Sender>), + StoreChunk { + /// A hash of the candidate this chunk belongs to. + candidate_hash: CandidateHash, + /// A relevant relay parent. + relay_parent: Hash, + /// The chunk itself. + chunk: ErasureChunk, + /// Sending side of the channel to send result to. + tx: oneshot::Sender>, + }, /// Store a `AvailableData` in the AV store. /// If `ValidatorIndex` is present store corresponding chunk also. /// /// Return `Ok(())` if the store operation succeeded, `Err(())` if it failed. - StoreAvailableData(Hash, Option, u32, AvailableData, oneshot::Sender>), + StoreAvailableData(CandidateHash, Option, u32, AvailableData, oneshot::Sender>), } impl AvailabilityStoreMessage { - /// If the current variant contains the relay parent hash, return it. + /// In fact, none of the AvailabilityStore messages assume a particular relay parent. pub fn relay_parent(&self) -> Option { match self { - Self::QueryAvailableData(hash, _) => Some(*hash), - Self::QueryDataAvailability(hash, _) => Some(*hash), - Self::QueryChunk(hash, _, _) => Some(*hash), - Self::QueryChunkAvailability(hash, _, _) => Some(*hash), - Self::StoreChunk(hash, _, _, _) => Some(*hash), - Self::StoreAvailableData(hash, _, _, _, _) => Some(*hash), + _ => None, } } } @@ -322,6 +348,9 @@ pub enum ChainApiMessage { /// Request the block number by hash. /// Returns `None` if a block with the given hash is not present in the db. BlockNumber(Hash, ChainApiResponseChannel>), + /// Request the block header by hash. + /// Returns `None` if a block with the given hash is not present in the db. + BlockHeader(Hash, ChainApiResponseChannel>), /// Request the finalized block hash by number. /// Returns `None` if a block with the given number is not present in the db. /// Note: the caller must ensure the block is finalized. @@ -378,17 +407,50 @@ pub enum RuntimeApiRequest { OccupiedCoreAssumption, RuntimeApiSender>, ), + /// Sends back `true` if the validation outputs pass all acceptance criteria checks. + CheckValidationOutputs( + ParaId, + polkadot_primitives::v1::CandidateCommitments, + RuntimeApiSender, + ), /// Get the session index that a child of the block will have. SessionIndexForChild(RuntimeApiSender), /// Get the validation code for a para, taking the given `OccupiedCoreAssumption`, which /// will inform on how the validation data should be computed if the para currently /// occupies a core. - ValidationCode(ParaId, OccupiedCoreAssumption, RuntimeApiSender>), + ValidationCode( + ParaId, + OccupiedCoreAssumption, + RuntimeApiSender>, + ), + /// Fetch the historical validation code used by a para for candidates executed in the + /// context of a given block height in the current chain. + /// + /// `context_height` may be no greater than the height of the block in whose + /// state the runtime API is executed. Otherwise `None` is returned. + HistoricalValidationCode( + ParaId, + BlockNumber, + RuntimeApiSender>, + ), /// Get a the candidate pending availability for a particular parachain by parachain / core index CandidatePendingAvailability(ParaId, RuntimeApiSender>), /// Get all events concerning candidates (backing, inclusion, time-out) in the parent of /// the block in whose state this request is executed. CandidateEvents(RuntimeApiSender>), + /// Get the session info for the given session, if stored. + SessionInfo(SessionIndex, RuntimeApiSender>), + /// Get all the pending inbound messages in the downward message queue for a para. + DmqContents( + ParaId, + RuntimeApiSender>>, + ), + /// Get the contents of all channels addressed to the given recipient. Channels that have no + /// messages in them are also included. + InboundHrmpChannelsContents( + ParaId, + RuntimeApiSender>>>, + ), } /// A message to the Runtime API subsystem. @@ -415,6 +477,8 @@ pub enum StatementDistributionMessage { Share(Hash, SignedFullStatement), /// Event from the network bridge. NetworkBridgeUpdateV1(NetworkBridgeEvent), + /// Register a listener for shared statements. + RegisterStatementListener(mpsc::Sender), } impl StatementDistributionMessage { @@ -423,6 +487,7 @@ impl StatementDistributionMessage { match self { Self::Share(hash, _) => Some(*hash), Self::NetworkBridgeUpdateV1(_) => None, + Self::RegisterStatementListener(_) => None, } } } @@ -434,7 +499,7 @@ pub enum ProvisionableData { /// This bitfield indicates the availability of various candidate blocks. Bitfield(Hash, SignedAvailabilityBitfield), /// The Candidate Backing subsystem believes that this candidate is valid, pending availability. - BackedCandidate(BackedCandidate), + BackedCandidate(CandidateReceipt), /// Misbehavior reports are self-contained proofs of validator misbehavior. MisbehaviorReport(Hash, MisbehaviorReport), /// Disputes trigger a broad dispute resolution process. @@ -461,16 +526,15 @@ pub enum ProvisionerMessage { /// where it can be assembled into the InclusionInherent. RequestInherentData(Hash, oneshot::Sender), /// This data should become part of a relay chain block - ProvisionableData(ProvisionableData), + ProvisionableData(Hash, ProvisionableData), } -impl ProvisionerMessage { - /// If the current variant contains the relay parent hash, return it. - pub fn relay_parent(&self) -> Option { +impl BoundToRelayParent for ProvisionerMessage { + fn relay_parent(&self) -> Hash { match self { - Self::RequestBlockAuthorshipData(hash, _) => Some(*hash), - Self::RequestInherentData(hash, _) => Some(*hash), - Self::ProvisionableData(_) => None, + Self::RequestBlockAuthorshipData(hash, _) => *hash, + Self::RequestInherentData(hash, _) => *hash, + Self::ProvisionableData(hash, _) => *hash, } } } @@ -516,7 +580,7 @@ impl CollationGenerationMessage { } /// A message type tying together all message types that are used across Subsystems. -#[derive(Debug)] +#[derive(Debug, derive_more::From)] pub enum AllMessages { /// Message for the validation subsystem. CandidateValidation(CandidateValidationMessage), diff --git a/node/test-service/src/lib.rs b/node/test-service/src/lib.rs deleted file mode 100644 index f05b96c186004bd70485db97ba4137adf7cd9fe6..0000000000000000000000000000000000000000 --- a/node/test-service/src/lib.rs +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright 2020 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 . - -//! Polkadot test service only. - -#![warn(missing_docs)] - -mod chain_spec; - -pub use chain_spec::*; -use futures::future::Future; -use polkadot_primitives::v0::{ - Block, Hash, CollatorId, Id as ParaId, -}; -use polkadot_runtime_common::BlockHashCount; -use polkadot_service::{ - new_full, NewFull, FullNodeHandles, AbstractClient, ClientHandle, ExecuteWithClient, -}; -use polkadot_test_runtime::{Runtime, SignedExtra, SignedPayload, VERSION}; -use sc_chain_spec::ChainSpec; -use sc_client_api::{execution_extensions::ExecutionStrategies, BlockchainEvents}; -use sc_executor::native_executor_instance; -use sc_informant::OutputFormat; -use sc_network::{ - config::{NetworkConfiguration, TransportConfig}, - multiaddr, NetworkService, -}; -use service::{ - config::{DatabaseConfig, KeystoreConfig, MultiaddrWithPeerId, WasmExecutionMethod}, - error::Error as ServiceError, - RpcHandlers, TaskExecutor, TaskManager, -}; -use service::{BasePath, Configuration, Role, TFullBackend}; -use sp_arithmetic::traits::SaturatedConversion; -use sp_blockchain::HeaderBackend; -use sp_keyring::Sr25519Keyring; -use sp_runtime::{codec::Encode, generic}; -use sp_state_machine::BasicExternalities; -use std::sync::Arc; -use substrate_test_client::{BlockchainEventsExt, RpcHandlersExt, RpcTransactionOutput, RpcTransactionError}; - -native_executor_instance!( - pub PolkadotTestExecutor, - polkadot_test_runtime::api::dispatch, - polkadot_test_runtime::native_version, - frame_benchmarking::benchmarking::HostFunctions, -); - -/// Create a new Polkadot test service for a full node. -pub fn polkadot_test_new_full( - config: Configuration, - collating_for: Option<(CollatorId, ParaId)>, - authority_discovery_enabled: bool, -) -> Result< - ( - TaskManager, - Arc>, - FullNodeHandles, - Arc>, - RpcHandlers, - ), - ServiceError, -> { - let NewFull { task_manager, client, node_handles, network, rpc_handlers, .. } = - new_full::( - config, - collating_for, - authority_discovery_enabled, - None, - true, - )?; - - Ok((task_manager, client, node_handles, network, rpc_handlers)) -} - -/// A wrapper for the test client that implements `ClientHandle`. -pub struct TestClient(pub Arc>); - -impl ClientHandle for TestClient { - fn execute_with(&self, t: T) -> T::Output { - T::execute_with_client::<_, _, polkadot_service::FullBackend>(t, self.0.clone()) - } -} - -/// Create a Polkadot `Configuration`. By default an in-memory socket will be used, therefore you need to provide boot -/// nodes if you want the future node to be connected to other nodes. The `storage_update_func` can be used to make -/// adjustements to the runtime before the node starts. -pub fn node_config( - storage_update_func: impl Fn(), - task_executor: TaskExecutor, - key: Sr25519Keyring, - boot_nodes: Vec, -) -> Configuration { - let base_path = BasePath::new_temp_dir().expect("could not create temporary directory"); - let root = base_path.path(); - let role = Role::Authority { - sentry_nodes: Vec::new(), - }; - let key_seed = key.to_seed(); - let mut spec = polkadot_local_testnet_config(); - let mut storage = spec - .as_storage_builder() - .build_storage() - .expect("could not build storage"); - - BasicExternalities::execute_with_storage(&mut storage, storage_update_func); - spec.set_storage(storage); - - let mut network_config = NetworkConfiguration::new( - format!("Polkadot Test Node for: {}", key_seed), - "network/test/0.1", - Default::default(), - None, - ); - let informant_output_format = OutputFormat { - enable_color: false, - prefix: format!("[{}] ", key_seed), - }; - - network_config.boot_nodes = boot_nodes; - - network_config.allow_non_globals_in_dht = true; - - network_config - .listen_addresses - .push(multiaddr::Protocol::Memory(rand::random()).into()); - - network_config.transport = TransportConfig::MemoryOnly; - - Configuration { - impl_name: "polkadot-test-node".to_string(), - impl_version: "0.1".to_string(), - role, - task_executor, - transaction_pool: Default::default(), - network: network_config, - keystore: KeystoreConfig::Path { - path: root.join("key"), - password: None, - }, - database: DatabaseConfig::RocksDb { - path: root.join("db"), - cache_size: 128, - }, - state_cache_size: 16777216, - state_cache_child_ratio: None, - pruning: Default::default(), - chain_spec: Box::new(spec), - wasm_method: WasmExecutionMethod::Interpreted, - // NOTE: we enforce the use of the native runtime to make the errors more debuggable - execution_strategies: ExecutionStrategies { - syncing: sc_client_api::ExecutionStrategy::NativeWhenPossible, - importing: sc_client_api::ExecutionStrategy::NativeWhenPossible, - block_construction: sc_client_api::ExecutionStrategy::NativeWhenPossible, - offchain_worker: sc_client_api::ExecutionStrategy::NativeWhenPossible, - other: sc_client_api::ExecutionStrategy::NativeWhenPossible, - }, - rpc_http: None, - rpc_ws: None, - rpc_ipc: None, - rpc_ws_max_connections: None, - rpc_cors: None, - rpc_methods: Default::default(), - prometheus_config: None, - telemetry_endpoints: None, - telemetry_external_transport: None, - default_heap_pages: None, - offchain_worker: Default::default(), - force_authoring: false, - disable_grandpa: false, - dev_key_seed: Some(key_seed), - tracing_targets: None, - tracing_receiver: Default::default(), - max_runtime_instances: 8, - announce_block: true, - base_path: Some(base_path), - informant_output_format, - } -} - -/// Run a Polkadot test node using the Polkadot test runtime. The node will be using an in-memory socket, therefore you -/// need to provide boot nodes if you want it to be connected to other nodes. The `storage_update_func` can be used to -/// make adjustements to the runtime before the node starts. -pub fn run_test_node( - task_executor: TaskExecutor, - key: Sr25519Keyring, - storage_update_func: impl Fn(), - boot_nodes: Vec, -) -> PolkadotTestNode< - TaskManager, - impl AbstractClient>, -> { - let config = node_config(storage_update_func, task_executor, key, boot_nodes); - let multiaddr = config.network.listen_addresses[0].clone(); - let authority_discovery_enabled = false; - let (task_manager, client, handles, network, rpc_handlers) = - polkadot_test_new_full(config, None, authority_discovery_enabled) - .expect("could not create Polkadot test service"); - - let peer_id = network.local_peer_id().clone(); - let addr = MultiaddrWithPeerId { multiaddr, peer_id }; - - PolkadotTestNode { - task_manager, - client, - handles, - addr, - rpc_handlers, - } -} - -/// A Polkadot test node instance used for testing. -pub struct PolkadotTestNode { - /// TaskManager's instance. - pub task_manager: S, - /// Client's instance. - pub client: Arc, - /// Node's handles. - pub handles: FullNodeHandles, - /// The `MultiaddrWithPeerId` to this node. This is useful if you want to pass it as "boot node" to other nodes. - pub addr: MultiaddrWithPeerId, - /// RPCHandlers to make RPC queries. - pub rpc_handlers: RpcHandlers, -} - -impl PolkadotTestNode -where - C: HeaderBackend, -{ - /// Send a transaction through RPCHandlers to call a function. - pub async fn call_function( - &self, - function: polkadot_test_runtime::Call, - caller: Sr25519Keyring, - ) -> Result { - let current_block_hash = self.client.info().best_hash; - let current_block = self.client.info().best_number.saturated_into(); - let genesis_block = self.client.hash(0).unwrap().unwrap(); - let nonce = 0; - let period = BlockHashCount::get() - .checked_next_power_of_two() - .map(|c| c / 2) - .unwrap_or(2) as u64; - let tip = 0; - let extra: SignedExtra = ( - frame_system::CheckSpecVersion::::new(), - frame_system::CheckTxVersion::::new(), - frame_system::CheckGenesis::::new(), - frame_system::CheckEra::::from(generic::Era::mortal(period, current_block)), - frame_system::CheckNonce::::from(nonce), - frame_system::CheckWeight::::new(), - pallet_transaction_payment::ChargeTransactionPayment::::from(tip), - ); - let raw_payload = SignedPayload::from_raw( - function.clone(), - extra.clone(), - ( - VERSION.spec_version, - VERSION.transaction_version, - genesis_block, - current_block_hash, - (), - (), - (), - ), - ); - let signature = raw_payload.using_encoded(|e| caller.sign(e)); - let extrinsic = polkadot_test_runtime::UncheckedExtrinsic::new_signed( - function.clone(), - polkadot_test_runtime::Address::Id(caller.public().into()), - polkadot_primitives::v0::Signature::Sr25519(signature.clone()), - extra.clone(), - ); - - self.rpc_handlers.send_transaction(extrinsic.into()).await - } -} - -impl PolkadotTestNode -where - C: BlockchainEvents, -{ - /// Wait for `count` blocks to be imported in the node and then exit. This function will not return if no blocks - /// are ever created, thus you should restrict the maximum amount of time of the test execution. - pub fn wait_for_blocks(&self, count: usize) -> impl Future { - self.client.wait_for_blocks(count) - } -} diff --git a/runtime/test-runtime/client/Cargo.toml b/node/test/client/Cargo.toml similarity index 54% rename from runtime/test-runtime/client/Cargo.toml rename to node/test/client/Cargo.toml index ce00e4a51d375d6dc8d65a1309ccd8b658f777ec..5d6c45b6c7994d93b68b3beb8d0981d3e9d15316 100644 --- a/runtime/test-runtime/client/Cargo.toml +++ b/node/test/client/Cargo.toml @@ -1,29 +1,31 @@ [package] -name = "polkadot-test-runtime-client" -version = "2.0.0" +name = "polkadot-test-client" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" [dependencies] -futures = "0.3.1" -codec = { package = "parity-scale-codec", version = "1.3.4" } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } # Polkadot dependencies +polkadot-test-runtime = { path = "../../../runtime/test-runtime" } +polkadot-test-service = { path = "../service" } polkadot-primitives = { path = "../../../primitives" } -polkadot-runtime-common = { path = "../../common" } -polkadot-test-runtime = { path = ".." } -polkadot-test-service = { path = "../../../node/test-service" } +polkadot-node-subsystem = { path = "../../subsystem" } # Substrate dependencies -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } +substrate-test-client = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-light = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-service = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["test-helpers"], default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-test-client = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[dev-dependencies] +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/node/test/client/src/block_builder.rs b/node/test/client/src/block_builder.rs new file mode 100644 index 0000000000000000000000000000000000000000..f9848a306419b460041def6e4d102f30c3b169d6 --- /dev/null +++ b/node/test/client/src/block_builder.rs @@ -0,0 +1,118 @@ +// Copyright 2020 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::{Client, FullBackend}; +use polkadot_test_runtime::{GetLastTimestamp, UncheckedExtrinsic}; +use polkadot_primitives::v1::Block; +use sp_runtime::generic::BlockId; +use sp_api::ProvideRuntimeApi; +use sc_block_builder::{BlockBuilderProvider, BlockBuilder}; +use sp_state_machine::BasicExternalities; +use parity_scale_codec::{Encode, Decode}; + +/// An extension for the test client to init a Polkadot specific block builder. +pub trait InitPolkadotBlockBuilder { + /// Init a Polkadot specific block builder that works for the test runtime. + /// + /// This will automatically create and push the inherents for you to make the block valid for the test runtime. + fn init_polkadot_block_builder(&self) -> sc_block_builder::BlockBuilder; + + /// Init a Polkadot specific block builder at a specific block that works for the test runtime. + /// + /// Same as [`InitPolkadotBlockBuilder::init_polkadot_block_builder`] besides that it takes a [`BlockId`] to say + /// which should be the parent block of the block that is being build. + fn init_polkadot_block_builder_at( + &self, + at: &BlockId, + ) -> sc_block_builder::BlockBuilder; +} + +impl InitPolkadotBlockBuilder for Client { + fn init_polkadot_block_builder( + &self, + ) -> BlockBuilder { + let chain_info = self.chain_info(); + self.init_polkadot_block_builder_at(&BlockId::Hash(chain_info.best_hash)) + } + + fn init_polkadot_block_builder_at( + &self, + at: &BlockId, + ) -> BlockBuilder { + let mut block_builder = self.new_block_at(at, Default::default(), false) + .expect("Creates new block builder for test runtime"); + + let mut inherent_data = sp_inherents::InherentData::new(); + let last_timestamp = self + .runtime_api() + .get_last_timestamp(&at) + .expect("Get last timestamp"); + + // `MinimumPeriod` is a storage parameter type that requires externalities to access the value. + let minimum_period = BasicExternalities::new_empty() + .execute_with(|| polkadot_test_runtime::MinimumPeriod::get()); + + let timestamp = last_timestamp + minimum_period; + + inherent_data + .put_data(sp_timestamp::INHERENT_IDENTIFIER, ×tamp) + .expect("Put timestamp inherent data"); + + let parent_header = self.header(at) + .expect("Get the parent block header") + .expect("The target block header must exist"); + let provisioner_data = polkadot_node_subsystem::messages::ProvisionerInherentData::default(); + let inclusion_inherent_data = ( + provisioner_data.0, + provisioner_data.1, + parent_header, + ); + inherent_data + .put_data( + polkadot_primitives::v1::INCLUSION_INHERENT_IDENTIFIER, + &inclusion_inherent_data, + ) + .expect("Put inclusion inherent data"); + + let inherents = block_builder.create_inherents(inherent_data).expect("Creates inherents"); + + inherents.into_iter().for_each(|ext| block_builder.push(ext).expect("Pushes inherent")); + + block_builder + } +} + +/// Polkadot specific extensions for the [`BlockBuilder`]. +pub trait BlockBuilderExt { + /// Push a Polkadot test runtime specific extrinsic to the block. + /// + /// This will internally use the [`BlockBuilder::push`] method, but this method expects a opaque extrinsic. So, + /// we provide this wrapper which converts a test runtime specific extrinsic to a opaque extrinsic and pushes it to + /// the block. + /// + /// Returns the result of the application of the extrinsic. + fn push_polkadot_extrinsic(&mut self, ext: UncheckedExtrinsic) -> Result<(), sp_blockchain::Error>; +} + +impl BlockBuilderExt for BlockBuilder<'_, Block, Client, FullBackend> { + fn push_polkadot_extrinsic(&mut self, ext: UncheckedExtrinsic) -> Result<(), sp_blockchain::Error> { + let encoded = ext.encode(); + self.push( + Decode::decode(&mut &encoded[..]) + .expect("The runtime specific extrinsic always decodes to an opaque extrinsic; qed"), + ) + } +} diff --git a/node/test/client/src/lib.rs b/node/test/client/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..d3312e06caec5cabe324122784a0985a632690f8 --- /dev/null +++ b/node/test/client/src/lib.rs @@ -0,0 +1,117 @@ +// Copyright 2020 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 Polkadot test client. +//! +//! This test client is using the Polkadot test runtime. + +mod block_builder; + +use polkadot_primitives::v1::Block; +use sc_service::client; +use sp_core::storage::Storage; +use sp_runtime::BuildStorage; + +pub use block_builder::*; +pub use substrate_test_client::*; +pub use polkadot_test_service::{ + Client, construct_extrinsic, construct_transfer_extrinsic, PolkadotTestExecutor, FullBackend, +}; +pub use polkadot_test_runtime as runtime; + +/// Test client executor. +pub type Executor = client::LocalCallExecutor>; + +/// Test client builder for Polkadot. +pub type TestClientBuilder = substrate_test_client::TestClientBuilder; + +/// LongestChain type for the test runtime/client. +pub type LongestChain = sc_consensus::LongestChain; + +/// Parameters of test-client builder with test-runtime. +#[derive(Default)] +pub struct GenesisParameters; + +impl substrate_test_client::GenesisInit for GenesisParameters { + fn genesis_storage(&self) -> Storage { + polkadot_test_service::chain_spec::polkadot_local_testnet_genesis() + .build_storage() + .expect("Builds test runtime genesis storage") + } +} + +/// A `test-runtime` extensions to `TestClientBuilder`. +pub trait TestClientBuilderExt: Sized { + /// Build the test client. + fn build(self) -> Client { + self.build_with_longest_chain().0 + } + + /// Build the test client and longest chain selector. + fn build_with_longest_chain(self) -> (Client, LongestChain); +} + +impl TestClientBuilderExt for TestClientBuilder { + fn build_with_longest_chain(self) -> (Client, LongestChain) { + self.build_with_native_executor(None) + } +} + +/// A `TestClientBuilder` with default backend and executor. +pub trait DefaultTestClientBuilderExt: Sized { + /// Create new `TestClientBuilder` + fn new() -> Self; +} + +impl DefaultTestClientBuilderExt for TestClientBuilder { + fn new() -> Self { + Self::with_default_backend() + } +} + +#[cfg(test)] +mod tests{ + use super::*; + use sp_consensus::BlockOrigin; + + #[test] + fn ensure_test_client_can_build_and_import_block() { + let mut client = TestClientBuilder::new().build(); + + let block_builder = client.init_polkadot_block_builder(); + let block = block_builder.build().expect("Finalizes the block").block; + + client.import(BlockOrigin::Own, block).expect("Imports the block"); + } + + #[test] + fn ensure_test_client_can_push_extrinsic() { + let mut client = TestClientBuilder::new().build(); + + let transfer = construct_transfer_extrinsic( + &client, + sp_keyring::Sr25519Keyring::Alice, + sp_keyring::Sr25519Keyring::Bob, + 1000, + ); + let mut block_builder = client.init_polkadot_block_builder(); + block_builder.push_polkadot_extrinsic(transfer).expect("Pushes extrinsic"); + + let block = block_builder.build().expect("Finalizes the block").block; + + client.import(BlockOrigin::Own, block).expect("Imports the block"); + } +} diff --git a/node/test-service/Cargo.toml b/node/test/service/Cargo.toml similarity index 74% rename from node/test-service/Cargo.toml rename to node/test/service/Cargo.toml index d1bf0aed1d1993e5964dd44542fa33e8939c80f8..e2cad280221a21ac98643c842f517a9707a26427 100644 --- a/node/test-service/Cargo.toml +++ b/node/test/service/Cargo.toml @@ -1,26 +1,33 @@ [package] name = "polkadot-test-service" -version = "0.8.2" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" [dependencies] -futures = "0.3.4" +futures = "0.3.8" futures01 = { package = "futures", version = "0.1.29" } -hex = "0.4" -log = "0.4.8" -rand = "0.7.3" +hex = "0.4.2" +tracing = "0.1.22" +tracing-futures = "0.2.4" +rand = "0.8.1" tempfile = "3.1.0" # Polkadot dependencies -polkadot-primitives = { path = "../../primitives" } -polkadot-rpc = { path = "../../rpc" } -polkadot-runtime-common = { path = "../../runtime/common" } +polkadot-overseer = { path = "../../overseer" } +polkadot-primitives = { path = "../../../primitives" } +polkadot-parachain = { path = "../../../parachain" } +polkadot-rpc = { path = "../../../rpc" } +polkadot-runtime-common = { path = "../../../runtime/common" } polkadot-service = { path = "../../service" } -polkadot-test-runtime = { path = "../../runtime/test-runtime" } +polkadot-node-subsystem = { path = "../../subsystem" } +polkadot-node-primitives = { path = "../../primitives" } +polkadot-test-runtime = { path = "../../../runtime/test-runtime" } +polkadot-runtime-parachains = { path = "../../../runtime/parachains" } # Substrate dependencies -authority-discovery = { package = "sc-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master" } +sp-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } babe = { package = "sc-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } consensus_common = { package = "sp-consensus", git = "https://github.com/paritytech/substrate", branch = "master" } @@ -30,12 +37,13 @@ grandpa = { package = "sc-finality-grandpa", git = "https://github.com/paritytec grandpa_primitives = { package = "sp-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master" } pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master" } +pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-informant = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } service = { package = "sc-service", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -49,6 +57,6 @@ substrate-test-client = { git = "https://github.com/paritytech/substrate", branc [dev-dependencies] pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -serde_json = "1.0" +serde_json = "1.0.61" substrate-test-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } tokio = { version = "0.2", features = ["macros"] } diff --git a/node/test-service/src/chain_spec.rs b/node/test/service/src/chain_spec.rs similarity index 65% rename from node/test-service/src/chain_spec.rs rename to node/test/service/src/chain_spec.rs index 93a614b7d3a788be2d9131a3bc06e0a9e3ae9bb5..173ee70dfb0a59792db5e3423664aba365401257 100644 --- a/node/test-service/src/chain_spec.rs +++ b/node/test/service/src/chain_spec.rs @@ -14,29 +14,32 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +//! Chain specifications for the test runtime. + +use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; use babe_primitives::AuthorityId as BabeId; use grandpa::AuthorityId as GrandpaId; use pallet_staking::Forcing; -use polkadot_primitives::v0::{ValidatorId, AccountId}; +use polkadot_primitives::v1::{ValidatorId, AccountId, AssignmentId}; use polkadot_service::chain_spec::{get_account_id_from_seed, get_from_seed, Extensions}; use polkadot_test_runtime::constants::currency::DOTS; use sc_chain_spec::{ChainSpec, ChainType}; -use sp_core::{sr25519, ChangesTrieConfiguration}; +use sp_core::sr25519; use sp_runtime::Perbill; const DEFAULT_PROTOCOL_ID: &str = "dot"; -/// The `ChainSpec parametrised for polkadot runtime`. +/// The `ChainSpec` parametrized for polkadot test runtime. pub type PolkadotChainSpec = service::GenericChainSpec; -/// Polkadot local testnet config (multivalidator Alice + Bob) +/// Local testnet config (multivalidator Alice + Bob) pub fn polkadot_local_testnet_config() -> PolkadotChainSpec { PolkadotChainSpec::from_genesis( "Local Testnet", "local_testnet", ChainType::Local, - || polkadot_local_testnet_genesis(None), + || polkadot_local_testnet_genesis(), vec![], None, Some(DEFAULT_PROTOCOL_ID), @@ -45,32 +48,30 @@ pub fn polkadot_local_testnet_config() -> PolkadotChainSpec { ) } -/// Polkadot local testnet genesis config (multivalidator Alice + Bob) -pub fn polkadot_local_testnet_genesis( - changes_trie_config: Option, -) -> polkadot_test_runtime::GenesisConfig { +/// Local testnet genesis config (multivalidator Alice + Bob) +pub fn polkadot_local_testnet_genesis() -> polkadot_test_runtime::GenesisConfig { polkadot_testnet_genesis( vec![ get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob"), - get_authority_keys_from_seed("Charlie"), ], get_account_id_from_seed::("Alice"), None, - changes_trie_config, ) } /// Helper function to generate stash, controller and session key from seed fn get_authority_keys_from_seed( seed: &str, -) -> (AccountId, AccountId, BabeId, GrandpaId, ValidatorId) { +) -> (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), ) } @@ -93,47 +94,56 @@ fn testnet_accounts() -> Vec { /// Helper function to create polkadot GenesisConfig for testing fn polkadot_testnet_genesis( - initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ValidatorId)>, + initial_authorities: Vec<( + AccountId, + AccountId, + BabeId, + GrandpaId, + ValidatorId, + AssignmentId, + AuthorityDiscoveryId, + )>, root_key: AccountId, endowed_accounts: Option>, - changes_trie_config: Option, ) -> polkadot_test_runtime::GenesisConfig { - use polkadot_test_runtime as polkadot; + use polkadot_test_runtime as runtime; let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); const ENDOWMENT: u128 = 1_000_000 * DOTS; const STASH: u128 = 100 * DOTS; - polkadot::GenesisConfig { - frame_system: Some(polkadot::SystemConfig { - code: polkadot::WASM_BINARY.expect("Wasm binary must be built for testing").to_vec(), - changes_trie_config, + runtime::GenesisConfig { + frame_system: Some(runtime::SystemConfig { + code: runtime::WASM_BINARY.expect("Wasm binary must be built for testing").to_vec(), + ..Default::default() }), - pallet_indices: Some(polkadot::IndicesConfig { indices: vec![] }), - pallet_balances: Some(polkadot::BalancesConfig { + pallet_indices: Some(runtime::IndicesConfig { indices: vec![] }), + pallet_balances: Some(runtime::BalancesConfig { balances: endowed_accounts .iter() .map(|k| (k.clone(), ENDOWMENT)) .collect(), }), - pallet_session: Some(polkadot::SessionConfig { + pallet_session: Some(runtime::SessionConfig { keys: initial_authorities .iter() .map(|x| { ( x.0.clone(), x.0.clone(), - polkadot_test_runtime::SessionKeys { + runtime::SessionKeys { babe: x.2.clone(), grandpa: x.3.clone(), - parachain_validator: x.4.clone(), + para_validator: x.4.clone(), + para_assignment: x.5.clone(), + authority_discovery: x.6.clone(), }, ) }) .collect::>(), }), - pallet_staking: Some(polkadot::StakingConfig { + pallet_staking: Some(runtime::StakingConfig { minimum_validator_count: 1, validator_count: 2, stakers: initial_authorities @@ -143,7 +153,7 @@ fn polkadot_testnet_genesis( x.0.clone(), x.1.clone(), STASH, - polkadot::StakerStatus::Validator, + runtime::StakerStatus::Validator, ) }) .collect(), @@ -154,13 +164,28 @@ fn polkadot_testnet_genesis( }), pallet_babe: Some(Default::default()), pallet_grandpa: Some(Default::default()), - pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { keys: vec![] }), - claims: Some(polkadot::ClaimsConfig { + pallet_authority_discovery: Some(runtime::AuthorityDiscoveryConfig { keys: vec![] }), + claims: Some(runtime::ClaimsConfig { claims: vec![], vesting: vec![], }), - pallet_vesting: Some(polkadot::VestingConfig { vesting: vec![] }), - pallet_sudo: Some(polkadot::SudoConfig { key: root_key }), + pallet_vesting: Some(runtime::VestingConfig { vesting: vec![] }), + pallet_sudo: Some(runtime::SudoConfig { key: root_key }), + parachains_configuration: Some(runtime::ParachainsConfigurationConfig { + config: polkadot_runtime_parachains::configuration::HostConfiguration { + validation_upgrade_frequency: 10u32, + validation_upgrade_delay: 5, + acceptance_period: 1200, + max_code_size: 5 * 1024 * 1024, + max_pov_size: 50 * 1024 * 1024, + max_head_data_size: 32 * 1024, + group_rotation_frequency: 20, + chain_availability_period: 4, + thread_availability_period: 4, + no_show_slots: 10, + ..Default::default() + }, + }), } } diff --git a/node/test/service/src/lib.rs b/node/test/service/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..76d2ab735ab5a62982659bbbfc76c178ef6a2988 --- /dev/null +++ b/node/test/service/src/lib.rs @@ -0,0 +1,406 @@ +// Copyright 2020 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 . + +//! Polkadot test service only. + +#![warn(missing_docs)] + +pub mod chain_spec; + +pub use chain_spec::*; +use futures::future::Future; +use polkadot_overseer::OverseerHandler; +use polkadot_primitives::v1::{ + Id as ParaId, HeadData, ValidationCode, Balance, CollatorPair, CollatorId, +}; +use polkadot_runtime_common::BlockHashCount; +use polkadot_service::{ + Error, NewFull, FullClient, ClientHandle, ExecuteWithClient, IsCollator, +}; +use polkadot_node_subsystem::messages::{CollatorProtocolMessage, CollationGenerationMessage}; +use polkadot_test_runtime::{ + Runtime, SignedExtra, SignedPayload, VERSION, ParasSudoWrapperCall, SudoCall, UncheckedExtrinsic, +}; +use polkadot_node_primitives::{CollatorFn, CollationGenerationConfig}; +use polkadot_runtime_parachains::paras::ParaGenesisArgs; +use sc_chain_spec::ChainSpec; +use sc_client_api::execution_extensions::ExecutionStrategies; +use sc_executor::native_executor_instance; +use sc_network::{ + config::{NetworkConfiguration, TransportConfig}, + multiaddr, +}; +use service::{ + config::{DatabaseConfig, KeystoreConfig, MultiaddrWithPeerId, WasmExecutionMethod}, + RpcHandlers, TaskExecutor, TaskManager, +}; +use service::{BasePath, Configuration, Role}; +use sp_arithmetic::traits::SaturatedConversion; +use sp_blockchain::HeaderBackend; +use sp_keyring::Sr25519Keyring; +use sp_runtime::{codec::Encode, generic, traits::IdentifyAccount, MultiSigner}; +use sp_state_machine::BasicExternalities; +use std::sync::Arc; +use substrate_test_client::{BlockchainEventsExt, RpcHandlersExt, RpcTransactionOutput, RpcTransactionError}; + +native_executor_instance!( + pub PolkadotTestExecutor, + polkadot_test_runtime::api::dispatch, + polkadot_test_runtime::native_version, + frame_benchmarking::benchmarking::HostFunctions, +); + +/// The client type being used by the test service. +pub type Client = FullClient; + +pub use polkadot_service::FullBackend; + +/// Create a new full node. +#[sc_cli::prefix_logs_with(config.network.node_name.as_str())] +pub fn new_full( + config: Configuration, + is_collator: IsCollator, +) -> Result< + NewFull>, + Error, +> { + polkadot_service::new_full::( + config, + is_collator, + None, + None, + polkadot_parachain::wasm_executor::IsolationStrategy::InProcess, + ) +} + +/// A wrapper for the test client that implements `ClientHandle`. +pub struct TestClient(pub Arc); + +impl ClientHandle for TestClient { + fn execute_with(&self, t: T) -> T::Output { + T::execute_with_client::<_, _, polkadot_service::FullBackend>(t, self.0.clone()) + } +} + +/// Create a Polkadot `Configuration`. +/// +/// By default an in-memory socket will be used, therefore you need to provide boot +/// nodes if you want the future node to be connected to other nodes. +/// +/// The `storage_update_func` function will be executed in an externalities provided environment +/// and can be used to make adjustements to the runtime genesis storage. +pub fn node_config( + storage_update_func: impl Fn(), + task_executor: TaskExecutor, + key: Sr25519Keyring, + boot_nodes: Vec, + is_validator: bool, +) -> Configuration { + let base_path = BasePath::new_temp_dir().expect("could not create temporary directory"); + let root = base_path.path(); + let role = if is_validator { + Role::Authority { sentry_nodes: Vec::new() } + } else { + Role::Full + }; + let key_seed = key.to_seed(); + let mut spec = polkadot_local_testnet_config(); + let mut storage = spec + .as_storage_builder() + .build_storage() + .expect("could not build storage"); + + BasicExternalities::execute_with_storage(&mut storage, storage_update_func); + spec.set_storage(storage); + + let mut network_config = NetworkConfiguration::new( + key_seed.to_string(), + "network/test/0.1", + Default::default(), + None, + ); + + network_config.boot_nodes = boot_nodes; + + network_config.allow_non_globals_in_dht = true; + + let addr: multiaddr::Multiaddr = multiaddr::Protocol::Memory(rand::random()).into(); + network_config + .listen_addresses + .push(addr.clone()); + + network_config + .public_addresses + .push(addr); + + network_config.transport = TransportConfig::MemoryOnly; + + Configuration { + impl_name: "polkadot-test-node".to_string(), + impl_version: "0.1".to_string(), + role, + task_executor, + transaction_pool: Default::default(), + network: network_config, + keystore: KeystoreConfig::InMemory, + keystore_remote: Default::default(), + database: DatabaseConfig::RocksDb { + path: root.join("db"), + cache_size: 128, + }, + state_cache_size: 16777216, + state_cache_child_ratio: None, + pruning: Default::default(), + chain_spec: Box::new(spec), + wasm_method: WasmExecutionMethod::Interpreted, + wasm_runtime_overrides: Default::default(), + // NOTE: we enforce the use of the native runtime to make the errors more debuggable + execution_strategies: ExecutionStrategies { + syncing: sc_client_api::ExecutionStrategy::NativeWhenPossible, + importing: sc_client_api::ExecutionStrategy::NativeWhenPossible, + block_construction: sc_client_api::ExecutionStrategy::NativeWhenPossible, + offchain_worker: sc_client_api::ExecutionStrategy::NativeWhenPossible, + other: sc_client_api::ExecutionStrategy::NativeWhenPossible, + }, + rpc_http: None, + rpc_ws: None, + rpc_ipc: None, + rpc_ws_max_connections: None, + rpc_cors: None, + rpc_methods: Default::default(), + prometheus_config: None, + telemetry_endpoints: None, + telemetry_external_transport: None, + default_heap_pages: None, + offchain_worker: Default::default(), + force_authoring: false, + disable_grandpa: false, + dev_key_seed: Some(key_seed), + tracing_targets: None, + tracing_receiver: Default::default(), + max_runtime_instances: 8, + announce_block: true, + base_path: Some(base_path), + informant_output_format: Default::default(), + disable_log_reloading: false, + } +} + +/// Run a test validator node that uses the test runtime. +/// +/// The node will be using an in-memory socket, therefore you need to provide boot nodes if you +/// want it to be connected to other nodes. +/// +/// The `storage_update_func` function will be executed in an externalities provided environment +/// and can be used to make adjustements to the runtime genesis storage. +pub fn run_validator_node( + task_executor: TaskExecutor, + key: Sr25519Keyring, + storage_update_func: impl Fn(), + boot_nodes: Vec, +) -> PolkadotTestNode { + let config = node_config(storage_update_func, task_executor, key, boot_nodes, true); + let multiaddr = config.network.listen_addresses[0].clone(); + let NewFull { task_manager, client, network, rpc_handlers, overseer_handler, .. } = + new_full(config, IsCollator::No).expect("could not create Polkadot test service"); + + let overseer_handler = overseer_handler.expect("test node must have an overseer handler"); + let peer_id = network.local_peer_id().clone(); + let addr = MultiaddrWithPeerId { multiaddr, peer_id }; + + PolkadotTestNode { + task_manager, + client, + overseer_handler, + addr, + rpc_handlers, + } +} + +/// Run a test collator node that uses the test runtime. +/// +/// The node will be using an in-memory socket, therefore you need to provide boot nodes if you +/// want it to be connected to other nodes. +/// +/// The `storage_update_func` function will be executed in an externalities provided environment +/// and can be used to make adjustements to the runtime genesis storage. +/// +/// # Note +/// +/// The collator functionionality still needs to be registered at the node! This can be done using +/// [`PolkadotTestNode::register_collator`]. +pub fn run_collator_node( + task_executor: TaskExecutor, + key: Sr25519Keyring, + storage_update_func: impl Fn(), + boot_nodes: Vec, + collator_id: CollatorId, +) -> PolkadotTestNode { + let config = node_config(storage_update_func, task_executor, key, boot_nodes, false); + let multiaddr = config.network.listen_addresses[0].clone(); + let NewFull { task_manager, client, network, rpc_handlers, overseer_handler, .. } = + new_full(config, IsCollator::Yes(collator_id)).expect("could not create Polkadot test service"); + + let overseer_handler = overseer_handler.expect("test node must have an overseer handler"); + let peer_id = network.local_peer_id().clone(); + let addr = MultiaddrWithPeerId { multiaddr, peer_id }; + + PolkadotTestNode { + task_manager, + client, + overseer_handler, + addr, + rpc_handlers, + } +} + +/// A Polkadot test node instance used for testing. +pub struct PolkadotTestNode { + /// TaskManager's instance. + pub task_manager: TaskManager, + /// Client's instance. + pub client: Arc, + /// The overseer handler. + pub overseer_handler: OverseerHandler, + /// The `MultiaddrWithPeerId` to this node. This is useful if you want to pass it as "boot node" to other nodes. + pub addr: MultiaddrWithPeerId, + /// RPCHandlers to make RPC queries. + pub rpc_handlers: RpcHandlers, +} + +impl PolkadotTestNode { + /// Send an extrinsic to this node. + pub async fn send_extrinsic( + &self, + function: impl Into, + caller: Sr25519Keyring, + ) -> Result { + let extrinsic = construct_extrinsic(&*self.client, function, caller); + + self.rpc_handlers.send_transaction(extrinsic.into()).await + } + + /// Register a parachain at this relay chain. + pub async fn register_parachain( + &self, + id: ParaId, + validation_code: impl Into, + genesis_head: impl Into, + ) -> Result<(), RpcTransactionError> { + let call = ParasSudoWrapperCall::sudo_schedule_para_initialize( + id, + ParaGenesisArgs { + genesis_head: genesis_head.into(), + validation_code: validation_code.into(), + parachain: true, + }, + ); + + self.send_extrinsic(SudoCall::sudo(Box::new(call.into())), Sr25519Keyring::Alice).await.map(drop) + } + + /// Wait for `count` blocks to be imported in the node and then exit. This function will not return if no blocks + /// are ever created, thus you should restrict the maximum amount of time of the test execution. + pub fn wait_for_blocks(&self, count: usize) -> impl Future { + self.client.wait_for_blocks(count) + } + + /// Register the collator functionality in the overseer of this node. + pub async fn register_collator( + &mut self, + collator_key: CollatorPair, + para_id: ParaId, + collator: CollatorFn, + ) { + let config = CollationGenerationConfig { + key: collator_key, + collator, + para_id, + }; + + self.overseer_handler + .send_msg(CollationGenerationMessage::Initialize(config)) + .await; + + self.overseer_handler + .send_msg(CollatorProtocolMessage::CollateOn(para_id)) + .await; + } +} + +/// Construct an extrinsic that can be applied to the test runtime. +pub fn construct_extrinsic( + client: &Client, + function: impl Into, + caller: Sr25519Keyring, +) -> UncheckedExtrinsic { + let function = function.into(); + let current_block_hash = client.info().best_hash; + let current_block = client.info().best_number.saturated_into(); + let genesis_block = client.hash(0).unwrap().unwrap(); + let nonce = 0; + let period = BlockHashCount::get() + .checked_next_power_of_two() + .map(|c| c / 2) + .unwrap_or(2) as u64; + let tip = 0; + let extra: SignedExtra = ( + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckEra::::from(generic::Era::mortal(period, current_block)), + frame_system::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(tip), + ); + let raw_payload = SignedPayload::from_raw( + function.clone(), + extra.clone(), + ( + VERSION.spec_version, + VERSION.transaction_version, + genesis_block, + current_block_hash, + (), + (), + (), + ), + ); + let signature = raw_payload.using_encoded(|e| caller.sign(e)); + UncheckedExtrinsic::new_signed( + function.clone(), + polkadot_test_runtime::Address::Id(caller.public().into()), + polkadot_primitives::v0::Signature::Sr25519(signature.clone()), + extra.clone(), + ) +} + +/// Construct a transfer extrinsic. +pub fn construct_transfer_extrinsic( + client: &Client, + origin: sp_keyring::AccountKeyring, + dest: sp_keyring::AccountKeyring, + value: Balance, +) -> UncheckedExtrinsic { + let function = polkadot_test_runtime::Call::Balances( + pallet_balances::Call::transfer( + MultiSigner::from(dest.public()).into_account().into(), + value, + ), + ); + + construct_extrinsic(client, function, origin) +} diff --git a/node/test-service/tests/build-blocks.rs b/node/test/service/tests/build-blocks.rs similarity index 83% rename from node/test-service/tests/build-blocks.rs rename to node/test/service/tests/build-blocks.rs index b809f188aafc9fff50e5cbfbdb521efe54c54cc8..0cf55e38584033bfb14d3c1e8e52f2fe3ebe58a8 100644 --- a/node/test-service/tests/build-blocks.rs +++ b/node/test/service/tests/build-blocks.rs @@ -21,13 +21,23 @@ use sp_keyring::Sr25519Keyring; #[substrate_test_utils::test] async fn ensure_test_service_build_blocks(task_executor: TaskExecutor) { - let mut alice = run_test_node( + sc_cli::init_logger( + sc_cli::InitLoggerParams { + pattern: "".into(), + tracing_receiver: Default::default(), + tracing_targets: None, + disable_log_reloading: false, + disable_log_color: true, + }, + ).expect("Sets up logger"); + + let mut alice = run_validator_node( task_executor.clone(), Sr25519Keyring::Alice, || {}, Vec::new(), ); - let mut bob = run_test_node( + let mut bob = run_validator_node( task_executor.clone(), Sr25519Keyring::Bob, || {}, diff --git a/node/test-service/tests/call-function.rs b/node/test/service/tests/call-function.rs similarity index 90% rename from node/test-service/tests/call-function.rs rename to node/test/service/tests/call-function.rs index af62bcf5dbff584c29d6ab95202da0b237d3e46d..c6802234c9c81fee65500e73fd1ff9f248ed8866 100644 --- a/node/test-service/tests/call-function.rs +++ b/node/test/service/tests/call-function.rs @@ -20,13 +20,13 @@ use sp_keyring::Sr25519Keyring::{Alice, Bob}; #[substrate_test_utils::test] async fn call_function_actually_work(task_executor: TaskExecutor) { - let alice = run_test_node(task_executor, Alice, || {}, Vec::new()); + let alice = run_validator_node(task_executor, Alice, || {}, Vec::new()); let function = polkadot_test_runtime::Call::Balances(pallet_balances::Call::transfer( Default::default(), 1, )); - let output = alice.call_function(function, Bob).await.unwrap(); + let output = alice.send_extrinsic(function, Bob).await.unwrap(); let res = output.result.expect("return value expected"); let json = serde_json::from_str::(res.as_str()).expect("valid JSON"); @@ -37,7 +37,7 @@ async fn call_function_actually_work(task_executor: TaskExecutor) { assert_eq!( result.as_str().map(|x| x.starts_with("0x")), Some(true), - "result starts with 0x" + "result starts with 0x", ); alice.task_manager.clean_shutdown().await; diff --git a/parachain/Cargo.toml b/parachain/Cargo.toml index eed548a1bf7fcf3c2746560a029bac8dff7e30cb..837284e945b22e5a7a1d390d072b3f72b15f4953 100644 --- a/parachain/Cargo.toml +++ b/parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" edition = "2018" @@ -9,21 +9,23 @@ edition = "2018" # note: special care is taken to avoid inclusion of `sp-io` externals when compiling # this crate for WASM. This is critical to avoid forcing all parachain WASM into implementing # various unnecessary Substrate-specific endpoints. -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = [ "derive" ] } -sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +parity-scale-codec = { version = "1.3.5", default-features = false, features = [ "derive" ] } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-wasm-interface = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } polkadot-core-primitives = { path = "../core-primitives", default-features = false } +derive_more = "0.99.11" # all optional crates. -derive_more = { version = "0.99.2", optional = true } -serde = { version = "1.0.102", default-features = false, features = [ "derive" ], optional = true } +thiserror = { version = "1.0.22", optional = true } +serde = { version = "1.0.117", default-features = false, features = [ "derive" ], optional = true } sp-externalities = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } -parking_lot = { version = "0.10.0", optional = true } -log = { version = "0.4.8", optional = true } -futures = { version = "0.3.4", optional = true } +parking_lot = { version = "0.11.1", optional = true } +log = { version = "0.4.11", optional = true } +futures = { version = "0.3.8", optional = true } [target.'cfg(not(any(target_os = "android", target_os = "unknown")))'.dependencies] shared_memory = { version = "0.10.0", optional = true } @@ -32,10 +34,11 @@ shared_memory = { version = "0.10.0", optional = true } default = ["std"] wasm-api = [] std = [ - "codec/std", - "derive_more", + "parity-scale-codec/std", + "thiserror", "serde/std", "sp-std/std", + "sp-runtime/std", "shared_memory", "sp-core/std", "parking_lot", diff --git a/parachain/src/primitives.rs b/parachain/src/primitives.rs index 3a1ee81bcdc31451b897d140b590d2994c91c15c..e3c97620bfd6625c4157a9947465b9bf1e302b26 100644 --- a/parachain/src/primitives.rs +++ b/parachain/src/primitives.rs @@ -19,7 +19,7 @@ use sp_std::vec::Vec; -use codec::{Encode, Decode, CompactAs}; +use parity_scale_codec::{Encode, Decode, CompactAs}; use sp_core::{RuntimeDebug, TypeId}; #[cfg(feature = "std")] @@ -28,37 +28,25 @@ use serde::{Serialize, Deserialize}; #[cfg(feature = "std")] use sp_core::bytes; -use polkadot_core_primitives::Hash; +use polkadot_core_primitives::{Hash, OutboundHrmpMessage}; /// Block number type used by the relay chain. pub use polkadot_core_primitives::BlockNumber as RelayChainBlockNumber; /// Parachain head data included in the chain. -#[derive(PartialEq, Eq, Clone, PartialOrd, Ord, Encode, Decode, RuntimeDebug)] +#[derive(PartialEq, Eq, Clone, PartialOrd, Ord, Encode, Decode, RuntimeDebug, derive_more::From)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Default, Hash))] pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); -impl From> for HeadData { - fn from(head: Vec) -> Self { - HeadData(head) - } -} - /// Parachain validation code. -#[derive(Default, PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] +#[derive(Default, PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, derive_more::From)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Hash))] pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); -impl From> for ValidationCode { - fn from(code: Vec) -> Self { - ValidationCode(code) - } -} - /// Parachain block data. /// /// Contains everything required to validate para-block, may contain block and witness data. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Encode, Decode, derive_more::From)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); @@ -124,9 +112,21 @@ impl Id { } /// Returns `true` if this parachain runs with system-level privileges. + /// Use IsSystem instead. + #[deprecated] pub fn is_system(&self) -> bool { self.0 < USER_INDEX_START } } +pub trait IsSystem { + fn is_system(&self) -> bool; +} + +impl IsSystem for Id { + fn is_system(&self) -> bool { + self.0 < USER_INDEX_START + } +} + impl sp_std::ops::Add for Id { type Output = Self; @@ -135,6 +135,45 @@ impl sp_std::ops::Add for Id { } } +#[derive(Clone, Copy, Default, Encode, Decode, Eq, PartialEq, Ord, PartialOrd, RuntimeDebug)] +pub struct Sibling(pub Id); + +impl From for Sibling { + fn from(i: Id) -> Self { + Self(i) + } +} + +impl From for Id { + fn from(i: Sibling) -> Self { + i.0 + } +} + +impl AsRef for Sibling { + fn as_ref(&self) -> &Id { + &self.0 + } +} + +impl TypeId for Sibling { + const TYPE_ID: [u8; 4] = *b"sibl"; +} + +impl From for u32 { + fn from(x: Sibling) -> Self { x.0.into() } +} + +impl From for Sibling { + fn from(x: u32) -> Self { Sibling(x.into()) } +} + +impl IsSystem for Sibling { + fn is_system(&self) -> bool { + IsSystem::is_system(&self.0) + } +} + /// This type can be converted into and possibly from an AccountId (which itself is generic). pub trait AccountIdConversion: Sized { /// Convert into an account ID. This is infallible. @@ -147,12 +186,12 @@ pub trait AccountIdConversion: Sized { // TODO: Remove all of this, move sp-runtime::AccountIdConversion to own crate and and use that. // #360 struct TrailingZeroInput<'a>(&'a [u8]); -impl<'a> codec::Input for TrailingZeroInput<'a> { - fn remaining_len(&mut self) -> Result, codec::Error> { +impl<'a> parity_scale_codec::Input for TrailingZeroInput<'a> { + fn remaining_len(&mut self) -> Result, parity_scale_codec::Error> { Ok(None) } - fn read(&mut self, into: &mut [u8]) -> Result<(), codec::Error> { + fn read(&mut self, into: &mut [u8]) -> Result<(), parity_scale_codec::Error> { let len = into.len().min(self.0.len()); into[..len].copy_from_slice(&self.0[..len]); for i in &mut into[len..] { @@ -186,44 +225,23 @@ impl AccountIdConversion for Id { } } -/// Which origin a parachain's message to the relay chain should be dispatched from. -#[derive(Clone, PartialEq, Eq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Hash))] -#[repr(u8)] -pub enum ParachainDispatchOrigin { - /// As a simple `Origin::Signed`, using `ParaId::account_id` as its value. This is good when - /// interacting with standard modules such as `balances`. - Signed, - /// As the special `Origin::Parachain(ParaId)`. This is good when interacting with parachain- - /// aware modules which need to succinctly verify that the origin is a parachain. - Parachain, - /// As the simple, superuser `Origin::Root`. This can only be done on specially permissioned - /// parachains. - Root, -} - -impl sp_std::convert::TryFrom for ParachainDispatchOrigin { - type Error = (); - fn try_from(x: u8) -> core::result::Result { - const SIGNED: u8 = ParachainDispatchOrigin::Signed as u8; - const PARACHAIN: u8 = ParachainDispatchOrigin::Parachain as u8; - Ok(match x { - SIGNED => ParachainDispatchOrigin::Signed, - PARACHAIN => ParachainDispatchOrigin::Parachain, - _ => return Err(()), - }) - } +/// A type that uniquely identifies an HRMP channel. An HRMP channel is established between two paras. +/// In text, we use the notation `(A, B)` to specify a channel between A and B. The channels are +/// unidirectional, meaning that `(A, B)` and `(B, A)` refer to different channels. The convention is +/// that we use the first item tuple for the sender and the second for the recipient. Only one channel +/// is allowed between two participants in one direction, i.e. there cannot be 2 different channels +/// identified by `(A, B)`. +#[derive(Clone, PartialEq, Eq, Encode, Decode, RuntimeDebug)] +#[cfg_attr(feature = "std", derive(Hash))] +pub struct HrmpChannelId { + /// The para that acts as the sender in this channel. + pub sender: Id, + /// The para that acts as the recipient in this channel. + pub recipient: Id, } /// A message from a parachain to its Relay Chain. -#[derive(Clone, PartialEq, Eq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Hash))] -pub struct UpwardMessage { - /// The origin for the message to be sent from. - pub origin: ParachainDispatchOrigin, - /// The message data. - pub data: Vec, -} +pub type UpwardMessage = Vec; /// Validation parameters for evaluating the parachain validity function. // TODO: balance downloads (https://github.com/paritytech/polkadot/issues/220) @@ -236,6 +254,11 @@ pub struct ValidationParams { pub block_data: BlockData, /// The current relay-chain block number. pub relay_chain_height: RelayChainBlockNumber, + /// The MQC head for the DMQ. + /// + /// The DMQ MQC head will be used by the validation function to authorize the downward messages + /// passed by the collator. + pub dmq_mqc_head: Hash, /// The list of MQC heads for the inbound HRMP channels paired with the sender para ids. This /// vector is sorted ascending by the para id and doesn't contain multiple entries with the same /// sender. @@ -243,7 +266,7 @@ pub struct ValidationParams { } /// The result of parachain validation. -// TODO: egress and balance uploads (https://github.com/paritytech/polkadot/issues/220) +// TODO: balance uploads (https://github.com/paritytech/polkadot/issues/220) #[derive(PartialEq, Eq, Encode)] #[cfg_attr(feature = "std", derive(Debug, Decode))] pub struct ValidationResult { @@ -253,8 +276,12 @@ pub struct ValidationResult { pub new_validation_code: Option, /// Upward messages send by the Parachain. pub upward_messages: Vec, + /// Outbound horizontal messages sent by the parachain. + pub horizontal_messages: Vec>, /// Number of downward messages that were processed by the Parachain. /// /// It is expected that the Parachain processes them from first to last. pub processed_downward_messages: u32, + /// The mark which specifies the block number up to which all inbound HRMP messages are processed. + pub hrmp_watermark: RelayChainBlockNumber, } diff --git a/parachain/src/wasm_api.rs b/parachain/src/wasm_api.rs index 9c7eac25f1e57516c31c62a117bfe48f632e0d5f..99bed554147b76b5fe2ed4f4627dc6318bb3b416 100644 --- a/parachain/src/wasm_api.rs +++ b/parachain/src/wasm_api.rs @@ -26,7 +26,7 @@ pub unsafe fn load_params(params: *const u8, len: usize) { let mut slice = sp_std::slice::from_raw_parts(params, len); - codec::Decode::decode(&mut slice).expect("Invalid input data") + parity_scale_codec::Decode::decode(&mut slice).expect("Invalid input data") } /// Allocate the validation result in memory, getting the return-pointer back. diff --git a/parachain/src/wasm_executor/mod.rs b/parachain/src/wasm_executor/mod.rs index 1dde237f0372861fc918592e7e153af86d7efe22..ba7e516f4269b2f39d2d7e2bc28af5a0a7fb4969 100644 --- a/parachain/src/wasm_executor/mod.rs +++ b/parachain/src/wasm_executor/mod.rs @@ -22,7 +22,7 @@ use std::{any::{TypeId, Any}, path::PathBuf}; use crate::primitives::{ValidationParams, ValidationResult}; -use codec::{Decode, Encode}; +use parity_scale_codec::{Decode, Encode}; use sp_core::{storage::{ChildInfo, TrackedStorageKey}, traits::{CallInWasm, SpawnNamed}}; use sp_externalities::Extensions; use sp_wasm_interface::HostFunctions as _; @@ -37,38 +37,49 @@ const MAX_RUNTIME_MEM: usize = 1024 * 1024 * 1024; // 1 GiB const MAX_CODE_MEM: usize = 16 * 1024 * 1024; // 16 MiB const MAX_VALIDATION_RESULT_HEADER_MEM: usize = MAX_CODE_MEM + 1024; // 16.001 MiB -/// A stub validation-pool defined when compiling for Android or WASM. -#[cfg(any(target_os = "android", target_os = "unknown"))] -#[derive(Clone)] -pub struct ValidationPool { - _inner: (), // private field means not publicly-instantiable -} - -#[cfg(any(target_os = "android", target_os = "unknown"))] -impl ValidationPool { - /// Create a new `ValidationPool`. - pub fn new() -> Self { - ValidationPool { _inner: () } - } -} - -/// A stub function defined when compiling for Android or WASM. -#[cfg(any(target_os = "android", target_os = "unknown"))] -pub fn run_worker(_: &str) -> Result<(), String> { - Err("Cannot run validation worker on this platform".to_string()) -} - -/// The execution mode for the `ValidationPool`. -#[derive(Clone)] -#[cfg_attr(not(any(target_os = "android", target_os = "unknown")), derive(Debug))] -pub enum ExecutionMode { +/// The strategy we employ for isolating execution of wasm parachain validation function (PVF). +/// +/// For a typical validator an external process is the default way to run PVF. The rationale is based +/// on the following observations: +/// +/// (a) PVF is completely under control of parachain developers who may or may not be malicious. +/// (b) Collators are in charge of providing PoV who also may or may not be malicious. +/// (c) PVF is executed by a wasm engine based on optimizing compiler which is a very complex piece +/// of machinery. +/// +/// (a) and (b) may lead to a situation where due to a combination of PVF and PoV the validation work +/// can stuck in an infinite loop, which can open up resource exhaustion or DoS attack vectors. +/// +/// While some execution engines provide functionality to interrupt execution of wasm module from +/// another thread, there are also some caveats to that: there is no clean way to interrupt execution +/// if the control flow is in the host side and at the moment we haven't rigoriously vetted that all +/// host functions terminate or, at least, return in a short amount of time. Additionally, we want +/// some freedom on choosing wasm execution environment. +/// +/// On top of that, execution in a separate process helps to minimize impact of (c) if exploited. +/// It's not only the risk of miscompilation, but it also includes risk of JIT-bombs, i.e. cases +/// of specially crafted code that take enourmous amounts of time and memory to compile. +/// +/// At the same time, since PVF validates self-contained candidates, validation workers don't require +/// extensive communication with polkadot host, therefore there should be no observable performance penalty +/// coming from inter process communication. +/// +/// All of the above should give a sense why isolation is crucial for a typical use-case. +/// +/// However, in some cases, e.g. when running PVF validation on android (for whatever reason), we +/// cannot afford the luxury of process isolation and thus there is an option to run validation in +/// process. Also, running in process is convenient for testing. +#[derive(Clone, Debug)] +pub enum IsolationStrategy { /// The validation worker is ran in a thread inside the same process. InProcess, /// The validation worker is ran using the process' executable and the subcommand `validation-worker` is passed /// following by the address of the shared memory. + #[cfg(not(any(target_os = "android", target_os = "unknown")))] ExternalProcessSelfHost(ValidationPool), /// The validation worker is ran using the command provided and the argument provided. The address of the shared /// memory is added at the end of the arguments. + #[cfg(not(any(target_os = "android", target_os = "unknown")))] ExternalProcessCustomHost { /// Validation pool. pool: ValidationPool, @@ -80,64 +91,75 @@ pub enum ExecutionMode { }, } +impl Default for IsolationStrategy { + fn default() -> Self { + #[cfg(not(any(target_os = "android", target_os = "unknown")))] + { + Self::ExternalProcessSelfHost(ValidationPool::new()) + } + + #[cfg(any(target_os = "android", target_os = "unknown"))] + { + Self::InProcess + } + } +} -#[derive(Debug, derive_more::Display, derive_more::From)] +#[derive(Debug, thiserror::Error)] /// Candidate validation error. pub enum ValidationError { /// Validation failed due to internal reasons. The candidate might still be valid. - Internal(InternalError), + #[error(transparent)] + Internal(#[from] InternalError), /// Candidate is invalid. - InvalidCandidate(InvalidCandidate), + #[error(transparent)] + InvalidCandidate(#[from] InvalidCandidate), } /// Error type that indicates invalid candidate. -#[derive(Debug, derive_more::Display, derive_more::From)] +#[derive(Debug, thiserror::Error)] pub enum InvalidCandidate { /// Wasm executor error. - #[display(fmt = "WASM executor error: {:?}", _0)] - WasmExecutor(sc_executor::error::Error), + #[error("WASM executor error")] + WasmExecutor(#[from] sc_executor::error::Error), /// Call data is too large. - #[display(fmt = "Validation parameters are {} bytes, max allowed is {}", _0, MAX_RUNTIME_MEM)] - #[from(ignore)] + #[error("Validation parameters are {0} bytes, max allowed is {}", MAX_RUNTIME_MEM)] ParamsTooLarge(usize), /// Code size it too large. - #[display(fmt = "WASM code is {} bytes, max allowed is {}", _0, MAX_CODE_MEM)] + #[error("WASM code is {0} bytes, max allowed is {}", MAX_CODE_MEM)] CodeTooLarge(usize), /// Error decoding returned data. - #[display(fmt = "Validation function returned invalid data.")] + #[error("Validation function returned invalid data.")] BadReturn, - #[display(fmt = "Validation function timeout.")] + #[error("Validation function timeout.")] Timeout, - #[display(fmt = "External WASM execution error: {}", _0)] + #[error("External WASM execution error: {0}")] ExternalWasmExecutor(String), } +impl core::convert::From for InvalidCandidate { + fn from(s: String) -> Self { + Self::ExternalWasmExecutor(s) + } +} + /// Host error during candidate validation. This does not indicate an invalid candidate. -#[derive(Debug, derive_more::Display, derive_more::From)] +#[derive(Debug, thiserror::Error)] pub enum InternalError { - #[display(fmt = "IO error: {}", _0)] - Io(std::io::Error), - #[display(fmt = "System error: {}", _0)] - System(Box), - #[display(fmt = "Shared memory error: {}", _0)] + #[error("IO error: {0}")] + Io(#[from] std::io::Error), + + #[error("System error: {0}")] + System(#[from] Box), + #[cfg(not(any(target_os = "android", target_os = "unknown")))] - SharedMem(shared_memory::SharedMemError), - #[display(fmt = "WASM worker error: {}", _0)] + #[error("Shared memory error: {0}")] + SharedMem(#[from] shared_memory::SharedMemError), + + #[error("WASM worker error: {0}")] WasmWorker(String), } -impl std::error::Error for ValidationError { - fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - match self { - ValidationError::Internal(InternalError::Io(ref err)) => Some(err), - ValidationError::Internal(InternalError::System(ref err)) => Some(&**err), - #[cfg(not(any(target_os = "android", target_os = "unknown")))] - ValidationError::Internal(InternalError::SharedMem(ref err)) => Some(err), - ValidationError::InvalidCandidate(InvalidCandidate::WasmExecutor(ref err)) => Some(err), - _ => None, - } - } -} /// Validate a candidate under the given validation code. /// @@ -145,29 +167,22 @@ impl std::error::Error for ValidationError { pub fn validate_candidate( validation_code: &[u8], params: ValidationParams, - execution_mode: &ExecutionMode, + isolation_strategy: &IsolationStrategy, spawner: impl SpawnNamed + 'static, ) -> Result { - match execution_mode { - ExecutionMode::InProcess => { + match isolation_strategy { + IsolationStrategy::InProcess => { validate_candidate_internal(validation_code, ¶ms.encode(), spawner) }, #[cfg(not(any(target_os = "android", target_os = "unknown")))] - ExecutionMode::ExternalProcessSelfHost(pool) => { + IsolationStrategy::ExternalProcessSelfHost(pool) => { pool.validate_candidate(validation_code, params) }, #[cfg(not(any(target_os = "android", target_os = "unknown")))] - ExecutionMode::ExternalProcessCustomHost { pool, binary, args } => { + IsolationStrategy::ExternalProcessCustomHost { pool, binary, args } => { let args: Vec<&str> = args.iter().map(|x| x.as_str()).collect(); pool.validate_candidate_custom(validation_code, params, binary, &args) }, - #[cfg(any(target_os = "android", target_os = "unknown"))] - ExecutionMode::ExternalProcessSelfHost(_) | ExecutionMode::ExternalProcessCustomHost { .. } => - Err(ValidationError::Internal(InternalError::System( - Box::::from( - "Remote validator not available".to_string() - ) as Box<_> - ))), } } @@ -230,7 +245,7 @@ impl sp_externalities::Externalities for ValidationExternalities { panic!("child_storage: unsupported feature for parachain validation") } - fn kill_child_storage(&mut self, _: &ChildInfo) { + fn kill_child_storage(&mut self, _: &ChildInfo, _: Option) -> bool { panic!("kill_child_storage: unsupported feature for parachain validation") } @@ -250,10 +265,6 @@ impl sp_externalities::Externalities for ValidationExternalities { panic!("place_child_storage: unsupported feature for parachain validation") } - fn chain_id(&self) -> u64 { - panic!("chain_id: unsupported feature for parachain validation") - } - fn storage_root(&mut self) -> Vec { panic!("storage_root: unsupported feature for parachain validation") } @@ -340,9 +351,10 @@ impl sp_externalities::ExtensionStore for ValidationExternalities { &mut self, type_id: TypeId, ) -> Result<(), sp_externalities::Error> { - match self.0.deregister(type_id) { - Some(_) => Ok(()), - None => Err(sp_externalities::Error::ExtensionIsNotRegistered(type_id)) + if self.0.deregister(type_id) { + Ok(()) + } else { + Err(sp_externalities::Error::ExtensionIsNotRegistered(type_id)) } } } diff --git a/parachain/src/wasm_executor/validation_host.rs b/parachain/src/wasm_executor/validation_host.rs index 07367d3318fed093ccc720ab2635bf4222778a64..d49f82b6bd77e63e0a9bd35f602da575260883ae 100644 --- a/parachain/src/wasm_executor/validation_host.rs +++ b/parachain/src/wasm_executor/validation_host.rs @@ -17,7 +17,7 @@ #![cfg(not(any(target_os = "android", target_os = "unknown")))] use std::{process, env, sync::Arc, sync::atomic, path::PathBuf}; -use codec::{Decode, Encode}; +use parity_scale_codec::{Decode, Encode}; use crate::primitives::{ValidationParams, ValidationResult}; use super::{ validate_candidate_internal, ValidationError, InvalidCandidate, InternalError, diff --git a/parachain/test-parachains/Cargo.toml b/parachain/test-parachains/Cargo.toml index d391c1b2314dc70e256b796ad127adb4235cf376..d8cc77b178de203583febd36ec576f8dd5249301 100644 --- a/parachain/test-parachains/Cargo.toml +++ b/parachain/test-parachains/Cargo.toml @@ -6,8 +6,8 @@ description = "Integration tests using the test-parachains" edition = "2018" [dependencies] -tiny-keccak = "1.5.0" -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } +tiny-keccak = "2.0.2" +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } parachain = { package = "polkadot-parachain", path = ".." } adder = { package = "test-parachain-adder", path = "adder" } diff --git a/parachain/test-parachains/adder/Cargo.toml b/parachain/test-parachains/adder/Cargo.toml index c0095a1bd4bbcff94642774e8966e4f7c3cd7a25..b2ca8525290cd1fb1b23d5b417f965c3a4227ffa 100644 --- a/parachain/test-parachains/adder/Cargo.toml +++ b/parachain/test-parachains/adder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-adder" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] description = "Test parachain which adds to a number as its state transition" edition = "2018" @@ -8,16 +8,16 @@ build = "build.rs" [dependencies] parachain = { package = "polkadot-parachain", path = "../../", default-features = false, features = [ "wasm-api" ] } -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -tiny-keccak = "1.5.0" -dlmalloc = { version = "0.1.3", features = [ "global" ] } +tiny-keccak = { version = "2.0.2", features = ["keccak"] } +dlmalloc = { version = "0.2.1", features = [ "global" ] } # We need to make sure the global allocator is disabled until we have support of full substrate externalities -runtime-io = { package = "sp-io", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = [ "disable_allocator" ] } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = [ "disable_allocator" ] } [build-dependencies] -wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.6" } +substrate-wasm-builder = "3.0.0" [features] default = [ "std" ] diff --git a/parachain/test-parachains/adder/build.rs b/parachain/test-parachains/adder/build.rs index 2e407bbef3876e3ff3cc1183533545fb74952acf..ac1ce327cf9086d6305b3bfb1da3b547df7c28e9 100644 --- a/parachain/test-parachains/adder/build.rs +++ b/parachain/test-parachains/adder/build.rs @@ -1,25 +1,24 @@ // Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. -// Substrate is free software: you can redistribute it and/or modify +// 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. -// Substrate is distributed in the hope that it will be useful, +// 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 Substrate. If not, see . +// along with Polkadot. If not, see . -use wasm_builder_runner::WasmBuilder; +use substrate_wasm_builder::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("2.0.0") .export_heap_base() .build() } diff --git a/parachain/test-parachains/adder/collator/Cargo.toml b/parachain/test-parachains/adder/collator/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..8fdefbffb702c9df1275d2b95e73644e54254ee5 --- /dev/null +++ b/parachain/test-parachains/adder/collator/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "test-parachain-adder-collator" +version = "0.7.26" +authors = ["Parity Technologies "] +description = "Collator for the adder test parachain" +edition = "2018" + +[[bin]] +name = "adder-collator" +path = "src/main.rs" + +[dependencies] +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +futures = "0.3.8" +futures-timer = "3.0.2" +log = "0.4.11" +structopt = "0.3.21" + +test-parachain-adder = { path = ".." } +polkadot-primitives = { path = "../../../../primitives" } +polkadot-cli = { path = "../../../../cli" } +polkadot-service = { path = "../../../../node/service" } +polkadot-node-primitives = { path = "../../../../node/primitives" } +polkadot-node-subsystem = { path = "../../../../node/subsystem" } + +sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } + +[dev-dependencies] +polkadot-parachain = { path = "../../.." } +polkadot-test-service = { path = "../../../../node/test/service" } + +substrate-test-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } + +tokio = { version = "0.2", features = ["macros"] } + +[features] +real-overseer = [ "polkadot-service/real-overseer" ] diff --git a/parachain/test-parachains/adder/collator/README.md b/parachain/test-parachains/adder/collator/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e3181a84dd5076afb989683d33ee8d9e2a893065 --- /dev/null +++ b/parachain/test-parachains/adder/collator/README.md @@ -0,0 +1,17 @@ +# How to run this collator + +First start two validators that will run for the relay chain: +```sh +cargo run --features=real-overseer --release -- -d alice --chain rococo-local --validator --alice --port 50551 +cargo run --features=real-overseer --release -- -d bob --chain rococo-local --validator --bob --port 50552 +``` + +Next start the collator that will collate for the adder parachain: +```sh +cargo run --features=real-overseer --release -p test-parachain-adder-collator -- --tmp --chain rococo-local --port 50553 +``` + +The last step is to register the parachain using polkadot-js. The parachain id is +100. The genesis state and the validation code are printed at startup by the collator. + +To do this automatically, run `scripts/adder-collator.sh`. diff --git a/parachain/test-parachains/adder/collator/src/cli.rs b/parachain/test-parachains/adder/collator/src/cli.rs new file mode 100644 index 0000000000000000000000000000000000000000..ae6e9ef9008f29e92c777b2f34acf2c047810e41 --- /dev/null +++ b/parachain/test-parachains/adder/collator/src/cli.rs @@ -0,0 +1,115 @@ +// Copyright 2017-2020 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 . + +//! Polkadot CLI library. + +use sc_cli::{RuntimeVersion, SubstrateCli}; +use structopt::StructOpt; + +/// Sub-commands supported by the collator. +#[derive(Debug, StructOpt)] +pub enum Subcommand { + /// Export the genesis state of the parachain. + #[structopt(name = "export-genesis-state")] + ExportGenesisState(ExportGenesisStateCommand), + + /// Export the genesis wasm of the parachain. + #[structopt(name = "export-genesis-wasm")] + ExportGenesisWasm(ExportGenesisWasmCommand), +} + +/// Command for exporting the genesis state of the parachain +#[derive(Debug, StructOpt)] +pub struct ExportGenesisStateCommand {} + +/// Command for exporting the genesis wasm file. +#[derive(Debug, StructOpt)] +pub struct ExportGenesisWasmCommand {} + +#[allow(missing_docs)] +#[derive(Debug, StructOpt)] +pub struct RunCmd { + #[allow(missing_docs)] + #[structopt(flatten)] + pub base: sc_cli::RunCmd, + + /// Id of the parachain this collator collates for. + #[structopt(long)] + pub parachain_id: Option, +} + +#[allow(missing_docs)] +#[derive(Debug, StructOpt)] +pub struct Cli { + #[structopt(subcommand)] + pub subcommand: Option, + + #[structopt(flatten)] + pub run: RunCmd, +} + +impl SubstrateCli for Cli { + fn impl_name() -> String { + "Parity Polkadot".into() + } + + fn impl_version() -> String { + "0.0.0".into() + } + + fn description() -> String { + env!("CARGO_PKG_DESCRIPTION").into() + } + + fn author() -> String { + env!("CARGO_PKG_AUTHORS").into() + } + + fn support_url() -> String { + "https://github.com/paritytech/polkadot/issues/new".into() + } + + fn copyright_start_year() -> i32 { + 2017 + } + + fn executable_name() -> String { + "polkadot".into() + } + + fn load_spec(&self, id: &str) -> std::result::Result, String> { + let id = if id.is_empty() { "rococo" } else { id }; + Ok(match id { + "rococo-staging" => { + Box::new(polkadot_service::chain_spec::rococo_staging_testnet_config()?) + } + "rococo-local" => { + Box::new(polkadot_service::chain_spec::rococo_local_testnet_config()?) + } + "rococo" => Box::new(polkadot_service::chain_spec::rococo_config()?), + path => { + let path = std::path::PathBuf::from(path); + Box::new(polkadot_service::RococoChainSpec::from_json_file(path)?) + } + }) + } + + fn native_runtime_version( + _spec: &Box, + ) -> &'static RuntimeVersion { + &polkadot_service::rococo_runtime::VERSION + } +} diff --git a/parachain/test-parachains/adder/collator/src/lib.rs b/parachain/test-parachains/adder/collator/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..ac50a4f69396b9f043853475307941ab2377daa5 --- /dev/null +++ b/parachain/test-parachains/adder/collator/src/lib.rs @@ -0,0 +1,278 @@ +// Copyright 2020 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 . + +//! Collator for the adder test parachain. + +use futures_timer::Delay; +use polkadot_node_primitives::{Collation, CollatorFn}; +use polkadot_primitives::v1::{CollatorId, CollatorPair, PoV}; +use parity_scale_codec::{Encode, Decode}; +use sp_core::Pair; +use std::{ + collections::HashMap, + sync::{Arc, Mutex}, + time::Duration, +}; +use test_parachain_adder::{execute, hash_state, BlockData, HeadData}; + +/// The amount we add when producing a new block. +/// +/// This is a constant to make tests easily reproducible. +const ADD: u64 = 2; + +/// Calculates the head and state for the block with the given `number`. +fn calculate_head_and_state_for_number(number: u64) -> (HeadData, u64) { + let mut head = HeadData { + number: 0, + parent_hash: Default::default(), + post_state: hash_state(0), + }; + + let mut state = 0u64; + + while head.number < number { + let block = BlockData { state, add: ADD }; + head = execute(head.hash(), head.clone(), &block).expect("Produces valid block"); + state = state.wrapping_add(ADD); + } + + (head, state) +} + +/// The state of the adder parachain. +struct State { + head_to_state: HashMap, u64>, + number_to_head: HashMap>, + /// Block number of the best block. + best_block: u64, +} + +impl State { + /// Init the genesis state. + fn genesis() -> Self { + let genesis_state = Arc::new(calculate_head_and_state_for_number(0).0); + + Self { + head_to_state: vec![(genesis_state.clone(), 0)].into_iter().collect(), + number_to_head: vec![(0, genesis_state)].into_iter().collect(), + best_block: 0, + } + } + + /// Advance the state and produce a new block based on the given `parent_head`. + /// + /// Returns the new [`BlockData`] and the new [`HeadData`]. + fn advance(&mut self, parent_head: HeadData) -> (BlockData, HeadData) { + self.best_block = parent_head.number; + + let block = BlockData { + state: self + .head_to_state + .get(&parent_head) + .copied() + .unwrap_or_else(|| calculate_head_and_state_for_number(parent_head.number).1), + add: ADD, + }; + + let new_head = execute(parent_head.hash(), parent_head, &block).expect("Produces valid block"); + + let new_head_arc = Arc::new(new_head.clone()); + self.head_to_state + .insert(new_head_arc.clone(), block.state.wrapping_add(ADD)); + self.number_to_head.insert(new_head.number, new_head_arc); + + (block, new_head) + } +} + +/// The collator of the adder parachain. +pub struct Collator { + state: Arc>, + key: CollatorPair, +} + +impl Collator { + /// Create a new collator instance with the state initialized as genesis. + pub fn new() -> Self { + Self { + state: Arc::new(Mutex::new(State::genesis())), + key: CollatorPair::generate().0, + } + } + + /// Get the SCALE encoded genesis head of the adder parachain. + pub fn genesis_head(&self) -> Vec { + self.state + .lock() + .unwrap() + .number_to_head + .get(&0) + .expect("Genesis header exists") + .encode() + } + + /// Get the validation code of the adder parachain. + pub fn validation_code(&self) -> &[u8] { + test_parachain_adder::wasm_binary_unwrap() + } + + /// Get the collator key. + pub fn collator_key(&self) -> CollatorPair { + self.key.clone() + } + + /// Get the collator id. + pub fn collator_id(&self) -> CollatorId { + self.key.public() + } + + /// Create the collation function. + /// + /// This collation function can be plugged into the overseer to generate collations for the adder parachain. + pub fn create_collation_function(&self) -> CollatorFn { + use futures::FutureExt as _; + + let state = self.state.clone(); + + Box::new(move |relay_parent, validation_data| { + let parent = HeadData::decode(&mut &validation_data.persisted.parent_head.0[..]) + .expect("Decodes parent head"); + + let (block_data, head_data) = state.lock().unwrap().advance(parent); + + log::info!( + "created a new collation on relay-parent({}): {:?}", + relay_parent, + block_data, + ); + + let collation = Collation { + upward_messages: Vec::new(), + horizontal_messages: Vec::new(), + new_validation_code: None, + head_data: head_data.encode().into(), + proof_of_validity: PoV { + block_data: block_data.encode().into(), + }, + processed_downward_messages: 0, + hrmp_watermark: validation_data.persisted.block_number, + }; + + async move { Some(collation) }.boxed() + }) + } + + /// Wait until `blocks` are built and enacted. + pub async fn wait_for_blocks(&self, blocks: u64) { + let start_block = self.state.lock().unwrap().best_block; + loop { + Delay::new(Duration::from_secs(1)).await; + + let current_block = self.state.lock().unwrap().best_block; + + if start_block + blocks <= current_block { + return; + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use futures::executor::block_on; + use polkadot_parachain::{primitives::ValidationParams, wasm_executor::IsolationStrategy}; + use polkadot_primitives::v1::{PersistedValidationData, ValidationData}; + + #[test] + fn collator_works() { + let collator = Collator::new(); + let collation_function = collator.create_collation_function(); + + for i in 0..5 { + let parent_head = collator + .state + .lock() + .unwrap() + .number_to_head + .get(&i) + .unwrap() + .clone(); + + let validation_data = ValidationData { + persisted: PersistedValidationData { + parent_head: parent_head.encode().into(), + ..Default::default() + }, + ..Default::default() + }; + + let collation = + block_on(collation_function(Default::default(), &validation_data)).unwrap(); + validate_collation(&collator, (*parent_head).clone(), collation); + } + } + + fn validate_collation(collator: &Collator, parent_head: HeadData, collation: Collation) { + let ret = polkadot_parachain::wasm_executor::validate_candidate( + collator.validation_code(), + ValidationParams { + parent_head: parent_head.encode().into(), + block_data: collation.proof_of_validity.block_data, + relay_chain_height: 1, + hrmp_mqc_heads: Vec::new(), + dmq_mqc_head: Default::default(), + }, + &IsolationStrategy::InProcess, + sp_core::testing::TaskExecutor::new(), + ) + .unwrap(); + + let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); + assert_eq!( + **collator + .state + .lock() + .unwrap() + .number_to_head + .get(&(parent_head.number + 1)) + .unwrap(), + new_head + ); + } + + #[test] + fn advance_to_state_when_parent_head_is_missing() { + let collator = Collator::new(); + + let mut head = calculate_head_and_state_for_number(10).0; + + for i in 1..10 { + head = collator.state.lock().unwrap().advance(head).1; + assert_eq!(10 + i, head.number); + } + + let collator = Collator::new(); + let mut second_head = collator.state.lock().unwrap().number_to_head.get(&0).cloned().unwrap().as_ref().clone(); + + for _ in 1..20 { + second_head = collator.state.lock().unwrap().advance(second_head.clone()).1; + } + + assert_eq!(second_head, head); + } +} diff --git a/parachain/test-parachains/adder/collator/src/main.rs b/parachain/test-parachains/adder/collator/src/main.rs new file mode 100644 index 0000000000000000000000000000000000000000..09998e9bc93df4f3b4db5b6345ff3a70a72adc1d --- /dev/null +++ b/parachain/test-parachains/adder/collator/src/main.rs @@ -0,0 +1,101 @@ +// Copyright 2020 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 . + +//! Collator for the adder test parachain. + +use polkadot_node_primitives::CollationGenerationConfig; +use polkadot_node_subsystem::messages::{CollationGenerationMessage, CollatorProtocolMessage}; +use polkadot_primitives::v1::Id as ParaId; +use sc_cli::{Result, Error as SubstrateCliError, Role, SubstrateCli}; +use sp_core::hexdisplay::HexDisplay; +use test_parachain_adder_collator::Collator; + +/// The parachain ID to collate for in case it wasn't set explicitly through CLI. +const DEFAULT_PARA_ID: ParaId = ParaId::new(100); + +mod cli; +use cli::Cli; + +fn main() -> Result<()> { + let cli = Cli::from_args(); + + match cli.subcommand { + Some(cli::Subcommand::ExportGenesisState(_params)) => { + let collator = Collator::new(); + println!("0x{:?}", HexDisplay::from(&collator.genesis_head())); + + Ok(()) + } + Some(cli::Subcommand::ExportGenesisWasm(_params)) => { + let collator = Collator::new(); + println!("0x{:?}", HexDisplay::from(&collator.validation_code())); + + Ok(()) + } + None => { + let runner = cli.create_runner(&cli.run.base) + .map_err(|e| SubstrateCliError::Application(Box::new(e) as Box::<(dyn 'static + Send + Sync + std::error::Error)>))?; + + runner.run_node_until_exit(|config| async move { + let role = config.role.clone(); + + match role { + Role::Light => Err("Light client not supported".into()), + _ => { + let collator = Collator::new(); + + let full_node = polkadot_service::build_full( + config, + polkadot_service::IsCollator::Yes(collator.collator_id()), + None, + None, + ).map_err(|e| e.to_string())?; + let mut overseer_handler = full_node + .overseer_handler + .expect("Overseer handler should be initialized for collators"); + + let genesis_head_hex = + format!("0x{:?}", HexDisplay::from(&collator.genesis_head())); + let validation_code_hex = + format!("0x{:?}", HexDisplay::from(&collator.validation_code())); + + let para_id = cli.run.parachain_id.map(ParaId::from).unwrap_or(DEFAULT_PARA_ID); + + log::info!("Running adder collator for parachain id: {}", para_id); + log::info!("Genesis state: {}", genesis_head_hex); + log::info!("Validation code: {}", validation_code_hex); + + let config = CollationGenerationConfig { + key: collator.collator_key(), + collator: collator.create_collation_function(), + para_id, + }; + overseer_handler + .send_msg(CollationGenerationMessage::Initialize(config)) + .await; + + overseer_handler + .send_msg(CollatorProtocolMessage::CollateOn(para_id)) + .await; + + Ok(full_node.task_manager) + } + } + }) + } + }?; + Ok(()) +} diff --git a/parachain/test-parachains/adder/collator/tests/integration.rs b/parachain/test-parachains/adder/collator/tests/integration.rs new file mode 100644 index 0000000000000000000000000000000000000000..3be0f906ccf44d364ce905f7f8723a7e43e69c39 --- /dev/null +++ b/parachain/test-parachains/adder/collator/tests/integration.rs @@ -0,0 +1,82 @@ +// Copyright 2020 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 . + +//! Integration test that ensures that we can build and include parachain +//! blocks of the adder parachain. + +// If this test is failing, make sure to run all tests with the `real-overseer` feature being enabled. +#[substrate_test_utils::test] +#[cfg(feature = "real-overseer")] +async fn collating_using_adder_collator(task_executor: sc_service::TaskExecutor) { + use sp_keyring::AccountKeyring::*; + use futures::join; + use polkadot_primitives::v1::Id as ParaId; + + sc_cli::init_logger( + sc_cli::InitLoggerParams { + pattern: "".into(), + tracing_receiver: Default::default(), + tracing_targets: None, + disable_log_reloading: false, + disable_log_color: true, + }, + ).expect("Sets up logger"); + + let para_id = ParaId::from(100); + + // start alice + let alice = polkadot_test_service::run_validator_node(task_executor.clone(), Alice, || {}, vec![]); + + // start bob + let bob = polkadot_test_service::run_validator_node( + task_executor.clone(), + Bob, + || {}, + vec![alice.addr.clone()], + ); + + let collator = test_parachain_adder_collator::Collator::new(); + + // register parachain + alice + .register_parachain( + para_id, + collator.validation_code().to_vec(), + collator.genesis_head(), + ) + .await + .unwrap(); + + // run the collator node + let mut charlie = polkadot_test_service::run_collator_node( + task_executor.clone(), + Charlie, + || {}, + vec![alice.addr.clone(), bob.addr.clone()], + collator.collator_id(), + ); + + charlie.register_collator(collator.collator_key(), para_id, collator.create_collation_function()).await; + + // Wait until the parachain has 4 blocks produced. + collator.wait_for_blocks(4).await; + + join!( + alice.task_manager.clean_shutdown(), + bob.task_manager.clean_shutdown(), + charlie.task_manager.clean_shutdown(), + ); +} diff --git a/parachain/test-parachains/adder/src/lib.rs b/parachain/test-parachains/adder/src/lib.rs index 7ccba8400efbb07eaadddfcd284ab0b60e94858b..37208efbca1b78ec19c5ce60955c2ad652944abd 100644 --- a/parachain/test-parachains/adder/src/lib.rs +++ b/parachain/test-parachains/adder/src/lib.rs @@ -20,7 +20,8 @@ #![cfg_attr(not(feature = "std"), feature(core_intrinsics, lang_items, core_panic_info, alloc_error_handler))] -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; +use tiny_keccak::{Hasher as _, Keccak}; #[cfg(not(feature = "std"))] mod wasm_validation; @@ -33,15 +34,23 @@ static ALLOC: dlmalloc::GlobalDlmalloc = dlmalloc::GlobalDlmalloc; #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); -#[cfg(feature = "std")] +fn keccak256(input: &[u8]) -> [u8; 32] { + let mut out = [0u8; 32]; + let mut keccak256 = Keccak::v256(); + keccak256.update(input); + keccak256.finalize(&mut out); + out +} + /// Wasm binary unwrapped. If built with `BUILD_DUMMY_WASM_BINARY`, the function panics. +#[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 disabled.") } /// Head data for this parachain. -#[derive(Default, Clone, Hash, Eq, PartialEq, Encode, Decode)] +#[derive(Default, Clone, Hash, Eq, PartialEq, Encode, Decode, Debug)] pub struct HeadData { /// Block number pub number: u64, @@ -53,21 +62,21 @@ pub struct HeadData { impl HeadData { pub fn hash(&self) -> [u8; 32] { - tiny_keccak::keccak256(&self.encode()) + keccak256(&self.encode()) } } /// Block data for this parachain. -#[derive(Default, Clone, Encode, Decode)] +#[derive(Default, Clone, Encode, Decode, Debug)] pub struct BlockData { /// State to begin from. pub state: u64, - /// Amount to add (overflowing) + /// Amount to add (wrapping) pub add: u64, } pub fn hash_state(state: u64) -> [u8; 32] { - tiny_keccak::keccak256(state.encode().as_slice()) + keccak256(state.encode().as_slice()) } /// Start state mismatched with parent header's state hash. @@ -81,13 +90,13 @@ pub fn execute( parent_head: HeadData, block_data: &BlockData, ) -> Result { - debug_assert_eq!(parent_hash, parent_head.hash()); + assert_eq!(parent_hash, parent_head.hash()); if hash_state(block_data.state) != parent_head.post_state { return Err(StateMismatch); } - let new_state = block_data.state.overflowing_add(block_data.add).0; + let new_state = block_data.state.wrapping_add(block_data.add); Ok(HeadData { number: parent_head.number + 1, diff --git a/parachain/test-parachains/adder/src/wasm_validation.rs b/parachain/test-parachains/adder/src/wasm_validation.rs index c0f3b56dc8e49bfa588a7f75099c952e62eff07b..f7e46cad391bc16fcc04e04f0072ece369ffbb6b 100644 --- a/parachain/test-parachains/adder/src/wasm_validation.rs +++ b/parachain/test-parachains/adder/src/wasm_validation.rs @@ -17,12 +17,13 @@ //! WASM validation for adder parachain. use crate::{HeadData, BlockData}; -use core::{intrinsics, panic}; +use core::panic; +use sp_std::vec::Vec; use parachain::primitives::{ValidationResult, HeadData as GenericHeadData}; -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; #[no_mangle] -pub extern fn validate_block(params: *const u8, len: usize) -> u64 { +pub extern "C" fn validate_block(params: *const u8, len: usize) -> u64 { let params = unsafe { parachain::load_params(params, len) }; let parent_head = HeadData::decode(&mut ¶ms.parent_head.0[..]) .expect("invalid parent head format."); @@ -30,17 +31,17 @@ pub extern fn validate_block(params: *const u8, len: usize) -> u64 { let block_data = BlockData::decode(&mut ¶ms.block_data.0[..]) .expect("invalid block data format."); - let parent_hash = tiny_keccak::keccak256(¶ms.parent_head.0[..]); - - match crate::execute(parent_hash, parent_head, &block_data) { - Ok(new_head) => parachain::write_result( - &ValidationResult { - head_data: GenericHeadData(new_head.encode()), - new_validation_code: None, - upward_messages: sp_std::vec::Vec::new(), - processed_downward_messages: 0, - } - ), - Err(_) => panic!("execution failure"), - } + let parent_hash = crate::keccak256(¶ms.parent_head.0[..]); + + let new_head = crate::execute(parent_hash, parent_head, &block_data).expect("Executes block"); + parachain::write_result( + &ValidationResult { + head_data: GenericHeadData(new_head.encode()), + new_validation_code: None, + upward_messages: sp_std::vec::Vec::new(), + horizontal_messages: sp_std::vec::Vec::new(), + processed_downward_messages: 0, + hrmp_watermark: params.relay_chain_height, + } + ) } diff --git a/parachain/test-parachains/adder/wasm/Cargo.toml b/parachain/test-parachains/adder/wasm/Cargo.toml deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/parachain/test-parachains/halt/Cargo.toml b/parachain/test-parachains/halt/Cargo.toml index 07fee6081cae179d8fccc4ba89db5f62baa7e6ff..d9fff249bc9926fb1f3acc123bc77c1abf978dcb 100644 --- a/parachain/test-parachains/halt/Cargo.toml +++ b/parachain/test-parachains/halt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "test-parachain-halt" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] description = "Test parachain which executes forever" edition = "2018" @@ -9,7 +9,7 @@ build = "build.rs" [dependencies] [build-dependencies] -wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.6" } +substrate-wasm-builder = "3.0.0" [features] default = [ "std" ] diff --git a/parachain/test-parachains/halt/build.rs b/parachain/test-parachains/halt/build.rs index 2e407bbef3876e3ff3cc1183533545fb74952acf..ac1ce327cf9086d6305b3bfb1da3b547df7c28e9 100644 --- a/parachain/test-parachains/halt/build.rs +++ b/parachain/test-parachains/halt/build.rs @@ -1,25 +1,24 @@ // Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. -// Substrate is free software: you can redistribute it and/or modify +// 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. -// Substrate is distributed in the hope that it will be useful, +// 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 Substrate. If not, see . +// along with Polkadot. If not, see . -use wasm_builder_runner::WasmBuilder; +use substrate_wasm_builder::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("2.0.0") .export_heap_base() .build() } diff --git a/parachain/test-parachains/tests/adder/mod.rs b/parachain/test-parachains/tests/adder/mod.rs index 2d8d228c869637141c8bcf8f3ab1c9222775471a..8666cf365a350a5830f2ae7fcf63549dc26280fa 100644 --- a/parachain/test-parachains/tests/adder/mod.rs +++ b/parachain/test-parachains/tests/adder/mod.rs @@ -25,40 +25,13 @@ use parachain::{ HeadData as GenericHeadData, ValidationParams, }, - wasm_executor::{ValidationPool, ExecutionMode} + wasm_executor::{ValidationPool, IsolationStrategy} }; -use codec::{Decode, Encode}; - -/// Head data for this parachain. -#[derive(Default, Clone, Encode, Decode)] -struct HeadData { - /// Block number - number: u64, - /// parent block keccak256 - parent_hash: [u8; 32], - /// hash of post-execution state. - post_state: [u8; 32], -} - -/// Block data for this parachain. -#[derive(Default, Clone, Encode, Decode)] -struct BlockData { - /// State to begin from. - state: u64, - /// Amount to add (overflowing) - add: u64, -} - -fn hash_state(state: u64) -> [u8; 32] { - tiny_keccak::keccak256(state.encode().as_slice()) -} - -fn hash_head(head: &HeadData) -> [u8; 32] { - tiny_keccak::keccak256(head.encode().as_slice()) -} +use parity_scale_codec::{Decode, Encode}; +use adder::{HeadData, BlockData, hash_state}; -fn execution_mode() -> ExecutionMode { - ExecutionMode::ExternalProcessCustomHost { +fn isolation_strategy() -> IsolationStrategy { + IsolationStrategy::ExternalProcessCustomHost { pool: ValidationPool::new(), binary: std::env::current_exe().unwrap(), args: WORKER_ARGS_TEST.iter().map(|x| x.to_string()).collect(), @@ -67,17 +40,17 @@ fn execution_mode() -> ExecutionMode { #[test] fn execute_good_on_parent_with_inprocess_validation() { - let execution_mode = ExecutionMode::InProcess; - execute_good_on_parent(execution_mode); + let isolation_strategy = IsolationStrategy::InProcess; + execute_good_on_parent(isolation_strategy); } #[test] pub fn execute_good_on_parent_with_external_process_validation() { - let execution_mode = execution_mode(); - execute_good_on_parent(execution_mode); + let isolation_strategy = isolation_strategy(); + execute_good_on_parent(isolation_strategy); } -fn execute_good_on_parent(execution_mode: ExecutionMode) { +fn execute_good_on_parent(isolation_strategy: IsolationStrategy) { let parent_head = HeadData { number: 0, parent_hash: [0; 32], @@ -89,7 +62,6 @@ fn execute_good_on_parent(execution_mode: ExecutionMode) { add: 512, }; - let ret = parachain::wasm_executor::validate_candidate( adder::wasm_binary_unwrap(), ValidationParams { @@ -97,15 +69,16 @@ fn execute_good_on_parent(execution_mode: ExecutionMode) { block_data: GenericBlockData(block_data.encode()), relay_chain_height: 1, hrmp_mqc_heads: Vec::new(), + dmq_mqc_head: Default::default(), }, - &execution_mode, + &isolation_strategy, sp_core::testing::TaskExecutor::new(), ).unwrap(); let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); assert_eq!(new_head.number, 1); - assert_eq!(new_head.parent_hash, hash_head(&parent_head)); + assert_eq!(new_head.parent_hash, parent_head.hash()); assert_eq!(new_head.post_state, hash_state(512)); } @@ -114,7 +87,7 @@ fn execute_good_chain_on_parent() { let mut number = 0; let mut parent_hash = [0; 32]; let mut last_state = 0; - let execution_mode = execution_mode(); + let isolation_strategy = isolation_strategy(); for add in 0..10 { let parent_head = HeadData { @@ -135,26 +108,27 @@ fn execute_good_chain_on_parent() { block_data: GenericBlockData(block_data.encode()), relay_chain_height: number as RelayChainBlockNumber + 1, hrmp_mqc_heads: Vec::new(), + dmq_mqc_head: Default::default(), }, - &execution_mode, + &isolation_strategy, sp_core::testing::TaskExecutor::new(), ).unwrap(); let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap(); assert_eq!(new_head.number, number + 1); - assert_eq!(new_head.parent_hash, hash_head(&parent_head)); + assert_eq!(new_head.parent_hash, parent_head.hash()); assert_eq!(new_head.post_state, hash_state(last_state + add)); number += 1; - parent_hash = hash_head(&new_head); + parent_hash = new_head.hash(); last_state += add; } } #[test] fn execute_bad_on_parent() { - let execution_mode = execution_mode(); + let isolation_strategy = isolation_strategy(); let parent_head = HeadData { number: 0, @@ -174,8 +148,9 @@ fn execute_bad_on_parent() { block_data: GenericBlockData(block_data.encode()), relay_chain_height: 1, hrmp_mqc_heads: Vec::new(), + dmq_mqc_head: Default::default(), }, - &execution_mode, + &isolation_strategy, sp_core::testing::TaskExecutor::new(), ).unwrap_err(); } diff --git a/parachain/test-parachains/tests/wasm_executor/mod.rs b/parachain/test-parachains/tests/wasm_executor/mod.rs index 600b25b9eedc2c64ed9739b096b7d8768c512e10..e092adc2f47ee7fb78f796c0e0fa8323d391380e 100644 --- a/parachain/test-parachains/tests/wasm_executor/mod.rs +++ b/parachain/test-parachains/tests/wasm_executor/mod.rs @@ -21,11 +21,11 @@ const WORKER_ARGS_TEST: &[&'static str] = &["--nocapture", "validation_worker"]; use crate::adder; use parachain::{ primitives::{BlockData, ValidationParams}, - wasm_executor::{ValidationError, InvalidCandidate, EXECUTION_TIMEOUT_SEC, ExecutionMode, ValidationPool}, + wasm_executor::{ValidationError, InvalidCandidate, EXECUTION_TIMEOUT_SEC, IsolationStrategy, ValidationPool}, }; -fn execution_mode() -> ExecutionMode { - ExecutionMode::ExternalProcessCustomHost { +fn isolation_strategy() -> IsolationStrategy { + IsolationStrategy::ExternalProcessCustomHost { pool: ValidationPool::new(), binary: std::env::current_exe().unwrap(), args: WORKER_ARGS_TEST.iter().map(|x| x.to_string()).collect(), @@ -34,7 +34,7 @@ fn execution_mode() -> ExecutionMode { #[test] fn terminates_on_timeout() { - let execution_mode = execution_mode(); + let isolation_strategy = isolation_strategy(); let result = parachain::wasm_executor::validate_candidate( halt::wasm_binary_unwrap(), @@ -43,8 +43,9 @@ fn terminates_on_timeout() { parent_head: Default::default(), relay_chain_height: 1, hrmp_mqc_heads: Vec::new(), + dmq_mqc_head: Default::default(), }, - &execution_mode, + &isolation_strategy, sp_core::testing::TaskExecutor::new(), ); match result { @@ -58,11 +59,10 @@ fn terminates_on_timeout() { #[test] fn parallel_execution() { - let execution_mode = execution_mode(); + let isolation_strategy = isolation_strategy(); + let isolation_strategy_clone = isolation_strategy.clone(); let start = std::time::Instant::now(); - - let execution_mode2 = execution_mode.clone(); let thread = std::thread::spawn(move || parachain::wasm_executor::validate_candidate( halt::wasm_binary_unwrap(), @@ -71,8 +71,9 @@ fn parallel_execution() { parent_head: Default::default(), relay_chain_height: 1, hrmp_mqc_heads: Vec::new(), + dmq_mqc_head: Default::default(), }, - &execution_mode, + &isolation_strategy, sp_core::testing::TaskExecutor::new(), ).ok()); let _ = parachain::wasm_executor::validate_candidate( @@ -82,8 +83,9 @@ fn parallel_execution() { parent_head: Default::default(), relay_chain_height: 1, hrmp_mqc_heads: Vec::new(), + dmq_mqc_head: Default::default(), }, - &execution_mode2, + &isolation_strategy_clone, sp_core::testing::TaskExecutor::new(), ); thread.join().unwrap(); diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 1308700e1989164edd674dd052294437f697bbc2..3061bb982c4396b3ff806f7572f15fc05c0a51e4 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -1,30 +1,34 @@ [package] name = "polkadot-primitives" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" [dependencies] -serde = { version = "1.0.102", optional = true, features = ["derive"] } -parity-scale-codec = { version = "1.3.4", default-features = false, features = ["bit-vec", "derive"] } +serde = { version = "1.0.118", optional = true, features = ["derive"] } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["bit-vec", "derive"] } primitives = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } application-crypto = { package = "sp-application-crypto", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-std = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } polkadot-parachain = { path = "../parachain", default-features = false } polkadot-core-primitives = { path = "../core-primitives", default-features = false } trie = { package = "sp-trie", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +hex-literal = "0.3.1" [dev-dependencies] sp-serializer = { git = "https://github.com/paritytech/substrate", branch = "master" } -pretty_assertions = "0.5.1" +pretty_assertions = "0.6.1" [features] default = ["std"] @@ -35,7 +39,10 @@ std = [ "inherents/std", "trie/std", "sp-api/std", + "sp-authority-discovery/std", + "sp-keystore", "sp-std/std", + "sp-io/std", "sp-version/std", "sp-staking/std", "sp-arithmetic/std", diff --git a/primitives/src/v0.rs b/primitives/src/v0.rs index 9f014c80c2650356ea7910557c6cd7c005d2fcbd..7ce060c528a8fe7953b3d5c74398c26fb8db64fe 100644 --- a/primitives/src/v0.rs +++ b/primitives/src/v0.rs @@ -18,18 +18,22 @@ //! perspective. use sp_std::prelude::*; +#[cfg(feature = "std")] +use sp_std::convert::TryInto; use sp_std::cmp::Ordering; + use parity_scale_codec::{Encode, Decode}; use bitvec::vec::BitVec; - #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; #[cfg(feature = "std")] -use primitives::crypto::Pair; +use sp_keystore::{CryptoStore, SyncCryptoStorePtr, Error as KeystoreError}; use primitives::RuntimeDebug; use runtime_primitives::traits::{AppVerify, Block as BlockT}; use inherents::InherentIdentifier; +#[cfg(feature = "std")] +use application_crypto::AppKey; use application_crypto::KeyTypeId; pub use runtime_primitives::traits::{BlakeTwo256, Hash as HashT, Verify, IdentifyAccount}; @@ -37,7 +41,7 @@ pub use polkadot_core_primitives::*; pub use parity_scale_codec::Compact; pub use polkadot_parachain::primitives::{ - Id, ParachainDispatchOrigin, LOWEST_USER_ID, UpwardMessage, HeadData, BlockData, + Id, LOWEST_USER_ID, UpwardMessage, HeadData, BlockData, ValidationCode, }; @@ -629,18 +633,18 @@ pub struct ErasureChunk { pub enum CompactStatement { /// Proposal of a parachain candidate. #[codec(index = "1")] - Candidate(Hash), + Candidate(CandidateHash), /// State that a parachain candidate is valid. #[codec(index = "2")] - Valid(Hash), + Valid(CandidateHash), /// State that a parachain candidate is invalid. #[codec(index = "3")] - Invalid(Hash), + Invalid(CandidateHash), } impl CompactStatement { /// Get the underlying candidate hash this references. - pub fn candidate_hash(&self) -> &Hash { + pub fn candidate_hash(&self) -> &CandidateHash { match *self { CompactStatement::Candidate(ref h) | CompactStatement::Valid(ref h) @@ -680,7 +684,7 @@ impl ValidityAttestation { /// which should be known in context. pub fn signed_payload( &self, - candidate_hash: Hash, + candidate_hash: CandidateHash, signing_context: &SigningContext, ) -> Vec { match *self { @@ -863,20 +867,26 @@ impl, RealPayload: Encode> Signed( + pub async fn sign( + keystore: &SyncCryptoStorePtr, payload: Payload, context: &SigningContext, validator_index: ValidatorIndex, - key: &ValidatorPair, - ) -> Self { + key: &ValidatorId, + ) -> Result { let data = Self::payload_data(&payload, context); - let signature = key.sign(&data); - Self { + let signature: ValidatorSignature = CryptoStore::sign_with( + &**keystore, + ValidatorId::ID, + &key.into(), + &data, + ).await?.try_into().map_err(|_| KeystoreError::KeyNotSupported(ValidatorId::ID))?; + Ok(Self { payload, validator_index, signature, real_payload: std::marker::PhantomData, - } + }) } /// Validate the payload given the context and public key. @@ -981,9 +991,9 @@ mod tests { assert_eq!(h.as_ref().len(), 32); let _payload = collator_signature_payload( - &Hash::from([1; 32]), + &Hash::repeat_byte(1), &5u32.into(), - &Hash::from([2; 32]), + &Hash::repeat_byte(2), ); } } diff --git a/primitives/src/v1.rs b/primitives/src/v1.rs index c2a8ec43d5a7131950248e377cb26efc882c0d31..fd320dfcb24b85e687664e446f8b11002d888ead 100644 --- a/primitives/src/v1.rs +++ b/primitives/src/v1.rs @@ -17,27 +17,28 @@ //! V1 Primitives. use sp_std::prelude::*; +use sp_std::collections::btree_map::BTreeMap; use parity_scale_codec::{Encode, Decode}; use bitvec::vec::BitVec; use primitives::RuntimeDebug; use runtime_primitives::traits::AppVerify; use inherents::InherentIdentifier; -use sp_arithmetic::traits::{BaseArithmetic, Saturating, Zero}; +use sp_arithmetic::traits::{BaseArithmetic, Saturating}; +use application_crypto::KeyTypeId; pub use runtime_primitives::traits::{BlakeTwo256, Hash as HashT}; // Export some core primitives. pub use polkadot_core_primitives::v1::{ - BlockNumber, Moment, Signature, AccountPublic, AccountId, AccountIndex, - ChainId, Hash, Nonce, Balance, Header, Block, BlockId, UncheckedExtrinsic, - Remark, DownwardMessage, + BlockNumber, Moment, Signature, AccountPublic, AccountId, AccountIndex, ChainId, Hash, Nonce, + Balance, Header, Block, BlockId, UncheckedExtrinsic, Remark, DownwardMessage, + InboundDownwardMessage, CandidateHash, InboundHrmpMessage, OutboundHrmpMessage, }; // Export some polkadot-parachain primitives pub use polkadot_parachain::primitives::{ - Id, ParachainDispatchOrigin, LOWEST_USER_ID, UpwardMessage, HeadData, BlockData, - ValidationCode, + Id, LOWEST_USER_ID, HrmpChannelId, UpwardMessage, HeadData, BlockData, ValidationCode, }; // Export some basic parachain primitives from v0. @@ -52,10 +53,103 @@ pub use crate::v0::{ pub use crate::v0::{ValidatorPair, CollatorPair}; pub use sp_staking::SessionIndex; +pub use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; + +/// A declarations of storage keys where an external observer can find some interesting data. +pub mod well_known_keys { + use super::{Id, HrmpChannelId}; + use hex_literal::hex; + use sp_io::hashing::twox_64; + use sp_std::prelude::*; + use parity_scale_codec::Encode as _; + + // A note on generating these magic values below: + // + // The `StorageValue`, such as `ACTIVE_CONFIG` was obtained by calling: + // + // ::ActiveConfig::hashed_key() + // + // The `StorageMap` values require `prefix`, and for example for `hrmp_egress_channel_index`, + // it could be obtained like: + // + // ::HrmpEgressChannelsIndex::prefix_hash(); + // + + /// The currently active host configuration. + /// + /// The storage entry should be accessed as an `AbridgedHostConfiguration` encoded value. + pub const ACTIVE_CONFIG: &[u8] = + &hex!["06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385"]; + + /// The upward message dispatch queue for the given para id. + /// + /// The storage entry stores a tuple of two values: + /// + /// - `count: u32`, the number of messages currently in the queue for given para, + /// - `total_size: u32`, the total size of all messages in the queue. + pub fn relay_dispatch_queue_size(para_id: Id) -> Vec { + let prefix = hex!["f5207f03cfdce586301014700e2c2593fad157e461d71fd4c1f936839a5f1f3e"]; + + para_id.using_encoded(|para_id: &[u8]| { + prefix.as_ref() + .iter() + .chain(twox_64(para_id).iter()) + .chain(para_id.iter()) + .cloned() + .collect() + }) + } + + /// The hrmp channel for the given identifier. + /// + /// The storage entry should be accessed as an `AbridgedHrmpChannel` encoded value. + pub fn hrmp_channels(channel: HrmpChannelId) -> Vec { + let prefix = hex!["6a0da05ca59913bc38a8630590f2627cb6604cff828a6e3f579ca6c59ace013d"]; + + channel.using_encoded(|channel: &[u8]| { + prefix.as_ref() + .iter() + .chain(twox_64(channel).iter()) + .chain(channel.iter()) + .cloned() + .collect() + }) + } + + /// The list of outbound channels for the given para. + /// + /// The storage entry stores a `Vec` + pub fn hrmp_egress_channel_index(para_id: Id) -> Vec { + let prefix = hex!["6a0da05ca59913bc38a8630590f2627cf12b746dcf32e843354583c9702cc020"]; + + para_id.using_encoded(|para_id: &[u8]| { + prefix.as_ref() + .iter() + .chain(twox_64(para_id).iter()) + .chain(para_id.iter()) + .cloned() + .collect() + }) + } +} /// Unique identifier for the Inclusion Inherent pub const INCLUSION_INHERENT_IDENTIFIER: InherentIdentifier = *b"inclusn0"; +/// The key type ID for parachain assignment key. +pub const ASSIGNMENT_KEY_TYPE_ID: KeyTypeId = KeyTypeId(*b"asgn"); + +// The public key of a keypair used by a validator for determining assignments +/// to approve included parachain candidates. +mod assigment_app { + use application_crypto::{app_crypto, sr25519}; + app_crypto!(sr25519, super::ASSIGNMENT_KEY_TYPE_ID); +} + +/// The public key of a keypair used by a validator for determining assignments +/// to approve included parachain candidates. +pub type AssignmentId = assigment_app::Public; + /// Get a collator signature payload on a relay-parent, block-data combo. pub fn collator_signature_payload>( relay_parent: &H, @@ -112,6 +206,8 @@ pub struct CandidateDescriptor { pub persisted_validation_data_hash: Hash, /// The blake2-256 hash of the pov. pub pov_hash: Hash, + /// The root of a block's erasure encoding Merkle tree. + pub erasure_root: Hash, /// Signature on blake2-256 of components of this receipt: /// The parachain index, the relay parent, the validation data hash, and the pov_hash. pub signature: CollatorSignature, @@ -148,8 +244,8 @@ impl CandidateReceipt { } /// Computes the blake2-256 hash of the receipt. - pub fn hash(&self) -> Hash where H: Encode { - BlakeTwo256::hash_of(self) + pub fn hash(&self) -> CandidateHash where H: Encode { + CandidateHash(BlakeTwo256::hash_of(self)) } } @@ -196,9 +292,14 @@ impl CommittedCandidateReceipt { /// /// This computes the canonical hash, not the hash of the directly encoded data. /// Thus this is a shortcut for `candidate.to_plain().hash()`. - pub fn hash(&self) -> Hash where H: Encode { + pub fn hash(&self) -> CandidateHash where H: Encode { self.to_plain().hash() } + + /// Does this committed candidate receipt corrensponds to the given [`CandidateReceipt`]? + pub fn corresponds_to(&self, receipt: &CandidateReceipt) -> bool where H: PartialEq { + receipt.descriptor == self.descriptor && receipt.commitments_hash == self.commitments.hash() + } } impl PartialOrd for CommittedCandidateReceipt { @@ -244,8 +345,8 @@ impl Ord for CommittedCandidateReceipt { /// Nevertheless, we expose it so the backing validators can validate the outputs of a /// candidate before voting to submit it to the relay-chain and so collators can /// collate candidates that satisfy the criteria implied these transient validation data. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Default))] +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] +#[cfg_attr(feature = "std", derive(Default))] pub struct ValidationData { /// The persisted validation data. pub persisted: PersistedValidationData, @@ -261,10 +362,19 @@ pub struct PersistedValidationData { pub parent_head: HeadData, /// The relay-chain block number this is in the context of. pub block_number: N, + /// The relay-chain block storage root this is in the context of. + pub relay_storage_root: Hash, /// The list of MQC heads for the inbound channels paired with the sender para ids. This /// vector is sorted ascending by the para id and doesn't contain multiple entries with the same /// sender. pub hrmp_mqc_heads: Vec<(Id, Hash)>, + /// The MQC head for the DMQ. + /// + /// The DMQ MQC head will be used by the validation function to authorize the downward messages + /// passed by the collator. + pub dmq_mqc_head: Hash, + /// The maximum legal size of a POV block, in bytes. + pub max_pov_size: u32, } impl PersistedValidationData { @@ -300,22 +410,26 @@ pub struct TransientValidationData { /// which case the code upgrade should be applied at the end of the signaling /// block. pub code_upgrade_allowed: Option, + /// The number of messages pending of the downward message queue. + pub dmq_length: u32, } /// Commitments made in a `CandidateReceipt`. Many of these are outputs of validation. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default, Hash))] -pub struct CandidateCommitments { - /// Fees paid from the chain to the relay chain validators. - pub fees: Balance, +pub struct CandidateCommitments { /// Messages destined to be interpreted by the Relay chain itself. pub upward_messages: Vec, - /// The root of a block's erasure encoding Merkle tree. - pub erasure_root: Hash, + /// Horizontal messages sent by the parachain. + pub horizontal_messages: Vec>, /// New validation code. pub new_validation_code: Option, /// The head-data produced as a result of execution. pub head_data: HeadData, + /// The number of messages processed from the DMQ. + pub processed_downward_messages: u32, + /// The mark which specifies the block number up to which all inbound HRMP messages are processed. + pub hrmp_watermark: N, } impl CandidateCommitments { @@ -359,6 +473,7 @@ pub type SignedAvailabilityBitfields = Vec; /// A backed (or backable, depending on context) candidate. #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] +#[cfg_attr(feature = "std", derive(Default))] pub struct BackedCandidate { /// The candidate referred to. pub candidate: CommittedCandidateReceipt, @@ -373,6 +488,16 @@ impl BackedCandidate { pub fn descriptor(&self) -> &CandidateDescriptor { &self.candidate.descriptor } + + /// Compute this candidate's hash. + pub fn hash(&self) -> CandidateHash where H: Clone + Encode { + self.candidate.hash() + } + + /// Get this candidate's receipt. + pub fn receipt(&self) -> CandidateReceipt where H: Clone { + self.candidate.to_plain() + } } /// Verify the backing of the given candidate. @@ -400,7 +525,7 @@ pub fn check_candidate_backing + Clone + Encode>( } // this is known, even in runtime, to be blake2-256. - let hash: Hash = backed.candidate.hash(); + let hash = backed.candidate.hash(); let mut signed = 0; for ((val_in_group_idx, _), attestation) in backed.validator_indices.iter().enumerate() @@ -437,8 +562,8 @@ impl From for CoreIndex { } /// The unique (during session) index of a validator group. -#[derive(Encode, Decode, Default, Clone, Copy)] -#[cfg_attr(feature = "std", derive(Eq, Hash, PartialEq, Debug))] +#[derive(Encode, Decode, Default, Clone, Copy, Debug)] +#[cfg_attr(feature = "std", derive(Eq, Hash, PartialEq))] pub struct GroupIndex(pub u32); impl From for GroupIndex { @@ -473,11 +598,11 @@ pub enum CoreOccupied { } /// This is the data we keep available for each candidate included in the relay chain. -#[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +#[cfg(feature = "std")] +#[derive(Clone, Encode, Decode, PartialEq, Debug)] pub struct AvailableData { /// The Proof-of-Validation of the candidate. - pub pov: PoV, + pub pov: std::sync::Arc, /// The persisted validation data needed for secondary checks. pub validation_data: PersistedValidationData, } @@ -515,11 +640,7 @@ impl GroupRotationInfo { impl GroupRotationInfo { /// Returns the block number of the next rotation after the current block. If the current block /// is 10 and the rotation frequency is 5, this should return 15. - /// - /// If the group rotation frequency is 0, returns 0. pub fn next_rotation_at(&self) -> N { - if self.group_rotation_frequency.is_zero() { return Zero::zero() } - let cycle_once = self.now + self.group_rotation_frequency; cycle_once - ( cycle_once.saturating_sub(self.session_start_block) % self.group_rotation_frequency @@ -528,10 +649,7 @@ impl GroupRotationInfo { /// Returns the block number of the last rotation before or including the current block. If the /// current block is 10 and the rotation frequency is 5, this should return 10. - /// - /// If the group rotation frequency is 0, returns 0. pub fn last_rotation_at(&self) -> N { - if self.group_rotation_frequency.is_zero() { return Zero::zero() } self.now - ( self.now.saturating_sub(self.session_start_block) % self.group_rotation_frequency ) @@ -540,10 +658,10 @@ impl GroupRotationInfo { /// Information about a core which is currently occupied. #[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] -pub struct OccupiedCore { - /// The ID of the para occupying the core. - pub para_id: Id, +#[cfg_attr(feature = "std", derive(Debug, PartialEq))] +pub struct OccupiedCore { + // NOTE: this has no ParaId as it can be deduced from the candidate descriptor. + /// If this core is freed by availability, this is the assignment that is next up on this /// core, if any. None if there is nothing queued for this core. pub next_up_on_available: Option, @@ -561,11 +679,22 @@ pub struct OccupiedCore { pub availability: BitVec, /// The group assigned to distribute availability pieces of this candidate. pub group_responsible: GroupIndex, + /// The hash of the candidate occupying the core. + pub candidate_hash: CandidateHash, + /// The descriptor of the candidate occupying the core. + pub candidate_descriptor: CandidateDescriptor, +} + +impl OccupiedCore { + /// Get the Para currently occupying this core. + pub fn para_id(&self) -> Id { + self.candidate_descriptor.para_id + } } /// Information about a core which is currently occupied. #[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug, Default))] +#[cfg_attr(feature = "std", derive(Debug, PartialEq, Default))] pub struct ScheduledCore { /// The ID of a para scheduled. pub para_id: Id, @@ -575,11 +704,11 @@ pub struct ScheduledCore { /// The state of a particular availability core. #[derive(Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] -pub enum CoreState { +#[cfg_attr(feature = "std", derive(Debug, PartialEq))] +pub enum CoreState { /// The core is currently occupied. #[codec(index = "0")] - Occupied(OccupiedCore), + Occupied(OccupiedCore), /// The core is currently free, with a para scheduled and given the opportunity /// to occupy. /// @@ -597,11 +726,16 @@ impl CoreState { /// If this core state has a `para_id`, return it. pub fn para_id(&self) -> Option { match self { - Self::Occupied(OccupiedCore { para_id, ..}) => Some(*para_id), + Self::Occupied(ref core) => Some(core.para_id()), Self::Scheduled(ScheduledCore { para_id, .. }) => Some(*para_id), Self::Free => None, } } + + /// Is this core state `Self::Occupied`? + pub fn is_occupied(&self) -> bool { + matches!(self, Self::Occupied(_)) + } } /// An assumption being made about the state of an occupied core. @@ -634,26 +768,77 @@ pub enum CandidateEvent { CandidateTimedOut(CandidateReceipt, HeadData), } +/// Information about validator sets of a session. +#[derive(Clone, Encode, Decode, RuntimeDebug)] +#[cfg_attr(feature = "std", derive(PartialEq, Default))] +pub struct SessionInfo { + /// Validators in canonical ordering. + pub validators: Vec, + /// Validators' authority discovery keys for the session in canonical ordering. + pub discovery_keys: Vec, + /// The assignment keys for validators. + pub assignment_keys: Vec, + /// Validators in shuffled ordering - these are the validator groups as produced + /// by the `Scheduler` module for the session and are typically referred to by + /// `GroupIndex`. + pub validator_groups: Vec>, + /// The number of availability cores used by the protocol during this session. + pub n_cores: u32, + /// The zeroth delay tranche width. + pub zeroth_delay_tranche_width: u32, + /// The number of samples we do of relay_vrf_modulo. + pub relay_vrf_modulo_samples: u32, + /// The number of delay tranches in total. + pub n_delay_tranches: u32, + /// How many slots (BABE / SASSAFRAS) must pass before an assignment is considered a + /// no-show. + pub no_show_slots: u32, + /// The number of validators needed to approve a block. + pub needed_approvals: u32, +} + sp_api::decl_runtime_apis! { /// The API for querying the state of parachains on-chain. - pub trait ParachainHost { + pub trait ParachainHost { + // NOTE: Many runtime API are declared with `#[skip_initialize_block]`. This is because without + // this attribute before each runtime call, the `initialize_block` runtime API will be called. + // That in turns will lead to two things: + // + // (a) The frame_system module will be initialized to the next block. + // (b) Initialization sequences for each runtime module (pallet) will be run. + // + // (a) is undesirable because the runtime APIs are querying the state against a specific + // block state. However, due to that initialization the observed block number would be as if + // it was the next block. + // + // We dont want (b) mainly because block initialization can be very heavy. Upgrade enactment, + // storage migration, and whatever other logic exists in `on_initialize` will be executed + // if not explicitly opted out with the `#[skip_initialize_block]` attribute. + // + // Additionally, some runtime APIs may depend on state that is pruned on the `on_initialize`. + // At the moment of writing, this is `candidate_events`. + /// Get the current validators. + #[skip_initialize_block] fn validators() -> Vec; /// Returns the validator groups and rotation info localized based on the block whose state /// this is invoked on. Note that `now` in the `GroupRotationInfo` should be the successor of /// the number of the block. + #[skip_initialize_block] fn validator_groups() -> (Vec>, GroupRotationInfo); /// Yields information on all availability cores. Cores are either free or occupied. Free /// cores can have paras assigned to them. - fn availability_cores() -> Vec>; + #[skip_initialize_block] + fn availability_cores() -> Vec>; /// Yields the full validation data for the given ParaId along with an assumption that /// should be used if the para currently occupieds a core. /// /// Returns `None` if either the para is not registered or the assumption is `Freed` /// and the para already occupies a core. + #[skip_initialize_block] fn full_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) -> Option>; @@ -662,30 +847,60 @@ sp_api::decl_runtime_apis! { /// /// Returns `None` if either the para is not registered or the assumption is `Freed` /// and the para already occupies a core. + #[skip_initialize_block] fn persisted_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) -> Option>; + /// Checks if the given validation outputs pass the acceptance criteria. + #[skip_initialize_block] + fn check_validation_outputs(para_id: Id, outputs: CandidateCommitments) -> bool; + /// Returns the session index expected at a child of the block. /// /// This can be used to instantiate a `SigningContext`. + #[skip_initialize_block] fn session_index_for_child() -> SessionIndex; + /// Get the session info for the given session, if stored. + #[skip_initialize_block] + fn session_info(index: SessionIndex) -> Option; + /// Fetch the validation code used by a para, making the given `OccupiedCoreAssumption`. /// /// Returns `None` if either the para is not registered or the assumption is `Freed` /// and the para already occupies a core. + #[skip_initialize_block] fn validation_code(para_id: Id, assumption: OccupiedCoreAssumption) -> Option; + /// Fetch the historical validation code used by a para for candidates executed in the + /// context of a given block height in the current chain. + /// + /// `context_height` may be no greater than the height of the block in whose + /// state the runtime API is executed. + #[skip_initialize_block] + fn historical_validation_code(para_id: Id, context_height: N) + -> Option; + /// Get the receipt of a candidate pending availability. This returns `Some` for any paras /// assigned to occupied cores in `availability_cores` and `None` otherwise. + #[skip_initialize_block] fn candidate_pending_availability(para_id: Id) -> Option>; /// Get a vector of events concerning candidates that occurred within a block. - // NOTE: this needs to skip block initialization as events are wiped within block - // initialization. #[skip_initialize_block] fn candidate_events() -> Vec>; + + /// Get all the pending inbound messages in the downward message queue for a para. + #[skip_initialize_block] + fn dmq_contents( + recipient: Id, + ) -> Vec>; + + /// Get the contents of all channels addressed to the given recipient. Channels that have no + /// messages in them are also included. + #[skip_initialize_block] + fn inbound_hrmp_channels_contents(recipient: Id) -> BTreeMap>>; } } @@ -708,6 +923,66 @@ impl From for u8 { } } +/// Abridged version of `HostConfiguration` (from the `Configuration` parachains host runtime module) +/// meant to be used by a parachain or PDK such as cumulus. +#[derive(Clone, Encode, Decode, RuntimeDebug)] +#[cfg_attr(feature = "std", derive(PartialEq))] +pub struct AbridgedHostConfiguration { + /// 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, + /// 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 size upper bound of the `CandidateCommitments`. + pub max_upward_message_size: u32, + /// The maximum number of messages that a candidate can contain. + /// + /// This parameter affects the size upper bound of the `CandidateCommitments`. + pub max_upward_message_num_per_candidate: 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 minimum frequency at which parachains can update their validation code. + pub validation_upgrade_frequency: BlockNumber, + /// The delay, in blocks, before a validation upgrade is applied. + pub validation_upgrade_delay: BlockNumber, +} + +/// Abridged version of `HrmpChannel` (from the `Hrmp` parachains host runtime module) meant to be +/// used by a parachain or PDK such as cumulus. +#[derive(Clone, Encode, Decode, RuntimeDebug)] +#[cfg_attr(feature = "std", derive(PartialEq))] +pub struct AbridgedHrmpChannel { + /// The maximum number of messages that can be pending in the channel at once. + pub max_capacity: u32, + /// The maximum total size of the messages that can be pending in the channel at once. + pub max_total_size: u32, + /// The maximum message size that could be put into the channel. + pub max_message_size: u32, + /// The current number of messages pending in the channel. + /// Invariant: should be less or equal to `max_capacity`.s`. + pub msg_count: u32, + /// The total size in bytes of all message payloads in the channel. + /// Invariant: should be less or equal to `max_total_size`. + pub total_size: u32, + /// A head of the Message Queue Chain for this channel. Each link in this chain has a form: + /// `(prev_head, B, H(M))`, where + /// - `prev_head`: is the previous value of `mqc_head` or zero if none. + /// - `B`: is the [relay-chain] block number in which a message was appended + /// - `H(M)`: is the hash of the message being appended. + /// This value is initialized to a special value that consists of all zeroes which indicates + /// that no messages were previously added. + pub mqc_head: Option, +} + #[cfg(test)] mod tests { use super::*; @@ -722,15 +997,6 @@ mod tests { assert_eq!(info.next_rotation_at(), 20); assert_eq!(info.last_rotation_at(), 15); - - let info = GroupRotationInfo { - session_start_block: 10u32, - now: 11, - group_rotation_frequency: 0, - }; - - assert_eq!(info.next_rotation_at(), 0); - assert_eq!(info.last_rotation_at(), 0); } #[test] @@ -740,10 +1006,10 @@ mod tests { assert_eq!(h.as_ref().len(), 32); let _payload = collator_signature_payload( - &Hash::from([1; 32]), + &Hash::repeat_byte(1), &5u32.into(), - &Hash::from([2; 32]), - &Hash::from([3; 32]), + &Hash::repeat_byte(2), + &Hash::repeat_byte(3), ); } } diff --git a/roadmap/implementers-guide/src/SUMMARY.md b/roadmap/implementers-guide/src/SUMMARY.md index d51f26f71ea53530420ab12c6c78c58e7e62645b..b6e0fab3be4e252769f0b65fbc7709b2992a9222 100644 --- a/roadmap/implementers-guide/src/SUMMARY.md +++ b/roadmap/implementers-guide/src/SUMMARY.md @@ -15,7 +15,10 @@ - [Scheduler Module](runtime/scheduler.md) - [Inclusion Module](runtime/inclusion.md) - [InclusionInherent Module](runtime/inclusioninherent.md) - - [Router Module](runtime/router.md) + - [DMP Module](runtime/dmp.md) + - [UMP Module](runtime/ump.md) + - [HRMP Module](runtime/hrmp.md) + - [Session Info Module](runtime/session_info.md) - [Runtime APIs](runtime-api/README.md) - [Validators](runtime-api/validators.md) - [Validator Groups](runtime-api/validator-groups.md) @@ -29,7 +32,8 @@ - [Node Architecture](node/README.md) - [Subsystems and Jobs](node/subsystems-and-jobs.md) - [Overseer](node/overseer.md) - - [Collators](node/collators/README.md) + - [GRANDPA Voting Rule](node/grandpa-voting-rule.md) + - [Collator Subsystems](node/collators/README.md) - [Collation Generation](node/collators/collation-generation.md) - [Collator Protocol](node/collators/collator-protocol.md) - [Backing Subsystems](node/backing/README.md) @@ -39,8 +43,13 @@ - [PoV Distribution](node/backing/pov-distribution.md) - [Availability Subsystems](node/availability/README.md) - [Availability Distribution](node/availability/availability-distribution.md) + - [Availability Recovery](node/availability/availability-recovery.md) - [Bitfield Distribution](node/availability/bitfield-distribution.md) - [Bitfield Signing](node/availability/bitfield-signing.md) + - [Approval Subsystems](node/approval/README.md) + - [Approval Voting](node/approval/approval-voting.md) + - [Approval Distribution](node/approval/approval-distribution.md) + - [Dispute Participation](node/approval/dispute-participation.md) - [Utility Subsystems](node/utility/README.md) - [Availability Store](node/utility/availability-store.md) - [Candidate Validation](node/utility/candidate-validation.md) @@ -59,6 +68,7 @@ - [Chain](types/chain.md) - [Messages](types/messages.md) - [Network](types/network.md) + - [Approvals](types/approval.md) [Glossary](glossary.md) [Further Reading](further-reading.md) diff --git a/roadmap/implementers-guide/src/glossary.md b/roadmap/implementers-guide/src/glossary.md index 63294d1d77fd69bd538938a04a505b7cd510fa7a..2dbe2ab14abeb60b1aff9d058b3920b94aa9a7fd 100644 --- a/roadmap/implementers-guide/src/glossary.md +++ b/roadmap/implementers-guide/src/glossary.md @@ -24,6 +24,7 @@ Here you can find definitions of a bunch of jargon, usually specific to the Polk - Parathread: A parachain which is scheduled on a pay-as-you-go basis. - Proof-of-Validity (PoV): A stateless-client proof that a parachain candidate is valid, with respect to some validation function. - Relay Parent: A block in the relay chain, referred to in a context where work is being done in the context of the state at this block. +- Router: The router module is a meta module that consists of three runtime modules responsible for routing messages between paras and the relay chain. The three separate runtime modules are: Dmp, Ump, Hrmp, each responsible for the respective part of message routing. - Runtime: The relay-chain state machine. - Runtime Module: See Module. - Runtime API: A means for the node-side behavior to access structured information based on the state of a fork of the blockchain. diff --git a/roadmap/implementers-guide/src/messaging.md b/roadmap/implementers-guide/src/messaging.md index 1e782e155be17924e455956720af871577a9122e..edc810e034154278e53e78b1e563dcbf299b1613 100644 --- a/roadmap/implementers-guide/src/messaging.md +++ b/roadmap/implementers-guide/src/messaging.md @@ -26,20 +26,28 @@ The downward message queue doesn't have a cap on its size and it is up to the re that prevent spamming in place. Upward Message Passing (UMP) is a mechanism responsible for delivering messages in the opposite direction: -from a parachain up to the relay chain. Upward messages can serve different purposes and can be of different - kinds. +from a parachain up to the relay chain. Upward messages are essentially byte blobs. However, they are interpreted +by the relay-chain according to the XCM standard. -One kind of message is `Dispatchable`. They could be thought of similarly to extrinsics sent to a relay chain: they also -invoke exposed runtime entrypoints, they consume weight and require fees. The difference is that they originate from -a parachain. Each parachain has a queue of dispatchables to be executed. There can be only so many dispatchables at a time. +The XCM standard is a common vocabulary of messages. The XCM standard doesn't require a particular interpretation of +a message. However, the parachains host (e.g. Polkadot) guarantees certain semantics for those. + +Moreover, while most XCM messages are handled by the on-chain XCM interpreter, some of the messages are special +cased. Specifically, those messages can be checked during the acceptance criteria and thus invalid +messages would lead to rejecting the candidate itself. + +One kind of such a message is `Xcm::Transact`. This upward message can be seen as a way for a parachain +to execute arbitrary entrypoints on the relay-chain. `Xcm::Transact` messages resemble regular extrinsics with the exception that they +originate from a parachain. + +The payload of `Xcm::Transact` messages is referred as to `Dispatchable`. When a candidate with such a message is enacted +the dispatchables are put into a queue corresponding to the parachain. There can be only so many dispatchables in that queue at once. The weight that processing of the dispatchables can consume is limited by a preconfigured value. Therefore, it is possible that some dispatchables will be left for later blocks. To make the dispatching more fair, the queues are processed turn-by-turn in a round robin fashion. -Upward messages are also used by a parachain to request opening and closing HRMP channels (HRMP will be described below). - -Other kinds of upward messages can be introduced in the future as well. Potential candidates are -new validation code signalling, or other requests to the relay chain. +The second category of special cased XCM messages are for horizontal messaging channel management, +namely messages meant to request opening and closing HRMP channels (HRMP will be described below). ## Horizontal Message Passing diff --git a/roadmap/implementers-guide/src/node/README.md b/roadmap/implementers-guide/src/node/README.md index f6d7e7a887f7cd505cf5fd0a83e9ef63ae78cb09..f20c970aff6c23cabfa1b8cac5bbc53d60a85edf 100644 --- a/roadmap/implementers-guide/src/node/README.md +++ b/roadmap/implementers-guide/src/node/README.md @@ -10,7 +10,14 @@ The architecture of the node-side behavior aims to embody the Rust principles of Many operations that need to be carried out involve the network, which is asynchronous. This asynchrony affects all core subsystems that rely on the network as well. The approach of hierarchical state machines is well-suited to this kind of environment. -We introduce a hierarchy of state machines consisting of an overseer supervising subsystems, where Subsystems can contain their own internal hierarchy of jobs. This is elaborated on in the next section on Subsystems. +We introduce + +## Components + +The node architecture consists of the following components: + * The Overseer (and subsystems): A hierarchy of state machines where an overseer supervises subsystems. Subsystems can contain their own internal hierarchy of jobs. This is elaborated on in the next section on Subsystems. + * A block proposer: Logic triggered by the consensus algorithm of the chain when the node should author a block. + * A GRANDPA voting rule: A strategy for selecting chains to vote on in the GRANDPA algorithm to ensure that only valid parachain candidates appear in finalized relay-chain blocks. ## Assumptions @@ -19,6 +26,6 @@ The Node-side code comes with a set of assumptions that we build upon. These ass We assume the following constraints regarding provided basic functionality: * The underlying **consensus** algorithm, whether it is BABE or SASSAFRAS is implemented. * There is a **chain synchronization** protocol which will search for and download the longest available chains at all times. - * The **state** of all blocks at the head of the chain is available. There may be **state pruning** such that state of the last `k` blocks behind the last finalized block are is available, as well as the state of all their descendents. This assumption implies that the state of all active leaves and their last `k` ancestors are all available. The underlying implementation is expected to support `k` of a few hundred blocks, but we reduce this to a very conservative `k=5` for our purposes. + * The **state** of all blocks at the head of the chain is available. There may be **state pruning** such that state of the last `k` blocks behind the last finalized block are available, as well as the state of all their descendents. This assumption implies that the state of all active leaves and their last `k` ancestors are all available. The underlying implementation is expected to support `k` of a few hundred blocks, but we reduce this to a very conservative `k=5` for our purposes. * There is an underlying **networking** framework which provides **peer discovery** services which will provide us with peers and will not create "loopback" connections to our own node. The number of peers we will have is assumed to be bounded at 1000. * There is a **transaction pool** and a **transaction propagation** mechanism which maintains a set of current transactions and distributes to connected peers. Current transactions are those which are not outdated relative to some "best" fork of the chain, which is part of the active heads, and have not been included in the best fork. diff --git a/roadmap/implementers-guide/src/node/approval/README.md b/roadmap/implementers-guide/src/node/approval/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2d0815376728a76185a18d7818b72acb12ae6191 --- /dev/null +++ b/roadmap/implementers-guide/src/node/approval/README.md @@ -0,0 +1,7 @@ +# Approval Subsystems + +The approval subsystems implement the node-side of the [Approval Protocol](../../protocol-approval.md). + +We make a divide between the [assignment/voting logic](approval-voting.md) and the [distribution logic](approval-distribution.md) that distributes assignment certifications and approval votes. The logic in the assignment and voting also informs the GRANDPA voting rule on how to vote. + +This category of subsystems also contains a module for [participating in live disputes](dispute-participation.md) and tracks all observed votes (backing or approval) by all validators on all candidates. \ No newline at end of file diff --git a/roadmap/implementers-guide/src/node/approval/approval-distribution.md b/roadmap/implementers-guide/src/node/approval/approval-distribution.md new file mode 100644 index 0000000000000000000000000000000000000000..cdbe8299ea8d3ad984fd2c348e8da4a29617f05f --- /dev/null +++ b/roadmap/implementers-guide/src/node/approval/approval-distribution.md @@ -0,0 +1,196 @@ +# Approval Distribution + +A subsystem for the distribution of assignments and approvals for approval checks on candidates over the network. + +The [Approval Voting](approval-voting.md) subsystem is responsible for active participation in a protocol designed to select a sufficient number of validators to check each and every candidate which appears in the relay chain. Statements of participation in this checking process are divided into two kinds: + - **Assignments** indicate that validators have been selected to do checking + - **Approvals** indicate that validators have checked and found the candidate satisfactory. + +The [Approval Voting](approval-voting.md) subsystem handles all the issuing and tallying of this protocol, but this subsystem is responsible for the disbursal of statements among the validator-set. + +The inclusion pipeline of candidates concludes after availability, and only after inclusion do candidates actually get pushed into the approval checking pipeline. As such, this protocol deals with the candidates _made available by_ particular blocks, as opposed to the candidates which actually appear within those blocks, which are the candidates _backed by_ those blocks. Unless stated otherwise, whenever we reference a candidate partially by block hash, we are referring to the set of candidates _made available by_ those blocks. + +We implement this protocol as a gossip protocol, and like other parachain-related gossip protocols our primary concerns are about ensuring fast message propagation while maintaining an upper bound on the number of messages any given node must store at any time. + +Approval messages should always follow assignments, so we need to be able to discern two pieces of information based on our [View](../../types/network.md#universal-types): + 1. Is a particular assignment relevant under a given `View`? + 2. Is a particular approval relevant to any assignment in a set? + +For our own local view, these two queries must not yield false negatives. When applied to our peers' views, it is acceptable for them to yield false negatives. The reason for that is that our peers' views may be beyond ours, and we are not capable of fully evaluating them. Once we have caught up, we can check again for false negatives to continue distributing. + +For assignments, what we need to be checking is whether we are aware of the (block, candidate) pair that the assignment references. For approvals, we need to be aware of an assignment by the same validator which references the candidate being approved. + +However, awareness on its own of a (block, candidate) pair would imply that even ancient candidates all the way back to the genesis are relevant. We are actually not interested in anything before finality. + + +## Protocol + +## Functionality + +```rust +type BlockScopedCandidate = (Hash, CandidateHash); + +/// The `State` struct is responsible for tracking the overall state of the subsystem. +/// +/// It tracks metadata about our view of the unfinalized chain, which assignments and approvals we have seen, and our peers' views. +struct State { + // These three fields are used in conjunction to construct a view over the unfinalized chain. + blocks_by_number: BTreeMap>, + blocks: HashMap, + finalized_number: BlockNumber, + + // Peer view data is partially stored here, and partially inline within the `BlockEntry`s + peer_views: HashMap, +} + +enum MessageFingerprint { + Assigment(Hash, u32, ValidatorIndex), + Approval(Hash, u32, ValidatorIndex), +} + +struct Knowledge { + known_messages: HashSet, +} + +/// Information about blocks in our current view as well as whether peers know of them. +struct BlockEntry { + // Peers who we know are aware of this block and thus, the candidates within it. This maps to their knowledge of messages. + known_by: HashMap, + // The number of the block. + number: BlockNumber, + // The parent hash of the block. + parent_hash: Hash, + // Our knowledge of messages. + knowledge: Knowledge, + // A votes entry for each candidate. + candidates: IndexMap, +} + +enum ApprovalState { + Assigned(AssignmentCert), + Approved(AssignmentCert, ApprovalSignature), +} + +/// Information about candidates in the context of a particular block they are included in. In other words, +/// multiple `CandidateEntry`s may exist for the same candidate, if it is included by multiple blocks - this is likely the case +/// when there are forks. +struct CandidateEntry { + approvals: HashMap, +} +``` + +### Network updates + +#### `NetworkBridgeEvent::PeerConnected` + +Add a blank view to the `peer_views` state. + +#### `NetworkBridgeEvent::PeerDisconnected` + +Remove the view under the associated `PeerId` from `State::peer_views`. + +Iterate over every `BlockEntry` and remove `PeerId` from it. + +#### `NetworkBridgeEvent::PeerViewChange` + +Invoke `unify_with_peer(peer, view)` to catch them up to messages we have. + +We also need to use the `view.finalized_number` to remove the `PeerId` from any blocks that it won't be wanting information about anymore. Note that we have to be on guard for peers doing crazy stuff like jumping their 'finalized_number` forward 10 trillion blocks to try and get us stuck in a loop for ages. + +One of the safeguards we can implement is to reject view updates from peers where the new `finalized_number` is less than the previous. + +We augment that by defining `constrain(x)` to output the x bounded by the first and last numbers in `state.blocks_by_number`. + +From there, we can loop backwards from `constrain(view.finalized_number)` until `constrain(last_view.finalized_number)` is reached, removing the `PeerId` from all `BlockEntry`s referenced at that height. We can break the loop early if we ever exit the bound supplied by the first block in `state.blocks_by_number`. + +#### `NetworkBridgeEvent::OurViewChange` + +Prune all lists from `blocks_by_number` with number less than or equal to `view.finalized_number`. Prune all the `BlockEntry`s referenced by those lists. + +#### `NetworkBridgeEvent::PeerMessage` + +If the message is of type `ApprovalDistributionV1Message::Assignment(assignment_cert, claimed_index)`, then call `import_and_circulate_assignment(MessageSource::Peer(sender), assignment_cert, claimed_index)` + +If the message is of type `ApprovalDistributionV1Message::Approval(approval_vote)`, then call `import_and_circulate_approval(MessageSource::Peer(sender), approval_vote)` + +### Subsystem Updates + +#### `ApprovalDistributionMessage::NewBlocks` + +Create `BlockEntry` and `CandidateEntries` for all blocks. + +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` + +Load the corresponding `BlockEntry`. Distribute to all peers in `known_by`. Add to the corresponding `CandidateEntry`. + +#### `ApprovalDistributionMessage::DistributeApproval` + +Load the corresponding `BlockEntry`. Distribute to all peers in `known_by`. Add to the corresponding `CandidateEntry`. + +### Utility + +```rust +enum MessageSource { + Peer(PeerId), + Local, +} +``` + +#### `import_and_circulate_assignment(source: MessageSource, assignment: IndirectAssignmentCert, claimed_candidate_index: u32)` + +Imports an assignment cert referenced by block hash and candidate index. As a postcondition, if the cert is valid, it will have distributed the cert to all peers who have the block in their view, with the exclusion of the peer referenced by the `MessageSource`. + + * Load the BlockEntry using `assignment.block_hash`. If it does not exist, report the source if it is `MessageSource::Peer` and return. + * Compute a fingerprint for the `assignment` using `claimed_candidate_index`. + * If the source is `MessageSource::Peer(sender)`: + * check if `peer` appears under `known_by` and whether the fingerprint is in the `known_messages` of the peer. If the peer does not know the block, report for providing data out-of-view and proceed. If the peer does know the block and the knowledge contains the fingerprint, report for providing replicate data and return. + * If the message fingerprint appears under the `BlockEntry`'s `Knowledge`, give the peer a small positive reputation boost and return. Note that we must do this after checking for out-of-view to avoid being spammed. If we did this check earlier, a peer could provide data out-of-view repeatedly and be rewarded for it. + * Dispatch `ApprovalVotingMessage::CheckAndImportAssignment(assignment)` and wait for the response. + * If the result is `AssignmentCheckResult::Accepted` or `AssignmentCheckResult::AcceptedDuplicate` + * If the vote was accepted but not duplicate, give the peer a positive reputation boost + * add the fingerprint to both our and the peer's knowledge in the `BlockEntry`. Note that we only doing this after making sure we have the right fingerprint. + * If the result is `AssignmentCheckResult::TooFarInFuture`, mildly punish the peer and return. + * If the result is `AssignmentCheckResult::Bad`, punish the peer and return. + * If the source is `MessageSource::Local(CandidateIndex)` + * check if the fingerprint appears under the `BlockEntry's` knowledge. If not, add it. + * Load the candidate entry for the given candidate index. It should exist unless there is a logic error in the approval voting subsystem. + * Set the approval state for the validator index to `ApprovalState::Assigned` unless the approval state is set already. This should not happen as long as the approval voting subsystem instructs us to ignore duplicate assignments. + * Dispatch a `ApprovalDistributionV1Message::Assignment(assignment, candidate_index)` to all peers in the `BlockEntry`'s `known_by` set, excluding the peer in the `source`, if `source` has kind `MessageSource::Peer`. Add the fingerprint of the assignment to the knowledge of each peer. + + +#### `import_and_circulate_approval(source: MessageSource, approval: IndirectSignedApprovalVote)` + +Imports an approval signature referenced by block hash and candidate index. + + * Load the BlockEntry using `approval.block_hash` and the candidate entry using `approval.candidate_entry`. If either does not exist, report the source if it is `MessageSource::Peer` and return. + * Compute a fingerprint for the approval. + * Compute a fingerprint for the corresponding assignment. If the `BlockEntry`'s knowledge does not contain that fingerprint, then report the source if it is `MessageSource::Peer` and return. All references to a fingerprint after this refer to the approval's, not the assignment's. + * If the source is `MessageSource::Peer(sender)`: + * check if `peer` appears under `known_by` and whether the fingerprint is in the `known_messages` of the peer. If the peer does not know the block, report for providing data out-of-view and proceed. If the peer does know the block and the knowledge contains the fingerprint, report for providing replicate data and return. + * If the message fingerprint appears under the `BlockEntry`'s `Knowledge`, give the peer a small positive reputation boost and return. Note that we must do this after checking for out-of-view to avoid being spammed. If we did this check earlier, a peer could provide data out-of-view repeatedly and be rewarded for it. + * Dispatch `ApprovalVotingMessage::CheckAndImportApproval(approval)` and wait for the response. + * If the result is `VoteCheckResult::Accepted(())`: + * Give the peer a positive reputation boost and add the fingerprint to both our and the peer's knowledge. + * If the result is `VoteCheckResult::Bad`: + * Report the peer and return. + * Load the candidate entry for the given candidate index. It should exist unless there is a logic error in the approval voting subsystem. + * Set the approval state for the validator index to `ApprovalState::Approved`. It should already be in the `Assigned` state as our `BlockEntry` knowledge contains a fingerprint for the assignment. + * Dispatch a `ApprovalDistributionV1Message::Approval(approval)` to all peers in the `BlockEntry`'s `known_by` set, excluding the peer in the `source`, if `source` has kind `MessageSource::Peer`. Add the fingerprint of the assignment to the knowledge of each peer. Note that this obeys the politeness conditions: + * We guarantee elsewhere that all peers within `known_by` are aware of all assignments relative to the block. + * We've checked that this specific approval has a corresponding assignment within the `BlockEntry`. + * Thus, all peers are aware of the assignment or have a message to them in-flight which will make them so. + + +#### `unify_with_peer(peer: PeerId, view)`: + +For each block in the view: + 1. Initialize a set `fresh_blocks = {}` + 2. Load the `BlockEntry` for the block. If the block is unknown, or the number is less than the view's finalized number, go to step 6. + 3. Inspect the `known_by` set of the `BlockEntry`. If the peer is already present, go to step 6. + 4. Add the peer to `known_by` with a cloned version of `block_entry.knowledge`. and add the hash of the block to `fresh_blocks`. + 5. Return to step 2 with the ancestor of the block. + 6. For each block in `fresh_blocks`, send all assignments and approvals for all candidates in those blocks to the peer. diff --git a/roadmap/implementers-guide/src/node/approval/approval-voting.md b/roadmap/implementers-guide/src/node/approval/approval-voting.md new file mode 100644 index 0000000000000000000000000000000000000000..7f96f9672162dd93f775935cad06afb244688469 --- /dev/null +++ b/roadmap/implementers-guide/src/node/approval/approval-voting.md @@ -0,0 +1,285 @@ +# Approval Voting + +Reading the [section on the approval protocol](../../protocol-approval.md) will likely be necessary to understand the aims of this subsystem. + +## Protocol + +Input: + - `ApprovalVotingMessage::CheckAndImportAssignment` + - `ApprovalVotingMessage::CheckAndImportApproval` + - `ApprovalVotingMessage::ApprovedAncestor` + +Output: + - `ApprovalDistributionMessage::DistributeAssignment` + - `ApprovalDistributionMessage::DistributeApproval` + - `RuntimeApiMessage::Request` + - `ChainApiMessage` + - `AvailabilityRecoveryMessage::Recover` + - `CandidateExecutionMessage::ValidateFromExhaustive` + +## Functionality + +The approval voting subsystem is responsible for casting votes and determining approval of candidates and as a result, blocks. + +This subsystem wraps a database which is used to store metadata about unfinalized blocks and the candidates within them. Candidates may appear in multiple blocks, and assignment criteria are chosen differently based on the hash of the block they appear in. + +## Database Schema + +The database schema is designed with the following goals in mind: + 1. To provide an easy index from unfinalized blocks to candidates + 1. To provide a lookup from candidate hash to approval status + 1. To be easy to clear on start-up. What has happened while we were offline is unimportant. + 1. To be fast to clear entries outdated by finality + +Structs: + +```rust +struct TrancheEntry { + tranche: DelayTranche, + // assigned validators who have not yet approved, and the instant we received + // their assignment. + assignments: Vec<(ValidatorIndex, Tick)>, +} + +struct OurAssignment { + cert: AssignmentCert, + tranche: DelayTranche, + validator_index: ValidatorIndex, + triggered: bool, +} + +struct ApprovalEntry { + tranches: Vec, // sorted ascending by tranche number. + backing_group: GroupIndex, + // When the next wakeup for this entry should occur. This is either to + // check a no-show or to check if we need to broadcast an assignment. + next_wakeup: Tick, + our_assignment: Option, + assignments: Bitfield, // n_validators bits + approved: bool, +} + +struct CandidateEntry { + candidate: CandidateReceipt, + session: SessionIndex, + // Assignments are based on blocks, so we need to track assignments separately + // based on the block we are looking at. + block_assignments: HashMap, + approvals: Bitfield, // n_validators bits +} + +struct BlockEntry { + block_hash: Hash, + session: SessionIndex, + slot: SlotNumber, + // random bytes derived from the VRF submitted within the block by the block + // author as a credential and used as input to approval assignment criteria. + relay_vrf_story: [u8; 32], + // The candidates included as-of this block and the index of the core they are + // leaving. Sorted ascending by core index. + candidates: Vec<(CoreIndex, Hash)>, + // 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 block. The block can be considered approved has all bits set to 1 + approved_bitfield: Bitfield, + rotation_offset: GroupIndex, + children: Vec, +} + +// slot_duration * 2 + DelayTranche gives the number of delay tranches since the +// unix epoch. +type Tick = u64; + +struct StoredBlockRange(BlockNumber, BlockNumber); +``` + +In the schema, we map + +``` +"StoredBlocks" => StoredBlockRange +BlockNumber => Vec +BlockHash => BlockEntry +CandidateHash => CandidateEntry +``` + +## Logic + +```rust +const APPROVAL_SESSIONS: SessionIndex = 6; +``` + +In-memory state: + +```rust +struct ApprovalVoteRequest { + validator_index: ValidatorIndex, + block_hash: Hash, + candidate_index: u32, +} + +struct State { + earliest_session: SessionIndex, + session_info: Vec, + keystore: KeyStorePtr, + wakeups: BTreeMap>, // Tick -> [(Relay Block, Candidate Hash)] + + // These are connected to each other. + approval_vote_tx: mpsc::Sender, + approval_vote_rx: mpsc::Receiver, +} +``` + +[`SessionInfo`](../../runtime/session_info.md) + +On start-up, we clear everything currently stored by the database. This is done by loading the `StoredBlockRange`, iterating through each block number, iterating through each block hash, and iterating through each candidate referenced by each block. Although this is `O(o*n*p)`, we don't expect to have more than a few unfinalized blocks at any time and in extreme cases, a few thousand. The clearing operation should be relatively fast as a result. + +Main loop: + * Each iteration, select over all of + * The next `Tick` in `wakeups`: trigger `wakeup_process` for each `(Hash, Hash)` pair scheduled under the `Tick` and then remove all entries under the `Tick`. + * The next message from the overseer: handle the message as described in the [Incoming Messages section](#incoming-messages) + * The next request from `approval_vote_rx`: handle with `issue_approval` + +### Incoming Messages + +#### `OverseerSignal::BlockFinalized` + +On receiving an `OverseerSignal::BlockFinalized(h)`, we fetch the block number `b` of that block from the ChainApi subsystem. We update our `StoredBlockRange` to begin at `b+1`. Additionally, we remove all block entries and candidates referenced by them up to and including `b`. Lastly, we prune out all descendents of `h` transitively: when we remove a `BlockEntry` with number `b` that is not equal to `h`, we recursively delete all the `BlockEntry`s referenced as children. We remove the `block_assignments` entry for the block hash and if `block_assignments` is now empty, remove the `CandidateEntry`. + + +#### `OverseerSignal::ActiveLeavesUpdate` + +On receiving an `OverseerSignal::ActiveLeavesUpdate(update)`: + * We determine the set of new blocks that were not in our previous view. This is done by querying the ancestry of all new items in the view and contrasting against the stored `BlockNumber`s. Typically, there will be only one new block. We fetch the headers and information on these blocks from the ChainApi subsystem. + * We update the `StoredBlockRange` and the `BlockNumber` maps. + * We use the RuntimeApiSubsystem to determine information about these blocks. It is generally safe to assume that runtime state is available for recent, unfinalized blocks. In the case that it isn't, it means that we are catching up to the head of the chain and needn't worry about assignments to those blocks anyway, as the security assumption of the protocol tolerates nodes being temporarily offline or out-of-date. + * We fetch the set of candidates included by each block by dispatching a `RuntimeApiRequest::CandidateEvents` and checking the `CandidateIncluded` events. + * We fetch the session of the block by dispatching a `session_index_for_child` request with the parent-hash of the block. + * If the `session index - APPROVAL_SESSIONS > state.earliest_session`, then bump `state.earliest_sessions` to that amount and prune earlier sessions. + * If the session isn't in our `state.session_info`, load the session info for it and for all sessions since the earliest-session, including the earliest-session, if that is missing. And it can be, just after pruning, if we've done a big jump forward, as is the case when we've just finished chain synchronization. + * If any of the runtime API calls fail, we just warn and skip the block. + * We use the RuntimeApiSubsystem to determine the set of candidates included in these blocks and use BABE logic to determine the slot number and VRF of the blocks. + * We also note how late we appear to have received the block. We create a `BlockEntry` for each block and a `CandidateEntry` for each candidate obtained from `CandidateIncluded` events after making a `RuntimeApiRequest::CandidateEvents` request. + * Ensure that the `CandidateEntry` contains a `block_assignments` entry for the block, with the correct backing group set. + * If a validator in this session, compute and assign `our_assignment` for the `block_assignments` + * Only if not a member of the backing group. + * Run `RelayVRFModulo` and `RelayVRFDelay` according to the [the approvals protocol section](../../protocol-approval.md#assignment-criteria). Ensure that the assigned core derived from the output is covered by the auxiliary signature aggregated in the `VRFPRoof`. + * invoke `process_wakeup(relay_block, candidate)` for each new candidate in each new block - this will automatically broadcast a 0-tranche assignment, kick off approval work, and schedule the next delay. + * Dispatch an `ApprovalDistributionMessage::NewBlocks` with the meta information filled out for each new block. + +#### `ApprovalVotingMessage::CheckAndImportAssignment` + +On receiving a `ApprovalVotingMessage::CheckAndImportAssignment` message, we check the assignment cert against the block entry. The cert itself contains information necessary to determine the candidate that is being assigned-to. In detail: + * Load the `BlockEntry` for the relay-parent referenced by the message. If there is none, return `VoteCheckResult::Report`. + * Fetch the `SessionInfo` for the session of the block + * Determine the assignment key of the validator based on that. + * Check the assignment cert + * If the cert kind is `RelayVRFModulo`, then the certificate is valid as long as `sample < session_info.relay_vrf_samples` and the VRF is valid for the validator's key with the input `block_entry.relay_vrf_story ++ sample.encode()` as described with [the approvals protocol section](../../protocol-approval.md#assignment-criteria). We set `core_index = vrf.make_bytes().to_u32() % session_info.n_cores`. If the `BlockEntry` causes inclusion of a candidate at `core_index`, then this is a valid assignment for the candidate at `core_index` and has delay tranche 0. Otherwise, it can be ignored. + * If the cert kind is `RelayVRFDelay`, then we check if the VRF is valid for the validator's key with the input `block_entry.relay_vrf_story ++ cert.core_index.encode()` as described in [the approvals protocol section](../../protocol-approval.md#assignment-criteria). The cert can be ignored if the block did not cause inclusion of a candidate on that core index. Otherwise, this is a valid assignment for the included candidate. The delay tranche for the assignment is determined by reducing `(vrf.make_bytes().to_u64() % (session_info.n_delay_tranches + session_info.zeroth_delay_tranche_width)).saturating_sub(session_info.zeroth_delay_tranche_width)`. + * We also check that the core index derived by the output is covered by the `VRFProof` by means of an auxiliary signature. + * If the delay tranche is too far in the future, return `VoteCheckResult::Ignore`. + * `import_checked_assignment` + * return the appropriate `VoteCheckResult` on the response channel. + +#### `ApprovalVotingMessage::CheckAndImportApproval` + +On receiving a `CheckAndImportApproval(indirect_approval_vote, response_channel)` message: + * Fetch the `BlockEntry` from the indirect approval vote's `block_hash`. If none, return `ApprovalCheckResult::Bad`. + * Fetch the `CandidateEntry` from the indirect approval vote's `candidate_index`. If the block did not trigger inclusion of enough candidates, return `ApprovalCheckResult::Bad`. + * Construct a `SignedApprovalVote` using the candidate hash and check against the validator's approval key, based on the session info of the block. If invalid or no such validator, return `ApprovalCheckResult::Bad`. + * Send `ApprovalCheckResult::Accepted` + * `import_checked_approval(BlockEntry, CandidateEntry, ValidatorIndex)` + +#### `ApprovalVotingMessage::ApprovedAncestor` + +On receiving an `ApprovedAncestor(Hash, BlockNumber, response_channel)`: + * Iterate over the ancestry of the hash all the way back to block number given, starting from the provided block hash. + * Keep track of an `all_approved_max: Option`. + * For each block hash encountered, load the `BlockEntry` associated. If any are not found, return `None` on the response channel and conclude. + * If the block entry's `approval_bitfield` has all bits set to 1 and `all_approved_max == None`, set `all_approved_max = Some(current_hash)`. + * If the block entry's `approval_bitfield` has any 0 bits, set `all_approved_max = None`. + * After iterating all ancestry, return `all_approved_max`. + +### Utility + +#### `tranche_now(slot_number, time) -> DelayTranche` + * Convert `time.saturating_sub(slot_number.to_time())` to a delay tranches value + +#### `import_checked_assignment` + * Load the candidate in question and access the `approval_entry` for the block hash the cert references. + * Ignore if we already observe the validator as having been assigned. + * Ensure the validator index is not part of the backing group for the candidate. + * Ensure the validator index is not present in the approval entry already. + * Create a tranche entry for the delay tranche in the approval entry and note the assignment within it. + * Note the candidate index within the approval entry. + * Schedule a wakeup with `next_wakeup`. + +#### `import_checked_approval(BlockEntry, CandidateEntry, ValidatorIndex)` + * Set the corresponding bit of the `approvals` bitfield in the `CandidateEntry` to `1`. If already `1`, return. + * For each `ApprovalEntry` in the `CandidateEntry` (typically only 1), check whether the validator is assigned as a checker. + * If so, set `n_tranches = tranches_to_approve(approval_entry, tranche_now(block.slot, now()))`. + * If `check_approval(block_entry, approval_entry, n_tranches)` is true, set the corresponding bit in the `block_entry.approved_bitfield`. + +#### `tranches_to_approve(approval_entry, tranche_now) -> RequiredTranches` + +```rust +enum RequiredTranches { + // All validators appear to be required, based on tranches already taken and remaining no-shows. + All, + // More tranches required - We're awaiting more assignments. The given `DelayTranche` indicates the + // upper bound of tranches that should broadcast based on the last no-show. + Pending(DelayTranche), + // An exact number of required tranches and a number of no-shows. This indicates that the amount of `needed_approvals` are assigned and additionally all no-shows are covered. + Exact(DelayTranche, usize), +} +``` + + * Determine the amount of tranches `n_tranches` our view of the protocol requires of this approval entry. + * Ignore all tranches beyond `tranche_now`. + * First, take tranches until we have at least `session_info.needed_approvals`. Call the number of tranches taken `k` + * Then, count no-shows in tranches `0..k`. For each no-show, we require another non-empty tranche. Take another non-empty tranche for each no-show, so now we've taken `l = k + j` tranches, where `j` is at least the number of no-shows within tranches `0..k`. + * Count no-shows in tranches `k..l` and for each of those, take another non-empty tranche for each no-show. Repeat so on until either + * We run out of tranches to take, having not received any assignments past a certain point. In this case we set `n_tranches` to a special value `RequiredTranches::Pending(last_taken_tranche + uncovered_no_shows)` which indicates that new assignments are needed. `uncovered_no_shows` is the number of no-shows we have not yet covered with `last_taken_tranche`. + * All no-shows are covered by at least one non-empty tranche. Set `n_tranches` to the number of tranches taken and return `RequiredTranches::Exact(n_tranches)`. + * The amount of assignments in non-empty & taken tranches plus the amount of needed extras equals or exceeds the total number of validators for the approval entry, which can be obtained by measuring the bitfield. In this case we return a special value `RequiredTranches::All` indicating that all validators have effectively been assigned to check. + * return `n_tranches` + +#### `check_approval(block_entry, approval_entry, n_tranches) -> bool` + * If `n_tranches` is `RequiredTranches::Pending`, return false + * If `n_tranches` is `RequiredTranches::All`, then we return `3 * n_approvals > 2 * n_validators`. + * If `n_tranches` is `RequiredTranches::Exact(tranche, no_shows), then we return whether all assigned validators up to `tranche` less `no_shows` have approved. e.g. if we had 5 tranches and 1 no-show, we would accept all validators in tranches 0..=5 except for 1 approving. In that example, we also accept all validators in tranches 0..=5 approving, but that would indicate that the `RequiredTranches` value was incorrectly constructed, so it is not realistic. If there are more missing approvals than there are no-shows, that indicates that there are some assignments which are not yet no-shows, but may become no-shows. + +#### `process_wakeup(relay_block, candidate_hash)` + * Load the `BlockEntry` and `CandidateEntry` from disk. If either is not present, this may have lost a race with finality and can be ignored. Also load the `ApprovalEntry` for the block and candidate. + * Set `required = tranches_to_approve(approval_entry, tranche_now(block.slot, now()))` + * Determine if we should trigger our assignment. + * If we've already triggered or `OurAssignment` is `None`, we do not trigger. + * If `required` is `RequiredTranches::All`, then we trigger if `check_approval(block_entry, approval_entry, All)` is false. + * If `required` is `RequiredTranches::Pending(max), then we trigger if our assignment's tranche is less than or equal to `max`. + * If `required` is `RequiredTranches::Exact(tranche)` then we do not trigger, because this value indicates that no new assignments are needed at the moment. + * If we should trigger our assignment + * Import the assignment to the `ApprovalEntry` + * Broadcast on network with an `ApprovalDistributionMessage::DistributeAssignment`. + * Kick off approval work with `launch_approval` + * Schedule another wakeup based on `next_wakeup` + +#### `next_wakeup(approval_entry, candidate_entry)`: + * If the `approval_entry` is approved, this doesn't need to be woken up again. + * Return the earlier of our next no-show timeout or the tranche of our assignment, if not yet triggered + * Our next no-show timeout is computed by finding the earliest-received assignment within `n_tranches` for which we have not received an approval and adding `to_ticks(session_info.no_show_slots)` to it. + +#### `launch_approval(SessionIndex, CandidateReceipt, ValidatorIndex, block_hash, candidate_index)`: + * Extract the public key of the `ValidatorIndex` from the `SessionInfo` for the session. + * Issue an `AvailabilityRecoveryMessage::RecoverAvailableData(candidate, session_index, response_sender)` + * Load the historical validation code of the parachain by dispatching a `RuntimeApiRequest::HistoricalValidationCode(`descriptor.para_id`, `descriptor.relay_parent`)` against the state of `block_hash`. + * Spawn a background task with a clone of `approval_vote_tx` + * Wait for the available data + * Issue a `CandidateValidationMessage::ValidateFromExhaustive` message + * Wait for the result of validation + * If valid, issue a message on `approval_vote_tx` detailing the request. + +#### `issue_approval(request)`: + * Fetch the block entry and candidate entry. Ignore if `None` - we've probably just lost a race with finality. + * Construct a `SignedApprovalVote` with the validator index for the session. + * `import_checked_approval(block_entry, candidate_entry, validator_index)` + * Construct a `IndirectSignedApprovalVote` using the information about the vote. + * Dispatch `ApprovalDistributionMessage::DistributeApproval`. diff --git a/roadmap/implementers-guide/src/node/approval/dispute-participation.md b/roadmap/implementers-guide/src/node/approval/dispute-participation.md new file mode 100644 index 0000000000000000000000000000000000000000..10c278c20df114f451a536f0f357cf787b619b22 --- /dev/null +++ b/roadmap/implementers-guide/src/node/approval/dispute-participation.md @@ -0,0 +1,5 @@ +# Dispute Participation + +## Protocol + +## Functionality \ No newline at end of file diff --git a/roadmap/implementers-guide/src/node/availability/availability-distribution.md b/roadmap/implementers-guide/src/node/availability/availability-distribution.md index de34f3b8ed9068431156c4f771be38aa2c34ccc1..5b1941bc71a5bcb2e7764bb3c6722409dac6f834 100644 --- a/roadmap/implementers-guide/src/node/availability/availability-distribution.md +++ b/roadmap/implementers-guide/src/node/availability/availability-distribution.md @@ -23,7 +23,8 @@ Output: For each relay-parent in our local view update, look at all backed candidates pending availability. Distribute via gossip all erasure chunks for all candidates that we have to peers. -We define an operation `live_candidates(relay_heads) -> Set` which returns a set of [`CommittedCandidateReceipt`s](../../types/candidate.md#committed-candidate-receipt). +We define an operation `live_candidates(relay_heads) -> Set` which returns a set of hashes corresponding to [`CandidateReceipt`s](../../types/candidate.md#candidate-receipt). + This is defined as all candidates pending availability in any of those relay-chain heads or any of their last `K` ancestors in the same session. We assume that state is not pruned within `K` blocks of the chain-head. `K` commonly is small and is currently fixed to `K=3`. We will send any erasure-chunks that correspond to candidates in `live_candidates(peer_most_recent_view_update)`. diff --git a/roadmap/implementers-guide/src/node/availability/availability-recovery.md b/roadmap/implementers-guide/src/node/availability/availability-recovery.md new file mode 100644 index 0000000000000000000000000000000000000000..a05b9e9c17499a3794943c81f1b3b50eed3f3f0f --- /dev/null +++ b/roadmap/implementers-guide/src/node/availability/availability-recovery.md @@ -0,0 +1,169 @@ +# Availability Recovery + +> TODO: + +This subsystem is the inverse of the [Availability Distribution](availability-distribution.md) subsystem: validators will serve the availability chunks kept in the availability store to nodes who connect to them. And the subsystem will also implement the other side: the logic for nodes to connect to validators, request availability pieces, and reconstruct the `AvailableData`. + +This version of the availability recovery subsystem is based off of direct connections to validators. In order to recover any given `AvailableData`, we must recover at least `f + 1` pieces from validators of the session. Thus, we will connect to and query randomly chosen validators until we have received `f + 1` pieces. + +## Protocol + +`PeerSet`: `Validation` + +Input: + +- NetworkBridgeUpdateV1(update) +- AvailabilityRecoveryMessage::RecoverAvailableData(candidate, session, response) + +Output: + +- NetworkBridge::SendValidationMessage +- NetworkBridge::ReportPeer +- AvailabilityStore::QueryChunk + +## Functionality + +We hold a state which tracks the current recovery interactions we have live, as well as which request IDs correspond to which interactions. An interaction is a structure encapsulating all interaction with the network necessary to recover the available data. + +```rust +type ChunkResponse = Result<(PeerId, ErasureChunk), Unavailable>; + +struct AwaitedChunk { + issued_at: Instant, + validator_index: ValidatorIndex, + candidate_hash: CandidateHash, + response: ResponseChannel, +} + +struct State { + /// Each interaction is implemented as its own async task, and these handles are for communicating with them. + interactions: Map, + /// A recent block hash for which state should be available. + live_block_hash: Hash, + discovering_validators: Map>, + live_chunk_requests: Map, + next_request_id: RequestId, + connecting_validators: Stream<(AuthorityDiscoveryId, PeerId)>, + + /// interaction communication. This is cloned and given to interactions that are spun up. + from_interaction_tx: Sender, + /// receiver for messages from interactions. + from_interaction_rx: Receiver, + + // An LRU cache of recently recovered data. + availability_lru: LruCache>, +} + +struct InteractionHandle { + awaiting: Vec>>, +} + +struct Unavailable; +enum FromInteraction { + // An interaction concluded. + Concluded(CandidateHash, Result), + // Make a request of a particular chunk from a particular validator. + MakeRequest( + AuthorityDiscoveryId, + CandidateHash, + ValidatorIndex, + ResponseChannel, + ), + // Report a peer. + ReportPeer( + PeerId, + Rep, + ), +} + +struct Interaction { + to_state: Sender, + validator_authority_keys: Vec, + validators: Vec, + // a random shuffling of the validators which indicates the order in which we connect to the validators and + // request the chunk from them. + shuffling: Vec, + // The number of pieces needed. + threshold: usize, + candidate_hash: Hash, + erasure_root: Hash, + received_chunks: Map, + requesting_chunks: FuturesUnordered>, +} +``` + +### Signal Handling + +On `ActiveLeavesUpdate`, if `activated` is non-empty, set `state.live_block_hash` to the first block in `Activated`. + +Ignore `BlockFinalized` signals. + +On `Conclude`, shut down the subsystem. + +#### `AvailabilityRecoveryMessage::RecoverAvailableData(receipt, session, response)` + +1. Check the `availability_lru` for the candidate and return the data if so. +1. Check if there is already an interaction handle for the request. If so, add the response handle to it. +1. Otherwise, load the session info for the given session under the state of `live_block_hash`, and initiate an interaction with *launch_interaction*. Add an interaction handle to the state and add the response channel to it. +1. If the session info is not available, return `RecoveryError::Unavailable` on the response channel. + +### From-interaction logic + +#### `FromInteraction::Concluded` + +1. Load the entry from the `interactions` map. It should always exist, if not for logic errors. Send the result to each member of `awaiting`. +1. Add the entry to the availability_lru. + +#### `FromInteraction::MakeRequest(discovery_pub, candidate_hash, validator_index, response)` + +1. Add an `AwaitedRequest` to the `discovering_validators` map under `discovery_pub`. +1. Issue a `NetworkBridgeMessage::ConnectToValidators`. +1. Add the stream of connected validator events to `state.connecting_validators`. + +#### `FromInteraction::ReportPeer(peer, rep)` + +1. Issue a `NetworkBridgeMessage::ReportPeer(peer, rep)`. + +### Responding to network events. + +#### On `connecting_validators` event: + +1. If the validator exists under `discovering_validators`, remove the entry. +1. For each `AwaitedChunk` in the entry, issue a `AvailabilityRecoveryV1Message::RequestChunk(next_request_id, candidate_hash, validator_index)` and make an entry in the `live_chunk_requests` map. + +#### On receiving `AvailabilityRecoveryV1::RequestChunk(r_id, candidate_hash, validator_index)` + +1. Issue a `AvailabilityStore::QueryChunk(candidate-hash, validator_index, response)` message. +1. Whatever the result, issue a `AvailabilityRecoveryV1Message::Chunk(r_id, response)` message. + +#### On receiving `AvailabilityRecoveryV1::Chunk(r_id, chunk)` + +1. If there exists an entry under `r_id`, remove it. If there doesn't exist one, report the peer and return. If the peer in the entry doesn't match the sending peer, reinstate the entry, report the peer, and return. +1. Send the chunk response on the `awaited_chunk` for the interaction to handle. + +### Interaction logic + +#### `launch_interaction(session_index, session_info, candidate_receipt, candidate_hash)` + +1. Compute the threshold from the session info. It should be `f + 1`, where `n = 3f + k`, where `k in {1, 2, 3}`, and `n` is the number of validators. +1. Set the various fields of `Interaction` based on the validator lists in `session_info`. Compute a random shuffling of the validator indices. +1. Set the `to_state` sender to be equal to a clone of `state.from_interaction_tx`. +1. Initialize `received_chunks` to an empty set, as well as `requesting_chunks`. + +Launch the interaction as a background task running `interaction_loop(interaction)`. + +#### `interaction_loop(interaction)` + +```rust +// How many parallel requests to have going at once. +const N_PARALLEL: usize = 50; +``` + +Loop: + * Poll for new updates from `requesting_chunks`. Check merkle proofs of any received chunks, and any failures should lead to issuance of a `FromInteraction::ReportPeer` message. + * If `received_chunks` has more than `threshold` entries, attempt to recover the data. If that fails, or a re-encoding of it doesn't match the expected erasure root, break and issue a `FromInteraction::Concluded(RecoveryError::Invalid)`. Otherwise, issue a `FromInteraction::Concluded(Ok(()))`. + * While there are fewer than `N_PARALLEL` entries in `requesting_chunks`, + * Pop the next item from `shuffling`. If it's empty and `requesting_chunks` is empty, break and issue a `FromInteraction::Concluded(RecoveryError::Unavailable)`. + * Initialize `(tx, rx)`. + * Issue a `FromInteraction::MakeRequest(validator, candidate_hash, validator_index, tx)`. + * Add `rx` to `requesting_chunks`. diff --git a/roadmap/implementers-guide/src/node/availability/bitfield-signing.md b/roadmap/implementers-guide/src/node/availability/bitfield-signing.md index 0ca9badd32e2f418d401307f722a07b83177be5a..f3ef3a4e752932a60e5d6fa368f8b844fde59aa0 100644 --- a/roadmap/implementers-guide/src/node/availability/bitfield-signing.md +++ b/roadmap/implementers-guide/src/node/availability/bitfield-signing.md @@ -24,6 +24,6 @@ If not running as a validator, do nothing. - Begin by waiting a fixed period of time so availability distribution has the chance to make candidates available. - Determine our validator index `i`, the set of backed candidates pending availability in `r`, and which bit of the bitfield each corresponds to. -- Start with an empty bitfield. For each bit in the bitfield, if there is a candidate pending availability, query the [Availability Store](../utility/availability-store.md) for whether we have the availability chunk for our validator index. +- Start with an empty bitfield. For each bit in the bitfield, if there is a candidate pending availability, query the [Availability Store](../utility/availability-store.md) for whether we have the availability chunk for our validator index. The `OccupiedCore` struct contains the candidate hash so the full candidate does not need to be fetched from runtime. - For all chunks we have, set the corresponding bit in the bitfield. - Sign the bitfield and dispatch a `BitfieldDistribution::DistributeBitfield` message. diff --git a/roadmap/implementers-guide/src/node/backing/candidate-backing.md b/roadmap/implementers-guide/src/node/backing/candidate-backing.md index afea5e8ee40255ec43414b08695ba870a663378f..016c5096749493f246d68c9979a7a62fbda1f99b 100644 --- a/roadmap/implementers-guide/src/node/backing/candidate-backing.md +++ b/roadmap/implementers-guide/src/node/backing/candidate-backing.md @@ -39,7 +39,7 @@ The subsystem should maintain a set of handles to Candidate Backing Jobs that ar ### On Receiving `CandidateBackingMessage` * If the message is a [`CandidateBackingMessage`][CBM]`::GetBackedCandidates`, get all backable candidates from the statement table and send them back. -* If the message is a [`CandidateBackingMessage`][CBM]`::Second`, sign and dispatch a `Seconded` statement only if we have not seconded any other candidate and have not signed a `Valid` statement for the requested candidate. Signing both a `Seconded` and `Valid` message is a double-voting misbehavior with a heavy penalty, and this could occur if another validator has seconded the same candidate and we've received their message before the internal seconding request. +* If the message is a [`CandidateBackingMessage`][CBM]`::Second`, sign and dispatch a `Seconded` statement only if we have not seconded any other candidate and have not signed a `Valid` statement for the requested candidate. Signing both a `Seconded` and `Valid` message is a double-voting misbehavior with a heavy penalty, and this could occur if another validator has seconded the same candidate and we've received their message before the internal seconding request. After successfully dispatching the `Seconded` statement we have to distribute the PoV. * If the message is a [`CandidateBackingMessage`][CBM]`::Statement`, count the statement to the quorum. If the statement in the message is `Seconded` and it contains a candidate that belongs to our assignment, request the corresponding `PoV` from the `PoVDistribution` and launch validation. Issue our own `Valid` or `Invalid` statement as a result. > big TODO: "contextual execution" @@ -67,26 +67,28 @@ The goal of a Candidate Backing Job is to produce as many backable candidates as ```rust match msg { - CetBackedCandidates(hash, tx) => { + GetBackedCandidates(hashes, tx) => { // Send back a set of backable candidates. } CandidateBackingMessage::Second(hash, candidate) => { if candidate is unknown and in local assignment { - spawn_validation_work(candidate, parachain head, validation function) + if spawn_validation_work(candidate, parachain head, validation function).await == Valid { + send(DistributePoV(pov)) + } } } CandidateBackingMessage::Statement(hash, statement) => { // count to the votes on this candidate - if let Statement::Seconded(candidate) = statement { - if candidate.parachain_id == our_assignment { - spawn_validation_work(candidate, parachain head, validation function) - } - } + if let Statement::Seconded(candidate) = statement { + if candidate.parachain_id == our_assignment { + spawn_validation_work(candidate, parachain head, validation function) + } + } } } ``` -Add `Seconded` statements and `Valid` statements to a quorum. If quorum reaches validator-group majority, send a [`ProvisionerMessage`][PM]`::ProvisionableData(ProvisionableData::BackedCandidate(BackedCandidate))` message. +Add `Seconded` statements and `Valid` statements to a quorum. If quorum reaches validator-group majority, send a [`ProvisionerMessage`][PM]`::ProvisionableData(ProvisionableData::BackedCandidate(CandidateReceipt))` message. `Invalid` statements that conflict with already witnessed `Seconded` and `Valid` statements for the given candidate, statements that are double-votes, self-contradictions and so on, should result in issuing a [`ProvisionerMessage`][PM]`::MisbehaviorReport` message for each newly detected case of this kind. ### Validating Candidates. @@ -110,14 +112,18 @@ fn spawn_validation_work(candidate, parachain head, validation function) { ### Fetch Pov Block Create a `(sender, receiver)` pair. -Dispatch a [`PoVDistributionMessage`][PDM]`::FecthPoV(relay_parent, candidate_hash, sender)` and listen on the receiver for a response. +Dispatch a [`PoVDistributionMessage`][PDM]`::FetchPoV(relay_parent, candidate_hash, sender)` and listen on the receiver for a response. + +### Distribute Pov Block + +Dispatch a [`PoVDistributionMessage`][PDM]`::DistributePoV(relay_parent, candidate_descriptor, pov)`. ### Validate PoV Block Create a `(sender, receiver)` pair. Dispatch a `CandidateValidationMessage::Validate(validation function, candidate, pov, sender)` and listen on the receiver for a response. -### Distribute Signed Statemnet +### Distribute Signed Statement Dispatch a [`StatementDistributionMessage`][PDM]`::Share(relay_parent, SignedFullStatement)`. diff --git a/roadmap/implementers-guide/src/node/backing/candidate-selection.md b/roadmap/implementers-guide/src/node/backing/candidate-selection.md index db441b7f7ed03c49cc437f4bbec3473bb6175f98..4439f10dd18defbaa542660962b38c543407525e 100644 --- a/roadmap/implementers-guide/src/node/backing/candidate-selection.md +++ b/roadmap/implementers-guide/src/node/backing/candidate-selection.md @@ -16,7 +16,6 @@ Input: [`CandidateSelectionMessage`](../../types/overseer-protocol.md#candidate- Output: -- Validation requests to Validation subsystem - [`CandidateBackingMessage`](../../types/overseer-protocol.md#candidate-backing-message)`::Second` - Peer set manager: report peers (collators who have misbehaved) diff --git a/roadmap/implementers-guide/src/node/backing/pov-distribution.md b/roadmap/implementers-guide/src/node/backing/pov-distribution.md index 9b32abbd560a4dac21d246ec8f44ac197b623e93..3cf6dd995aa5d96dd982c210b23f4846344aba9f 100644 --- a/roadmap/implementers-guide/src/node/backing/pov-distribution.md +++ b/roadmap/implementers-guide/src/node/backing/pov-distribution.md @@ -17,7 +17,7 @@ Output: ## Functionality -This network protocol is responsible for distributing [`PoV`s](../../types/availability.md#proof-of-validity) by gossip. Since PoVs are heavy in practice, gossip is far from the most efficient way to distribute them. In the future, this should be replaced by a better network protocol that finds validators who have validated the block and connects to them directly. This protocol is descrbied. +This network protocol is responsible for distributing [`PoV`s](../../types/availability.md#proof-of-validity) by gossip. Since PoVs are heavy in practice, gossip is far from the most efficient way to distribute them. In the future, this should be replaced by a better network protocol that finds validators who have validated the block and connects to them directly. This protocol is described. This protocol is described in terms of "us" and our peers, with the understanding that this is the procedure that any honest node will run. It has the following goals: - We never have to buffer an unbounded amount of data @@ -25,7 +25,7 @@ This protocol is described in terms of "us" and our peers, with the understandin As we are gossiping, we need to track which PoVs our peers are waiting for to avoid sending them data that they are not expecting. It is not reasonable to expect our peers to buffer unexpected PoVs, just as we will not buffer unexpected PoVs. So notifying our peers about what is being awaited is key. However it is important that the notifications system is also bounded. -For this, in order to avoid reaching into the internals of the [Statement Distribution](statement-distribution.md) Subsystem, we can rely on an expected propery of candidate backing: that each validator can second up to 2 candidates per chain head. This will typically be only one, because they are only supposed to issue one, but they can equivocate if they are willing to be slashed. So we can set a cap on the number of PoVs each peer is allowed to notify us that they are waiting for at a given relay-parent. This cap will be twice the number of validators at that relay-parent. In practice, this is a very lax upper bound that can be reduced much further if desired. +For this, in order to avoid reaching into the internals of the [Statement Distribution](statement-distribution.md) Subsystem, we can rely on an expected property of candidate backing: that each validator can second up to 2 candidates per chain head. This will typically be only one, because they are only supposed to issue one, but they can equivocate if they are willing to be slashed. So we can set a cap on the number of PoVs each peer is allowed to notify us that they are waiting for at a given relay-parent. This cap will be twice the number of validators at that relay-parent. In practice, this is a very lax upper bound that can be reduced much further if desired. The view update mechanism of the [Network Bridge](../utility/network-bridge.md) ensures that peers are only allowed to consider a certain set of relay-parents as live. So this bounding mechanism caps the amount of data we need to store per peer at any time at `sum({ 2 * n_validators_at_head(head) * sizeof(hash) for head in view_heads })`. Additionally, peers should only be allowed to notify us of PoV hashes they are waiting for in the context of relay-parents in our own local view, which means that `n_validators_at_head` is implied to be `0` for relay-parents not in our own local view. diff --git a/roadmap/implementers-guide/src/node/backing/statement-distribution.md b/roadmap/implementers-guide/src/node/backing/statement-distribution.md index f5258b4155e78631c5bde46541ed20abc3eedc5a..9e15bc35e5eca0803230313921f3a8672b83f5cd 100644 --- a/roadmap/implementers-guide/src/node/backing/statement-distribution.md +++ b/roadmap/implementers-guide/src/node/backing/statement-distribution.md @@ -38,7 +38,7 @@ There is a very simple state machine which governs which messages we are willing A: Initial State. Receive `SignedFullStatement(Statement::Second)`: extract `Statement`, forward to Candidate Backing and PoV Distribution, proceed to B. Receive any other `SignedFullStatement` variant: drop it. -B: Receive any `SignedFullStatement`: check signature, forward to Candidate Backing. Receive `OverseerMessage::StopWork`: proceed to C. +B: Receive any `SignedFullStatement`: check signature and determine whether the statement is new to us. if new, forward to Candidate Backing and circulate to other peers. Receive `OverseerMessage::StopWork`: proceed to C. C: Receive any message for this block: drop it. diff --git a/roadmap/implementers-guide/src/node/collators/collation-generation.md b/roadmap/implementers-guide/src/node/collators/collation-generation.md index ab3f80273d60dce522cd764554f4e05c2c076be1..56401823590ddbb984ec3112ad80dac20c7ceaae 100644 --- a/roadmap/implementers-guide/src/node/collators/collation-generation.md +++ b/roadmap/implementers-guide/src/node/collators/collation-generation.md @@ -22,14 +22,26 @@ The process of generating a collation for a parachain is very parachain-specific ```rust pub struct Collation { - /// Hash of `CandidateCommitments` as understood by the collator. - pub commitments_hash: Hash, + /// Messages destined to be interpreted by the Relay chain itself. + pub upward_messages: Vec, + /// New validation code. + pub new_validation_code: Option, + /// The head-data produced as a result of execution. + pub head_data: HeadData, + /// Proof to verify the state transition of the parachain. pub proof_of_validity: PoV, } +type CollatorFn = Box< + dyn Fn(Hash, &ValidationData) -> Pin>>> +>; + struct CollationGenerationConfig { key: CollatorPair, - collator: Box Box>> + /// Collate will be called with the relay chain hash the parachain should build + /// a block on and the `ValidationData` that provides information about the state + /// of the parachain on the relay chain. + collator: CollatorFn, para_id: ParaId, } ``` diff --git a/roadmap/implementers-guide/src/node/grandpa-voting-rule.md b/roadmap/implementers-guide/src/node/grandpa-voting-rule.md new file mode 100644 index 0000000000000000000000000000000000000000..57da4e0dad6957aa05c284267478410d1c74381f --- /dev/null +++ b/roadmap/implementers-guide/src/node/grandpa-voting-rule.md @@ -0,0 +1,11 @@ +# GRANDPA Voting Rule + +[GRANDPA](https://w3f-research.readthedocs.io/en/latest/polkadot/finality.html) is the finality engine of Polkadot. + +One broad goal of finality, which applies across many different blockchains, is that there should exist only one finalized block at each height in the finalized chain. Before a block at a given height is finalized, it may compete with other forks. + +GRANDPA's regular voting rule is for each validator to select the longest chain they are aware of. GRANDPA proceeds in rounds, collecting information from all online validators and determines the blocks that a supermajority of validators all have in common with each other. + +For parachains, we extend the security guarantee of finality to be such that no invalid parachain candidate may be included in a finalized block. Candidates may be included in some fork of the relay chain with only a few backing votes behind them. After that point, we run the [Approvals Protocol](../protocol-approval.md), which is implemented as the [Approval Voting](approval/approval-voting.md) subsystem. This system involves validators self-selecting to re-check candidates included in all observed forks of the relay chain as well as an algorithm for observing validators' statements about assignment and approval in order to determine which candidates, and thus blocks, are with high probability valid. The highest approved ancestor of a given block can be determined by querying the Approval Voting subsystem via the [`ApprovalVotingMessage::ApprovedAncestor`](../types/overseer-protocol.md#approval-voting) message. + +Lastly, we refuse to finalize any block including a candidate for which we are aware of an ongoing dispute or of a dispute resolving against the candidate. The exact means of doing this has not been determined yet. diff --git a/roadmap/implementers-guide/src/node/utility/candidate-validation.md b/roadmap/implementers-guide/src/node/utility/candidate-validation.md index 19108bd78e811f48bb42d714595b1e06de4ec58b..c34672368c321754c55ffc0b93d0f0585033847a 100644 --- a/roadmap/implementers-guide/src/node/utility/candidate-validation.md +++ b/roadmap/implementers-guide/src/node/utility/candidate-validation.md @@ -24,7 +24,7 @@ Upon receiving a validation request, the first thing the candidate validation su ### Determining Parameters -For a [`CandidateValidationMessage`][CVM]`::ValidateFromExhaustive`, these parameters are exhaustively provided. The [`TransientValidationData`](../../types/candidate.md#transientvalidationdata) is optional, and is used to perform further checks on the outputs of validation. +For a [`CandidateValidationMessage`][CVM]`::ValidateFromExhaustive`, these parameters are exhaustively provided. For a [`CandidateValidationMessage`][CVM]`::ValidateFromChainState`, some more work needs to be done. Due to the uncertainty of Availability Cores (implemented in the [`Scheduler`](../../runtime/scheduler.md) module of the runtime), a candidate at a particular relay-parent and for a particular para may have two different valid validation-data to be executed under depending on what is assumed to happen if the para is occupying a core at the onset of the new block. This is encoded as an `OccupiedCoreAssumption` in the runtime API. @@ -40,9 +40,8 @@ Once we have all parameters, we can spin up a background task to perform the val * The collator signature is valid * The PoV provided matches the `pov_hash` field of the descriptor -After that, we can invoke the validation function. Lastly, if available, we do some final checks on the output using the `TransientValidationData`: - * The produced head-data is no larger than the maximum allowed. - * The produced code upgrade, if any, is no larger than the maximum allowed, and a code upgrade was allowed to be signaled. - * The amount and size of produced upward messages is not too large. +### Checking Validation Outputs + +If we can assume the presence of the relay-chain state (that is, during processing [`CandidateValidationMessage`][CVM]`::ValidateFromChainState`) we can run all the checks that the relay-chain would run at the inclusion time thus confirming that the candidate will be accepted. [CVM]: ../../types/overseer-protocol.md#validationrequesttype diff --git a/roadmap/implementers-guide/src/node/utility/chain-api.md b/roadmap/implementers-guide/src/node/utility/chain-api.md index 6469db262ab5fa812ae7e8998f427bef2fa5c512..7695b73a05e3db44f95ca622642a19e0da9756cf 100644 --- a/roadmap/implementers-guide/src/node/utility/chain-api.md +++ b/roadmap/implementers-guide/src/node/utility/chain-api.md @@ -14,6 +14,7 @@ On receipt of `ChainApiMessage`, answer the request and provide the response to Currently, the following requests are supported: * Block hash to number +* Block hash to header * Finalized block number to hash * Last finalized block number * Ancestors diff --git a/roadmap/implementers-guide/src/node/utility/network-bridge.md b/roadmap/implementers-guide/src/node/utility/network-bridge.md index ef04090629f177b21e56a1e1e5bc24e5fbc82079..9f51094336f4ef3314a27bba74848984558abd69 100644 --- a/roadmap/implementers-guide/src/node/utility/network-bridge.md +++ b/roadmap/implementers-guide/src/node/utility/network-bridge.md @@ -61,6 +61,10 @@ The `activated` and `deactivated` lists determine the evolution of our local vie If we are connected to the same peer on both peer-sets, we will send the peer two view updates as a result. +### Overseer Signal: BlockFinalized + +We update our view's `finalized_number` to the provided one and delay `ProtocolMessage::ViewUpdate` and `NetworkBridgeEvent::OurViewChange` till the next `ActiveLeavesUpdate`. + ### Network Event: Peer Connected Issue a `NetworkBridgeEvent::PeerConnected` for each [Event Handler](#event-handlers) of the peer-set and negotiated protocol version of the peer. @@ -82,11 +86,11 @@ Map the message onto the corresponding [Event Handler](#event-handlers) based on - Adjust peer reputation according to cost or benefit provided -### SendValidationMessage +### SendValidationMessage / SendValidationMessages - Issue a corresponding `ProtocolMessage` to each listed peer on the validation peer-set. -### SendCollationMessage +### SendCollationMessage / SendCollationMessages - Issue a corresponding `ProtocolMessage` to each listed peer on the collation peer-set. @@ -94,8 +98,8 @@ Map the message onto the corresponding [Event Handler](#event-handlers) based on - Determine the DHT keys to use for each validator based on the relay-chain state and Runtime API. - Recover the Peer IDs of the validators from the DHT. There may be more than one peer ID per validator. -- Accumulate all `(ValidatorId, PeerId)` pairs and send on the response channel. -- Feed all Peer IDs to peer set manager the underlying network provides, indicating the expected peer-set. +- Send all `(ValidatorId, PeerId)` pairs on the response channel. +- Feed all Peer IDs to peer set manager the underlying network provides. ## Event Handlers diff --git a/roadmap/implementers-guide/src/protocol-approval.md b/roadmap/implementers-guide/src/protocol-approval.md index 189a2d8e8c3afa6ada3acd1f2bc92c1d0a686fda..0ff1f2047f60e6c3cb9a26188949979caa238f2b 100644 --- a/roadmap/implementers-guide/src/protocol-approval.md +++ b/roadmap/implementers-guide/src/protocol-approval.md @@ -28,7 +28,7 @@ Approval has roughly two parts: - **Approval checks** listens to the assignments subsystem for outgoing assignment notices that we shall check specific candidates. It then performs these checks by first invoking the reconstruction subsystem to obtain the candidate, second invoking the candidate validity utility subsystem upon the candidate, and finally sending out an approval vote, or perhaps initiating a dispute. -These both run first as off-chain consensus protocols using messages gossiped among all validators, and second as an on-chain record of this off-chain protocols' progress after the fact. We need the on-chain protocol to provide rewards for the on-chain protocol, and doing an on-chain protocol simplify interaction with GRANDPA. +These both run first as off-chain consensus protocols using messages gossiped among all validators, and second as an on-chain record of this off-chain protocols' progress after the fact. We need the on-chain protocol to provide rewards for the off-chain protocol. Approval requires two gossiped message types, assignment notices created by its assignments subsystem, and approval votes sent by our approval checks subsystem when authorized by the candidate validity utility subsystem. @@ -38,7 +38,7 @@ We need two separate keys for the approval subsystem: - **Approval assignment keys** are sr25519/schnorrkel keys used only for the assignment criteria VRFs. We implicitly sign assignment notices with approval assignment keys by including their relay chain context and additional data in the VRF's extra message, but exclude these from its VRF input. -- **Approval vote keys** would only sign off on candidate parablock validity and has no natural key type restrictions. We could reuse the ed25519 grandpa keys for this purpose since these signatures control access to grandpa, although distant future node configurations might favor separate roles. +- **Approval vote keys** would only sign off on candidate parablock validity and has no natural key type restrictions. There's no need for this to actualy embody a new session key type. We just want to make a distinction between assignments and approvals, although distant future node configurations might favor separate roles. We re-use the same keys as are used for parachain backing in practice. Approval vote keys could relatively easily be handled by some hardened signer tooling, perhaps even HSMs assuming we select ed25519 for approval vote keys. Approval assignment keys might or might not support hardened signer tooling, but doing so sounds far more complex. In fact, assignment keys determine only VRF outputs that determine approval checker assignments, for which they can only act or not act, so they cannot equivocate, lie, etc. and represent little if any slashing risk for validator operators. @@ -102,11 +102,11 @@ Assignment criteria come in three flavors, `RelayVRFModulo`, `RelayVRFDelay` and Among these, we have two distinct VRF output computations: -`RelayVRFModulo` runs several distinct samples whose VRF input is the `RelayVRFStory` and the sample number. It computes the VRF output with `schnorrkel::vrf::VRFInOut::make_bytes` using the context "core", reduces this number modulo the number of availability cores, and outputs the candidate just declared available by, and included by aka leaving, that availability core. We drop any samples that return no candidate because no candidate was leaving the sampled availability core in this relay chain block. We choose three samples initially, but we could make polkadot more secure and efficient by increasing this to four or five, and reducing the backing checks accordingly. All successful `RelayVRFModulo` samples are assigned delay tranche zero. +`RelayVRFModulo` runs several distinct samples whose VRF input is the `RelayVRFStory` and the sample number. It computes the VRF output with `schnorrkel::vrf::VRFInOut::make_bytes` using the context "A&V Core", reduces this number modulo the number of availability cores, and outputs the candidate just declared available by, and included by aka leaving, that availability core. We drop any samples that return no candidate because no candidate was leaving the sampled availability core in this relay chain block. We choose three samples initially, but we could make polkadot more secure and efficient by increasing this to four or five, and reducing the backing checks accordingly. All successful `RelayVRFModulo` samples are assigned delay tranche zero. There is no sampling process for `RelayVRFDelay` and `RelayEquivocation`. We instead run them on specific candidates and they compute a delay from their VRF output. `RelayVRFDelay` runs for all candidates included under, aka declared available by, a relay chain block, and inputs the associated VRF output via `RelayVRFStory`. `RelayEquivocation` runs only on candidate block equivocations, and inputs their block hashes via the `RelayEquivocation` story. -`RelayVRFDelay` and `RelayEquivocation` both compute their output with `schnorrkel::vrf::VRFInOut::make_bytes` using the context "tranche" and reduce the result modulo `num_delay_tranches + zeroth_delay_tranche_width`, and consolidate results 0 through `zeroth_delay_tranche_width` to be 0. In this way, they ensure the zeroth delay tranche has `zeroth_delay_tranche_width+1` times as many assignments as any other tranche. +`RelayVRFDelay` and `RelayEquivocation` both compute their output with `schnorrkel::vrf::VRFInOut::make_bytes` using the context "A&V Tranche" and reduce the result modulo `num_delay_tranches + zeroth_delay_tranche_width`, and consolidate results 0 through `zeroth_delay_tranche_width` to be 0. In this way, they ensure the zeroth delay tranche has `zeroth_delay_tranche_width+1` times as many assignments as any other tranche. As future work (or TODO?), we should merge assignment notices with the same delay and story using `vrf_merge`. We cannot merge those with the same delay and different stories because `RelayEquivocationStory`s could change but `RelayVRFStory` never changes. @@ -152,7 +152,7 @@ TODO: When? Is this optimal for the network? etc. ## On-chain verification -We should verify approval on-chain to reward approval checkers and to simplify integration with GRANDPA. We therefore require the "no show" timeout to be longer than a relay chain slot so that we can witness "no shows" on-chain, which helps with both these goals. +We should verify approval on-chain to reward approval checkers. We therefore require the "no show" timeout to be longer than a relay chain slot so that we can witness "no shows" on-chain, which helps with this goal. The major challenge with an on-chain record of the off-chain process is adversarial block producers who may either censor votes or publish votes to the chain which cause other votes to be ignored and unrewards (reward stealing). In principle, all validators have some "tranche" at which they're assigned to the parachain candidate, which ensures we reach enough validators eventually. As noted above, we often retract "no shows" when the slow validator eventually shows up, so witnessing their initially being a "no show" helps manage rewards. @@ -186,6 +186,14 @@ Any validator could send their assignment notices and/or approval votes too earl Assignment notices being gossiped too early might create a denial of service vector. If so, we might exploit the relative time scheme that synchronises our clocks, which conceivably permits just dropping excessively early assignments. +## Finality GRANDPA Voting Rule + +The relay-chain requires validators to participate in GRANDPA. In GRANDPA, validators submit off-chain votes on what they believe to be the best block of the chain, and GRANDPA determines the common block contained by a supermajority of sub-chains. There are also additional constraints on what can be submitted based on results of previous rounds of voting. + +In order to avoid finalizing anything which has not received enough approval votes or is disputed, we will pair the approval protocol with an alteration to the GRANDPA voting strategy for honest nodes which causes them to vote only on chains where every parachain candidate within has been approved. Furthermore, the voting rule prevents voting for chains where there is any live dispute or any dispute has resolved to a candidate being invalid. + +Thus, the finalized relay-chain should contain only relay-chain blocks where a majority believe that every block within has been sufficiently approved. + ### Future work We could consider additional gossip messages with which nodes claims "slow availability" and/or "slow candidate" to fine tune the assignments "no show" system, but long enough "no show" delays suffice probably. diff --git a/roadmap/implementers-guide/src/runtime-api/availability-cores.md b/roadmap/implementers-guide/src/runtime-api/availability-cores.md index 561e817cca3f147c8ad7baa9b1c7d08a3380037e..87b06e2906d3f21090f41143b9dfb617c2297592 100644 --- a/roadmap/implementers-guide/src/runtime-api/availability-cores.md +++ b/roadmap/implementers-guide/src/runtime-api/availability-cores.md @@ -12,8 +12,7 @@ This is all the information that a validator needs about scheduling for the curr ```rust struct OccupiedCore { - /// The ID of the para occupying the core. - para_id: ParaId, + // NOTE: this has no ParaId as it can be deduced from the candidate descriptor. /// If this core is freed by availability, this is the assignment that is next up on this /// core, if any. None if there is nothing queued for this core. next_up_on_available: Option, @@ -31,6 +30,10 @@ struct OccupiedCore { availability: Bitfield, /// The group assigned to distribute availability pieces of this candidate. group_responsible: GroupIndex, + /// The hash of the candidate occupying the core. + candidate_hash: CandidateHash, + /// The descriptor of the candidate occupying the core. + candidate_descriptor: CandidateDescriptor, } struct ScheduledCore { diff --git a/roadmap/implementers-guide/src/runtime-api/historical_validation_code.md b/roadmap/implementers-guide/src/runtime-api/historical_validation_code.md new file mode 100644 index 0000000000000000000000000000000000000000..0b63f247df9360f5967bf68fd68ff04dadd5de13 --- /dev/null +++ b/roadmap/implementers-guide/src/runtime-api/historical_validation_code.md @@ -0,0 +1,7 @@ +# Historical Validation Code + +Fetch the historical validation code used by a para for candidates executed in the context of a given block height in the current chain. + +```rust +fn historical_validation_code(at: Block, para_id: ParaId, context_height: BlockNumber) -> Option; +``` diff --git a/roadmap/implementers-guide/src/runtime-api/validator-groups.md b/roadmap/implementers-guide/src/runtime-api/validator-groups.md index 42b39f976d19977df6e882127dd759fe9596d370..75a94e234979f496f2d1268ae0b9c08a11d25378 100644 --- a/roadmap/implementers-guide/src/runtime-api/validator-groups.md +++ b/roadmap/implementers-guide/src/runtime-api/validator-groups.md @@ -17,14 +17,10 @@ impl GroupRotationInfo { /// Returns the block number of the next rotation after the current block. If the current block /// is 10 and the rotation frequency is 5, this should return 15. - /// - /// If the group rotation frequency is 0, returns 0. fn next_rotation_at(&self) -> BlockNumber; /// Returns the block number of the last rotation before or including the current block. If the /// current block is 10 and the rotation frequency is 5, this should return 10. - /// - /// If the group rotation frequency is 0, returns 0. fn last_rotation_at(&self) -> BlockNumber; } diff --git a/roadmap/implementers-guide/src/runtime/dmp.md b/roadmap/implementers-guide/src/runtime/dmp.md new file mode 100644 index 0000000000000000000000000000000000000000..6f125ca46b5eca28035dc72566d2c634af0c7102 --- /dev/null +++ b/roadmap/implementers-guide/src/runtime/dmp.md @@ -0,0 +1,59 @@ +# DMP Module + +A module responsible for Downward Message Processing (DMP). See [Messaging Overview](../messaging.md) for more details. + +## Storage + +General storage entries + +```rust +/// Paras that are to be cleaned up at the end of the session. +/// The entries are sorted ascending by the para id. +OutgoingParas: Vec; +``` + +Storage layout required for implementation of DMP. + +```rust +/// The downward messages addressed for a certain para. +DownwardMessageQueues: map ParaId => Vec; +/// A mapping that stores the downward message queue MQC head for each para. +/// +/// Each link in this chain has a form: +/// `(prev_head, B, H(M))`, where +/// - `prev_head`: is the previous head hash or zero if none. +/// - `B`: is the relay-chain block number in which a message was appended. +/// - `H(M)`: is the hash of the message being appended. +DownwardMessageQueueHeads: map ParaId => Hash; +``` + +## Initialization + +No initialization routine runs for this module. + +## Routines + +Candidate Acceptance Function: + +* `check_processed_downward_messages(P: ParaId, processed_downward_messages: u32)`: + 1. Checks that `DownwardMessageQueues` for `P` is at least `processed_downward_messages` long. + 1. Checks that `processed_downward_messages` is at least 1 if `DownwardMessageQueues` for `P` is not empty. + +Candidate Enactment: + +* `prune_dmq(P: ParaId, processed_downward_messages: u32)`: + 1. Remove the first `processed_downward_messages` from the `DownwardMessageQueues` of `P`. + +Utility routines. + +`queue_downward_message(P: ParaId, M: DownwardMessage)`: + 1. Check if the size of `M` exceeds the `config.max_downward_message_size`. If so, return an error. + 1. Wrap `M` into `InboundDownwardMessage` using the current block number for `sent_at`. + 1. Obtain a new MQC link for the resulting `InboundDownwardMessage` and replace `DownwardMessageQueueHeads` for `P` with the resulting hash. + 1. Add the resulting `InboundDownwardMessage` into `DownwardMessageQueues` for `P`. + +## Session Change + +1. Drain `OutgoingParas`. For each `P` happened to be in the list: + 1. Remove all `DownwardMessageQueues` of `P`. + 1. Remove `DownwardMessageQueueHeads` for `P`. diff --git a/roadmap/implementers-guide/src/runtime/hrmp.md b/roadmap/implementers-guide/src/runtime/hrmp.md new file mode 100644 index 0000000000000000000000000000000000000000..145a2f28453050a75684bee40ed780abf50e8fca --- /dev/null +++ b/roadmap/implementers-guide/src/runtime/hrmp.md @@ -0,0 +1,280 @@ +# HRMP Module + +A module responsible for Horizontally Relay-routed Message Passing (HRMP). See [Messaging Overview](../messaging.md) for more details. + +## Storage + +General storage entries + +```rust +/// Paras that are to be cleaned up at the end of the session. +/// The entries are sorted ascending by the para id. +OutgoingParas: Vec; +``` + +HRMP related structs: + +```rust +/// A description of a request to open an HRMP channel. +struct HrmpOpenChannelRequest { + /// Indicates if this request was confirmed by the recipient. + confirmed: bool, + /// How many session boundaries ago this request was seen. + age: SessionIndex, + /// The amount that the sender supplied at the time of creation of this request. + sender_deposit: Balance, + /// The maximum message size that could be put into the channel. + max_message_size: u32, + /// The maximum number of messages that can be pending in the channel at once. + max_capacity: u32, + /// The maximum total size of the messages that can be pending in the channel at once. + max_total_size: u32, +} + +/// A metadata of an HRMP channel. +struct HrmpChannel { + /// The amount that the sender supplied as a deposit when opening this channel. + sender_deposit: Balance, + /// The amount that the recipient supplied as a deposit when accepting opening this channel. + recipient_deposit: Balance, + /// The maximum number of messages that can be pending in the channel at once. + max_capacity: u32, + /// The maximum total size of the messages that can be pending in the channel at once. + max_total_size: u32, + /// The maximum message size that could be put into the channel. + max_message_size: u32, + /// The current number of messages pending in the channel. + /// Invariant: should be less or equal to `max_capacity`. + msg_count: u32, + /// The total size in bytes of all message payloads in the channel. + /// Invariant: should be less or equal to `max_total_size`. + total_size: u32, + /// A head of the Message Queue Chain for this channel. Each link in this chain has a form: + /// `(prev_head, B, H(M))`, where + /// - `prev_head`: is the previous value of `mqc_head` or zero if none. + /// - `B`: is the [relay-chain] block number in which a message was appended + /// - `H(M)`: is the hash of the message being appended. + /// This value is initialized to a special value that consists of all zeroes which indicates + /// that no messages were previously added. + mqc_head: Option, +} +``` +HRMP related storage layout + +```rust +/// The set of pending HRMP open channel requests. +/// +/// The set is accompanied by a list for iteration. +/// +/// Invariant: +/// - There are no channels that exists in list but not in the set and vice versa. +HrmpOpenChannelRequests: map HrmpChannelId => Option; +HrmpOpenChannelRequestsList: Vec; + +/// This mapping tracks how many open channel requests are inititated 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; +/// This mapping tracks how many open channel requests were accepted by a given recipient para. +/// Invariant: `HrmpOpenChannelRequests` should contain the same number of items `(_, X)` with +/// `confirmed` set to true, as the number of `HrmpAcceptedChannelRequestCount` for `X`. +HrmpAcceptedChannelRequestCount: map ParaId => u32; + +/// A set of pending HRMP close channel requests that are going to be closed during the session change. +/// Used for checking if a given channel is registered for closure. +/// +/// The set is accompanied by a list for iteration. +/// +/// Invariant: +/// - There are no channels that exists in list but not in the set and vice versa. +HrmpCloseChannelRequests: map HrmpChannelId => Option<()>; +HrmpCloseChannelRequestsList: Vec; + +/// The HRMP watermark associated with each para. +/// Invariant: +/// - each para `P` used here as a key should satisfy `Paras::is_valid_para(P)` within a session. +HrmpWatermarks: map ParaId => Option; +/// HRMP channel data associated with each para. +/// Invariant: +/// - each participant in the channel should satisfy `Paras::is_valid_para(P)` within a session. +HrmpChannels: map HrmpChannelId => Option; +/// Ingress/egress indexes allow to find all the senders and receivers given the opposite +/// side. I.e. +/// +/// (a) ingress index allows to find all the senders for a given recipient. +/// (b) egress index allows to find all the recipients for a given sender. +/// +/// Invariants: +/// - for each ingress index entry for `P` each item `I` in the index should present in `HrmpChannels` +/// as `(I, P)`. +/// - for each egress index entry for `P` each item `E` in the index should present in `HrmpChannels` +/// as `(P, E)`. +/// - there should be no other dangling channels in `HrmpChannels`. +/// - the vectors are sorted. +HrmpIngressChannelsIndex: map ParaId => Vec; +HrmpEgressChannelsIndex: map ParaId => Vec; +/// Storage for the messages for each channel. +/// Invariant: cannot be non-empty if the corresponding channel in `HrmpChannels` is `None`. +HrmpChannelContents: map HrmpChannelId => Vec; +/// Maintains a mapping that can be used to answer the question: +/// What paras sent a message at the given block number for a given reciever. +/// Invariants: +/// - The inner `Vec` is never empty. +/// - The inner `Vec` cannot store two same `ParaId`. +/// - The outer vector is sorted ascending by block number and cannot store two items with the same +/// block number. +HrmpChannelDigests: map ParaId => Vec<(BlockNumber, Vec)>; +``` + +## Initialization + +No initialization routine runs for this module. + +## Routines + +Candidate Acceptance Function: + +* `check_hrmp_watermark(P: ParaId, new_hrmp_watermark)`: + 1. `new_hrmp_watermark` should be strictly greater than the value of `HrmpWatermarks` for `P` (if any). + 1. `new_hrmp_watermark` must not be greater than the context's block number. + 1. `new_hrmp_watermark` should be either + 1. equal to the context's block number + 1. or in `HrmpChannelDigests` for `P` an entry with the block number should exist +* `check_outbound_hrmp(sender: ParaId, Vec)`: + 1. Checks that there are at most `config.hrmp_max_message_num_per_candidate` messages. + 1. Checks that horizontal messages are sorted by ascending recipient ParaId and there is no two horizontal messages have the same recipient. + 1. For each horizontal message `M` with the channel `C` identified by `(sender, M.recipient)` check: + 1. exists + 1. `M`'s payload size doesn't exceed a preconfigured limit `C.max_message_size` + 1. `M`'s payload size summed with the `C.total_size` doesn't exceed a preconfigured limit `C.max_total_size`. + 1. `C.msg_count + 1` doesn't exceed a preconfigured limit `C.max_capacity`. + +Candidate Enactment: + +* `queue_outbound_hrmp(sender: ParaId, Vec)`: + 1. For each horizontal message `HM` with the channel `C` identified by `(sender, HM.recipient)`: + 1. Append `HM` into `HrmpChannelContents` that corresponds to `C` with `sent_at` equals to the current block number. + 1. Locate or create an entry in `HrmpChannelDigests` for `HM.recipient` and append `sender` into the entry's list. + 1. Increment `C.msg_count` + 1. Increment `C.total_size` by `HM`'s payload size + 1. Append a new link to the MQC and save the new head in `C.mqc_head`. Note that the current block number as of enactment is used for the link. +* `prune_hrmp(recipient, new_hrmp_watermark)`: + 1. From `HrmpChannelDigests` for `recipient` remove all entries up to an entry with block number equal to `new_hrmp_watermark`. + 1. From the removed digests construct a set of paras that sent new messages within the interval between the old and new watermarks. + 1. For each channel `C` identified by `(sender, recipient)` for each `sender` coming from the set, prune messages up to the `new_hrmp_watermark`. + 1. For each pruned message `M` from channel `C`: + 1. Decrement `C.msg_count` + 1. Decrement `C.total_size` by `M`'s payload size. + 1. Set `HrmpWatermarks` for `P` to be equal to `new_hrmp_watermark` + > NOTE: That collecting digests can be inefficient and the time it takes grows very fast. Thanks to the aggresive + > parametrization this shouldn't be a big of a deal. + > If that becomes a problem consider introducing an extra dictionary which says at what block the given sender + > sent a message to the recipient. + +The following routine is intended to be called in the same time when `Paras::schedule_para_cleanup` is called. + +`schedule_para_cleanup(ParaId)`: + 1. Add the para into the `OutgoingParas` vector maintaining the sorted order. + +## Entry-points + +The following entry-points are meant to be used for HRMP channel management. + +Those entry-points are meant to be called from a parachain. `origin` is defined as the `ParaId` of +the parachain executed the message. + +* `hrmp_init_open_channel(recipient, proposed_max_capacity, proposed_max_message_size)`: + 1. Check that the `origin` is not `recipient`. + 1. Check that `proposed_max_capacity` is less or equal to `config.hrmp_channel_max_capacity` and greater than zero. + 1. Check that `proposed_max_message_size` is less or equal to `config.hrmp_channel_max_message_size` and greater than zero. + 1. Check that `recipient` is a valid para. + 1. Check that there is no existing channel for `(origin, recipient)` in `HrmpChannels`. + 1. Check that there is no existing open channel request (`origin`, `recipient`) in `HrmpOpenChannelRequests`. + 1. Check that the sum of the number of already opened HRMP channels by the `origin` (the size + of the set found `HrmpEgressChannelsIndex` for `origin`) and the number of open requests by the + `origin` (the value from `HrmpOpenChannelRequestCount` for `origin`) doesn't exceed the limit of + channels (`config.hrmp_max_parachain_outbound_channels` or `config.hrmp_max_parathread_outbound_channels`) minus 1. + 1. Check that `origin`'s balance is more or equal to `config.hrmp_sender_deposit` + 1. Reserve the deposit for the `origin` according to `config.hrmp_sender_deposit` + 1. Increase `HrmpOpenChannelRequestCount` by 1 for `origin`. + 1. Append `(origin, recipient)` to `HrmpOpenChannelRequestsList`. + 1. Add a new entry to `HrmpOpenChannelRequests` for `(origin, recipient)` + 1. Set `sender_deposit` to `config.hrmp_sender_deposit` + 1. Set `max_capacity` to `proposed_max_capacity` + 1. Set `max_message_size` to `proposed_max_message_size` + 1. Set `max_total_size` to `config.hrmp_channel_max_total_size` + 1. Send a downward message to `recipient` notifying about an inbound HRMP channel request. + - The DM is sent using `queue_downward_message`. + - The DM is represented by the `HrmpNewChannelOpenRequest` XCM message. + - `sender` is set to `origin`, + - `max_message_size` is set to `proposed_max_message_size`, + - `max_capacity` is set to `proposed_max_capacity`. +* `hrmp_accept_open_channel(sender)`: + 1. Check that there is an existing request between (`sender`, `origin`) in `HrmpOpenChannelRequests` + 1. Check that it is not confirmed. + 1. Check that the sum of the number of inbound HRMP channels opened to `origin` (the size of the set + found in `HrmpIngressChannelsIndex` for `origin`) and the number of accepted open requests by the `origin` + (the value from `HrmpAcceptedChannelRequestCount` for `origin`) doesn't exceed the limit of channels + (`config.hrmp_max_parachain_inbound_channels` or `config.hrmp_max_parathread_inbound_channels`) + minus 1. + 1. Check that `origin`'s balance is more or equal to `config.hrmp_recipient_deposit`. + 1. Reserve the deposit for the `origin` according to `config.hrmp_recipient_deposit` + 1. For the request in `HrmpOpenChannelRequests` identified by `(sender, P)`, set `confirmed` flag to `true`. + 1. Increase `HrmpAcceptedChannelRequestCount` by 1 for `origin`. + 1. Send a downward message to `sender` notifying that the channel request was accepted. + - The DM is sent using `queue_downward_message`. + - The DM is represented by the `HrmpChannelAccepted` XCM message. + - `recipient` is set to `origin`. +* `hrmp_close_channel(ch)`: + 1. Check that `origin` is either `ch.sender` or `ch.recipient` + 1. Check that `HrmpChannels` for `ch` exists. + 1. Check that `ch` is not in the `HrmpCloseChannelRequests` set. + 1. If not already there, insert a new entry `Some(())` to `HrmpCloseChannelRequests` for `ch` + and append `ch` to `HrmpCloseChannelRequestsList`. + 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`, + - `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`. + +## Session Change + +1. Drain `OutgoingParas`. For each `P` happened to be in the list: + 1. Remove all inbound channels of `P`, i.e. `(_, P)`, + 1. Remove all outbound channels of `P`, i.e. `(P, _)`, + 1. Remove `HrmpOpenChannelRequestCount` for `P` + 1. Remove `HrmpAcceptedChannelRequestCount` for `P`. +1. For each channel designator `D` in `HrmpOpenChannelRequestsList` we query the request `R` from `HrmpOpenChannelRequests`: + 1. if `R.confirmed = false`: + 1. increment `R.age` by 1. + 1. if `R.age` reached a preconfigured time-to-live limit `config.hrmp_open_request_ttl`, then: + 1. refund `R.sender_deposit` to the sender + 1. decrement `HrmpOpenChannelRequestCount` for `D.sender` by 1. + 1. remove `R` + 1. remove `D` + 2. if `R.confirmed = true`, + 1. if both `D.sender` and `D.recipient` are not offboarded. + 1. create a new channel `C` between `(D.sender, D.recipient)`. + 1. Initialize the `C.sender_deposit` with `R.sender_deposit` and `C.recipient_deposit` + with the value found in the configuration `config.hrmp_recipient_deposit`. + 1. Insert `sender` into the set `HrmpIngressChannelsIndex` for the `recipient`. + 1. Insert `recipient` into the set `HrmpEgressChannelsIndex` for the `sender`. + 1. decrement `HrmpOpenChannelRequestCount` for `D.sender` by 1. + 1. decrement `HrmpAcceptedChannelRequestCount` for `D.recipient` by 1. + 1. remove `R` + 1. remove `D` +1. For each HRMP channel designator `D` in `HrmpCloseChannelRequestsList` + 1. remove the channel identified by `D`, if exists. + 1. remove `D` from `HrmpCloseChannelRequests`. + 1. remove `D` from `HrmpCloseChannelRequestsList` + +To remove a HRMP channel `C` identified with a tuple `(sender, recipient)`: + +1. Return `C.sender_deposit` to the `sender`. +1. Return `C.recipient_deposit` to the `recipient`. +1. Remove `C` from `HrmpChannels`. +1. Remove `C` from `HrmpChannelContents`. +1. Remove `recipient` from the set `HrmpEgressChannelsIndex` for `sender`. +1. Remove `sender` from the set `HrmpIngressChannelsIndex` for `recipient`. diff --git a/roadmap/implementers-guide/src/runtime/inclusion.md b/roadmap/implementers-guide/src/runtime/inclusion.md index 17dbdc94cc022834a326ec4c48057ee93cc13d82..5cabb109dd548289aba47eab2ae19e24baf94fce 100644 --- a/roadmap/implementers-guide/src/runtime/inclusion.md +++ b/roadmap/implementers-guide/src/runtime/inclusion.md @@ -14,9 +14,11 @@ struct AvailabilityBitfield { struct CandidatePendingAvailability { core: CoreIndex, // availability core + hash: CandidateHash, descriptor: CandidateDescriptor, availability_votes: Bitfield, // one bit per validator. relay_parent_number: BlockNumber, // number of the relay-parent. + backers: Bitfield, // one bit per validator, set for those who backed the candidate. backed_in_number: BlockNumber, } ``` @@ -56,9 +58,8 @@ All failed checks should lead to an unrecoverable error making the block invalid 1. apply each bit of bitfield to the corresponding pending candidate. looking up parathread cores using the `core_lookup`. Disregard bitfields that have a `1` bit for any free cores. 1. For each applied bit of each availability-bitfield, set the bit for the validator in the `CandidatePendingAvailability`'s `availability_votes` bitfield. Track all candidates that now have >2/3 of bits set in their `availability_votes`. These candidates are now available and can be enacted. 1. For all now-available candidates, invoke the `enact_candidate` routine with the candidate and relay-parent number. - 1. > TODO: pass it onwards to `Validity` module. 1. Return a list of freed cores consisting of the cores where candidates have become available. -* `process_candidates(BackedCandidates, scheduled: Vec, group_validators: Fn(GroupIndex) -> Option>)`: +* `process_candidates(parent_storage_root, BackedCandidates, scheduled: Vec, group_validators: Fn(GroupIndex) -> Option>)`: 1. check that each candidate corresponds to a scheduled core and that they are ordered in the same order the cores appear in assignments in `scheduled`. 1. check that `scheduled` is sorted ascending by `CoreIndex`, without duplicates. 1. check that there is no candidate pending availability for any scheduled `ParaId`. @@ -68,21 +69,21 @@ All failed checks should lead to an unrecoverable error making the block invalid 1. Ensure that any code upgrade scheduled by the candidate does not happen within `config.validation_upgrade_frequency` of `Paras::last_code_upgrade(para_id, true)`, if any, comparing against the value of `Paras::FutureCodeUpgrades` for the given para ID. 1. Check the collator's signature on the candidate data. 1. check the backing of the candidate using the signatures and the bitfields, comparing against the validators assigned to the groups, fetched with the `group_validators` lookup. - 1. call `Router::check_upward_messages(para, commitments.upward_messages)` to check that the upward messages are valid. - 1. call `Router::check_processed_downward_messages(para, commitments.processed_downward_messages)` to check that the DMQ is properly drained. - 1. call `Router::check_hrmp_watermark(para, commitments.hrmp_watermark)` for each candidate to check rules of processing the HRMP watermark. - 1. check that in the commitments of each candidate the horizontal messages are sorted by ascending recipient ParaId and there is no two horizontal messages have the same recipient. - 1. using `Router::verify_outbound_hrmp(sender, commitments.horizontal_messages)` ensure that the each candidate send a valid set of horizontal messages + 1. call `Ump::check_upward_messages(para, commitments.upward_messages)` to check that the upward messages are valid. + 1. call `Dmp::check_processed_downward_messages(para, commitments.processed_downward_messages)` to check that the DMQ is properly drained. + 1. call `Hrmp::check_hrmp_watermark(para, commitments.hrmp_watermark)` for each candidate to check rules of processing the HRMP watermark. + 1. using `Hrmp::check_outbound_hrmp(sender, commitments.horizontal_messages)` ensure that the each candidate sent a valid set of horizontal messages 1. create an entry in the `PendingAvailability` map for each backed candidate with a blank `availability_votes` bitfield. 1. create a corresponding entry in the `PendingAvailabilityCommitments` with the commitments. 1. Return a `Vec` of all scheduled cores of the list of passed assignments that a candidate was successfully backed for, sorted ascending by CoreIndex. * `enact_candidate(relay_parent_number: BlockNumber, CommittedCandidateReceipt)`: 1. If the receipt contains a code upgrade, Call `Paras::schedule_code_upgrade(para_id, code, relay_parent_number + config.validationl_upgrade_delay)`. > TODO: Note that this is safe as long as we never enact candidates where the relay parent is across a session boundary. In that case, which we should be careful to avoid with contextual execution, the configuration might have changed and the para may de-sync from the host's understanding of it. - 1. call `Router::enact_upward_messages` for each backed candidate, using the [`UpwardMessage`s](../types/messages.md#upward-message) from the [`CandidateCommitments`](../types/candidate.md#candidate-commitments). - 1. call `Router::queue_outbound_hrmp` with the para id of the candidate and the list of horizontal messages taken from the commitment, - 1. call `Router::prune_hrmp` with the para id of the candiate and the candidate's `hrmp_watermark`. - 1. call `Router::prune_dmq` with the para id of the candidate and the candidate's `processed_downward_messages`. + 1. Reward all backing validators of each candidate, contained within the `backers` field. + 1. call `Ump::enact_upward_messages` for each backed candidate, using the [`UpwardMessage`s](../types/messages.md#upward-message) from the [`CandidateCommitments`](../types/candidate.md#candidate-commitments). + 1. call `Dmp::prune_dmq` with the para id of the candidate and the candidate's `processed_downward_messages`. + 1. call `Hrmp::prune_hrmp` with the para id of the candiate and the candidate's `hrmp_watermark`. + 1. call `Hrmp::queue_outbound_hrmp` with the para id of the candidate and the list of horizontal messages taken from the commitment, 1. Call `Paras::note_new_head` using the `HeadData` from the receipt and `relay_parent_number`. * `collect_pending`: diff --git a/roadmap/implementers-guide/src/runtime/inclusioninherent.md b/roadmap/implementers-guide/src/runtime/inclusioninherent.md index d026cf180aa5217f929468cc4e1042c11be60b89..3f239896424b346d7c210fdc3bdff05ba80c3b9c 100644 --- a/roadmap/implementers-guide/src/runtime/inclusioninherent.md +++ b/roadmap/implementers-guide/src/runtime/inclusioninherent.md @@ -16,11 +16,13 @@ Included: Option<()>, ## Entry Points -* `inclusion`: This entry-point accepts two parameters: [`Bitfields`](../types/availability.md#signed-availability-bitfield) and [`BackedCandidates`](../types/backing.md#backed-candidate). +* `inclusion`: This entry-point accepts three parameters: The relay-chain parent block header, [`Bitfields`](../types/availability.md#signed-availability-bitfield) and [`BackedCandidates`](../types/backing.md#backed-candidate). + 1. Hash the parent header and make sure that it corresponds to the block hash of the parent (tracked by the `frame_system` FRAME module), 1. The `Bitfields` are first forwarded to the `Inclusion::process_bitfields` routine, returning a set of freed cores. Provide a `Scheduler::core_para` as a core-lookup to the `process_bitfields` routine. Annotate each of these freed cores with `FreedReason::Concluded`. 1. If `Scheduler::availability_timeout_predicate` is `Some`, invoke `Inclusion::collect_pending` using it, and add timed-out cores to the free cores, annotated with `FreedReason::TimedOut`. 1. Invoke `Scheduler::schedule(freed)` - 1. Invoke the `Inclusion::process_candidates` routine with the parameters `(backed_candidates, Scheduler::scheduled(), Scheduler::group_validators)`. + 1. Extract `parent_storage_root` from the parent header, + 1. Invoke the `Inclusion::process_candidates` routine with the parameters `(parent_storage_root, backed_candidates, Scheduler::scheduled(), Scheduler::group_validators)`. 1. Call `Scheduler::occupied` using the return value of the `Inclusion::process_candidates` call above, first sorting the list of assigned core indices. - 1. Call the `Router::process_upward_dispatchables` routine to execute all messages in upward dispatch queues. + 1. Call the `Ump::process_pending_upward_messages` routine to execute all messages in upward dispatch queues. 1. If all of the above succeeds, set `Included` to `Some(())`. diff --git a/roadmap/implementers-guide/src/runtime/initializer.md b/roadmap/implementers-guide/src/runtime/initializer.md index 5fd2bc3bd60f2471f04db948c70fe4b63b185b73..361fab38c811319a5f0b329edd6f889b1c6b36b1 100644 --- a/roadmap/implementers-guide/src/runtime/initializer.md +++ b/roadmap/implementers-guide/src/runtime/initializer.md @@ -23,8 +23,10 @@ The other parachains modules are initialized in this order: 1. Paras 1. Scheduler 1. Inclusion -1. Validity. -1. Router. +1. SessionInfo +1. DMP +1. UMP +1. HRMP The [Configuration Module](configuration.md) is first, since all other modules need to operate under the same configuration as each other. It would lead to inconsistency if, for example, the scheduler ran first and then the configuration was updated before the Inclusion module. diff --git a/roadmap/implementers-guide/src/runtime/paras.md b/roadmap/implementers-guide/src/runtime/paras.md index dbb169af17514a530e50cbe12bb99733c4ca394f..0958c88d510fd1a399bdc6622ff9384eb61b3a59 100644 --- a/roadmap/implementers-guide/src/runtime/paras.md +++ b/roadmap/implementers-guide/src/runtime/paras.md @@ -111,6 +111,7 @@ OutgoingParas: Vec; * `note_new_head(ParaId, HeadData, BlockNumber)`: note that a para has progressed to a new head, where the new head was executed in the context of a relay-chain block with given number. This will apply pending code upgrades based on the block number provided. * `validation_code_at(ParaId, at: BlockNumber, assume_intermediate: Option)`: Fetches the validation code to be used when validating a block in the context of the given relay-chain height. A second block number parameter may be used to tell the lookup to proceed as if an intermediate parablock has been included at the given relay-chain height. This may return past, current, or (with certain choices of `assume_intermediate`) future code. `assume_intermediate`, if provided, must be before `at`. If the validation code has been pruned, this will return `None`. * `is_parathread(ParaId) -> bool`: Returns true if the para ID references any live parathread. +* `is_valid_para(ParaId) -> bool`: Returns true if the para ID references either a live parathread or live parachain. * `last_code_upgrade(id: ParaId, include_future: bool) -> Option`: The block number of the last scheduled upgrade of the requested para. Includes future upgrades if the flag is set. This is the `expected_at` number, not the `activated_at` number. * `persisted_validation_data(id: ParaId) -> Option`: Get the PersistedValidationData of the given para, assuming the context is the parent block. Returns `None` if the para is not known. diff --git a/roadmap/implementers-guide/src/runtime/router.md b/roadmap/implementers-guide/src/runtime/router.md deleted file mode 100644 index 37fc2c6a76364e87ef0e32911127eecd240a9260..0000000000000000000000000000000000000000 --- a/roadmap/implementers-guide/src/runtime/router.md +++ /dev/null @@ -1,315 +0,0 @@ -# Router Module - -The Router module is responsible for all messaging mechanisms supported between paras and the relay chain, specifically: UMP, DMP, HRMP and later XCMP. - -## Storage - -Storage layout: - -```rust -/// Paras that are to be cleaned up at the end of the session. -/// The entries are sorted ascending by the para id. -OutgoingParas: Vec; -/// Dispatchable objects ready to be dispatched onto the relay chain. The messages are processed in FIFO order. -/// This is subject to `max_upward_queue_count` and -/// `watermark_queue_size` from `HostConfiguration`. -RelayDispatchQueues: map ParaId => Vec; -/// Size of the dispatch queues. Caches sizes of the queues in `RelayDispatchQueue`. -/// First item in the tuple is the count of messages and second -/// is the total length (in bytes) of the message payloads. -RelayDispatchQueueSize: map ParaId => (u32, u32); -/// The ordered list of `ParaId`s that have a `RelayDispatchQueue` entry. -NeedsDispatch: Vec; -/// This is the para that gets will get dispatched first during the next upward dispatchable queue -/// execution round. -NextDispatchRoundStartWith: Option; -``` - -### Downward Message Passing (DMP) - -Storage layout required for implementation of DMP. - -```rust -/// The downward messages addressed for a certain para. -DownwardMessageQueues: map ParaId => Vec; -/// A mapping that stores the downward message queue MQC head for each para. -/// -/// Each link in this chain has a form: -/// `(prev_head, B, H(M))`, where -/// - `prev_head`: is the previous head hash. -/// - `B`: is the relay-chain block number in which a message was appended. -/// - `H(M)`: is the hash of the message being appended. -DownwardMessageQueueHeads: map ParaId => Option; -``` - -### HRMP - -HRMP related structs: - -```rust -/// A description of a request to open an HRMP channel. -struct HrmpOpenChannelRequest { - /// Indicates if this request was confirmed by the recipient. - confirmed: bool, - /// How many session boundaries ago this request was seen. - age: SessionIndex, - /// The amount that the sender supplied at the time of creation of this request. - sender_deposit: Balance, - /// The maximum number of messages that can be pending in the channel at once. - limit_used_places: u32, - /// The maximum total size of the messages that can be pending in the channel at once. - limit_used_bytes: u32, -} - -/// A metadata of an HRMP channel. -struct HrmpChannel { - /// The amount that the sender supplied as a deposit when opening this channel. - sender_deposit: Balance, - /// The amount that the recipient supplied as a deposit when accepting opening this channel. - recipient_deposit: Balance, - /// The maximum number of messages that can be pending in the channel at once. - limit_used_places: u32, - /// The maximum total size of the messages that can be pending in the channel at once. - limit_used_bytes: u32, - /// The maximum message size that could be put into the channel. - limit_message_size: u32, - /// The current number of messages pending in the channel. - /// Invariant: should be less or equal to `limit_used_places`. - used_places: u32, - /// The total size in bytes of all message payloads in the channel. - /// Invariant: should be less or equal to `limit_used_bytes`. - used_bytes: u32, - /// A head of the Message Queue Chain for this channel. Each link in this chain has a form: - /// `(prev_head, B, H(M))`, where - /// - `prev_head`: is the previous value of `mqc_head`. - /// - `B`: is the [relay-chain] block number in which a message was appended - /// - `H(M)`: is the hash of the message being appended. - /// This value is initialized to a special value that consists of all zeroes which indicates - /// that no messages were previously added. - mqc_head: Hash, -} -``` -HRMP related storage layout - -```rust -/// The set of pending HRMP open channel requests. -/// -/// The set is accompanied by a list for iteration. -/// -/// Invariant: -/// - There are no channels that exists in list but not in the set and vice versa. -HrmpOpenChannelRequests: map HrmpChannelId => Option; -HrmpOpenChannelRequestsList: Vec; - -/// This mapping tracks how many open channel requests are inititated 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; -/// This mapping tracks how many open channel requests were accepted by a given recipient para. -/// Invariant: `HrmpOpenChannelRequests` should contain the same number of items `(_, X)` with -/// `confirmed` set to true, as the number of `HrmpAcceptedChannelRequestCount` for `X`. -HrmpAcceptedChannelRequestCount: map ParaId => u32; - -/// A set of pending HRMP close channel requests that are going to be closed during the session change. -/// Used for checking if a given channel is registered for closure. -/// -/// The set is accompanied by a list for iteration. -/// -/// Invariant: -/// - There are no channels that exists in list but not in the set and vice versa. -HrmpCloseChannelRequests: map HrmpChannelId => Option<()>; -HrmpCloseChannelRequestsList: Vec; - -/// The HRMP watermark associated with each para. -HrmpWatermarks: map ParaId => Option; -/// HRMP channel data associated with each para. -HrmpChannels: map HrmpChannelId => Option; -/// The indexes that map all senders to their recievers and vise versa. -/// Invariants: -/// - for each ingress index entry for `P` each item `I` in the index should present in `HrmpChannels` as `(I, P)`. -/// - for each egress index entry for `P` each item `E` in the index should present in `HrmpChannels` as `(P, E)`. -/// - there should be no other dangling channels in `HrmpChannels`. -HrmpIngressChannelsIndex: map ParaId => Vec; -HrmpEgressChannelsIndex: map ParaId => Vec; -/// Storage for the messages for each channel. -/// Invariant: cannot be non-empty if the corresponding channel in `HrmpChannels` is `None`. -HrmpChannelContents: map HrmpChannelId => Vec; -/// Maintains a mapping that can be used to answer the question: -/// What paras sent a message at the given block number for a given reciever. -/// Invariant: The para ids vector is never empty. -HrmpChannelDigests: map ParaId => Vec<(BlockNumber, Vec)>; -``` - -## Initialization - -No initialization routine runs for this module. - -## Routines - -Candidate Acceptance Function: - -* `check_upward_messages(P: ParaId, Vec`): - 1. Checks that there are at most `config.max_upward_message_num_per_candidate` messages. - 1. Checks each upward message `M` individually depending on its kind: - 1. If the message kind is `Dispatchable`: - 1. Verify that `RelayDispatchQueueSize` for `P` has enough capacity for the message (NOTE that should include all processed - upward messages of the `Dispatchable` kind up to this point!) - 1. If the message kind is `HrmpInitOpenChannel(recipient, max_places, max_message_size)`: - 1. Check that the `P` is not `recipient`. - 1. Check that `max_places` is less or equal to `config.hrmp_channel_max_places`. - 1. Check that `max_message_size` is less or equal to `config.hrmp_channel_max_message_size`. - 1. Check that `recipient` is a valid para. - 1. Check that there is no existing channel for `(P, recipient)` in `HrmpChannels`. - 1. Check that there is no existing open channel request (`P`, `recipient`) in `HrmpOpenChannelRequests`. - 1. Check that the sum of the number of already opened HRMP channels by the `P` (the size - of the set found `HrmpEgressChannelsIndex` for `P`) and the number of open requests by the - `P` (the value from `HrmpOpenChannelRequestCount` for `P`) doesn't exceed the limit of - channels (`config.hrmp_max_parachain_outbound_channels` or `config.hrmp_max_parathread_outbound_channels`) minus 1. - 1. Check that `P`'s balance is more or equal to `config.hrmp_sender_deposit` - 1. If the message kind is `HrmpAcceptOpenChannel(sender)`: - 1. Check that there is an existing request between (`sender`, `P`) in `HrmpOpenChannelRequests` - 1. Check that it is not confirmed. - 1. Check that `P`'s balance is more or equal to `config.hrmp_recipient_deposit`. - 1. Check that the sum of the number of inbound HRMP channels opened to `P` (the size of the set - found in `HrmpIngressChannelsIndex` for `P`) and the number of accepted open requests by the `P` - (the value from `HrmpAcceptedChannelRequestCount` for `P`) doesn't exceed the limit of channels - (`config.hrmp_max_parachain_inbound_channels` or `config.hrmp_max_parathread_inbound_channels`) - minus 1. - 1. If the message kind is `HrmpCloseChannel(ch)`: - 1. Check that `P` is either `ch.sender` or `ch.recipient` - 1. Check that `HrmpChannels` for `ch` exists. - 1. Check that `ch` is not in the `HrmpCloseChannelRequests` set. -* `check_processed_downward_messages(P: ParaId, processed_downward_messages)`: - 1. Checks that `DownwardMessageQueues` for `P` is at least `processed_downward_messages` long. - 1. Checks that `processed_downward_messages` is at least 1 if `DownwardMessageQueues` for `P` is not empty. -* `check_hrmp_watermark(P: ParaId, new_hrmp_watermark)`: - 1. `new_hrmp_watermark` should be strictly greater than the value of `HrmpWatermarks` for `P` (if any). - 1. `new_hrmp_watermark` must not be greater than the context's block number. - 1. `new_hrmp_watermark` should be either - 1. equal to the context's block number - 1. or in `HrmpChannelDigests` for `P` an entry with the block number should exist -* `verify_outbound_hrmp(sender: ParaId, Vec)`: - 1. For each horizontal message `M` with the channel `C` identified by `(sender, M.recipient)` check: - 1. exists - 1. `M`'s payload size doesn't exceed a preconfigured limit `C.limit_message_size` - 1. `M`'s payload size summed with the `C.used_bytes` doesn't exceed a preconfigured limit `C.limit_used_bytes`. - 1. `C.used_places + 1` doesn't exceed a preconfigured limit `C.limit_used_places`. - -Candidate Enactment: - -* `queue_outbound_hrmp(sender: ParaId, Vec)`: - 1. For each horizontal message `HM` with the channel `C` identified by `(sender, HM.recipient)`: - 1. Append `HM` into `HrmpChannelContents` that corresponds to `C` with `sent_at` equals to the current block number. - 1. Locate or create an entry in ``HrmpChannelDigests`` for `HM.recipient` and append `sender` into the entry's list. - 1. Increment `C.used_places` - 1. Increment `C.used_bytes` by `HM`'s payload size - 1. Append a new link to the MQC and save the new head in `C.mqc_head`. Note that the current block number as of enactment is used for the link. -* `prune_hrmp(recipient, new_hrmp_watermark)`: - 1. From ``HrmpChannelDigests`` for `recipient` remove all entries up to an entry with block number equal to `new_hrmp_watermark`. - 1. From the removed digests construct a set of paras that sent new messages within the interval between the old and new watermarks. - 1. For each channel `C` identified by `(sender, recipient)` for each `sender` coming from the set, prune messages up to the `new_hrmp_watermark`. - 1. For each pruned message `M` from channel `C`: - 1. Decrement `C.used_places` - 1. Decrement `C.used_bytes` by `M`'s payload size. - 1. Set `HrmpWatermarks` for `P` to be equal to `new_hrmp_watermark` -* `prune_dmq(P: ParaId, processed_downward_messages)`: - 1. Remove the first `processed_downward_messages` from the `DownwardMessageQueues` of `P`. -* `enact_upward_messages(P: ParaId, Vec)`: - 1. Process all upward messages in order depending on their kinds: - 1. If the message kind is `Dispatchable`: - 1. Append the message to `RelayDispatchQueues` for `P` - 1. Increment the size and the count in `RelayDispatchQueueSize` for `P`. - 1. Ensure that `P` is present in `NeedsDispatch`. - 1. If the message kind is `HrmpInitOpenChannel(recipient, max_places, max_message_size)`: - 1. Increase `HrmpOpenChannelRequestCount` by 1 for `P`. - 1. Append `(P, recipient)` to `HrmpOpenChannelRequestsList`. - 1. Add a new entry to `HrmpOpenChannelRequests` for `(sender, recipient)` - 1. Set `sender_deposit` to `config.hrmp_sender_deposit` - 1. Set `limit_used_places` to `max_places` - 1. Set `limit_message_size` to `max_message_size` - 1. Set `limit_used_bytes` to `config.hrmp_channel_max_size` - 1. Reserve the deposit for the `P` according to `config.hrmp_sender_deposit` - 1. If the message kind is `HrmpAcceptOpenChannel(sender)`: - 1. Reserve the deposit for the `P` according to `config.hrmp_recipient_deposit` - 1. For the request in `HrmpOpenChannelRequests` identified by `(sender, P)`, set `confirmed` flag to `true`. - 1. Increase `HrmpAcceptedChannelRequestCount` by 1 for `P`. - 1. If the message kind is `HrmpCloseChannel(ch)`: - 1. If not already there, insert a new entry `Some(())` to `HrmpCloseChannelRequests` for `ch` - and append `ch` to `HrmpCloseChannelRequestsList`. - -The following routine is intended to be called in the same time when `Paras::schedule_para_cleanup` is called. - -`schedule_para_cleanup(ParaId)`: - 1. Add the para into the `OutgoingParas` vector maintaining the sorted order. - -The following routine is meant to execute pending entries in upward dispatchable queues. This function doesn't fail, even if -any of dispatchables return an error. - -`process_upward_dispatchables()`: - 1. Initialize a cumulative weight counter `T` to 0 - 1. Iterate over items in `NeedsDispatch` cyclically, starting with `NextDispatchRoundStartWith`. If the item specified is `None` start from the beginning. For each `P` encountered: - 1. Dequeue `D` the first dispatchable `D` from `RelayDispatchQueues` for `P` - 1. Decrement the size of the message from `RelayDispatchQueueSize` for `P` - 1. Decode `D` into a dispatchable. Otherwise, if succeeded: - 1. If `weight_of(D) > config.dispatchable_upward_message_critical_weight` then skip the dispatchable. Otherwise: - 1. Execute `D` and add the actual amount of weight consumed to `T`. - 1. If `weight_of(D) + T > config.preferred_dispatchable_upward_messages_step_weight`, set `NextDispatchRoundStartWith` to `P` and finish processing. - > NOTE that in practice we would need to approach the weight calculation more thoroughly, i.e. incorporate all operations - > that could take place on the course of handling these dispatchables. - 1. If `RelayDispatchQueues` for `P` became empty, remove `P` from `NeedsDispatch`. - 1. If `NeedsDispatch` became empty then finish processing and set `NextDispatchRoundStartWith` to `None`. - -Utility routines. - -`queue_downward_message(P: ParaId, M: DownwardMessage)`: - 1. Check if the serialized size of `M` exceeds the `config.critical_downward_message_size`. If so, return an error. - 1. Wrap `M` into `InboundDownwardMessage` using the current block number for `sent_at`. - 1. Obtain a new MQC link for the resulting `InboundDownwardMessage` and replace `DownwardMessageQueueHeads` for `P` with the resulting hash. - 1. Add the resulting `InboundDownwardMessage` into `DownwardMessageQueues` for `P`. - -## Session Change - -1. Drain `OutgoingParas`. For each `P` happened to be in the list: - 1. Remove all inbound channels of `P`, i.e. `(_, P)`, - 1. Remove all outbound channels of `P`, i.e. `(P, _)`, - 1. Remove all `DownwardMessageQueues` of `P`. - 1. Remove `DownwardMessageQueueHeads` for `P`. - 1. Remove `RelayDispatchQueueSize` of `P`. - 1. Remove `RelayDispatchQueues` of `P`. - 1. Remove `HrmpOpenChannelRequestCount` for `P` - 1. Remove `HrmpAcceptedChannelRequestCount` for `P`. - 1. Remove `P` if it exists in `NeedsDispatch`. - 1. If `P` is in `NextDispatchRoundStartWith`, then reset it to `None` - - Note that if we don't remove the open/close requests since they are going to die out naturally at the end of the session. -1. For each channel designator `D` in `HrmpOpenChannelRequestsList` we query the request `R` from `HrmpOpenChannelRequests`: - 1. if `R.confirmed = false`: - 1. increment `R.age` by 1. - 1. if `R.age` reached a preconfigured time-to-live limit `config.hrmp_open_request_ttl`, then: - 1. refund `R.sender_deposit` to the sender - 1. decrement `HrmpOpenChannelRequestCount` for `D.sender` by 1. - 1. remove `R` - 1. remove `D` - 2. if `R.confirmed = true`, - 1. if both `D.sender` and `D.recipient` are not offboarded. - 1. create a new channel `C` between `(D.sender, D.recipient)`. - 1. Initialize the `C.sender_deposit` with `R.sender_deposit` and `C.recipient_deposit` - with the value found in the configuration `config.hrmp_recipient_deposit`. - 1. Insert `sender` into the set `HrmpIngressChannelsIndex` for the `recipient`. - 1. Insert `recipient` into the set `HrmpEgressChannelsIndex` for the `sender`. - 1. decrement `HrmpOpenChannelRequestCount` for `D.sender` by 1. - 1. decrement `HrmpAcceptedChannelRequestCount` for `D.recipient` by 1. - 1. remove `R` - 1. remove `D` -1. For each HRMP channel designator `D` in `HrmpCloseChannelRequestsList` - 1. remove the channel identified by `D`, if exists. - 1. remove `D` from `HrmpCloseChannelRequests`. - 1. remove `D` from `HrmpCloseChannelRequestsList` - -To remove a HRMP channel `C` identified with a tuple `(sender, recipient)`: - -1. Return `C.sender_deposit` to the `sender`. -1. Return `C.recipient_deposit` to the `recipient`. -1. Remove `C` from `HrmpChannels`. -1. Remove `C` from `HrmpChannelContents`. -1. Remove `recipient` from the set `HrmpEgressChannelsIndex` for `sender`. -1. Remove `sender` from the set `HrmpIngressChannelsIndex` for `recipient`. diff --git a/roadmap/implementers-guide/src/runtime/scheduler.md b/roadmap/implementers-guide/src/runtime/scheduler.md index ab8089a647104ccd0e496213e28836daf340fdeb..0587e9ee8e8e3591cc9b6d259eb23e3818a3342a 100644 --- a/roadmap/implementers-guide/src/runtime/scheduler.md +++ b/roadmap/implementers-guide/src/runtime/scheduler.md @@ -162,7 +162,7 @@ AvailabilityCores: Vec>; ParathreadClaimIndex: Vec; /// The block number where the session start occurred. Used to track how many group rotations have occurred. SessionStartBlock: BlockNumber; -/// Currently scheduled cores - free but up to be occupied. Ephemeral storage item that's wiped on finalization. +/// Currently scheduled cores - free but up to be occupied. Scheduled: Vec, // sorted ascending by CoreIndex. ``` @@ -175,12 +175,14 @@ Actions: 1. Set `SessionStartBlock` to current block number. 1. Clear all `Some` members of `AvailabilityCores`. Return all parathread claims to queue with retries un-incremented. 1. Set `configuration = Configuration::configuration()` (see [`HostConfiguration`](../types/runtime.md#host-configuration)) -1. Resize `AvailabilityCores` to have length `Paras::parachains().len() + configuration.parathread_cores with all`None` entries. +1. Determine the number of cores & validator groups as `n_cores`. This is the maximum of + 1. `Paras::parachains().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 - - We need a total of `N = Paras::parachains().len() + configuration.parathread_cores` validator groups. - - The total number of validators `V` in the `SessionChangeNotification`'s `validators` may not be evenly divided by `V`. - - First, we obtain "shuffled validators" `SV` by shuffling the validators using the `SessionChangeNotification`'s random seed. - - The groups are selected by partitioning `SV`. The first V % N groups will have (V / N) + 1 members, while the remaining groups will have (V / N) members each. + - We obtain "shuffled validators" `SV` by shuffling the validators using the `SessionChangeNotification`'s random seed. + - Note that the total number of validators `V` in `SV` may not be evenly divided by `n_cores`. + - The groups are selected by partitioning `SV`. The first V % N groups will have (V / n_cores) + 1 members, while the remaining groups will have (V / N) members each. 1. Prune the parathread queue to remove all retries beyond `configuration.parathread_retries`. - Also prune all parathread claims corresponding to de-registered parathreads. - all pruned claims should have their entry removed from the parathread index. @@ -189,13 +191,12 @@ Actions: ## Initialization +1. Free all scheduled cores and return parathread claims to queue, with retries incremented. 1. Schedule free cores using the `schedule(Vec::new())`. ## Finalization -Actions: - -1. Free all scheduled cores and return parathread claims to queue, with retries incremented. +No finalization routine runs for this module. ## Routines diff --git a/roadmap/implementers-guide/src/runtime/session_info.md b/roadmap/implementers-guide/src/runtime/session_info.md new file mode 100644 index 0000000000000000000000000000000000000000..d446a314cf77312abd3eb0fa852b34f20511f7b3 --- /dev/null +++ b/roadmap/implementers-guide/src/runtime/session_info.md @@ -0,0 +1,55 @@ +# Session Info + +For disputes and approvals, we need access to information about validator sets from prior sessions. We also often want easy access to the same information about the current session's validator set. This module aggregates and stores this information in a rolling window while providing easy APIs for access. + +## Storage + +Helper structs: + +```rust +struct SessionInfo { + // validators in canonical ordering. These are the public keys used for backing, + // dispute participation, and approvals. + validators: Vec, + // validators' authority discovery keys for the session in canonical ordering. + discovery_keys: Vec, + // The assignment keys for validators. + assignment_keys: Vec, + // validators in shuffled ordering - these are the validator groups as produced + // by the `Scheduler` module for the session and are typically referred to by + // `GroupIndex`. + validator_groups: Vec>, + // The number of availability cores used by the protocol during this session. + n_cores: u32, + // the zeroth delay tranche width. + zeroth_delay_tranche_width: u32, + // The number of samples we do of relay_vrf_modulo. + relay_vrf_modulo_samples: u32, + // The number of delay tranches in total. + n_delay_tranches: u32, + // How many slots (BABE / SASSAFRAS) must pass before an assignment is considered a + // no-show. + no_show_slots: u32, + /// The number of validators needed to approve a block. + needed_approvals: u32, +} +``` + +Storage Layout: + +```rust +/// The earliest session for which previous session info is stored. +EarliestStoredSession: SessionIndex, +/// Session information. Should have an entry from `EarliestStoredSession..=CurrentSessionIndex` +Sessions: map SessionIndex => Option, +``` + +## Session Change + +1. Update `EarliestStoredSession` based on `config.dispute_period` and remove all entries from `Sessions` from the previous value up to the new value. +1. Create a new entry in `Sessions` with information about the current session. + +## 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 stored. diff --git a/roadmap/implementers-guide/src/runtime/ump.md b/roadmap/implementers-guide/src/runtime/ump.md new file mode 100644 index 0000000000000000000000000000000000000000..ff2e9e09b9976bfc71ade23b4dae763546e3dd49 --- /dev/null +++ b/roadmap/implementers-guide/src/runtime/ump.md @@ -0,0 +1,100 @@ +# UMP Module + +A module responsible for Upward Message Passing (UMP). See [Messaging Overview](../messaging.md) for more details. + +## Storage + +General storage entries + +```rust +/// Paras that are to be cleaned up at the end of the session. +/// The entries are sorted ascending by the para id. +OutgoingParas: Vec; +``` + +Storage related to UMP + +```rust +/// The messages waiting to be handled by the relay-chain originating from a certain parachain. +/// +/// Note that some upward messages might have been already processed by the inclusion logic. E.g. +/// channel management messages. +/// +/// The messages are processed in FIFO order. +RelayDispatchQueues: map ParaId => Vec; +/// Size of the dispatch queues. Caches sizes of the queues in `RelayDispatchQueue`. +/// +/// First item in the tuple is the count of messages and second +/// is the total length (in bytes) of the message payloads. +/// +/// Note that this is an auxilary mapping: it's possible to tell the byte size and the number of +/// messages only looking at `RelayDispatchQueues`. This mapping is separate to avoid the cost of +/// loading the whole message queue if only the total size and count are required. +/// +/// Invariant: +/// - The set of keys should exactly match the set of keys of `RelayDispatchQueues`. +RelayDispatchQueueSize: map ParaId => (u32, u32); // (num_messages, total_bytes) +/// The ordered list of `ParaId`s that have a `RelayDispatchQueue` entry. +/// +/// Invariant: +/// - The set of items from this vector should be exactly the set of the keys in +/// `RelayDispatchQueues` and `RelayDispatchQueueSize`. +NeedsDispatch: Vec; +/// This is the para that gets dispatched first during the next upward dispatchable queue +/// execution round. +/// +/// Invariant: +/// - If `Some(para)`, then `para` must be present in `NeedsDispatch`. +NextDispatchRoundStartWith: Option; +``` + + +## Initialization + +No initialization routine runs for this module. + +## Routines + +Candidate Acceptance Function: + +* `check_upward_messages(P: ParaId, Vec`): + 1. Checks that there are at most `config.max_upward_message_num_per_candidate` messages. + 1. Checks that no message exceeds `config.max_upward_message_size`. + 1. Verify that `RelayDispatchQueueSize` for `P` has enough capacity for the messages + +Candidate Enactment: + +* `enact_upward_messages(P: ParaId, Vec)`: + 1. Process each upward message `M` in order: + 1. Append the message to `RelayDispatchQueues` for `P` + 1. Increment the size and the count in `RelayDispatchQueueSize` for `P`. + 1. Ensure that `P` is present in `NeedsDispatch`. + +The following routine is intended to be called in the same time when `Paras::schedule_para_cleanup` is called. + +`schedule_para_cleanup(ParaId)`: + 1. Add the para into the `OutgoingParas` vector maintaining the sorted order. + +The following routine is meant to execute pending entries in upward message queues. This function doesn't fail, even if +dispatcing any of individual upward messages returns an error. + +`process_pending_upward_messages()`: + 1. Initialize a cumulative weight counter `T` to 0 + 1. Iterate over items in `NeedsDispatch` cyclically, starting with `NextDispatchRoundStartWith`. If the item specified is `None` start from the beginning. For each `P` encountered: + 1. Dequeue the first upward message `D` from `RelayDispatchQueues` for `P` + 1. Decrement the size of the message from `RelayDispatchQueueSize` for `P` + 1. Delegate processing of the message to the runtime. The weight consumed is added to `T`. + 1. If `T >= config.preferred_dispatchable_upward_messages_step_weight`, set `NextDispatchRoundStartWith` to `P` and finish processing. + 1. If `RelayDispatchQueues` for `P` became empty, remove `P` from `NeedsDispatch`. + 1. If `NeedsDispatch` became empty then finish processing and set `NextDispatchRoundStartWith` to `None`. + > NOTE that in practice we would need to approach the weight calculation more thoroughly, i.e. incorporate all operations + > that could take place on the course of handling these upward messages. + +## Session Change + +1. Drain `OutgoingParas`. For each `P` happened to be in the list:. + 1. Remove `RelayDispatchQueueSize` of `P`. + 1. Remove `RelayDispatchQueues` of `P`. + 1. Remove `P` if it exists in `NeedsDispatch`. + 1. If `P` is in `NextDispatchRoundStartWith`, then reset it to `None` + - Note that if we don't remove the open/close requests since they are going to die out naturally at the end of the session. diff --git a/roadmap/implementers-guide/src/types/approval.md b/roadmap/implementers-guide/src/types/approval.md new file mode 100644 index 0000000000000000000000000000000000000000..1db305e76024d5c191baafdb019180d4bdfebca6 --- /dev/null +++ b/roadmap/implementers-guide/src/types/approval.md @@ -0,0 +1,101 @@ +# Approval Types + +## AssignmentId + +The public key of a keypair used by a validator for determining assignments to approve included parachain candidates. + +## AssignmentCert + +An `AssignmentCert`, short for Assignment Certificate, is a piece of data provided by a validator to prove that they have been selected to perform secondary approval checks on an included candidate. + +These certificates can be checked in the context of a specific block, candidate, and validator assignment VRF key. The block state will also provide further context about the availability core states at that block. + +```rust +enum AssignmentCertKind { + RelayVRFModulo { + sample: u32, + }, + RelayVRFDelay { + core_index: CoreIndex, + } +} + +struct AssignmentCert { + // The criterion which is claimed to be met by this cert. + kind: AssignmentCertKind, + // The VRF showing the criterion is met. + vrf: (VRFPreOut, VRFProof), +} +``` + +> TODO: RelayEquivocation cert. Probably can only be broadcast to chains that have handled an equivocation report. + +## IndirectAssignmentCert + +An assignment cert which refers to the candidate under which the assignment is relevant by block hash. + +```rust +struct IndirectAssignmentCert { + // A block hash where the candidate appears. + block_hash: Hash, + validator: ValidatorIndex, + cert: AssignmentCert, +} +``` + +## ApprovalVote + +A vote of approval on a candidate. + +```rust +struct ApprovalVote(Hash); +``` + +## SignedApprovalVote + +An approval vote signed with a validator's key. This should be verifiable under the `ValidatorId` corresponding to the `ValidatorIndex` of the session, which should be implicit from context. + +```rust +struct SignedApprovalVote { + vote: ApprovalVote, + validator: ValidatorIndex, + signature: ValidatorSignature, +} +``` + +## IndirectSignedApprovalVote + +A signed approval vote which references the candidate indirectly via the block. If there exists a look-up to the candidate hash from the block hash and candidate index, then this can be transformed into a `SignedApprovalVote`. + +Although this vote references the candidate by a specific block hash and candidate index, the signature is computed on the actual `SignedApprovalVote` payload. + +```rust +struct IndirectSignedApprovalVote { + // A block hash where the candidate appears. + block_hash: Hash, + // The index of the candidate in the list of candidates fully included as-of the block. + candidate_index: u32, + validator: ValidatorIndex, + signature: ValidatorSignature, +} +``` + +## 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 instantiable only when the checks have actually been done. Fields should be accessible via getters, not direct struct access. + +```rust +struct CheckedAssignmentCert { + cert: AssignmentCert, + validator: ValidatorIndex, + relay_block: Hash, + candidate_hash: Hash, + delay_tranche: DelayTranche, +} +``` + +## DelayTranche + +```rust +type DelayTranche = u32; +``` \ No newline at end of file diff --git a/roadmap/implementers-guide/src/types/availability.md b/roadmap/implementers-guide/src/types/availability.md index 0117b174e645072b3553b6bc77a2f4b3ccc63f62..e2b90e86f43fe6ce4d8e679866d7f6e7ce002865 100644 --- a/roadmap/implementers-guide/src/types/availability.md +++ b/roadmap/implementers-guide/src/types/availability.md @@ -40,7 +40,7 @@ This is the data we want to keep available for each [candidate](candidate.md) in ```rust struct AvailableData { /// The Proof-of-Validation of the candidate. - pov: PoV, + pov: Arc, /// The persisted validation data used to check the candidate. validation_data: PersistedValidationData, } diff --git a/roadmap/implementers-guide/src/types/candidate.md b/roadmap/implementers-guide/src/types/candidate.md index d8d0057bf850a510223dffe1986ab428f67da4e8..c9da4b683fbae79e0f8cc7f25a09aaa48eb73c22 100644 --- a/roadmap/implementers-guide/src/types/candidate.md +++ b/roadmap/implementers-guide/src/types/candidate.md @@ -80,6 +80,8 @@ struct CandidateDescriptor { persisted_validation_data_hash: Hash, /// The blake2-256 hash of the pov-block. pov_hash: Hash, + /// The root of a block's erasure encoding Merkle tree. + erasure_root: Hash, /// Signature on blake2-256 of components of this receipt: /// The parachain index, the relay parent, the validation data hash, and the pov_hash. signature: CollatorSignature, @@ -125,6 +127,8 @@ struct PersistedValidationData { parent_head: HeadData, /// The relay-chain block number this is in the context of. This informs the collator. block_number: BlockNumber, + /// The relay-chain block storage root this is in the context of. + relay_storage_root: Hash, /// The MQC head for the DMQ. /// /// The DMQ MQC head will be used by the validation function to authorize the downward messages @@ -247,14 +251,10 @@ The execution and validation of parachain or parathread candidates produces a nu #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Default))] struct CandidateCommitments { - /// Fees paid from the chain to the relay chain validators. - fees: Balance, /// Messages directed to other paras routed via the relay chain. horizontal_messages: Vec, /// Messages destined to be interpreted by the Relay chain itself. upward_messages: Vec, - /// The root of a block's erasure encoding Merkle tree. - erasure_root: Hash, /// New validation code. new_validation_code: Option, /// The head-data produced as a result of execution. @@ -277,29 +277,4 @@ struct SigningContext { /// The session index this signature is in the context of. session_index: SessionIndex, } -``` - -## Validation Outputs - -This struct encapsulates the outputs of candidate validation. - -```rust -struct ValidationOutputs { - /// The head-data produced by validation. - head_data: HeadData, - /// The validation data, persisted. - validation_data: PersistedValidationData, - /// Messages directed to other paras routed via the relay chain. - horizontal_messages: Vec, - /// Upwards messages to the relay chain. - upwards_messages: Vec, - /// Fees paid to the validators of the relay-chain. - fees: Balance, - /// The new validation code submitted by the execution, if any. - new_validation_code: Option, - /// The number of messages processed from the DMQ. - processed_downward_messages: u32, - /// The mark which specifies the block number up to which all inbound HRMP messages are processed. - hrmp_watermark: BlockNumber, -} -``` +``` \ No newline at end of file diff --git a/roadmap/implementers-guide/src/types/messages.md b/roadmap/implementers-guide/src/types/messages.md index 8a992d08fa50c9bcae89a0bd575fca35fffb1226..8ea58d14e85d796a2adef08f20b570c95e0b9d85 100644 --- a/roadmap/implementers-guide/src/types/messages.md +++ b/roadmap/implementers-guide/src/types/messages.md @@ -5,17 +5,43 @@ Types of messages that are passed between parachains and the relay chain: UMP, D There is also HRMP (Horizontally Relay-routed Message Passing) which provides the same functionality although with smaller scalability potential. +## Vertical Message Passing + +Types required for message passing between the relay-chain and a parachain. + +Actual contents of the messages is specified by the XCM standard. + +```rust,ignore +/// A message sent from a parachain to the relay-chain. +type UpwardMessage = Vec; + +/// A message sent from the relay-chain down to a parachain. +/// +/// The size of the message is limited by the `config.max_downward_message_size` +/// parameter. +type DownwardMessage = Vec; + +/// This struct extends `DownwardMessage` by adding the relay-chain block number when the message was +/// enqueued in the downward message queue. +struct InboundDownwardMessage { + /// The block number at which this messages was put into the downward message queue. + pub sent_at: BlockNumber, + /// The actual downward message to processes. + pub msg: DownwardMessage, +} +``` + +## Horizontal Message Passing + ## HrmpChannelId -A type that uniquely identifies a HRMP channel. A HRMP channel is established between two paras. +A type that uniquely identifies an HRMP channel. An HRMP channel is established between two paras. In text, we use the notation `(A, B)` to specify a channel between A and B. The channels are unidirectional, meaning that `(A, B)` and `(B, A)` refer to different channels. The convention is that we use the first item tuple for the sender and the second for the recipient. Only one channel is allowed between two participants in one direction, i.e. there cannot be 2 different channels identified by `(A, B)`. -`HrmpChannelId` has a defined ordering: first `sender` and tie is resolved by `recipient`. - ```rust,ignore struct HrmpChannelId { sender: ParaId, @@ -23,65 +49,6 @@ struct HrmpChannelId { } ``` -## Upward Message - -A type of messages dispatched from a parachain to the relay chain. - -```rust,ignore -enum ParachainDispatchOrigin { - /// As a simple `Origin::Signed`, using `ParaId::account_id` as its value. This is good when - /// interacting with standard modules such as `balances`. - Signed, - /// As the special `Origin::Parachain(ParaId)`. This is good when interacting with parachain- - /// aware modules which need to succinctly verify that the origin is a parachain. - Parachain, - /// As the simple, superuser `Origin::Root`. This can only be done on specially permissioned - /// parachains. - Root, -} - -/// An opaque byte buffer that encodes an entrypoint and the arguments that should be -/// provided to it upon the dispatch. -/// -/// NOTE In order to be executable the byte buffer should be decoded which potentially can fail if -/// the encoding was changed. -type RawDispatchable = Vec; - -enum UpwardMessage { - /// This upward message is meant to schedule execution of a provided dispatchable. - Dispatchable { - /// The origin with which the dispatchable should be executed. - origin: ParachainDispatchOrigin, - /// The dispatchable to be executed in its raw form. - dispatchable: RawDispatchable, - }, - /// A message for initiation of opening a new HRMP channel between the origin para and the - /// given `recipient`. - /// - /// Let `origin` be the parachain that sent this upward message. In that case the channel - /// to be opened is (`origin` -> `recipient`). - HrmpInitOpenChannel { - /// The receiving party in the channel. - recipient: ParaId, - /// How many messages can be stored in the channel at most. - max_places: u32, - /// The maximum size of a message in this channel. - max_message_size: u32, - }, - /// A message that is meant to confirm the HRMP open channel request initiated earlier by the - /// `HrmpInitOpenChannel` by the given `sender`. - /// - /// Let `origin` be the parachain that sent this upward message. In that case the channel - /// (`origin` -> `sender`) will be opened during the session change. - HrmpAcceptOpenChannel(ParaId), - /// A message for closing the specified existing channel `ch`. - /// - /// The channel to be closed is `(ch.sender -> ch.recipient)`. The parachain that sent this - /// upward message must be either `ch.sender` or `ch.recipient`. - HrmpCloseChannel(HrmpChannelId), -} -``` - ## Horizontal Message This is a message sent from a parachain to another parachain that travels through the relay chain. @@ -105,32 +72,3 @@ struct InboundHrmpMessage { pub data: Vec, } ``` - -## Downward Message - -`DownwardMessage` - is a message that goes down from the relay chain to a parachain. Such a message -could be seen as a notification, however, it is conceivable that they might be used by the relay -chain to send a request to the parachain (likely, through the `ParachainSpecific` variant). - -The serialized size of the message is limited by the `config.critical_downward_message_size` parameter. - -```rust,ignore -enum DownwardMessage { - /// Some funds were transferred into the parachain's account. The hash is the identifier that - /// was given with the transfer. - TransferInto(AccountId, Balance, Remark), - /// An opaque message which interpretation is up to the recipient para. This variant ought - /// to be used as a basis for special protocols between the relay chain and, typically system, - /// paras. - ParachainSpecific(Vec), -} - -/// A wrapped version of `DownwardMessage`. The difference is that it has attached the block number when -/// the message was sent. -struct InboundDownwardMessage { - /// The block number at which this messages was put into the downward message queue. - pub sent_at: BlockNumber, - /// The actual downward message to processes. - pub msg: DownwardMessage, -} -``` diff --git a/roadmap/implementers-guide/src/types/network.md b/roadmap/implementers-guide/src/types/network.md index 75f251613f2524361380f97e99de39178c37c334..79eab39002c6372d2b8d3fc8cb3ff5efda013e89 100644 --- a/roadmap/implementers-guide/src/types/network.md +++ b/roadmap/implementers-guide/src/types/network.md @@ -8,7 +8,12 @@ These types are those that are actually sent over the network to subsystems. type RequestId = u64; type ProtocolVersion = u32; struct PeerId(...); // opaque, unique identifier of a peer. -struct View(Vec); // Up to `N` (5?) chain heads. +struct View { + // Up to `N` (5?) chain heads. + heads: Vec, + // The number of the finalized block. + finalized_number: BlockNumber, +} enum ObservedRole { Full, @@ -18,12 +23,38 @@ enum ObservedRole { ## V1 Network Subsystem Message Types +### Approval Distribution V1 + +```rust +enum ApprovalDistributionV1Message { + /// Assignments for candidates in recent, unfinalized blocks. + /// + /// The u32 is the claimed index of the candidate this assignment corresponds to. Actually checking the assignment + /// may yield a different result. + Assignments(Vec<(IndirectAssignmentCert, u32)>), + /// Approvals for candidates in some recent, unfinalized block. + Approvals(Vec), +} +``` + ### Availability Distribution V1 ```rust enum AvailabilityDistributionV1Message { /// An erasure chunk for a given candidate hash. - Chunk(Hash, ErasureChunk), + Chunk(CandidateHash, ErasureChunk), +} +``` + +### Availability Recovery V1 + +```rust +enum AvailabilityRecoveryV1Message { + /// Request a chunk for a given candidate hash and validator index. + RequestChunk(RequestId, CandidateHash, ValidatorIndex), + /// Respond with chunk for a given candidate hash and validator index. + /// The response may be `None` if the requestee does not have the chunk. + Chunk(RequestId, Option), } ``` @@ -82,7 +113,9 @@ These are the messages for the protocol on the validation peer-set. ```rust enum ValidationProtocolV1 { + ApprovalDistribution(ApprovalDistributionV1Message), AvailabilityDistribution(AvailabilityDistributionV1Message), + AvailabilityRecovery(AvailabilityRecoveryV1Message), BitfieldDistribution(BitfieldDistributionV1Message), PoVDistribution(PoVDistributionV1Message), StatementDistribution(StatementDistributionV1Message), diff --git a/roadmap/implementers-guide/src/types/overseer-protocol.md b/roadmap/implementers-guide/src/types/overseer-protocol.md index 3af9d0cac4fde6e1fc0a517f006757b06a0422d6..02219a91f13b8d8467ba66497e62360dbc45a17f 100644 --- a/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -10,6 +10,8 @@ Signals from the overseer to a subsystem to request change in execution that has enum OverseerSignal { /// Signal about a change in active leaves. ActiveLeavesUpdate(ActiveLeavesUpdate), + /// Signal about a new best finalized block. + BlockFinalized(Hash), /// Conclude all operation. Conclude, } @@ -33,6 +35,91 @@ struct ActiveLeavesUpdate { } ``` +## Approval Voting + +Messages received by the approval voting subsystem. + +```rust +enum AssignmentCheckResult { + // The vote was accepted and should be propagated onwards. + Accepted, + // The vote was valid but duplicate and should not be propagated onwards. + AcceptedDuplicate, + // The vote was valid but too far in the future to accept right now. + TooFarInFuture, + // The vote was bad and should be ignored, reporting the peer who propagated it. + Bad, +} + +enum ApprovalCheckResult { + // The vote was accepted and should be propagated onwards. + Accepted, + // The vote was bad and should be ignored, reporting the peer who propagated it. + Bad, +} + +enum ApprovalVotingMessage { + /// Check if the assignment is valid and can be accepted by our view of the protocol. + /// Should not be sent unless the block hash is known. + CheckAndImportAssignment( + IndirectAssignmentCert, + ResponseChannel, + ), + /// Check if the approval vote is valid and can be accepted by our view of the + /// protocol. + /// + /// Should not be sent unless the block hash within the indirect vote is known. + CheckAndImportApproval( + IndirectSignedApprovalVote, + ResponseChannel, + ), + /// Returns the highest possible ancestor hash of the provided block hash which is + /// acceptable to vote on finality for. + /// The `BlockNumber` provided is the number of the block's ancestor which is the + /// earliest possible vote. + /// + /// It can also return the same block hash, if that is acceptable to vote upon. + /// Return `None` if the input hash is unrecognized. + ApprovedAncestor(Hash, BlockNumber, ResponseChannel>), +} +``` + +## Approval Distribution + +Messages received by the approval Distribution subsystem. + +```rust +/// Metadata about a block which is now live in the approval protocol. +struct BlockApprovalMeta { + /// The hash of the block. + hash: Hash, + /// The number of the block. + number: BlockNumber, + /// The candidates included by the block. Note that these are not the same as the candidates that appear within the + /// block body. + candidates: Vec, + /// The consensus slot number of the block. + slot_number: SlotNumber, +} + +enum ApprovalDistributionMessage { + /// Notify the `ApprovalDistribution` subsystem about new blocks and the candidates contained within + /// them. + NewBlocks(Vec), + /// Distribute an assignment cert from the local validator. The cert is assumed + /// to be valid, relevant, and for the given relay-parent and validator index. + /// + /// The `u32` param is the candidate index in the fully-included list. + DistributeAssignment(IndirectAssignmentCert, u32), + /// Distribute an approval vote for the local validator. The approval vote is assumed to be + /// valid, relevant, and the corresponding approval already issued. If not, the subsystem is free to drop + /// the message. + DistributeApproval(IndirectSignedApprovalVote), + /// An update from the network bridge. + NetworkBridgeUpdateV1(NetworkBridgeEvent), +} +``` + ## All Messages > TODO (now) @@ -55,6 +142,25 @@ enum AvailabilityDistributionMessage { } ``` +## Availability Recovery Message + +Messages received by the availability recovery subsystem. + +```rust +enum RecoveryError { + Invalid, + Unavailable, +} +enum AvailabilityRecoveryMessage { + /// Recover available data from validators on the network. + RecoverAvailableData( + CandidateReceipt, + SessionIndex, + ResponseChannel>, + ), +} +``` + ## Availability Store Message Messages to and from the availability store. @@ -62,18 +168,18 @@ Messages to and from the availability store. ```rust enum AvailabilityStoreMessage { /// Query the `AvailableData` of a candidate by hash. - QueryAvailableData(Hash, ResponseChannel>), + QueryAvailableData(CandidateHash, ResponseChannel>), /// Query whether an `AvailableData` exists within the AV Store. - QueryDataAvailability(Hash, ResponseChannel), + QueryDataAvailability(CandidateHash, ResponseChannel), /// Query a specific availability chunk of the candidate's erasure-coding by validator index. /// Returns the chunk and its inclusion proof against the candidate's erasure-root. - QueryChunk(Hash, ValidatorIndex, ResponseChannel>), - /// Store a specific chunk of the candidate's erasure-coding by validator index, with an + QueryChunk(CandidateHash, ValidatorIndex, ResponseChannel>), + /// Store a specific chunk of the candidate's erasure-coding, with an /// accompanying proof. - StoreChunk(Hash, ValidatorIndex, AvailabilityChunkAndProof, ResponseChannel>), + StoreChunk(CandidateHash, AvailabilityChunkAndProof, ResponseChannel>), /// Store `AvailableData`. If `ValidatorIndex` is provided, also store this validator's /// `AvailabilityChunkAndProof`. - StoreAvailableData(Hash, Option, u32, AvailableData, ResponseChannel>), + StoreAvailableData(CandidateHash, Option, u32, AvailableData, ResponseChannel>), } ``` @@ -107,7 +213,7 @@ enum BitfieldSigningMessage { } enum CandidateBackingMessage { /// Requests a set of backable candidates that could be backed in a child of the given /// relay-parent, referenced by its hash. - GetBackedCandidates(Hash, ResponseChannel>), + GetBackedCandidates(Hash, Vec, ResponseChannel>), /// 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. @@ -140,6 +246,9 @@ enum ChainApiMessage { /// Get the block number by hash. /// Returns `None` if a block with the given hash is not present in the db. BlockNumber(Hash, ResponseChannel, Error>>), + /// Request the block header by hash. + /// Returns `None` if a block with the given hash is not present in the db. + BlockHeader(Hash, ResponseChannel, Error>>), /// Get the finalized block hash by number. /// Returns `None` if a block with the given number is not present in the db. /// Note: the caller must ensure the block is finalized. @@ -211,12 +320,24 @@ enum NetworkBridgeMessage { /// Send a message to one or more peers on the validation peerset. SendValidationMessage([PeerId], ValidationProtocolV1), /// Send a message to one or more peers on the collation peerset. - SendCollationMessage([PeerId], ValidationProtocolV1), - /// Connect to peers who represent the given `ValidatorId`s at the given relay-parent. + SendCollationMessage([PeerId], CollationProtocolV1), + /// Send multiple validation messages. + SendValidationMessages([([PeerId, ValidationProtocolV1])]), + /// Send multiple collation messages. + SendCollationMessages([([PeerId, ValidationProtocolV1])]), + /// Connect to peers who represent the given `validator_ids`. /// - /// Also accepts a response channel by which the issuer can learn the `PeerId`s of those - /// validators. - ConnectToValidators(PeerSet, [ValidatorId], ResponseChannel<[(ValidatorId, PeerId)]>>), + /// Also ask the network to stay connected to these peers at least + /// until the request is revoked. + /// This can be done by dropping the receiver. + ConnectToValidators { + /// Ids of the validators to connect to. + validator_ids: Vec, + /// Response sender by which the issuer can learn the `PeerId`s of + /// the validators as they are connected. + /// The response is sent immediately for already connected peers. + connected: ResponseStream<(AuthorityDiscoveryId, PeerId)>, + }, } ``` @@ -269,7 +390,7 @@ enum ProvisionableData { /// This bitfield indicates the availability of various candidate blocks. Bitfield(Hash, SignedAvailabilityBitfield), /// The Candidate Backing subsystem believes that this candidate is valid, pending availability. - BackedCandidate(BackedCandidate), + BackedCandidate(CandidateReceipt), /// Misbehavior reports are self-contained proofs of validator misbehavior. MisbehaviorReport(Hash, MisbehaviorReport), /// Disputes trigger a broad dispute resolution process. @@ -313,12 +434,8 @@ enum RuntimeApiRequest { Validators(ResponseChannel>), /// Get the validator groups and rotation info. ValidatorGroups(ResponseChannel<(Vec>, GroupRotationInfo)>), - /// Get the session index for children of the block. This can be used to construct a signing - /// context. - SessionIndex(ResponseChannel), - /// Get the validation code for a specific para, using the given occupied core assumption. - ValidationCode(ParaId, OccupiedCoreAssumption, ResponseChannel>), - /// Get the persisted validation data at the state of a given block for a specific para, + /// Get information about all availability cores. + AvailabilityCores(ResponseChannel>), /// with the given occupied core assumption. PersistedValidationData( ParaId, @@ -331,12 +448,31 @@ enum RuntimeApiRequest { OccupiedCoreAssumption, ResponseChannel>, ), - /// Get information about all availability cores. - AvailabilityCores(ResponseChannel>), + /// Sends back `true` if the commitments pass all acceptance criteria checks. + CheckValidationOutputs( + ParaId, + CandidateCommitments, + RuntimeApiSender, + ), + /// Get the session index for children of the block. This can be used to construct a signing + /// context. + SessionIndexForChild(ResponseChannel), + /// Get the validation code for a specific para, using the given occupied core assumption. + ValidationCode(ParaId, OccupiedCoreAssumption, ResponseChannel>), + /// Fetch the historical validation code used by a para for candidates executed in + /// the context of a given block height in the current chain. + HistoricalValidationCode(ParaId, BlockNumber, ResponseChannel>), /// Get a committed candidate receipt for all candidates pending availability. CandidatePendingAvailability(ParaId, ResponseChannel>), /// Get all events concerning candidates in the last block. CandidateEvents(ResponseChannel>), + /// Get the session info for the given session, if stored. + SessionInfo(SessionIndex, ResponseChannel>), + /// Get all the pending inbound messages in the downward message queue for a para. + DmqContents(ParaId, ResponseChannel>>), + /// Get the contents of all channels addressed to the given recipient. Channels that have no + /// messages in them are also included. + InboundHrmpChannelsContents(ParaId, ResponseChannel>>>), } enum RuntimeApiMessage { @@ -362,6 +498,8 @@ enum StatementDistributionMessage { /// The statement distribution subsystem assumes that the statement should be correctly /// signed. Share(Hash, SignedFullStatement), + /// Register a listener to be notified on any new statements. + RegisterStatementListener(ResponseChannel), } ``` @@ -373,39 +511,52 @@ Various modules request that the [Candidate Validation subsystem](../node/utilit /// Result of the validation of the candidate. enum ValidationResult { - /// Candidate is valid, and here are the outputs. In practice, this should be a shared type - /// so that validation caching can be done. - Valid(ValidationOutputs), + /// Candidate is valid, and here are the outputs and the validation data used to form inputs. + /// In practice, this should be a shared type so that validation caching can be done. + Valid(CandidateCommitments, PersistedValidationData), /// Candidate is invalid. Invalid, } -/// Messages issued to the candidate validation subsystem. +/// Messages received by the Validation subsystem. /// /// ## Validation Requests /// /// Validation requests made to the subsystem should return an error only on internal error. -/// Otherwise, they should return either `Ok(ValidationResult::Valid(_))` or `Ok(ValidationResult::Invalid)`. -enum CandidateValidationMessage { - /// Validate a candidate with provided parameters. This will implicitly attempt to gather the - /// `OmittedValidationData` and `ValidationCode` from the runtime API of the chain, - /// based on the `relay_parent` of the `CandidateDescriptor`. +/// Otherwise, they should return either `Ok(ValidationResult::Valid(_))` +/// or `Ok(ValidationResult::Invalid)`. +#[derive(Debug)] +pub enum CandidateValidationMessage { + /// Validate a candidate with provided parameters using relay-chain state. + /// + /// This will implicitly attempt to gather the `PersistedValidationData` and `ValidationCode` + /// from the runtime API of the chain, based on the `relay_parent` + /// of the `CandidateDescriptor`. + /// + /// This will also perform checking of validation outputs against the acceptance criteria. /// /// If there is no state available which can provide this data or the core for /// the para is not free at the relay-parent, an error is returned. - ValidateFromChainState(CandidateDescriptor, PoV, ResponseChannel>), - - /// Validate a candidate with provided parameters. Explicitly provide the `PersistedValidationData` - /// and `ValidationCode` so this can do full validation without needing to access the state of - /// the relay-chain. Optionally provide the `TransientValidationData` which will lead to checks - /// on the output. + ValidateFromChainState( + CandidateDescriptor, + Arc, + oneshot::Sender>, + ), + /// Validate a candidate with provided, exhaustive parameters for validation. + /// + /// Explicitly provide the `PersistedValidationData` and `ValidationCode` so this can do full + /// validation without needing to access the state of the relay-chain. + /// + /// This request doesn't involve acceptance criteria checking, therefore only useful for the + /// cases where the validity of the candidate is established. This is the case for the typical + /// use-case: secondary checkers would use this request relying on the full prior checks + /// performed by the relay-chain. ValidateFromExhaustive( PersistedValidationData, - Option, ValidationCode, CandidateDescriptor, - PoV, - ResponseChannel>, + Arc, + oneshot::Sender>, ), } ``` diff --git a/roadmap/implementers-guide/src/types/runtime.md b/roadmap/implementers-guide/src/types/runtime.md index f9415f8b42942d5d972a0143665e4501abc0925f..332860d4703b33e8604f21c9a3de481b76c6c188 100644 --- a/roadmap/implementers-guide/src/types/runtime.md +++ b/roadmap/implementers-guide/src/types/runtime.md @@ -13,7 +13,7 @@ struct HostConfiguration { /// The delay, in blocks, before a validation upgrade is applied. pub validation_upgrade_delay: BlockNumber, /// The acceptance period, in blocks. This is the amount of blocks after availability that validators - /// and fishermen have to perform secondary approval checks or issue reports. + /// and fishermen have to perform secondary checks or issue reports. pub acceptance_period: BlockNumber, /// The maximum validation code size, in bytes. pub max_code_size: u32, @@ -34,6 +34,23 @@ struct HostConfiguration { pub thread_availability_period: BlockNumber, /// The amount of blocks ahead to schedule parathreads. pub scheduling_lookahead: u32, + /// The maximum number of validators to have per core. `None` means no maximum. + pub max_validators_per_core: Option, + /// The amount of sessions to keep for disputes. + pub dispute_period: SessionIndex, + /// 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 do of the RelayVRFModulo approval assignment criterion. + 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 @@ -44,17 +61,14 @@ struct HostConfiguration { /// stage. /// /// NOTE that this is a soft limit and could be exceeded. - pub preferred_dispatchable_upward_messages_step_weight: u32, - /// Any dispatchable upward message that requests more than the critical amount is rejected - /// with `DispatchResult::CriticalWeightExceeded`. + pub preferred_dispatchable_upward_messages_step_weight: Weight, + /// The maximum size of an upward message that can be sent by a candidate. /// - /// The parameter value is picked up so that no dispatchable can make the block weight exceed - /// the total budget. I.e. that the sum of `preferred_dispatchable_upward_messages_step_weight` - /// and `dispatchable_upward_message_critical_weight` doesn't exceed the amount of weight left - /// under a typical worst case (e.g. no upgrades, etc) weight consumed by the required phases of - /// block execution (i.e. initialization, finalization and inherents). - pub dispatchable_upward_message_critical_weight: u32, + /// 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. /// @@ -62,7 +76,7 @@ struct HostConfiguration { /// 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 critical_downward_message_size: u32, + pub max_downward_message_size: u32, /// Number of sessions after which an HRMP open channel request expires. pub hrmp_open_request_ttl: u32, /// The deposit that the sender should provide for opening an HRMP channel. @@ -70,18 +84,24 @@ struct HostConfiguration { /// 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_places: u32, + 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_size: u32, + 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 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 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, } ``` diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 9d5ccae4e872d2ef132b801185f1770095622d0b..bfae25ff34f73f3aba4c239e9ce95fc1db5c85ec 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,18 +1,20 @@ [package] name = "polkadot-rpc" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" [dependencies] -jsonrpc-core = "14.0.3" +jsonrpc-core = "15.1.0" polkadot-primitives = { path = "../primitives" } sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } sp-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } +sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "master"} sc-consensus-babe-rpc = { git = "https://github.com/paritytech/substrate", branch = "master"} @@ -20,8 +22,9 @@ sc-consensus-epochs = { git = "https://github.com/paritytech/substrate", branch sc-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-finality-grandpa-rpc = { git = "https://github.com/paritytech/substrate", branch = "master" } sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master"} +sc-sync-state-rpc = { git = "https://github.com/paritytech/substrate", branch = "master"} txpool-api = { package = "sp-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "master" } frame-rpc-system = { package = "substrate-frame-rpc-system", git = "https://github.com/paritytech/substrate", branch = "master" } pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "master" } -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false } +parity-scale-codec = { version = "1.3.5", default-features = false } sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index 2714db4d30544b8d97b82fef5a36a736312d5131..2f036563d4b613d98d740ed22a6ba308900bea13 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -23,12 +23,16 @@ use std::sync::Arc; use polkadot_primitives::v0::{Block, BlockNumber, AccountId, Nonce, Balance, Hash}; use sp_api::ProvideRuntimeApi; use txpool_api::TransactionPool; +use sp_block_builder::BlockBuilder; use sp_blockchain::{HeaderBackend, HeaderMetadata, Error as BlockChainError}; use sp_consensus::SelectChain; use sp_consensus_babe::BabeApi; +use sp_keystore::SyncCryptoStorePtr; +use sc_client_api::AuxStore; use sc_client_api::light::{Fetcher, RemoteBlockchain}; use sc_consensus_babe::Epoch; -use sp_block_builder::BlockBuilder; +use sc_finality_grandpa::FinalityProofProvider; +use sc_sync_state_rpc::{SyncStateRpcApi, SyncStateRpcHandler}; pub use sc_rpc::{DenyUnsafe, SubscriptionTaskExecutor}; /// A type representing all RPC extensions. @@ -53,48 +57,53 @@ pub struct BabeDeps { /// BABE pending epoch changes. pub shared_epoch_changes: sc_consensus_epochs::SharedEpochChanges, /// The keystore that manages the keys of the node. - pub keystore: sc_keystore::KeyStorePtr, + pub keystore: SyncCryptoStorePtr, } /// Dependencies for GRANDPA -pub struct GrandpaDeps { +pub struct GrandpaDeps { /// Voting round info. pub shared_voter_state: sc_finality_grandpa::SharedVoterState, /// Authority set info. pub shared_authority_set: sc_finality_grandpa::SharedAuthoritySet, /// Receives notifications about justification events from Grandpa. pub justification_stream: sc_finality_grandpa::GrandpaJustificationStream, - /// Subscription manager to keep track of pubsub subscribers. + /// Executor to drive the subscription manager in the Grandpa RPC handler. pub subscription_executor: sc_rpc::SubscriptionTaskExecutor, + /// Finality proof provider. + pub finality_provider: Arc>, } /// Full client dependencies -pub struct FullDeps { +pub struct FullDeps { /// The client instance to use. pub client: Arc, /// Transaction pool instance. pub pool: Arc

, /// The SelectChain Strategy pub select_chain: SC, + /// A copy of the chain spec. + pub chain_spec: Box, /// Whether to deny unsafe calls pub deny_unsafe: DenyUnsafe, /// BABE specific dependencies. pub babe: BabeDeps, /// GRANDPA specific dependencies. - pub grandpa: GrandpaDeps, + pub grandpa: GrandpaDeps, } /// Instantiate all RPC extensions. -pub fn create_full(deps: FullDeps) -> RpcExtension where - C: ProvideRuntimeApi, - C: HeaderBackend + HeaderMetadata, - C: Send + Sync + 'static, +pub fn create_full(deps: FullDeps) -> RpcExtension where + C: ProvideRuntimeApi + HeaderBackend + AuxStore + + HeaderMetadata + Send + Sync + 'static, C::Api: frame_rpc_system::AccountNonceApi, C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, C::Api: BabeApi, C::Api: BlockBuilder, P: TransactionPool + Sync + Send + 'static, SC: SelectChain + 'static, + B: sc_client_api::Backend + Send + Sync + 'static, + B::State: sc_client_api::StateBackend>, { use frame_rpc_system::{FullSystem, SystemApi}; use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApi}; @@ -106,6 +115,7 @@ pub fn create_full(deps: FullDeps) -> RpcExtension where client, pool, select_chain, + chain_spec, deny_unsafe, babe, grandpa, @@ -120,6 +130,7 @@ pub fn create_full(deps: FullDeps) -> RpcExtension where shared_authority_set, justification_stream, subscription_executor, + finality_provider, } = grandpa; io.extend_with( @@ -131,8 +142,8 @@ pub fn create_full(deps: FullDeps) -> RpcExtension where io.extend_with( sc_consensus_babe_rpc::BabeApi::to_delegate( BabeRpcHandler::new( - client, - shared_epoch_changes, + client.clone(), + shared_epoch_changes.clone(), keystore, babe_config, select_chain, @@ -142,10 +153,20 @@ pub fn create_full(deps: FullDeps) -> RpcExtension where ); io.extend_with( GrandpaApi::to_delegate(GrandpaRpcHandler::new( - shared_authority_set, + shared_authority_set.clone(), shared_voter_state, justification_stream, subscription_executor, + finality_provider, + )) + ); + io.extend_with( + SyncStateRpcApi::to_delegate(SyncStateRpcHandler::new( + chain_spec, + client, + shared_authority_set, + shared_epoch_changes, + deny_unsafe, )) ); io diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 213610bd54062123ceea7fdf35a61a01265224b0..bb2a1270ce208b484740d0a2621bf4066a6496ef 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "polkadot-runtime-common" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } -log = { version = "0.3.9", optional = true } -rustc-hex = { version = "2.0.1", default-features = false } -serde = { version = "1.0.102", default-features = false } -serde_derive = { version = "1.0.102", optional = true } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +log = { version = "0.4.11", optional = true } +rustc-hex = { version = "2.1.0", default-features = false } +serde = { version = "1.0.118", default-features = false } +serde_derive = { version = "1.0.117", optional = true } static_assertions = "1.1.0" sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -32,14 +32,17 @@ pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = " pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } -libsecp256k1 = { version = "0.3.2", default-features = false, optional = true } +libsecp256k1 = { version = "0.3.5", default-features = false, optional = true } runtime-parachains = { package = "polkadot-runtime-parachains", path = "../parachains", default-features = false } +xcm = { path = "../../xcm", default-features = false } + [dev-dependencies] -hex-literal = "0.2.1" +hex-literal = "0.3.1" keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -47,16 +50,16 @@ sp-application-crypto = { git = "https://github.com/paritytech/substrate", branc pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master" } -trie-db = "0.22.0" -serde_json = "1.0.41" -libsecp256k1 = "0.3.2" +trie-db = "0.22.2" +serde_json = "1.0.61" +libsecp256k1 = "0.3.5" [features] default = ["std"] no_std = [] std = [ "bitvec/std", - "codec/std", + "parity-scale-codec/std", "log", "rustc-hex/std", "serde_derive", @@ -79,6 +82,8 @@ std = [ "pallet-timestamp/std", "pallet-vesting/std", "pallet-transaction-payment/std", + "runtime-parachains/std", + "xcm/std", ] runtime-benchmarks = [ "libsecp256k1/hmac", diff --git a/runtime/common/src/claims.rs b/runtime/common/src/claims.rs index 334d5ec4bb7b58c6c3958553c845fc182807ca3d..102b34fa863789bad81e23acdae433567e136d54 100644 --- a/runtime/common/src/claims.rs +++ b/runtime/common/src/claims.rs @@ -19,11 +19,13 @@ use sp_std::{prelude::*, fmt::Debug}; use sp_io::{hashing::keccak_256, crypto::secp256k1_ecdsa_recover}; use frame_support::{ - decl_event, decl_storage, decl_module, decl_error, ensure, dispatch::IsSubType, - traits::{Currency, Get, VestingSchedule, EnsureOrigin}, weights::{Pays, DispatchClass} + decl_event, decl_storage, decl_module, decl_error, ensure, + traits::{Currency, Get, VestingSchedule, EnsureOrigin, IsSubType}, + weights::{Weight, Pays, DispatchClass}, + pallet_prelude::DispatchResultWithPostInfo, }; use frame_system::{ensure_signed, ensure_root, ensure_none}; -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; #[cfg(feature = "std")] use serde::{self, Serialize, Deserialize, Serializer, Deserializer}; #[cfg(feature = "std")] @@ -37,16 +39,34 @@ use sp_runtime::{ }; use primitives::v1::ValidityError; -type CurrencyOf = <::VestingSchedule as VestingSchedule<::AccountId>>::Currency; -type BalanceOf = as Currency<::AccountId>>::Balance; +type CurrencyOf = <::VestingSchedule as VestingSchedule<::AccountId>>::Currency; +type BalanceOf = as Currency<::AccountId>>::Balance; /// Configuration trait. -pub trait Trait: frame_system::Trait { +pub trait Config: frame_system::Config { /// The overarching event type. - type Event: From> + Into<::Event>; + type Event: From> + Into<::Event>; type VestingSchedule: VestingSchedule; type Prefix: Get<&'static [u8]>; type MoveClaimOrigin: EnsureOrigin; + type WeightInfo: WeightInfo; +} + +pub trait WeightInfo { + fn claim() -> Weight; + fn mint_claim() -> Weight; + fn claim_attest() -> Weight; + fn attest() -> Weight; + fn move_claim() -> Weight; +} + +pub struct TestWeightInfo; +impl WeightInfo for TestWeightInfo { + fn claim() -> Weight { 0 } + fn mint_claim() -> Weight { 0 } + fn claim_attest() -> Weight { 0 } + fn attest() -> Weight { 0 } + fn move_claim() -> Weight { 0 } } /// The kind of a statement an account needs to make for a claim to be valid. @@ -130,7 +150,7 @@ impl sp_std::fmt::Debug for EcdsaSignature { decl_event!( pub enum Event where Balance = BalanceOf, - AccountId = ::AccountId + AccountId = ::AccountId { /// Someone claimed some DOTs. [who, ethereum_address, amount] Claimed(AccountId, EthereumAddress, Balance), @@ -138,7 +158,7 @@ decl_event!( ); decl_error! { - pub enum Error for Module { + pub enum Error for Module { /// Invalid Ethereum signature. InvalidEthereumSignature, /// Ethereum address has no claim. @@ -159,7 +179,7 @@ decl_storage! { // A macro for the Storage trait, and its implementation, for this module. // This allows for type-safe usage of the Substrate storage database, so you can // keep things around between blocks. - trait Store for Module as Claims { + trait Store for Module as Claims { Claims get(fn claims) build(|config: &GenesisConfig| { config.claims.iter().map(|(a, b, _, _)| (a.clone(), b.clone())).collect::>() }): map hasher(identity) EthereumAddress => Option>; @@ -194,7 +214,7 @@ decl_storage! { } decl_module! { - pub struct Module for enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { type Error = Error; /// The Prefix that is used in signed Ethereum messages for this network @@ -223,25 +243,11 @@ decl_module! { /// /// /// The weight of this call is invariant over the input parameters. - /// - One `eth_recover` operation which involves a keccak hash and a - /// ecdsa recover. - /// - Three storage reads to check if a claim exists for the user, to - /// get the current pot size, to see if there exists a vesting schedule. - /// - Up to one storage write for adding a new vesting schedule. - /// - One `deposit_creating` Currency call. - /// - One storage write to update the total. - /// - Two storage removals for vesting and claims information. - /// - One deposit event. + /// Weight includes logic to validate unsigned `claim` call. /// /// Total Complexity: O(1) - /// ---------------------------- - /// Base Weight: 269.7 µs - /// DB Weight: - /// - Read: Signing, Claims, Total, Claims Vesting, Vesting Vesting, Balance Lock, Account - /// - Write: Vesting Vesting, Account, Balance Lock, Total, Claim, Claims Vesting, Signing - /// Validate Unsigned: +188.7 µs /// - #[weight = T::DbWeight::get().reads_writes(7, 7) + 270_000_000 + 190_000_000] + #[weight = T::WeightInfo::claim()] fn claim(origin, dest: T::AccountId, ethereum_signature: EcdsaSignature) { ensure_none(origin)?; @@ -264,24 +270,11 @@ decl_module! { /// /// /// The weight of this call is invariant over the input parameters. - /// - One storage mutate to increase the total claims available. - /// - One storage write to add a new claim. - /// - Up to one storage write to add a new vesting schedule. + /// We assume worst case that both vesting and statement is being inserted. /// /// Total Complexity: O(1) - /// --------------------- - /// Base Weight: 10.46 µs - /// DB Weight: - /// - Reads: Total - /// - Writes: Total, Claims - /// - Maybe Write: Vesting, Statement /// - #[weight = - T::DbWeight::get().reads_writes(1, 2) - + T::DbWeight::get().writes(vesting_schedule.is_some().into()) - + T::DbWeight::get().writes(statement.is_some().into()) - + 10_000_000 - ] + #[weight = T::WeightInfo::mint_claim()] fn mint_claim(origin, who: EthereumAddress, value: BalanceOf, @@ -322,26 +315,11 @@ decl_module! { /// /// /// The weight of this call is invariant over the input parameters. - /// - One `eth_recover` operation which involves a keccak hash and a - /// ecdsa recover. - /// - Four storage reads to check if a claim exists for the user, to - /// get the current pot size, to see if there exists a vesting schedule, to get the - /// required statement. - /// - Up to one storage write for adding a new vesting schedule. - /// - One `deposit_creating` Currency call. - /// - One storage write to update the total. - /// - Two storage removals for vesting and claims information. - /// - One deposit event. + /// Weight includes logic to validate unsigned `claim_attest` call. /// /// Total Complexity: O(1) - /// ---------------------------- - /// Base Weight: 270.2 µs - /// DB Weight: - /// - Read: Signing, Claims, Total, Claims Vesting, Vesting Vesting, Balance Lock, Account - /// - Write: Vesting Vesting, Account, Balance Lock, Total, Claim, Claims Vesting, Signing - /// Validate Unsigned: +190.1 µs /// - #[weight = T::DbWeight::get().reads_writes(7, 7) + 270_000_000 + 190_000_000] + #[weight = T::WeightInfo::claim_attest()] fn claim_attest(origin, dest: T::AccountId, ethereum_signature: EcdsaSignature, @@ -370,16 +348,13 @@ decl_module! { /// - `statement`: The identity of the statement which is being attested to in the signature. /// /// + /// The weight of this call is invariant over the input parameters. + /// Weight includes logic to do pre-validation on `attest` call. + /// /// Total Complexity: O(1) - /// ---------------------------- - /// Base Weight: 93.3 µs - /// DB Weight: - /// - Read: Preclaims, Signing, Claims, Total, Claims Vesting, Vesting Vesting, Balance Lock, Account - /// - Write: Vesting Vesting, Account, Balance Lock, Total, Claim, Claims Vesting, Signing, Preclaims - /// Validate PreValidateAttests: +8.631 µs /// #[weight = ( - T::DbWeight::get().reads_writes(8, 8) + 90_000_000 + 10_000_000, + T::WeightInfo::attest(), DispatchClass::Normal, Pays::No )] @@ -393,16 +368,12 @@ decl_module! { Preclaims::::remove(&who); } - #[weight = ( - T::DbWeight::get().reads_writes(4, 4) + 100_000_000_000, - DispatchClass::Normal, - Pays::No - )] + #[weight = T::WeightInfo::move_claim()] fn move_claim(origin, old: EthereumAddress, new: EthereumAddress, maybe_preclaim: Option, - ) { + ) -> DispatchResultWithPostInfo { T::MoveClaimOrigin::try_origin(origin).map(|_| ()).or_else(ensure_root)?; Claims::::take(&old).map(|c| Claims::::insert(&new, c)); @@ -411,6 +382,7 @@ decl_module! { maybe_preclaim.map(|preclaim| Preclaims::::mutate(&preclaim, |maybe_o| if maybe_o.as_ref().map_or(false, |o| o == &old) { *maybe_o = Some(new) } )); + Ok(Pays::No.into()) } } } @@ -426,7 +398,7 @@ fn to_ascii_hex(data: &[u8]) -> Vec { r } -impl Module { +impl Module { // Constructs the message that Ethereum RPC's `personal_sign` and `eth_sign` would sign. fn ethereum_signable_message(what: &[u8], extra: &[u8]) -> Vec { let prefix = T::Prefix::get(); @@ -487,7 +459,7 @@ impl Module { } } -impl sp_runtime::traits::ValidateUnsigned for Module { +impl sp_runtime::traits::ValidateUnsigned for Module { type Call = Call; fn validate_unsigned(_source: TransactionSource, call: &Self::Call) -> TransactionValidity { @@ -495,16 +467,14 @@ impl sp_runtime::traits::ValidateUnsigned for Module { let (maybe_signer, maybe_statement) = match call { // - // Base Weight: 188.7 µs (includes the full logic of `validate_unsigned`) - // DB Weight: 2 Read (Claims, Signing) + // The weight of this logic is included in the `claim` dispatchable. // Call::claim(account, ethereum_signature) => { let data = account.using_encoded(to_ascii_hex); (Self::eth_recover(ðereum_signature, &data, &[][..]), None) } // - // Base Weight: 190.1 µs (includes the full logic of `validate_unsigned`) - // DB Weight: 2 Read (Claims, Signing) + // The weight of this logic is included in the `claim_attest` dispatchable. // Call::claim_attest(account, ethereum_signature, statement) => { let data = account.using_encoded(to_ascii_hex); @@ -538,11 +508,11 @@ impl sp_runtime::traits::ValidateUnsigned for Module { /// Validate `attest` calls prior to execution. Needed to avoid a DoS attack since they are /// otherwise free to place on chain. #[derive(Encode, Decode, Clone, Eq, PartialEq)] -pub struct PrevalidateAttests(sp_std::marker::PhantomData) where - ::Call: IsSubType>; +pub struct PrevalidateAttests(sp_std::marker::PhantomData) where + ::Call: IsSubType>; -impl Debug for PrevalidateAttests where - ::Call: IsSubType> +impl Debug for PrevalidateAttests where + ::Call: IsSubType> { #[cfg(feature = "std")] fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { @@ -555,8 +525,8 @@ impl Debug for PrevalidateAttests where } } -impl PrevalidateAttests where - ::Call: IsSubType> +impl PrevalidateAttests where + ::Call: IsSubType> { /// Create new `SignedExtension` to check runtime version. pub fn new() -> Self { @@ -564,11 +534,11 @@ impl PrevalidateAttests where } } -impl SignedExtension for PrevalidateAttests where - ::Call: IsSubType> +impl SignedExtension for PrevalidateAttests where + ::Call: IsSubType> { type AccountId = T::AccountId; - type Call = ::Call; + type Call = ::Call; type AdditionalSigned = (); type Pre = (); const IDENTIFIER: &'static str = "PrevalidateAttests"; @@ -578,8 +548,7 @@ impl SignedExtension for PrevalidateAttests where } // - // Base Weight: 8.631 µs - // DB Weight: 2 Read (Preclaims, Signing) + // The weight of this logic is included in the `attest` dispatchable. // fn validate( &self, @@ -615,7 +584,7 @@ mod secp_utils { res.0.copy_from_slice(&keccak_256(&public(secret).serialize()[1..65])[12..]); res } - pub fn sig(secret: &secp256k1::SecretKey, what: &[u8], extra: &[u8]) -> EcdsaSignature { + pub fn sig(secret: &secp256k1::SecretKey, what: &[u8], extra: &[u8]) -> EcdsaSignature { let msg = keccak_256(&>::ethereum_signable_message(&to_ascii_hex(what)[..], extra)); let (sig, recovery_id) = secp256k1::sign(&secp256k1::Message::parse(&msg), secret); let mut r = [0u8; 65]; @@ -633,10 +602,10 @@ mod tests { use secp_utils::*; use sp_core::H256; - use codec::Encode; + use parity_scale_codec::Encode; // 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 sp_runtime::{Perbill, traits::{BlakeTwo256, IdentityLookup, Identity}, testing::Header}; + use sp_runtime::{traits::{BlakeTwo256, IdentityLookup, Identity}, testing::Header}; use frame_support::{ impl_outer_origin, impl_outer_dispatch, assert_ok, assert_err, assert_noop, parameter_types, ord_parameter_types, weights::{Pays, GetDispatchInfo}, traits::ExistenceRequirement, @@ -661,12 +630,12 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u32 = 250; - pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; - pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } - impl frame_system::Trait for Test { + impl frame_system::Config for Test { type BaseCallFilter = (); + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); type Origin = Origin; type Call = Call; type Index = u64; @@ -678,37 +647,34 @@ mod tests { type Header = Header; type Event = (); type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); - type BlockExecutionWeight = (); - type ExtrinsicBaseWeight = (); - type MaximumExtrinsicWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = (); - type ModuleToIndex = (); + type PalletInfo = (); type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; type SystemWeightInfo = (); + type SS58Prefix = (); } parameter_types! { pub const ExistentialDeposit: u64 = 1; - pub const CreationFee: u64 = 0; - pub const MinVestedTransfer: u64 = 0; } - impl pallet_balances::Trait for Test { + impl pallet_balances::Config for Test { type Balance = u64; type Event = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type MaxLocks = (); type WeightInfo = (); } - impl pallet_vesting::Trait for Test { + parameter_types! { + pub const MinVestedTransfer: u64 = 0; + } + + impl pallet_vesting::Config for Test { type Event = (); type Currency = Balances; type BlockNumberToBalance = Identity; @@ -723,11 +689,12 @@ mod tests { pub const Six: u64 = 6; } - impl Trait for Test { + impl Config for Test { type Event = (); type VestingSchedule = Vesting; type Prefix = Prefix; type MoveClaimOrigin = frame_system::EnsureSignedBy; + type WeightInfo = TestWeightInfo; } type System = frame_system::Module; type Balances = pallet_balances::Module; @@ -1045,7 +1012,7 @@ mod tests { fn claiming_while_vested_doesnt_work() { new_test_ext().execute_with(|| { // A user is already vested - assert_ok!(::VestingSchedule::add_vesting_schedule(&69, total_claims(), 100, 10)); + assert_ok!(::VestingSchedule::add_vesting_schedule(&69, total_claims(), 100, 10)); CurrencyOf::::make_free_balance_be(&69, total_claims()); assert_eq!(Balances::free_balance(69), total_claims()); assert_ok!(Claims::mint_claim(Origin::root(), eth(&bob()), 200, Some((50, 10, 1)), None)); @@ -1178,18 +1145,18 @@ mod benchmarking { const MAX_CLAIMS: u32 = 10_000; const VALUE: u32 = 1_000_000; - fn create_claim(input: u32) -> DispatchResult { + fn create_claim(input: u32) -> DispatchResult { let secret_key = secp256k1::SecretKey::parse(&keccak_256(&input.encode())).unwrap(); let eth_address = eth(&secret_key); - let vesting = Some((100_000.into(), 1_000.into(), 100.into())); + let vesting = Some((100_000u32.into(), 1_000u32.into(), 100u32.into())); super::Module::::mint_claim(RawOrigin::Root.into(), eth_address, VALUE.into(), vesting, None)?; Ok(()) } - fn create_claim_attest(input: u32) -> DispatchResult { + fn create_claim_attest(input: u32) -> DispatchResult { let secret_key = secp256k1::SecretKey::parse(&keccak_256(&input.encode())).unwrap(); let eth_address = eth(&secret_key); - let vesting = Some((100_000.into(), 1_000.into(), 100.into())); + let vesting = Some((100_000u32.into(), 1_000u32.into(), 100u32.into())); super::Module::::mint_claim( RawOrigin::Root.into(), eth_address, @@ -1201,109 +1168,98 @@ mod benchmarking { } benchmarks! { - _ { - // Create claims in storage. Two are created at a time! - let c in 0 .. MAX_CLAIMS / 2 => { + // Benchmark `claim` including `validate_unsigned` logic. + claim { + let c = MAX_CLAIMS; + + for i in 0 .. c / 2 { create_claim::(c)?; create_claim_attest::(u32::max_value() - c)?; - }; - } + } - // Benchmark `claim` for different users. - claim { - let u in 0 .. 1000; - let secret_key = secp256k1::SecretKey::parse(&keccak_256(&u.encode())).unwrap(); + let secret_key = secp256k1::SecretKey::parse(&keccak_256(&c.encode())).unwrap(); let eth_address = eth(&secret_key); - let account: T::AccountId = account("user", u, SEED); - let vesting = Some((100_000.into(), 1_000.into(), 100.into())); + let account: T::AccountId = account("user", c, SEED); + let vesting = Some((100_000u32.into(), 1_000u32.into(), 100u32.into())); let signature = sig::(&secret_key, &account.encode(), &[][..]); super::Module::::mint_claim(RawOrigin::Root.into(), eth_address, VALUE.into(), vesting, None)?; assert_eq!(Claims::::get(eth_address), Some(VALUE.into())); - }: _(RawOrigin::None, account, signature) + let source = sp_runtime::transaction_validity::TransactionSource::External; + let call = Call::::claim(account.clone(), signature.clone()); + }: { + super::Module::::validate_unsigned(source, &call)?; + super::Module::::claim(RawOrigin::None.into(), account, signature)?; + } verify { assert_eq!(Claims::::get(eth_address), None); } // Benchmark `mint_claim` when there already exists `c` claims in storage. mint_claim { - let c in ...; - let eth_address = account("eth_address", c, SEED); - let vesting = Some((100_000.into(), 1_000.into(), 100.into())); + let c = MAX_CLAIMS; + + for i in 0 .. c / 2 { + create_claim::(c)?; + create_claim_attest::(u32::max_value() - c)?; + } + + let eth_address = account("eth_address", 0, SEED); + let vesting = Some((100_000u32.into(), 1_000u32.into(), 100u32.into())); let statement = StatementKind::Regular; }: _(RawOrigin::Root, eth_address, VALUE.into(), vesting, Some(statement)) verify { assert_eq!(Claims::::get(eth_address), Some(VALUE.into())); } - // Benchmark `claim_attest` for different users. + // Benchmark `claim_attest` including `validate_unsigned` logic. claim_attest { - let u in 0 .. 1000; - let attest_u = u32::max_value() - u; - let secret_key = secp256k1::SecretKey::parse(&keccak_256(&attest_u.encode())).unwrap(); - let eth_address = eth(&secret_key); - let account: T::AccountId = account("user", u, SEED); - let vesting = Some((100_000.into(), 1_000.into(), 100.into())); - let statement = StatementKind::Regular; - let signature = sig::(&secret_key, &account.encode(), statement.to_text()); - super::Module::::mint_claim(RawOrigin::Root.into(), eth_address, VALUE.into(), vesting, Some(statement))?; - assert_eq!(Claims::::get(eth_address), Some(VALUE.into())); - }: _(RawOrigin::None, account, signature, statement.to_text().to_vec()) - verify { - assert_eq!(Claims::::get(eth_address), None); - } + let c = MAX_CLAIMS; - // Benchmark `attest` for different users. - attest { - let u in 0 .. 1000; - let attest_u = u32::max_value() - u; - let secret_key = secp256k1::SecretKey::parse(&keccak_256(&attest_u.encode())).unwrap(); + for i in 0 .. c / 2 { + create_claim::(c)?; + create_claim_attest::(u32::max_value() - c)?; + } + + // Crate signature + let attest_c = u32::max_value() - c; + let secret_key = secp256k1::SecretKey::parse(&keccak_256(&attest_c.encode())).unwrap(); let eth_address = eth(&secret_key); - let account: T::AccountId = account("user", u, SEED); - let vesting = Some((100_000.into(), 1_000.into(), 100.into())); + let account: T::AccountId = account("user", c, SEED); + let vesting = Some((100_000u32.into(), 1_000u32.into(), 100u32.into())); let statement = StatementKind::Regular; let signature = sig::(&secret_key, &account.encode(), statement.to_text()); super::Module::::mint_claim(RawOrigin::Root.into(), eth_address, VALUE.into(), vesting, Some(statement))?; - Preclaims::::insert(&account, eth_address); assert_eq!(Claims::::get(eth_address), Some(VALUE.into())); - }: _(RawOrigin::Signed(account), statement.to_text().to_vec()) + let call = Call::::claim_attest(account.clone(), signature.clone(), StatementKind::Regular.to_text().to_vec()); + let source = sp_runtime::transaction_validity::TransactionSource::External; + }: { + super::Module::::validate_unsigned(source, &call)?; + super::Module::::claim_attest(RawOrigin::None.into(), account, signature, statement.to_text().to_vec())?; + } verify { assert_eq!(Claims::::get(eth_address), None); } - // Benchmark the time it takes to execute `validate_unsigned` for `claim` - validate_unsigned_claim { - let c in ...; - // Crate signature - let secret_key = secp256k1::SecretKey::parse(&keccak_256(&c.encode())).unwrap(); - let account: T::AccountId = account("user", c, SEED); - let signature = sig::(&secret_key, &account.encode(), &[][..]); - let call = Call::::claim(account, signature); - let source = sp_runtime::transaction_validity::TransactionSource::External; - }: { - super::Module::::validate_unsigned(source, &call)? - } + // Benchmark `attest` including prevalidate logic. + attest { + let c = MAX_CLAIMS; - // Benchmark the time it takes to execute `validate_unsigned` for `claim_attest` - validate_unsigned_claim_attest { - let c in ...; - // Crate signature - let attest_c = u32::max_value() - c; - let secret_key = secp256k1::SecretKey::parse(&keccak_256(&attest_c.encode())).unwrap(); - let account: T::AccountId = account("user", c, SEED); - let signature = sig::(&secret_key, &account.encode(), StatementKind::Regular.to_text()); - let call = Call::::claim_attest(account, signature, StatementKind::Regular.to_text().to_vec()); - let source = sp_runtime::transaction_validity::TransactionSource::External; - }: { - super::Module::::validate_unsigned(source, &call)? - } + for i in 0 .. c / 2 { + create_claim::(c)?; + create_claim_attest::(u32::max_value() - c)?; + } - validate_prevalidate_attests { - let c in ...; let attest_c = u32::max_value() - c; let secret_key = secp256k1::SecretKey::parse(&keccak_256(&attest_c.encode())).unwrap(); let eth_address = eth(&secret_key); let account: T::AccountId = account("user", c, SEED); + let vesting = Some((100_000u32.into(), 1_000u32.into(), 100u32.into())); + let statement = StatementKind::Regular; + let signature = sig::(&secret_key, &account.encode(), statement.to_text()); + super::Module::::mint_claim(RawOrigin::Root.into(), eth_address, VALUE.into(), vesting, Some(statement))?; Preclaims::::insert(&account, eth_address); + assert_eq!(Claims::::get(eth_address), Some(VALUE.into())); + let call = super::Call::attest(StatementKind::Regular.to_text().to_vec()); // We have to copy the validate statement here because of trait issues... :( let validate = |who: &T::AccountId, call: &super::Call| -> DispatchResult { @@ -1316,10 +1272,41 @@ mod benchmarking { Ok(()) }; }: { - validate(&account, &call)? + validate(&account, &call)?; + super::Module::::attest(RawOrigin::Signed(account).into(), statement.to_text().to_vec())?; + } + verify { + assert_eq!(Claims::::get(eth_address), None); + } + + move_claim { + let c = MAX_CLAIMS; + + for i in 0 .. c / 2 { + create_claim::(c)?; + create_claim_attest::(u32::max_value() - c)?; + } + + let attest_c = u32::max_value() - c; + let secret_key = secp256k1::SecretKey::parse(&keccak_256(&attest_c.encode())).unwrap(); + let eth_address = eth(&secret_key); + + let new_secret_key = secp256k1::SecretKey::parse(&keccak_256(&(u32::max_value()/2).encode())).unwrap(); + let new_eth_address = eth(&new_secret_key); + + let account: T::AccountId = account("user", c, SEED); + Preclaims::::insert(&account, eth_address); + + assert!(Claims::::contains_key(eth_address)); + assert!(!Claims::::contains_key(new_eth_address)); + }: _(RawOrigin::Root, eth_address, new_eth_address, Some(account)) + verify { + assert!(!Claims::::contains_key(eth_address)); + assert!(Claims::::contains_key(new_eth_address)); } // Benchmark the time it takes to do `repeat` number of keccak256 hashes + #[extra] keccak256 { let i in 0 .. 10_000; let bytes = (i).encode(); @@ -1330,6 +1317,7 @@ mod benchmarking { } // Benchmark the time it takes to do `repeat` number of `eth_recover` + #[extra] eth_recover { let i in 0 .. 1_000; // Crate signature @@ -1358,9 +1346,7 @@ mod benchmarking { assert_ok!(test_benchmark_mint_claim::()); assert_ok!(test_benchmark_claim_attest::()); assert_ok!(test_benchmark_attest::()); - assert_ok!(test_benchmark_validate_unsigned_claim::()); - assert_ok!(test_benchmark_validate_unsigned_claim_attest::()); - assert_ok!(test_benchmark_validate_prevalidate_attests::()); + assert_ok!(test_benchmark_move_claim::()); assert_ok!(test_benchmark_keccak256::()); assert_ok!(test_benchmark_eth_recover::()); }); diff --git a/runtime/common/src/crowdfund.rs b/runtime/common/src/crowdfund.rs index 17b78cbd71d045b27e951acf0b5ebfd50a7df21f..715f6a9cfbab4f32e623814790bf27eaa6fcef55 100644 --- a/runtime/common/src/crowdfund.rs +++ b/runtime/common/src/crowdfund.rs @@ -69,7 +69,7 @@ use frame_support::{ decl_module, decl_storage, decl_event, decl_error, storage::child, ensure, traits::{ - Currency, Get, OnUnbalanced, WithdrawReason, ExistenceRequirement::AllowDeath + Currency, Get, OnUnbalanced, WithdrawReasons, ExistenceRequirement::AllowDeath }, }; use frame_system::ensure_signed; @@ -77,18 +77,18 @@ use sp_runtime::{ModuleId, traits::{AccountIdConversion, Hash, Saturating, Zero, CheckedAdd} }; use crate::slots; -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; use sp_std::vec::Vec; use primitives::v1::{Id as ParaId, HeadData}; pub type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; + <::Currency as Currency<::AccountId>>::Balance; #[allow(dead_code)] pub type NegativeImbalanceOf = - <::Currency as Currency<::AccountId>>::NegativeImbalance; + <::Currency as Currency<::AccountId>>::NegativeImbalance; -pub trait Trait: slots::Trait { - type Event: From> + Into<::Event>; +pub trait Config: slots::Config { + type Event: From> + Into<::Event>; /// ModuleID for the crowdfund module. An appropriate value could be ```ModuleId(*b"py/cfund")``` type ModuleId: Get; @@ -164,7 +164,7 @@ pub struct FundInfo { } decl_storage! { - trait Store for Module as Crowdfund { + trait Store for Module as Crowdfund { /// Info on all of the funds. Funds get(fn funds): map hasher(twox_64_concat) FundIndex @@ -184,7 +184,7 @@ decl_storage! { decl_event! { pub enum Event where - ::AccountId, + ::AccountId, Balance = BalanceOf, { /// Create a new crowdfunding campaign. [fund_index] @@ -205,7 +205,7 @@ decl_event! { } decl_error! { - pub enum Error for Module { + pub enum Error for Module { /// Last slot must be greater than first slot. LastSlotBeforeFirstSlot, /// The last slot cannot be more then 3 slots after the first slot. @@ -251,7 +251,7 @@ decl_error! { } decl_module! { - pub struct Module for enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { type Error = Error; const ModuleId: ModuleId = T::ModuleId::get(); @@ -269,11 +269,11 @@ decl_module! { let owner = ensure_signed(origin)?; ensure!(first_slot < last_slot, Error::::LastSlotBeforeFirstSlot); - ensure!(last_slot <= first_slot + 3.into(), Error::::LastSlotTooFarInFuture); + ensure!(last_slot <= first_slot + 3u32.into(), Error::::LastSlotTooFarInFuture); ensure!(end > >::block_number(), Error::::CannotEndInPast); let deposit = T::SubmissionDeposit::get(); - let transfer = WithdrawReason::Transfer.into(); + let transfer = WithdrawReasons::TRANSFER; let imb = T::Currency::withdraw(&owner, deposit, transfer, AllowDeath)?; let index = FundCount::get(); @@ -455,7 +455,7 @@ decl_module! { // Avoid using transfer to ensure we don't pay any fees. let fund_account = &Self::fund_account_id(index); - let transfer = WithdrawReason::Transfer.into(); + let transfer = WithdrawReasons::TRANSFER; let imbalance = T::Currency::withdraw(fund_account, balance, transfer, AllowDeath)?; let _ = T::Currency::resolve_into_existing(&who, imbalance); @@ -485,7 +485,7 @@ decl_module! { let account = Self::fund_account_id(index); // Avoid using transfer to ensure we don't pay any fees. - let transfer = WithdrawReason::Transfer.into(); + let transfer = WithdrawReasons::TRANSFER; let imbalance = T::Currency::withdraw(&account, fund.deposit, transfer, AllowDeath)?; let _ = T::Currency::resolve_into_existing(&fund.owner, imbalance); @@ -528,7 +528,7 @@ decl_module! { } } -impl Module { +impl Module { /// The account ID of the fund pot. /// /// This actually does computation. If you need to keep using it, then make sure you cache the @@ -560,7 +560,7 @@ impl Module { } pub fn crowdfund_kill(index: FundIndex) { - child::kill_storage(&Self::id_from_index(index)); + child::kill_storage(&Self::id_from_index(index), None); } } @@ -573,13 +573,12 @@ mod tests { impl_outer_origin, assert_ok, assert_noop, parameter_types, traits::{OnInitialize, OnFinalize}, }; - use frame_support::traits::{Contains, ContainsLengthBound}; use sp_core::H256; use primitives::v1::{Id as ParaId, ValidationCode}; // 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 requried. use sp_runtime::{ - Perbill, Permill, Percent, testing::Header, DispatchResult, + Permill, testing::Header, DispatchResult, traits::{BlakeTwo256, IdentityLookup}, }; use crate::slots::Registrar; @@ -595,12 +594,13 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u32 = 250; - pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; - pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } - impl frame_system::Trait for Test { + + impl frame_system::Config for Test { type BaseCallFilter = (); + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); type Origin = Origin; type Call = (); type Index = u64; @@ -612,29 +612,24 @@ mod tests { type Header = Header; type Event = (); type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); - type BlockExecutionWeight = (); - type ExtrinsicBaseWeight = (); - type MaximumExtrinsicWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = (); - type ModuleToIndex = (); + type PalletInfo = (); type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; type SystemWeightInfo = (); + type SS58Prefix = (); } parameter_types! { pub const ExistentialDeposit: u64 = 1; } - impl pallet_balances::Trait for Test { + impl pallet_balances::Config for Test { type Balance = u64; type Event = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type MaxLocks = (); type WeightInfo = (); } @@ -643,40 +638,21 @@ mod tests { pub const ProposalBondMinimum: u64 = 1; pub const SpendPeriod: u64 = 2; pub const Burn: Permill = Permill::from_percent(50); - pub const TipCountdown: u64 = 1; - pub const TipFindersFee: Percent = Percent::from_percent(20); - pub const TipReportDepositBase: u64 = 1; - pub const TipReportDepositPerByte: u64 = 1; pub const TreasuryModuleId: ModuleId = ModuleId(*b"py/trsry"); } - pub struct Nobody; - impl Contains for Nobody { - fn contains(_: &u64) -> bool { false } - fn sorted_members() -> Vec { vec![] } - #[cfg(feature = "runtime-benchmarks")] - fn add(_: &u64) { unimplemented!() } - } - impl ContainsLengthBound for Nobody { - fn min_len() -> usize { 0 } - fn max_len() -> usize { 0 } - } - impl pallet_treasury::Trait for Test { + impl pallet_treasury::Config for Test { type Currency = pallet_balances::Module; type ApproveOrigin = frame_system::EnsureRoot; type RejectOrigin = frame_system::EnsureRoot; type Event = (); - type ProposalRejection = (); + type OnSlash = (); type ProposalBond = ProposalBond; type ProposalBondMinimum = ProposalBondMinimum; type SpendPeriod = SpendPeriod; type Burn = Burn; type BurnDestination = (); - type Tippers = Nobody; - type TipCountdown = TipCountdown; - type TipFindersFee = TipFindersFee; - type TipReportDepositBase = TipReportDepositBase; - type TipReportDepositPerByte = TipReportDepositPerByte; type ModuleId = TreasuryModuleId; + type SpendFunds = (); type WeightInfo = (); } @@ -736,7 +712,7 @@ mod tests { pub const LeasePeriod: u64 = 10; pub const EndingPeriod: u64 = 3; } - impl slots::Trait for Test { + impl slots::Config for Test { type Event = (); type Currency = Balances; type Parachains = TestParachains; @@ -750,7 +726,7 @@ mod tests { pub const RetirementPeriod: u64 = 5; pub const CrowdfundModuleId: ModuleId = ModuleId(*b"py/cfund"); } - impl Trait for Test { + impl Config for Test { type Event = (); type SubmissionDeposit = SubmissionDeposit; type MinContribution = MinContribution; @@ -923,7 +899,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into() )); @@ -934,7 +910,7 @@ mod tests { assert_eq!( fund.deploy_data, Some(DeployData { - code_hash: ::Hash::default(), + code_hash: ::Hash::default(), code_size: 0, initial_head_data: vec![0].into(), }), @@ -953,7 +929,7 @@ mod tests { assert_noop!(Crowdfund::fix_deploy_data( Origin::signed(2), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into()), Error::::InvalidOrigin @@ -963,7 +939,7 @@ mod tests { assert_noop!(Crowdfund::fix_deploy_data( Origin::signed(1), 1, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into()), Error::::InvalidFundIndex @@ -973,7 +949,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -981,7 +957,7 @@ mod tests { assert_noop!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![1].into()), Error::::ExistingDeployData @@ -1001,7 +977,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1047,7 +1023,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1075,7 +1051,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1118,7 +1094,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1260,7 +1236,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1289,7 +1265,7 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); @@ -1328,14 +1304,14 @@ mod tests { assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(1), 0, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); assert_ok!(Crowdfund::fix_deploy_data( Origin::signed(2), 1, - ::Hash::default(), + ::Hash::default(), 0, vec![0].into(), )); diff --git a/runtime/common/src/impls.rs b/runtime/common/src/impls.rs index 111fc00e24a0ef6d6b1a74925109c0a9b65fd4e2..66ebb7cd9e645afe9c3e35a4b56649f20ee7e4ac 100644 --- a/runtime/common/src/impls.rs +++ b/runtime/common/src/impls.rs @@ -16,21 +16,19 @@ //! Auxillary struct/enums for polkadot runtime. -use sp_runtime::traits::Convert; use frame_support::traits::{OnUnbalanced, Imbalance, Currency}; use crate::NegativeImbalance; /// Logic for the author to get a portion of fees. pub struct ToAuthor(sp_std::marker::PhantomData); - impl OnUnbalanced> for ToAuthor where - R: pallet_balances::Trait + pallet_authorship::Trait, - ::AccountId: From, - ::AccountId: Into, - ::Event: From::AccountId, - ::Balance, + R: pallet_balances::Config + pallet_authorship::Config, + ::AccountId: From, + ::AccountId: Into, + ::Event: From::AccountId, + ::Balance, pallet_balances::DefaultInstance> >, { @@ -42,32 +40,166 @@ where } } -/// Converter for currencies to votes. -pub struct CurrencyToVoteHandler(sp_std::marker::PhantomData); - -impl CurrencyToVoteHandler +pub struct DealWithFees(sp_std::marker::PhantomData); +impl OnUnbalanced> for DealWithFees where - R: pallet_balances::Trait, - R::Balance: Into, + R: pallet_balances::Config + pallet_treasury::Config + pallet_authorship::Config, + pallet_treasury::Module: OnUnbalanced>, + ::AccountId: From, + ::AccountId: Into, + ::Event: From::AccountId, + ::Balance, + pallet_balances::DefaultInstance> + >, { - fn factor() -> u128 { - let issuance: u128 = >::total_issuance().into(); - (issuance / u64::max_value() as u128).max(1) + 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); + if let Some(tips) = fees_then_tips.next() { + // for tips, if any, 100% to author + tips.merge_into(&mut split.1); + } + use pallet_treasury::Module as Treasury; + as OnUnbalanced<_>>::on_unbalanced(split.0); + as OnUnbalanced<_>>::on_unbalanced(split.1); + } } } -impl Convert for CurrencyToVoteHandler -where - R: pallet_balances::Trait, - R::Balance: Into, -{ - fn convert(x: u128) -> u64 { (x / Self::factor()) as u64 } -} -impl Convert for CurrencyToVoteHandler -where - R: pallet_balances::Trait, - R::Balance: Into, -{ - fn convert(x: u128) -> u128 { x * Self::factor() } +#[cfg(test)] +mod tests { + use super::*; + use frame_system::limits; + use frame_support::{impl_outer_origin, parameter_types, weights::DispatchClass}; + use frame_support::traits::FindAuthor; + use sp_core::H256; + use sp_runtime::{ + testing::Header, ModuleId, + traits::{BlakeTwo256, IdentityLookup}, + Perbill, + }; + use primitives::v1::AccountId; + + #[derive(Clone, PartialEq, Eq, Debug)] + pub struct Test; + + impl_outer_origin!{ + pub enum Origin for Test {} + } + + parameter_types! { + pub const BlockHashCount: u64 = 250; + pub BlockWeights: limits::BlockWeights = limits::BlockWeights::builder() + .for_class(DispatchClass::all(), |weight| { + weight.base_extrinsic = 100; + }) + .for_class(DispatchClass::non_mandatory(), |weight| { + weight.max_total = Some(1024); + }) + .build_or_panic(); + pub BlockLength: limits::BlockLength = limits::BlockLength::max(2 * 1024); + pub const AvailableBlockRatio: Perbill = Perbill::one(); + } + + impl frame_system::Config for Test { + type BaseCallFilter = (); + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Call = (); + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type Event = (); + type BlockHashCount = BlockHashCount; + type BlockLength = BlockLength; + type BlockWeights = BlockWeights; + type DbWeight = (); + type Version = (); + type PalletInfo = (); + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + } + + impl pallet_balances::Config for Test { + type Balance = u64; + type Event = (); + type DustRemoval = (); + type ExistentialDeposit = (); + type AccountStore = System; + type MaxLocks = (); + type WeightInfo = (); + } + + parameter_types! { + pub const TreasuryModuleId: ModuleId = ModuleId(*b"py/trsry"); + } + + impl pallet_treasury::Config for Test { + type Currency = pallet_balances::Module; + type ApproveOrigin = frame_system::EnsureRoot; + type RejectOrigin = frame_system::EnsureRoot; + type Event = (); + type OnSlash = (); + type ProposalBond = (); + type ProposalBondMinimum = (); + type SpendPeriod = (); + type Burn = (); + type BurnDestination = (); + type ModuleId = TreasuryModuleId; + type SpendFunds = (); + type WeightInfo = (); + } + + pub struct OneAuthor; + impl FindAuthor for OneAuthor { + fn find_author<'a, I>(_: I) -> Option + where I: 'a, + { + Some(Default::default()) + } + } + impl pallet_authorship::Config for Test { + type FindAuthor = OneAuthor; + type UncleGenerations = (); + type FilterUncle = (); + type EventHandler = (); + } + + type Treasury = pallet_treasury::Module; + type Balances = pallet_balances::Module; + type System = frame_system::Module; + + pub fn new_test_ext() -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + // We use default for brevity, but you can configure as desired if needed. + pallet_balances::GenesisConfig::::default().assimilate_storage(&mut t).unwrap(); + t.into() + } + + #[test] + fn test_fees_and_tip_split() { + new_test_ext().execute_with(|| { + let fee = Balances::issue(10); + let tip = Balances::issue(20); + + assert_eq!(Balances::free_balance(Treasury::account_id()), 0); + assert_eq!(Balances::free_balance(AccountId::default()), 0); + + DealWithFees::on_unbalanceds(vec![fee, tip].into_iter()); + + // Author gets 100% of tip and 20% of fee = 22 + assert_eq!(Balances::free_balance(AccountId::default()), 22); + // Treasury gets 80% of fee + assert_eq!(Balances::free_balance(Treasury::account_id()), 8); + }); + } } diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index 50218d39d51e06554a5e3380b659ddce8715d472..c85e5224e0f8072c259292f602a00801e7af292a 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -25,14 +25,14 @@ pub mod crowdfund; pub mod purchase; pub mod impls; pub mod paras_sudo_wrapper; +pub mod paras_registrar; -pub mod dummy; - -use primitives::v1::{BlockNumber, ValidatorId}; -use sp_runtime::{Perquintill, Perbill, FixedPointNumber, traits::Saturating}; +use primitives::v1::{BlockNumber, ValidatorId, AssignmentId}; +use sp_runtime::{Perquintill, Perbill, FixedPointNumber}; +use frame_system::limits; use frame_support::{ parameter_types, traits::{Currency}, - weights::{Weight, constants::WEIGHT_PER_SECOND}, + weights::{Weight, constants::WEIGHT_PER_SECOND, DispatchClass}, }; use pallet_transaction_payment::{TargetedFeeAdjustment, Multiplier}; use static_assertions::const_assert; @@ -46,27 +46,29 @@ pub use pallet_timestamp::Call as TimestampCall; pub use pallet_balances::Call as BalancesCall; /// Implementations of some helper traits passed into runtime modules as associated types. -pub use impls::{CurrencyToVoteHandler, ToAuthor}; +pub use impls::ToAuthor; + +pub type NegativeImbalance = as Currency<::AccountId>>::NegativeImbalance; -pub type NegativeImbalance = as Currency<::AccountId>>::NegativeImbalance; +/// The sequence of bytes a valid wasm module binary always starts with. Apart from that it's also a +/// valid wasm module. +const WASM_MAGIC: &[u8] = &[0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00]; -/// We assume that an on-initialize consumes 10% of the weight on average, hence a single extrinsic -/// will not be allowed to consume more than `AvailableBlockRatio - 10%`. -const AVERAGE_ON_INITIALIZE_WEIGHT: Perbill = Perbill::from_percent(10); +/// We assume that an on-initialize consumes 2.5% of the weight on average, hence a single extrinsic +/// will not be allowed to consume more than `AvailableBlockRatio - 2.5%`. +pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_perthousand(25); +/// 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 2 seconds of compute with a 6 second average block time. +pub const MAXIMUM_BLOCK_WEIGHT: Weight = 2 * WEIGHT_PER_SECOND; + +const_assert!(NORMAL_DISPATCH_RATIO.deconstruct() >= AVERAGE_ON_INITIALIZE_RATIO.deconstruct()); // Common constants used in all runtimes. parameter_types! { pub const BlockHashCount: BlockNumber = 2400; - /// Block time that can be used by weights. - pub const MaximumBlockWeight: Weight = 2 * WEIGHT_PER_SECOND; - /// Portion of the block available to normal class of dispatches. - pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); - /// Maximum weight that a _single_ extrinsic can take. - pub MaximumExtrinsicWeight: Weight = AvailableBlockRatio::get() - .saturating_sub(AVERAGE_ON_INITIALIZE_WEIGHT) * MaximumBlockWeight::get(); - /// Maximum length of block. 5MB. - pub const MaximumBlockLength: u32 = 5 * 1024 * 1024; - /// The portion of the `AvailableBlockRatio` that we adjust the fees with. Blocks filled less + /// The portion of the `NORMAL_DISPATCH_RATIO` that we adjust the fees with. Blocks filled less /// than this will decrease the weight and more will increase. pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); /// The adjustment variable of the runtime. Higher values will cause `TargetBlockFullness` to @@ -76,9 +78,41 @@ parameter_types! { /// that combined with `AdjustmentVariable`, we can recover from the minimum. /// See `multiplier_can_grow_from_zero`. pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 1_000_000_000u128); + /// Maximum length of block. Up to 5MB. + pub BlockLength: limits::BlockLength = + limits::BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); + /// Block weights base values and limits. + pub BlockWeights: limits::BlockWeights = limits::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 an 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(); } -const_assert!(AvailableBlockRatio::get().deconstruct() >= AVERAGE_ON_INITIALIZE_WEIGHT.deconstruct()); +parameter_types! { + /// A limit for off-chain phragmen unsigned solution submission. + /// + /// We want to keep it as high as possible, but can't risk having it reject, + /// so we always subtract the base block execution weight. + pub OffchainSolutionWeightLimit: Weight = BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .expect("Normal extrinsics have weight limit configured by default; qed") + .saturating_sub(BlockExecutionWeight::get()); +} /// Parameterized slow adjusting fee updated based on /// https://w3f-research.readthedocs.io/en/latest/polkadot/Token%20Economics.html#-2.-slow-adjusting-mechanism @@ -89,6 +123,12 @@ pub type SlowAdjustingFeeUpdate = TargetedFeeAdjustment< MinimumMultiplier >; +/// The type used for currency conversion. +/// +/// This must only be used as long as the balance type is u128. +pub type CurrencyToVote = frame_support::traits::U128CurrencyToVote; +static_assertions::assert_eq_size!(primitives::v1::Balance, u128); + /// A placeholder since there is currently no provided session key handler for parachain validator /// keys. pub struct ParachainSessionKeyPlaceholder(sp_std::marker::PhantomData); @@ -96,7 +136,7 @@ impl sp_runtime::BoundToRuntimeAppPublic for ParachainSessionKeyPlaceholder +impl pallet_session::OneSessionHandler for ParachainSessionKeyPlaceholder { type Key = ValidatorId; @@ -118,6 +158,35 @@ impl fn on_disabled(_: usize) { } } +/// A placeholder since there is currently no provided session key handler for parachain validator +/// keys. +pub struct AssignmentSessionKeyPlaceholder(sp_std::marker::PhantomData); +impl sp_runtime::BoundToRuntimeAppPublic for AssignmentSessionKeyPlaceholder { + type Public = AssignmentId; +} + +impl + pallet_session::OneSessionHandler for AssignmentSessionKeyPlaceholder +{ + type Key = AssignmentId; + + fn on_genesis_session<'a, I: 'a>(_validators: I) where + I: Iterator, + T::AccountId: 'a + { + + } + + fn on_new_session<'a, I: 'a>(_changed: bool, _v: I, _q: I) where + I: Iterator, + T::AccountId: 'a + { + + } + + fn on_disabled(_: usize) { } +} + #[cfg(test)] mod multiplier_tests { use super::*; @@ -138,14 +207,18 @@ mod multiplier_tests { parameter_types! { pub const BlockHashCount: u64 = 250; - pub const ExtrinsicBaseWeight: u64 = 100; - pub const MaximumBlockWeight: Weight = 1024; - pub const MaximumBlockLength: u32 = 2 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::one(); + pub BlockLength: frame_system::limits::BlockLength = + frame_system::limits::BlockLength::max(2 * 1024); + pub BlockWeights: frame_system::limits::BlockWeights = + frame_system::limits::BlockWeights::simple_max(1024); } - impl frame_system::Trait for Runtime { + impl frame_system::Config for Runtime { type BaseCallFilter = (); + type BlockWeights = BlockWeights; + type BlockLength = (); + type DbWeight = (); type Origin = Origin; type Index = u64; type BlockNumber = u64; @@ -157,19 +230,13 @@ mod multiplier_tests { type Header = Header; type Event = (); type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); - type BlockExecutionWeight = (); - type ExtrinsicBaseWeight = ExtrinsicBaseWeight; - type MaximumExtrinsicWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = (); - type ModuleToIndex = (); + type PalletInfo = (); type AccountData = (); type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); + type SS58Prefix = (); } type System = frame_system::Module; @@ -178,7 +245,7 @@ mod multiplier_tests { let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default().build_storage::().unwrap().into(); t.execute_with(|| { - System::set_block_limits(w, 0); + System::set_block_consumed_resources(w, 0); assertions() }); } @@ -186,7 +253,8 @@ mod multiplier_tests { #[test] fn multiplier_can_grow_from_zero() { let minimum_multiplier = MinimumMultiplier::get(); - let target = TargetBlockFullness::get() * (AvailableBlockRatio::get() * MaximumBlockWeight::get()); + let target = TargetBlockFullness::get() * + BlockWeights::get().get(DispatchClass::Normal).max_total.unwrap(); // if the min is too small, then this will not change, and we are doomed forever. // the weight is 1/10th bigger than target. run_with_system_weight(target * 101 / 100, || { diff --git a/runtime/common/src/paras_registrar.rs b/runtime/common/src/paras_registrar.rs new file mode 100644 index 0000000000000000000000000000000000000000..1d46a43c01ec1779aa9b6a57ebe72799a93195bf --- /dev/null +++ b/runtime/common/src/paras_registrar.rs @@ -0,0 +1,739 @@ +// Copyright 2017-2020 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 . + +//! Module to handle parathread/parachain registration and related fund management. +//! In essence this is a simple wrapper around `paras`. + +use crate::WASM_MAGIC; +use sp_std::{prelude::*, result}; +use frame_support::{ + decl_storage, decl_module, decl_error, ensure, + dispatch::DispatchResult, + traits::{Get, Currency, ReservableCurrency}, +}; +use frame_system::{self, ensure_root, ensure_signed}; +use primitives::v1::{ + Id as ParaId, ValidationCode, HeadData, +}; +use runtime_parachains::{ + paras::{ + self, + ParaGenesisArgs, + }, + dmp, ump, hrmp, + ensure_parachain, + Origin, +}; + +type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + +pub trait Config: paras::Config + dmp::Config + ump::Config + hrmp::Config { + /// The aggregated origin type must support the `parachains` origin. We require that we can + /// infallibly convert between this origin and the system origin, but in reality, they're the + /// same type, we just can't express that to the Rust type system without writing a `where` + /// clause everywhere. + type Origin: From<::Origin> + + Into::Origin>>; + + /// The system's currency for parathread payment. + type Currency: ReservableCurrency; + + /// The deposit to be paid to run a parathread. + type ParathreadDeposit: Get>; +} + +decl_storage! { + trait Store for Module as Registrar { + /// Whether parathreads are enabled or not. + ParathreadsRegistrationEnabled: bool; + + /// Pending swap operations. + PendingSwap: map hasher(twox_64_concat) ParaId => Option; + + /// Map of all registered parathreads/chains. + Paras get(fn paras): map hasher(twox_64_concat) ParaId => Option; + + /// Users who have paid a parathread's deposit. + Debtors: map hasher(twox_64_concat) ParaId => T::AccountId; + } +} + +decl_error! { + pub enum Error for Module { + /// Parachain already exists. + ParaAlreadyExists, + /// Invalid parachain ID. + InvalidChainId, + /// Invalid parathread ID. + InvalidThreadId, + /// Invalid para code size. + CodeTooLarge, + /// Invalid para head data size. + HeadDataTooLarge, + /// Parathreads registration is disabled. + ParathreadsRegistrationDisabled, + /// The validation code provided doesn't start with the Wasm file magic string. + DefinitelyNotWasm, + } +} + +decl_module! { + pub struct Module for enum Call where origin: ::Origin { + type Error = Error; + + /// Register a parathread with given code for immediate use. + /// + /// Must be sent from a Signed origin that is able to have `ParathreadDeposit` reserved. + /// `genesis_head` and `validation_code` are used to initalize the parathread's state. + #[weight = 0] + fn register_parathread( + origin, + id: ParaId, + genesis_head: HeadData, + validation_code: ValidationCode, + ) -> DispatchResult { + let who = ensure_signed(origin)?; + + ensure!(ParathreadsRegistrationEnabled::get(), Error::::ParathreadsRegistrationDisabled); + ensure!(validation_code.0.starts_with(WASM_MAGIC), Error::::DefinitelyNotWasm); + + ensure!(!Paras::contains_key(id), Error::::ParaAlreadyExists); + + let outgoing = >::outgoing_paras(); + + ensure!(outgoing.binary_search(&id).is_err(), Error::::ParaAlreadyExists); + + ::Currency::reserve(&who, T::ParathreadDeposit::get())?; + >::insert(id, who); + + Paras::insert(id, false); + + let genesis = ParaGenesisArgs { + genesis_head, + validation_code, + parachain: false, + }; + + runtime_parachains::schedule_para_initialize::(id, genesis); + + Ok(()) + } + + /// Deregister a parathread and retreive the deposit. + /// + /// Must be sent from a `Parachain` origin which is currently a parathread. + /// + /// Ensure that before calling this that any funds you want emptied from the parathread's + /// account is moved out; after this it will be impossible to retreive them (without + /// governance intervention). + #[weight = 0] + fn deregister_parathread(origin) -> DispatchResult { + let id = ensure_parachain(::Origin::from(origin))?; + + ensure!(ParathreadsRegistrationEnabled::get(), Error::::ParathreadsRegistrationDisabled); + + let is_parachain = Paras::take(id).ok_or(Error::::InvalidChainId)?; + + ensure!(!is_parachain, Error::::InvalidThreadId); + + let debtor = >::take(id); + let _ = ::Currency::unreserve(&debtor, T::ParathreadDeposit::get()); + + runtime_parachains::schedule_para_cleanup::(id); + + Ok(()) + } + + #[weight = 0] + fn enable_parathread_registration(origin) -> DispatchResult { + ensure_root(origin)?; + + ParathreadsRegistrationEnabled::put(true); + + Ok(()) + } + + #[weight = 0] + fn disable_parathread_registration(origin) -> DispatchResult { + ensure_root(origin)?; + + ParathreadsRegistrationEnabled::put(false); + + Ok(()) + } + + + /// Swap a parachain with another parachain or parathread. The origin must be a `Parachain`. + /// The swap will happen only if there is already an opposite swap pending. If there is not, + /// the swap will be stored in the pending swaps map, ready for a later confirmatory swap. + /// + /// The `ParaId`s remain mapped to the same head data and code so external code can rely on + /// `ParaId` to be a long-term identifier of a notional "parachain". However, their + /// scheduling info (i.e. whether they're a parathread or parachain), auction information + /// and the auction deposit are switched. + #[weight = 0] + fn swap(origin, other: ParaId) { + let id = ensure_parachain(::Origin::from(origin))?; + + if PendingSwap::get(other) == Some(id) { + // Remove intention to swap. + PendingSwap::remove(other); + + Paras::mutate(id, |i| + Paras::mutate(other, |j| + sp_std::mem::swap(i, j) + ) + ); + + >::mutate(id, |i| + >::mutate(other, |j| + sp_std::mem::swap(i, j) + ) + ); + } else { + PendingSwap::insert(id, other); + } + } + } +} + +impl Module { + /// Register a parachain with given code. Must be called by root. + /// Fails if given ID is already used. + pub fn register_parachain( + id: ParaId, + genesis_head: HeadData, + validation_code: ValidationCode, + ) -> DispatchResult { + ensure!(!Paras::contains_key(id), Error::::ParaAlreadyExists); + ensure!(validation_code.0.starts_with(WASM_MAGIC), Error::::DefinitelyNotWasm); + + let outgoing = >::outgoing_paras(); + + ensure!(outgoing.binary_search(&id).is_err(), Error::::ParaAlreadyExists); + + Paras::insert(id, true); + + let genesis = ParaGenesisArgs { + genesis_head, + validation_code, + parachain: true, + }; + + runtime_parachains::schedule_para_initialize::(id, genesis); + + Ok(()) + } + + /// Deregister a parachain with the given ID. Must be called by root. + pub fn deregister_parachain(id: ParaId) -> DispatchResult { + let is_parachain = Paras::take(id).ok_or(Error::::InvalidChainId)?; + + ensure!(is_parachain, Error::::InvalidChainId); + + runtime_parachains::schedule_para_cleanup::(id); + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use sp_io::TestExternalities; + use sp_core::H256; + use sp_runtime::{ + traits::{ + BlakeTwo256, IdentityLookup, Extrinsic as ExtrinsicT, + }, testing::{UintAuthorityId, TestXt}, Perbill, curve::PiecewiseLinear, + }; + use primitives::v1::{ + Balance, BlockNumber, Header, Signature, AuthorityDiscoveryId, ValidatorIndex, + }; + use frame_system::limits; + use frame_support::{ + traits::{Randomness, OnInitialize, OnFinalize}, + impl_outer_origin, impl_outer_dispatch, assert_ok, parameter_types, + }; + use keyring::Sr25519Keyring; + use runtime_parachains::{initializer, configuration, inclusion, session_info, scheduler, dmp, ump, hrmp}; + use pallet_session::OneSessionHandler; + + impl_outer_origin! { + pub enum Origin for Test { + runtime_parachains, + } + } + + impl_outer_dispatch! { + pub enum Call for Test where origin: Origin { + paras::Parachains, + registrar::Registrar, + staking::Staking, + } + } + + pallet_staking_reward_curve::build! { + const REWARD_CURVE: PiecewiseLinear<'static> = curve!( + min_inflation: 0_025_000, + max_inflation: 0_100_000, + ideal_stake: 0_500_000, + falloff: 0_050_000, + max_piece_count: 40, + test_precision: 0_005_000, + ); + } + + #[derive(Clone, Eq, PartialEq)] + pub struct Test; + const NORMAL_RATIO: Perbill = Perbill::from_percent(75); + parameter_types! { + pub const BlockHashCount: u32 = 250; + pub BlockWeights: limits::BlockWeights = + limits::BlockWeights::with_sensible_defaults(4 * 1024 * 1024, NORMAL_RATIO); + pub BlockLength: limits::BlockLength = + limits::BlockLength::max_with_normal_ratio(4 * 1024 * 1024, NORMAL_RATIO); + } + + impl frame_system::Config for Test { + type BaseCallFilter = (); + type Origin = Origin; + type Call = Call; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = (); + type BlockHashCount = BlockHashCount; + type DbWeight = (); + type BlockWeights = BlockWeights; + type BlockLength = BlockLength; + type Version = (); + type PalletInfo = (); + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = Balances; + type SystemWeightInfo = (); + type SS58Prefix = (); + } + + impl frame_system::offchain::SendTransactionTypes for Test where + Call: From, + { + type OverarchingCall = Call; + type Extrinsic = TestXt; + } + + parameter_types! { + pub const ExistentialDeposit: Balance = 1; + } + + impl pallet_balances::Config for Test { + type Balance = u128; + type DustRemoval = (); + type Event = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type MaxLocks = (); + type WeightInfo = (); + } + + parameter_types!{ + pub const SlashDeferDuration: pallet_staking::EraIndex = 7; + pub const AttestationPeriod: BlockNumber = 100; + pub const MinimumPeriod: u64 = 3; + pub const SessionsPerEra: sp_staking::SessionIndex = 6; + pub const BondingDuration: pallet_staking::EraIndex = 28; + pub const MaxNominatorRewardedPerValidator: u32 = 64; + } + + parameter_types! { + pub const Period: BlockNumber = 1; + pub const Offset: BlockNumber = 0; + pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); + pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; + } + + impl pallet_session::Config for Test { + type SessionManager = (); + type Keys = UintAuthorityId; + type ShouldEndSession = pallet_session::PeriodicSessions; + type NextSessionRotation = pallet_session::PeriodicSessions; + type SessionHandler = pallet_session::TestSessionHandler; + type Event = (); + type ValidatorId = u64; + type ValidatorIdOf = (); + type DisabledValidatorsThreshold = DisabledValidatorsThreshold; + type WeightInfo = (); + } + + parameter_types! { + pub const MaxHeadDataSize: u32 = 100; + pub const MaxCodeSize: u32 = 100; + + pub const ValidationUpgradeFrequency: BlockNumber = 10; + pub const ValidationUpgradeDelay: BlockNumber = 2; + pub const SlashPeriod: BlockNumber = 50; + pub const ElectionLookahead: BlockNumber = 0; + pub const StakingUnsignedPriority: u64 = u64::max_value() / 2; + } + + impl pallet_staking::Config for Test { + type RewardRemainder = (); + type CurrencyToVote = frame_support::traits::SaturatingCurrencyToVote; + type Event = (); + type Currency = pallet_balances::Module; + type Slash = (); + type Reward = (); + type SessionsPerEra = SessionsPerEra; + type BondingDuration = BondingDuration; + type SlashDeferDuration = SlashDeferDuration; + type SlashCancelOrigin = frame_system::EnsureRoot; + type SessionInterface = Self; + type UnixTime = pallet_timestamp::Module; + type RewardCurve = RewardCurve; + type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; + type NextNewSession = Session; + type ElectionLookahead = ElectionLookahead; + type Call = Call; + type UnsignedPriority = StakingUnsignedPriority; + type MaxIterations = (); + type MinSolutionScoreBump = (); + type OffchainSolutionWeightLimit = (); + type WeightInfo = (); + } + + impl pallet_timestamp::Config for Test { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); + } + + impl dmp::Config for Test {} + + impl ump::Config for Test { + type UmpSink = (); + } + + impl hrmp::Config for Test { + type Origin = Origin; + } + + impl pallet_session::historical::Config for Test { + type FullIdentification = pallet_staking::Exposure; + type FullIdentificationOf = pallet_staking::ExposureOf; + } + + // This is needed for a custom `AccountId` type which is `u64` in testing here. + pub mod test_keys { + use sp_core::crypto::KeyTypeId; + + pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"test"); + + mod app { + use super::super::Inclusion; + use sp_application_crypto::{app_crypto, sr25519}; + + app_crypto!(sr25519, super::KEY_TYPE); + + impl sp_runtime::traits::IdentifyAccount for Public { + type AccountId = u64; + + fn into_account(self) -> Self::AccountId { + let id = self.0.clone().into(); + Inclusion::validators().iter().position(|b| *b == id).unwrap() as u64 + } + } + } + + pub type ReporterId = app::Public; + } + + impl paras::Config for Test { + type Origin = Origin; + } + + impl configuration::Config for Test { } + + pub struct TestRewardValidators; + + impl inclusion::RewardValidators for TestRewardValidators { + fn reward_backing(_: impl IntoIterator) { } + fn reward_bitfields(_: impl IntoIterator) { } + } + + impl inclusion::Config for Test { + type Event = (); + type RewardValidators = TestRewardValidators; + } + + impl session_info::AuthorityDiscoveryConfig for Test { + fn authorities() -> Vec { + Vec::new() + } + } + + impl session_info::Config for Test { } + + pub struct TestRandomness; + + impl Randomness for TestRandomness { + fn random(_subject: &[u8]) -> H256 { + Default::default() + } + } + + impl initializer::Config for Test { + type Randomness = TestRandomness; + } + + impl scheduler::Config for Test { } + + type Extrinsic = TestXt; + + impl frame_system::offchain::CreateSignedTransaction for Test where + Call: From, + { + fn create_transaction>( + call: Call, + _public: test_keys::ReporterId, + _account: ::AccountId, + nonce: ::Index, + ) -> Option<(Call, ::SignaturePayload)> { + Some((call, (nonce, ()))) + } + } + + impl frame_system::offchain::SigningTypes for Test { + type Public = test_keys::ReporterId; + type Signature = Signature; + } + + parameter_types! { + pub const ParathreadDeposit: Balance = 10; + pub const QueueSize: usize = 2; + pub const MaxRetries: u32 = 3; + } + + impl Config for Test { + type Origin = Origin; + type Currency = pallet_balances::Module; + type ParathreadDeposit = ParathreadDeposit; + } + + type Balances = pallet_balances::Module; + type Parachains = paras::Module; + type Inclusion = inclusion::Module; + type System = frame_system::Module; + type Registrar = Module; + type Session = pallet_session::Module; + type Staking = pallet_staking::Module; + type Initializer = initializer::Module; + + fn new_test_ext() -> TestExternalities { + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + + let authority_keys = [ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Eve, + Sr25519Keyring::Ferdie, + Sr25519Keyring::One, + Sr25519Keyring::Two, + ]; + + // stashes are the index. + let session_keys: Vec<_> = authority_keys.iter().enumerate() + .map(|(i, _k)| (i as u64, i as u64, UintAuthorityId(i as u64))) + .collect(); + + let balances: Vec<_> = (0..authority_keys.len()).map(|i| (i as u64, 10_000_000)).collect(); + + pallet_session::GenesisConfig:: { + keys: session_keys, + }.assimilate_storage(&mut t).unwrap(); + + pallet_balances::GenesisConfig:: { + balances, + }.assimilate_storage(&mut t).unwrap(); + + t.into() + } + + fn run_to_block(n: BlockNumber) { + // NOTE that this function only simulates modules of interest. Depending on new module may + // require adding it here. + println!("Running until block {}", n); + while System::block_number() < n { + let b = System::block_number(); + + if System::block_number() > 1 { + println!("Finalizing {}", System::block_number()); + System::on_finalize(System::block_number()); + Initializer::on_finalize(System::block_number()); + } + // Session change every 3 blocks. + if (b + 1) % 3 == 0 { + println!("New session at {}", System::block_number()); + Initializer::on_new_session( + false, + Vec::new().into_iter(), + Vec::new().into_iter(), + ); + } + System::set_block_number(b + 1); + println!("Initializing {}", System::block_number()); + System::on_initialize(System::block_number()); + Initializer::on_initialize(System::block_number()); + } + } + + #[test] + fn basic_setup_works() { + new_test_ext().execute_with(|| { + assert_eq!(PendingSwap::get(&ParaId::from(0u32)), None); + assert_eq!(Paras::get(&ParaId::from(0u32)), None); + }); + } + + #[test] + fn register_deregister_chain_works() { + new_test_ext().execute_with(|| { + run_to_block(1); + + assert_ok!(Registrar::enable_parathread_registration( + Origin::root(), + )); + run_to_block(2); + + assert_ok!(Registrar::register_parachain( + 2u32.into(), + vec![3; 3].into(), + WASM_MAGIC.to_vec().into(), + )); + + let orig_bal = Balances::free_balance(&3u64); + + // Register a new parathread + assert_ok!(Registrar::register_parathread( + Origin::signed(3u64), + 8u32.into(), + vec![3; 3].into(), + WASM_MAGIC.to_vec().into(), + )); + + // deposit should be taken (reserved) + assert_eq!(Balances::free_balance(3u64) + ParathreadDeposit::get(), orig_bal); + assert_eq!(Balances::reserved_balance(3u64), ParathreadDeposit::get()); + + run_to_block(3); + + assert_ok!(Registrar::deregister_parachain(2u32.into())); + + assert_ok!(Registrar::deregister_parathread( + runtime_parachains::Origin::Parachain(8u32.into()).into() + )); + + // reserved balance should be returned. + assert_eq!(Balances::free_balance(3u64), orig_bal); + assert_eq!(Balances::reserved_balance(3u64), 0); + }); + } + + #[test] + fn swap_handles_funds_correctly() { + new_test_ext().execute_with(|| { + run_to_block(1); + + assert_ok!(Registrar::enable_parathread_registration( + Origin::root(), + )); + run_to_block(2); + + let initial_1_balance = Balances::free_balance(1); + let initial_2_balance = Balances::free_balance(2); + + // User 1 register a new parathread + assert_ok!(Registrar::register_parathread( + Origin::signed(1), + 8u32.into(), + vec![1; 3].into(), + WASM_MAGIC.to_vec().into(), + )); + + assert_ok!(Registrar::register_parachain( + 2u32.into(), + vec![1; 3].into(), + WASM_MAGIC.to_vec().into(), + )); + + run_to_block(9); + + // Swap the parachain and parathread + assert_ok!(Registrar::swap(runtime_parachains::Origin::Parachain(2u32.into()).into(), 8u32.into())); + assert_ok!(Registrar::swap(runtime_parachains::Origin::Parachain(8u32.into()).into(), 2u32.into())); + + // Deregister a parathread that was originally a parachain + assert_ok!(Registrar::deregister_parathread(runtime_parachains::Origin::Parachain(2u32.into()).into())); + + run_to_block(12); + + // Funds are correctly returned + assert_eq!(Balances::free_balance(1), initial_1_balance); + assert_eq!(Balances::free_balance(2), initial_2_balance); + }); + } + + #[test] + fn cannot_register_until_para_is_cleaned_up() { + new_test_ext().execute_with(|| { + run_to_block(2); + + assert_ok!(Registrar::register_parachain( + 1u32.into(), + vec![1; 3].into(), + WASM_MAGIC.to_vec().into(), + )); + + run_to_block(4); + + assert_ok!(Registrar::deregister_parachain(1u32.into())); + run_to_block(5); + + assert!(Registrar::register_parachain( + 1u32.into(), + vec![1; 3].into(), + WASM_MAGIC.to_vec().into(), + ).is_err()); + + // The session will be changed on the 6th block, as part of finalization. The change + // will be observed on the 7th. + run_to_block(7); + assert_ok!(Registrar::register_parachain( + 1u32.into(), + vec![1; 3].into(), + WASM_MAGIC.to_vec().into(), + )); + }); + } +} diff --git a/runtime/common/src/paras_sudo_wrapper.rs b/runtime/common/src/paras_sudo_wrapper.rs index d165123b422f5e8e663ff7d3868d9d165be80cd5..796051a27ef5e5dd808c134e098d802337af1bc8 100644 --- a/runtime/common/src/paras_sudo_wrapper.rs +++ b/runtime/common/src/paras_sudo_wrapper.rs @@ -16,28 +16,41 @@ //! A simple wrapper allowing `Sudo` to call into `paras` routines. +use crate::WASM_MAGIC; +use sp_std::prelude::*; use frame_support::{ - decl_error, decl_module, + decl_error, decl_module, ensure, dispatch::DispatchResult, weights::DispatchClass, }; use frame_system::ensure_root; -use runtime_parachains::paras::{ - self, - ParaGenesisArgs, +use runtime_parachains::{ + configuration, dmp, ump, hrmp, paras::{self, ParaGenesisArgs}, }; use primitives::v1::Id as ParaId; +use parity_scale_codec::Encode; /// The module's configuration trait. -pub trait Trait: paras::Trait { } +pub trait Config: + configuration::Config + paras::Config + dmp::Config + ump::Config + hrmp::Config +{ +} decl_error! { - pub enum Error for Module { } + pub enum Error for Module { + /// The specified parachain or parathread is not registered. + ParaDoesntExist, + /// A DMP message couldn't be sent because it exceeds the maximum size allowed for a downward + /// message. + ExceedsMaxMessageSize, + /// The validation code provided doesn't start with the Wasm file magic string. + DefinitelyNotWasm, + } } decl_module! { /// A sudo wrapper to call into v1 paras module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; /// Schedule a para to be initialized at the start of the next session. @@ -48,7 +61,8 @@ decl_module! { genesis: ParaGenesisArgs, ) -> DispatchResult { ensure_root(origin)?; - paras::Module::::schedule_para_initialize(id, genesis); + ensure!(genesis.validation_code.0.starts_with(WASM_MAGIC), Error::::DefinitelyNotWasm); + runtime_parachains::schedule_para_initialize::(id, genesis); Ok(()) } @@ -56,7 +70,47 @@ decl_module! { #[weight = (1_000, DispatchClass::Operational)] pub fn sudo_schedule_para_cleanup(origin, id: ParaId) -> DispatchResult { ensure_root(origin)?; - paras::Module::::schedule_para_cleanup(id); + runtime_parachains::schedule_para_cleanup::(id); + Ok(()) + } + + /// Send a downward XCM to the given para. + /// + /// The given parachain should exist and the payload should not exceed the preconfigured size + /// `config.max_downward_message_size`. + #[weight = (1_000, DispatchClass::Operational)] + pub fn sudo_queue_downward_xcm(origin, id: ParaId, xcm: xcm::VersionedXcm) -> 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 { + dmp::QueueDownwardMessageError::ExceedsMaxMessageSize => + Error::::ExceedsMaxMessageSize.into(), + }) + } + + /// Forcefully establish a channel from the sender to the recipient. + /// + /// This is equivalent to sending an `Hrmp::hrmp_init_open_channel` extrinsic followed by + /// `Hrmp::hrmp_accept_open_channel`. + #[weight = (1_000, DispatchClass::Operational)] + pub fn sudo_establish_hrmp_channel( + origin, + sender: ParaId, + recipient: ParaId, + max_capacity: u32, + max_message_size: u32, + ) -> DispatchResult { + ensure_root(origin)?; + + >::init_open_channel( + sender, + recipient, + max_capacity, + max_message_size, + )?; + >::accept_open_channel(recipient, sender)?; Ok(()) } } diff --git a/runtime/common/src/purchase.rs b/runtime/common/src/purchase.rs index 1944d295278ffabfc90e25cff457b2f29b387bcf..5a73596d85ae630eb6aeab84f1f9bcfad9d200df 100644 --- a/runtime/common/src/purchase.rs +++ b/runtime/common/src/purchase.rs @@ -16,7 +16,7 @@ //! Module to process purchase of DOTs. -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; use sp_runtime::{Permill, RuntimeDebug, DispatchResult, DispatchError, AnySignature}; use sp_runtime::traits::{Zero, CheckedAdd, Verify, Saturating}; use frame_support::{decl_event, decl_storage, decl_module, decl_error, ensure}; @@ -28,9 +28,9 @@ use sp_core::sr25519; use sp_std::prelude::*; /// Configuration trait. -pub trait Trait: frame_system::Trait { +pub trait Config: frame_system::Config { /// The overarching event type. - type Event: From> + Into<::Event>; + type Event: From> + Into<::Event>; /// Balances Pallet type Currency: Currency; /// Vesting Pallet @@ -47,7 +47,7 @@ pub trait Trait: frame_system::Trait { type MaxUnlocked: Get>; } -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; /// The kind of a statement an account needs to make for a claim to be valid. #[derive(Encode, Decode, Clone, Copy, Eq, PartialEq, RuntimeDebug)] @@ -103,9 +103,9 @@ pub struct AccountStatus { decl_event!( pub enum Event where - AccountId = ::AccountId, + AccountId = ::AccountId, Balance = BalanceOf, - BlockNumber = ::BlockNumber, + BlockNumber = ::BlockNumber, { /// A [new] account was created. AccountCreated(AccountId), @@ -125,7 +125,7 @@ decl_event!( ); decl_error! { - pub enum Error for Module { + pub enum Error for Module { /// Account is not currently valid to use. InvalidAccount, /// Account used in the purchase already exists. @@ -146,7 +146,7 @@ decl_error! { } decl_storage! { - trait Store for Module as Purchase { + trait Store for Module as Purchase { // A map of all participants in the DOT purchase process. Accounts: map hasher(blake2_128_concat) T::AccountId => AccountStatus>; // The account that will be used to payout participants of the DOT purchase process. @@ -159,7 +159,7 @@ decl_storage! { } decl_module! { - pub struct Module for enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { type Error = Error; /// The maximum statement length for the statement users to sign when creating an account. @@ -340,7 +340,7 @@ decl_module! { } } -impl Module { +impl Module { fn verify_signature(who: &T::AccountId, signature: &[u8]) -> Result<(), DispatchError> { // sr25519 always expects a 64 byte signature. ensure!(signature.len() == 64, Error::::InvalidSignature); @@ -374,7 +374,7 @@ fn account_to_bytes(account: &AccountId) -> Result<[u8; 32], Dispatch /// WARNING: Executing this function will clear all storage used by this pallet. /// Be sure this is what you want... pub fn remove_pallet() -> frame_support::weights::Weight - where T: frame_system::Trait + where T: frame_system::Config { use frame_support::migration::remove_storage_prefix; remove_storage_prefix(b"Purchase", b"Accounts", b""); @@ -382,7 +382,7 @@ pub fn remove_pallet() -> frame_support::weights::Weight remove_storage_prefix(b"Purchase", b"Statement", b""); remove_storage_prefix(b"Purchase", b"UnlockBlock", b""); - T::MaximumBlockWeight::get() + ::BlockWeights::get().max_block } #[cfg(test)] @@ -393,7 +393,7 @@ mod tests { // 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 sp_runtime::{ - Perbill, MultiSignature, + MultiSignature, traits::{BlakeTwo256, IdentityLookup, Identity, Verify, IdentifyAccount, Dispatchable}, testing::Header }; @@ -424,12 +424,12 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u32 = 250; - pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; - pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } - impl frame_system::Trait for Test { + impl frame_system::Config for Test { type BaseCallFilter = (); + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); type Origin = Origin; type Call = Call; type Index = u64; @@ -441,31 +441,26 @@ mod tests { type Header = Header; type Event = (); type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); - type BlockExecutionWeight = (); - type ExtrinsicBaseWeight = (); - type MaximumExtrinsicWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = (); - type ModuleToIndex = (); + type PalletInfo = (); type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; type SystemWeightInfo = (); + type SS58Prefix = (); } parameter_types! { pub const ExistentialDeposit: u64 = 1; } - impl pallet_balances::Trait for Test { + impl pallet_balances::Config for Test { type Balance = u64; type Event = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type MaxLocks = (); type WeightInfo = (); } @@ -473,7 +468,7 @@ mod tests { pub const MinVestedTransfer: u64 = 0; } - impl pallet_vesting::Trait for Test { + impl pallet_vesting::Config for Test { type Event = (); type Currency = Balances; type BlockNumberToBalance = Identity; @@ -493,7 +488,7 @@ mod tests { pub const ConfigurationOrigin: AccountId = AccountId32::from([2u8; 32]); } - impl Trait for Test { + impl Config for Test { type Event = (); type Currency = Balances; type VestingSchedule = Vesting; @@ -691,7 +686,7 @@ mod tests { ); // Account with vesting - assert_ok!(::VestingSchedule::add_vesting_schedule( + assert_ok!(::VestingSchedule::add_vesting_schedule( &alice(), 100, 1, @@ -932,13 +927,13 @@ mod tests { bob(), )); // Payment is made. - assert_eq!(::Currency::free_balance(&payment_account()), 99_650); - assert_eq!(::Currency::free_balance(&alice()), 100); + assert_eq!(::Currency::free_balance(&payment_account()), 99_650); + assert_eq!(::Currency::free_balance(&alice()), 100); // 10% of the 50 units is unlocked automatically for Alice - assert_eq!(::VestingSchedule::vesting_balance(&alice()), Some(45)); - assert_eq!(::Currency::free_balance(&bob()), 250); + assert_eq!(::VestingSchedule::vesting_balance(&alice()), Some(45)); + assert_eq!(::Currency::free_balance(&bob()), 250); // A max of 10 units is unlocked automatically for Bob - assert_eq!(::VestingSchedule::vesting_balance(&bob()), Some(140)); + assert_eq!(::VestingSchedule::vesting_balance(&bob()), Some(140)); // Status is completed. assert_eq!( Accounts::::get(alice()), @@ -965,13 +960,13 @@ mod tests { let vest_call = Call::Vesting(pallet_vesting::Call::::vest()); assert_ok!(vest_call.clone().dispatch(Origin::signed(alice()))); assert_ok!(vest_call.clone().dispatch(Origin::signed(bob()))); - assert_eq!(::VestingSchedule::vesting_balance(&alice()), Some(45)); - assert_eq!(::VestingSchedule::vesting_balance(&bob()), Some(140)); + assert_eq!(::VestingSchedule::vesting_balance(&alice()), Some(45)); + assert_eq!(::VestingSchedule::vesting_balance(&bob()), Some(140)); System::set_block_number(101); assert_ok!(vest_call.clone().dispatch(Origin::signed(alice()))); assert_ok!(vest_call.clone().dispatch(Origin::signed(bob()))); - assert_eq!(::VestingSchedule::vesting_balance(&alice()), None); - assert_eq!(::VestingSchedule::vesting_balance(&bob()), None); + assert_eq!(::VestingSchedule::vesting_balance(&alice()), None); + assert_eq!(::VestingSchedule::vesting_balance(&bob()), None); }); } @@ -984,7 +979,7 @@ mod tests { alice(), ), BadOrigin); // Account with Existing Vesting Schedule - assert_ok!(::VestingSchedule::add_vesting_schedule( + assert_ok!(::VestingSchedule::add_vesting_schedule( &bob(), 100, 1, 50, )); assert_noop!(Purchase::payout( diff --git a/runtime/common/src/slot_range.rs b/runtime/common/src/slot_range.rs index 23855c4acc11e11d3b7579f402d5f5e3d66a3ec9..b9751e18efb2c33a65d9a97fda752910962bfa92 100644 --- a/runtime/common/src/slot_range.rs +++ b/runtime/common/src/slot_range.rs @@ -19,7 +19,7 @@ use sp_std::{result, ops::Add, convert::{TryFrom, TryInto}}; use sp_runtime::traits::CheckedSub; -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; /// Total number of possible sub ranges of slots. pub const SLOT_RANGE_COUNT: usize = 10; diff --git a/runtime/common/src/slots.rs b/runtime/common/src/slots.rs index 60bf8f81745b8bb0ed81d3283c7ec9318900310b..66d4d9640f3f1b2135ee2aa27f84876483d0e15d 100644 --- a/runtime/common/src/slots.rs +++ b/runtime/common/src/slots.rs @@ -22,10 +22,10 @@ use sp_std::{prelude::*, mem::swap, convert::TryInto}; use sp_runtime::traits::{ CheckedSub, StaticLookup, Zero, One, CheckedConversion, Hash, AccountIdConversion, }; -use codec::{Encode, Decode, Codec}; +use parity_scale_codec::{Encode, Decode, Codec}; use frame_support::{ decl_module, decl_storage, decl_event, decl_error, ensure, dispatch::DispatchResult, - traits::{Currency, ReservableCurrency, WithdrawReason, ExistenceRequirement, Get, Randomness}, + traits::{Currency, ReservableCurrency, WithdrawReasons, ExistenceRequirement, Get, Randomness}, weights::{DispatchClass, Weight}, }; use primitives::v1::{ @@ -34,12 +34,12 @@ use primitives::v1::{ use frame_system::{ensure_signed, ensure_root}; use crate::slot_range::{SlotRange, SLOT_RANGE_COUNT}; -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; /// The module's configuration trait. -pub trait Trait: frame_system::Trait { +pub trait Config: frame_system::Config { /// The overarching event type. - type Event: From> + Into<::Event>; + type Event: From> + Into<::Event>; /// The currency type used for bidding. type Currency: ReservableCurrency; @@ -161,18 +161,18 @@ pub enum IncomingParachain { Deploy { code: ValidationCode, initial_head_data: HeadData }, } -type LeasePeriodOf = ::BlockNumber; +type LeasePeriodOf = ::BlockNumber; // Winning data type. This encodes the top bidders of each range together with their bid. type WinningData = - [Option<(Bidder<::AccountId>, BalanceOf)>; SLOT_RANGE_COUNT]; + [Option<(Bidder<::AccountId>, BalanceOf)>; SLOT_RANGE_COUNT]; // Winners data type. This encodes each of the final winners of a parachain auction, the parachain // index assigned to them, their winning bid and the range that they won. type WinnersData = - Vec<(Option::AccountId>>, ParaId, BalanceOf, SlotRange)>; + Vec<(Option::AccountId>>, ParaId, BalanceOf, SlotRange)>; // This module's storage items. decl_storage! { - trait Store for Module as Slots { + trait Store for Module as Slots { /// The number of auctions that have been started so far. pub AuctionCounter get(fn auction_counter): AuctionIndex; @@ -245,7 +245,7 @@ fn swap_ordered_existence(ids: &mut [T], one: T, oth ids.sort(); } -impl SwapAux for Module { +impl SwapAux for Module { fn ensure_can_swap(one: ParaId, other: ParaId) -> Result<(), &'static str> { if >::contains_key(one) || >::contains_key(other) { Err("can't swap an undeployed parachain")? @@ -262,8 +262,8 @@ impl SwapAux for Module { decl_event!( pub enum Event where - AccountId = ::AccountId, - BlockNumber = ::BlockNumber, + AccountId = ::AccountId, + BlockNumber = ::BlockNumber, LeasePeriod = LeasePeriodOf, ParaId = ParaId, Balance = BalanceOf, @@ -292,7 +292,7 @@ decl_event!( ); decl_error! { - pub enum Error for Module { + pub enum Error for Module { /// This auction is already in progress. AuctionInProgress, /// The lease period is in the past. @@ -323,7 +323,7 @@ decl_error! { } decl_module! { - pub struct Module for enum Call where origin: T::Origin { + pub struct Module for enum Call where origin: T::Origin { type Error = Error; fn deposit_event() = default; @@ -520,7 +520,7 @@ decl_module! { .ok_or(Error::::ParaNotOnboarding)?; if let IncomingParachain::Fixed{code_hash, code_size, initial_head_data} = details { ensure!(code.0.len() as u32 == code_size, Error::::InvalidCode); - ensure!(::Hashing::hash(&code.0) == code_hash, Error::::InvalidCode); + ensure!(::Hashing::hash(&code.0) == code_hash, Error::::InvalidCode); if starts > Self::lease_period_index() { // Hasn't yet begun. Replace the on-boarding entry with the new information. @@ -542,7 +542,7 @@ decl_module! { } } -impl Module { +impl Module { /// Deposit currently held for a particular parachain that we administer. fn deposit_held(para_id: &ParaId) -> BalanceOf { >::get(para_id).into_iter().max().unwrap_or_else(Zero::zero) @@ -630,7 +630,7 @@ impl Module { if T::Currency::withdraw( &bidder.who, amount, - WithdrawReason::Fee.into(), + WithdrawReasons::FEE, ExistenceRequirement::AllowDeath ).is_err() { continue; @@ -667,7 +667,7 @@ impl Module { if T::Currency::withdraw( ¶_id.into_account(), additional, - WithdrawReason::Fee.into(), + WithdrawReasons::FEE, ExistenceRequirement::AllowDeath ).is_err() { continue; @@ -942,10 +942,7 @@ mod tests { use std::{collections::HashMap, cell::RefCell}; use sp_core::H256; - use sp_runtime::{ - Perbill, - traits::{BlakeTwo256, Hash, IdentityLookup}, - }; + use sp_runtime::traits::{BlakeTwo256, Hash, IdentityLookup}; use frame_support::{ impl_outer_origin, parameter_types, assert_ok, assert_noop, traits::{OnInitialize, OnFinalize} @@ -964,12 +961,12 @@ mod tests { pub struct Test; parameter_types! { pub const BlockHashCount: u32 = 250; - pub const MaximumBlockWeight: u32 = 4 * 1024 * 1024; - pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } - impl frame_system::Trait for Test { + impl frame_system::Config for Test { type BaseCallFilter = (); + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); type Origin = Origin; type Call = (); type Index = u64; @@ -981,31 +978,26 @@ mod tests { type Header = Header; type Event = (); type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); - type BlockExecutionWeight = (); - type ExtrinsicBaseWeight = (); - type MaximumExtrinsicWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = (); - type ModuleToIndex = (); + type PalletInfo = (); type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = Balances; type SystemWeightInfo = (); + type SS58Prefix = (); } parameter_types! { pub const ExistentialDeposit: u64 = 1; } - impl pallet_balances::Trait for Test { + impl pallet_balances::Config for Test { type Balance = u64; type Event = (); type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type MaxLocks = (); type WeightInfo = (); } @@ -1073,7 +1065,7 @@ mod tests { pub const EndingPeriod: BlockNumber = 3; } - impl Trait for Test { + impl Config for Test { type Event = (); type Currency = Balances; type Parachains = TestParachains; diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index cbeeb4cc082621e3badd93850c05a71062d15d1c..3e66e7fe02a53d5a9e8acc40d28c28c3a1d542b7 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -1,19 +1,19 @@ [package] name = "kusama-runtime" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } -log = { version = "0.3.9", optional = true } -rustc-hex = { version = "2.0.1", default-features = false } -serde = { version = "1.0.102", default-features = false } -serde_derive = { version = "1.0.102", optional = true } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +log = { version = "0.4.11", optional = true } +rustc-hex = { version = "2.1.0", default-features = false } +serde = { version = "1.0.118", default-features = false } +serde_derive = { version = "1.0.117", optional = true } static_assertions = "1.1.0" -smallvec = "1.4.1" +smallvec = "1.6.1" authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -34,13 +34,13 @@ pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-bounties = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-elections-phragmen = { package = "pallet-elections-phragmen", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-finality-tracker = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -61,6 +61,7 @@ pallet-staking-reward-curve = { package = "pallet-staking-reward-curve", git = " frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-tips = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -69,21 +70,22 @@ frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -hex-literal = { version = "0.2.1", optional = true } +hex-literal = { version = "0.3.1", optional = true } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } [dev-dependencies] -hex-literal = "0.2.1" -libsecp256k1 = "0.3.2" -tiny-keccak = "1.5.0" +hex-literal = "0.3.1" +libsecp256k1 = "0.3.5" +tiny-keccak = "2.0.2" keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -serde_json = "1.0.41" +separator = "0.4.1" +serde_json = "1.0.61" [build-dependencies] -wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.6" } +substrate-wasm-builder = "3.0.0" [features] default = ["std"] @@ -95,7 +97,7 @@ std = [ "bitvec/std", "primitives/std", "rustc-hex/std", - "codec/std", + "parity-scale-codec/std", "inherents/std", "sp-core/std", "sp-api/std", @@ -107,13 +109,13 @@ std = [ "frame-support/std", "pallet-authorship/std", "pallet-balances/std", + "pallet-bounties/std", "pallet-transaction-payment/std", "pallet-transaction-payment-rpc-runtime-api/std", "pallet-collective/std", "pallet-elections-phragmen/std", "pallet-democracy/std", "frame-executive/std", - "pallet-finality-tracker/std", "pallet-grandpa/std", "pallet-identity/std", "pallet-im-online/std", @@ -133,6 +135,7 @@ std = [ "frame-system/std", "frame-system-rpc-runtime-api/std", "pallet-timestamp/std", + "pallet-tips/std", "pallet-treasury/std", "sp-version/std", "pallet-utility/std", @@ -150,26 +153,34 @@ runtime-benchmarks = [ "runtime-common/runtime-benchmarks", "frame-benchmarking", "frame-support/runtime-benchmarks", - "frame-system-benchmarking", "frame-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", + "pallet-babe/runtime-benchmarks", "pallet-balances/runtime-benchmarks", + "pallet-bounties/runtime-benchmarks", "pallet-collective/runtime-benchmarks", "pallet-democracy/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-multisig/runtime-benchmarks", + "pallet-proxy/runtime-benchmarks", "pallet-scheduler/runtime-benchmarks", "pallet-society/runtime-benchmarks", "pallet-staking/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", + "pallet-tips/runtime-benchmarks", "pallet-treasury/runtime-benchmarks", "pallet-utility/runtime-benchmarks", "pallet-vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", + "frame-system-benchmarking", "hex-literal", ] + # When enabled, the runtime api will not be build. # # This is required by Cumulus to access certain types of the diff --git a/runtime/kusama/build.rs b/runtime/kusama/build.rs index af219a29319898d2f6180ef13bbe5263cd114727..a75ebb4edbe1b3c55e23a2700a5d48efcaae1e54 100644 --- a/runtime/kusama/build.rs +++ b/runtime/kusama/build.rs @@ -1,25 +1,24 @@ // Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. -// Substrate is free software: you can redistribute it and/or modify +// 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. -// Substrate is distributed in the hope that it will be useful, +// 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 Substrate. If not, see . +// along with Polkadot. If not, see . -use wasm_builder_runner::WasmBuilder; +use substrate_wasm_builder::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("2.0.0") .import_memory() .export_heap_base() .build() diff --git a/runtime/kusama/src/constants.rs b/runtime/kusama/src/constants.rs index 5d81cf0bb853881906ce71473ddea03f11ec2c12..91d6b354522571079e8339b04a4184027592cb05 100644 --- a/runtime/kusama/src/constants.rs +++ b/runtime/kusama/src/constants.rs @@ -69,7 +69,7 @@ pub mod fee { /// node's balance type. /// /// This should typically create a mapping between the following ranges: - /// - [0, frame_system::MaximumBlockWeight] + /// - [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: @@ -95,16 +95,16 @@ pub mod fee { #[cfg(test)] mod tests { use frame_support::weights::WeightToFeePolynomial; - use runtime_common::{MaximumBlockWeight, ExtrinsicBaseWeight}; + use runtime_common::{MAXIMUM_BLOCK_WEIGHT, ExtrinsicBaseWeight}; use super::fee::WeightToFee; use super::currency::{CENTS, DOLLARS, MILLICENTS}; #[test] - // This function tests that the fee for `MaximumBlockWeight` of weight is correct + // This function tests that the fee for `MAXIMUM_BLOCK_WEIGHT` of weight is correct fn full_block_fee_is_correct() { // A full block should cost 16 DOLLARS println!("Base: {}", ExtrinsicBaseWeight::get()); - let x = WeightToFee::calc(&MaximumBlockWeight::get()); + let x = WeightToFee::calc(&MAXIMUM_BLOCK_WEIGHT); let y = 16 * DOLLARS; assert!(x.max(y) - x.min(y) < MILLICENTS); } diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 448cfd52b1531ea96120eff5ad09e0ceef6f8508..49de622bc462060293ddcb9d86a906d0fbeaf2b0 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -18,21 +18,24 @@ #![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"] +#![recursion_limit = "256"] +use pallet_transaction_payment::CurrencyAdapter; use sp_std::prelude::*; -use sp_core::u32_trait::{_1, _2, _3, _4, _5}; -use codec::{Encode, Decode}; +use sp_std::collections::btree_map::BTreeMap; +use sp_core::u32_trait::{_1, _2, _3, _5}; +use parity_scale_codec::{Encode, Decode}; use primitives::v1::{ - AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, + AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CommittedCandidateReceipt, + CoreState, GroupRotationInfo, Hash, Id, Moment, Nonce, OccupiedCoreAssumption, + PersistedValidationData, Signature, ValidationCode, ValidationData, ValidatorId, ValidatorIndex, + InboundDownwardMessage, InboundHrmpMessage, SessionInfo, AssignmentId, }; -use primitives::v0 as p_v0; use runtime_common::{ - dummy, claims, SlowAdjustingFeeUpdate, - impls::{CurrencyToVoteHandler, ToAuthor}, - NegativeImbalance, BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, - MaximumBlockLength, BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, - MaximumExtrinsicWeight, ParachainSessionKeyPlaceholder, + claims, SlowAdjustingFeeUpdate, CurrencyToVote, + impls::DealWithFees, + BlockHashCount, RocksDbWeight, BlockWeights, BlockLength, OffchainSolutionWeightLimit, + ParachainSessionKeyPlaceholder, AssignmentSessionKeyPlaceholder, }; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, ModuleId, @@ -54,7 +57,7 @@ use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use frame_support::{ parameter_types, construct_runtime, debug, RuntimeDebug, - traits::{KeyOwnerProofSystem, SplitTwoWays, Randomness, LockIdentifier, Filter, InstanceFilter}, + traits::{KeyOwnerProofSystem, Randomness, LockIdentifier, Filter, InstanceFilter}, weights::Weight, }; use frame_system::{EnsureRoot, EnsureOneOf}; @@ -87,7 +90,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("kusama"), impl_name: create_runtime_str!("parity-kusama"), authoring_version: 2, - spec_version: 2024, + spec_version: 2028, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -121,10 +124,13 @@ type MoreThanHalfCouncil = EnsureOneOf< parameter_types! { pub const Version: RuntimeVersion = VERSION; + pub const SS58Prefix: u8 = 2; } -impl frame_system::Trait for Runtime { +impl frame_system::Config for Runtime { type BaseCallFilter = BaseFilter; + type BlockWeights = BlockWeights; + type BlockLength = BlockLength; type Origin = Origin; type Call = Call; type Index = Nonce; @@ -136,29 +142,31 @@ impl frame_system::Trait for Runtime { type Header = generic::Header; type Event = Event; type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; type DbWeight = RocksDbWeight; - type BlockExecutionWeight = BlockExecutionWeight; - type ExtrinsicBaseWeight = ExtrinsicBaseWeight; - type MaximumExtrinsicWeight = MaximumExtrinsicWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; - type ModuleToIndex = ModuleToIndex; + type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); - type SystemWeightInfo = weights::frame_system::WeightInfo; + type SystemWeightInfo = weights::frame_system::WeightInfo; + type SS58Prefix = SS58Prefix; } -impl pallet_scheduler::Trait for Runtime { +parameter_types! { + pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * + BlockWeights::get().max_block; + pub const MaxScheduledPerBlock: u32 = 50; +} + +impl pallet_scheduler::Config for Runtime { type Event = Event; type Origin = Origin; type PalletsOrigin = OriginCaller; type Call = Call; - type MaximumWeight = MaximumBlockWeight; + type MaximumWeight = MaximumSchedulerWeight; type ScheduleOrigin = EnsureRoot; - type WeightInfo = (); + type MaxScheduledPerBlock = MaxScheduledPerBlock; + type WeightInfo = weights::pallet_scheduler::WeightInfo; } parameter_types! { @@ -166,7 +174,7 @@ parameter_types! { pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } -impl pallet_babe::Trait for Runtime { +impl pallet_babe::Config for Runtime { type EpochDuration = EpochDuration; type ExpectedBlockTime = ExpectedBlockTime; @@ -187,48 +195,43 @@ impl pallet_babe::Trait for Runtime { type HandleEquivocation = pallet_babe::EquivocationHandler; + + type WeightInfo = (); } parameter_types! { pub const IndexDeposit: Balance = 1 * DOLLARS; } -impl pallet_indices::Trait for Runtime { +impl pallet_indices::Config for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; type Event = Event; - type WeightInfo = (); + type WeightInfo = weights::pallet_indices::WeightInfo; } parameter_types! { pub const ExistentialDeposit: Balance = 1 * CENTS; + pub const MaxLocks: u32 = 50; } -/// Splits fees 80/20 between treasury and block author. -pub type DealWithFees = SplitTwoWays< - Balance, - NegativeImbalance, - _4, Treasury, // 4 parts (80%) goes to the treasury. - _1, ToAuthor, // 1 part (20%) goes to the block author. ->; - -impl pallet_balances::Trait for Runtime { +impl pallet_balances::Config for Runtime { type Balance = Balance; type DustRemoval = (); type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = weights::pallet_balances::WeightInfo; + type MaxLocks = MaxLocks; + type WeightInfo = weights::pallet_balances::WeightInfo; } parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; } -impl pallet_transaction_payment::Trait for Runtime { - type Currency = Balances; - type OnTransactionPayment = DealWithFees; +impl pallet_transaction_payment::Config for Runtime { + type OnChargeTransaction = CurrencyAdapter>; type TransactionByteFee = TransactionByteFee; type WeightToFee = WeightToFee; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; @@ -237,11 +240,11 @@ impl pallet_transaction_payment::Trait for Runtime { parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; } -impl pallet_timestamp::Trait for Runtime { +impl pallet_timestamp::Config for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; - type WeightInfo = weights::pallet_timestamp::WeightInfo; + type WeightInfo = weights::pallet_timestamp::WeightInfo; } parameter_types! { @@ -249,7 +252,7 @@ parameter_types! { } // TODO: substrate#2986 implement this properly -impl pallet_authorship::Trait for Runtime { +impl pallet_authorship::Config for Runtime { type FindAuthor = pallet_session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); @@ -261,21 +264,51 @@ parameter_types! { pub const Offset: BlockNumber = 0; } +impl_opaque_keys! { + pub struct OldSessionKeys { + pub grandpa: Grandpa, + pub babe: Babe, + pub im_online: ImOnline, + pub para_validator: ParachainSessionKeyPlaceholder, + pub authority_discovery: AuthorityDiscovery, + } +} + impl_opaque_keys! { pub struct SessionKeys { pub grandpa: Grandpa, pub babe: Babe, pub im_online: ImOnline, - pub parachain_validator: ParachainSessionKeyPlaceholder, + pub para_validator: ParachainSessionKeyPlaceholder, + pub para_assignment: AssignmentSessionKeyPlaceholder, pub authority_discovery: AuthorityDiscovery, } } +fn transform_session_keys(v: AccountId, old: OldSessionKeys) -> SessionKeys { + SessionKeys { + grandpa: old.grandpa, + babe: old.babe, + im_online: old.im_online, + para_validator: old.para_validator, + para_assignment: { + // We need to produce a dummy value that's unique for the validator. + let mut id = AssignmentId::default(); + let id_raw: &mut [u8] = id.as_mut(); + id_raw.copy_from_slice(v.as_ref()); + id_raw[0..4].copy_from_slice(b"asgn"); + + id + }, + authority_discovery: old.authority_discovery, + } +} + parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } -impl pallet_session::Trait for Runtime { +impl pallet_session::Config for Runtime { type Event = Event; type ValidatorId = AccountId; type ValidatorIdOf = pallet_staking::StashOf; @@ -285,10 +318,10 @@ impl pallet_session::Trait for Runtime { type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; - type WeightInfo = (); + type WeightInfo = weights::pallet_session::WeightInfo; } -impl pallet_session::historical::Trait for Runtime { +impl pallet_session::historical::Config for Runtime { type FullIdentification = pallet_staking::Exposure; type FullIdentificationOf = pallet_staking::ExposureOf; } @@ -317,7 +350,7 @@ parameter_types! { // 27 eras in which slashes can be cancelled (slightly less than 7 days). pub const SlashDeferDuration: pallet_staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const MaxNominatorRewardedPerValidator: u32 = 256; + pub const MaxNominatorRewardedPerValidator: u32 = 128; // quarter of the last session will be for election. pub const ElectionLookahead: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; pub const MaxIterations: u32 = 10; @@ -330,10 +363,10 @@ type SlashCancelOrigin = EnsureOneOf< pallet_collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective> >; -impl pallet_staking::Trait for Runtime { +impl pallet_staking::Config for Runtime { type Currency = Balances; type UnixTime = Timestamp; - type CurrencyToVote = CurrencyToVoteHandler; + type CurrencyToVote = CurrencyToVote; type RewardRemainder = Treasury; type Event = Event; type Slash = Treasury; @@ -352,7 +385,10 @@ impl pallet_staking::Trait for Runtime { type UnsignedPriority = StakingUnsignedPriority; type MaxIterations = MaxIterations; type MinSolutionScoreBump = MinSolutionScoreBump; - type WeightInfo = weights::pallet_staking::WeightInfo; + // The unsigned solution weight targeted by the OCW. We set it to the maximum possible value of + // a single extrinsic. + type OffchainSolutionWeightLimit = OffchainSolutionWeightLimit; + type WeightInfo = weights::pallet_staking::WeightInfo; } parameter_types! { @@ -366,9 +402,10 @@ parameter_types! { pub const PreimageByteDeposit: Balance = 10 * MILLICENTS; pub const InstantAllowed: bool = true; pub const MaxVotes: u32 = 100; + pub const MaxProposals: u32 = 100; } -impl pallet_democracy::Trait for Runtime { +impl pallet_democracy::Config for Runtime { type Proposal = Call; type Event = Event; type Currency = Balances; @@ -390,7 +427,19 @@ impl pallet_democracy::Trait for Runtime { type InstantAllowed = InstantAllowed; type FastTrackVotingPeriod = FastTrackVotingPeriod; // To cancel a proposal which has been passed, 2/3 of the council must agree to it. - type CancellationOrigin = pallet_collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>; + type CancellationOrigin = EnsureOneOf< + AccountId, + EnsureRoot, + pallet_collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>, + >; + // To cancel a proposal before it has been passed, the technical committee must be unanimous or + // Root must agree. + type CancelProposalOrigin = EnsureOneOf< + AccountId, + EnsureRoot, + pallet_collective::EnsureProportionAtLeast<_1, _1, AccountId, TechnicalCollective>, + >; + type BlacklistOrigin = EnsureRoot; // Any single technical committee member may veto a coming council proposal, however they can // only do it once and it lasts only for the cooloff period. type VetoOrigin = pallet_collective::EnsureMember; @@ -401,7 +450,8 @@ impl pallet_democracy::Trait for Runtime { type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; type OperationalPreimageOrigin = pallet_collective::EnsureMember; - type WeightInfo = weights::pallet_democracy::WeightInfo; + type WeightInfo = weights::pallet_democracy::WeightInfo; + type MaxProposals = MaxProposals; } parameter_types! { @@ -411,7 +461,7 @@ parameter_types! { } type CouncilCollective = pallet_collective::Instance1; -impl pallet_collective::Trait for Runtime { +impl pallet_collective::Config for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; @@ -420,7 +470,7 @@ impl pallet_collective::Trait for Runtime { type MaxProposals = CouncilMaxProposals; type MaxMembers = CouncilMaxMembers; type DefaultVote = pallet_collective::PrimeDefaultVote; - type WeightInfo = weights::pallet_collective::WeightInfo; + type WeightInfo = weights::pallet_collective::WeightInfo; } parameter_types! { @@ -435,12 +485,12 @@ parameter_types! { // Make sure that there are no more than MaxMembers members elected via phragmen. const_assert!(DesiredMembers::get() <= CouncilMaxMembers::get()); -impl pallet_elections_phragmen::Trait for Runtime { +impl pallet_elections_phragmen::Config for Runtime { type Event = Event; type Currency = Balances; type ChangeMembers = Council; type InitializeMembers = Council; - type CurrencyToVote = CurrencyToVoteHandler; + type CurrencyToVote = frame_support::traits::U128CurrencyToVote; type CandidacyBond = CandidacyBond; type VotingBond = VotingBond; type LoserCandidate = Treasury; @@ -450,7 +500,7 @@ impl pallet_elections_phragmen::Trait for Runtime { type DesiredRunnersUp = DesiredRunnersUp; type TermDuration = TermDuration; type ModuleId = ElectionsPhragmenModuleId; - type WeightInfo = (); + type WeightInfo = weights::pallet_elections_phragmen::WeightInfo; } parameter_types! { @@ -460,7 +510,7 @@ parameter_types! { } type TechnicalCollective = pallet_collective::Instance2; -impl pallet_collective::Trait for Runtime { +impl pallet_collective::Config for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; @@ -469,10 +519,10 @@ impl pallet_collective::Trait for Runtime { type MaxProposals = TechnicalMaxProposals; type MaxMembers = TechnicalMaxMembers; type DefaultVote = pallet_collective::PrimeDefaultVote; - type WeightInfo = weights::pallet_collective::WeightInfo; + type WeightInfo = weights::pallet_collective::WeightInfo; } -impl pallet_membership::Trait for Runtime { +impl pallet_membership::Config for Runtime { type Event = Event; type AddOrigin = MoreThanHalfCouncil; type RemoveOrigin = MoreThanHalfCouncil; @@ -493,7 +543,13 @@ parameter_types! { pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); pub const TipReportDepositBase: Balance = 1 * DOLLARS; - pub const TipReportDepositPerByte: Balance = 1 * CENTS; + pub const DataDepositPerByte: Balance = 1 * CENTS; + pub const BountyDepositBase: Balance = 1 * DOLLARS; + pub const BountyDepositPayoutDelay: BlockNumber = 4 * DAYS; + pub const BountyUpdatePeriod: BlockNumber = 90 * DAYS; + pub const MaximumReasonLength: u32 = 16384; + pub const BountyCuratorDeposit: Permill = Permill::from_percent(50); + pub const BountyValueMinimum: Balance = 2 * DOLLARS; } type ApproveOrigin = EnsureOneOf< @@ -502,59 +558,79 @@ type ApproveOrigin = EnsureOneOf< pallet_collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective> >; -impl pallet_treasury::Trait for Runtime { +impl pallet_treasury::Config for Runtime { + type ModuleId = TreasuryModuleId; type Currency = Balances; type ApproveOrigin = ApproveOrigin; type RejectOrigin = MoreThanHalfCouncil; - type Tippers = ElectionsPhragmen; - type TipCountdown = TipCountdown; - type TipFindersFee = TipFindersFee; - type TipReportDepositBase = TipReportDepositBase; - type TipReportDepositPerByte = TipReportDepositPerByte; type Event = Event; - type ProposalRejection = Treasury; + type OnSlash = Treasury; type ProposalBond = ProposalBond; type ProposalBondMinimum = ProposalBondMinimum; type SpendPeriod = SpendPeriod; type Burn = Burn; type BurnDestination = Society; - type ModuleId = TreasuryModuleId; - type WeightInfo = (); + type SpendFunds = Bounties; + type WeightInfo = weights::pallet_treasury::WeightInfo; +} + +impl pallet_bounties::Config for Runtime { + type Event = Event; + type BountyDepositBase = BountyDepositBase; + type BountyDepositPayoutDelay = BountyDepositPayoutDelay; + type BountyUpdatePeriod = BountyUpdatePeriod; + type BountyCuratorDeposit = BountyCuratorDeposit; + type BountyValueMinimum = BountyValueMinimum; + type DataDepositPerByte = DataDepositPerByte; + type MaximumReasonLength = MaximumReasonLength; + type WeightInfo = weights::pallet_bounties::WeightInfo; + +} + +impl pallet_tips::Config for Runtime { + type Event = Event; + type DataDepositPerByte = DataDepositPerByte; + type MaximumReasonLength = MaximumReasonLength; + type Tippers = ElectionsPhragmen; + type TipCountdown = TipCountdown; + type TipFindersFee = TipFindersFee; + type TipReportDepositBase = TipReportDepositBase; + type WeightInfo = weights::pallet_tips::WeightInfo; } parameter_types! { - pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); + pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * BlockWeights::get().max_block; } -impl pallet_offences::Trait for Runtime { +impl pallet_offences::Config for Runtime { type Event = Event; type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; - type WeightInfo = (); } -impl pallet_authority_discovery::Trait for Runtime {} +impl pallet_authority_discovery::Config for Runtime {} parameter_types! { pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; } parameter_types! { - pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; + pub StakingUnsignedPriority: TransactionPriority = + Perbill::from_percent(90) * TransactionPriority::max_value(); pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); } -impl pallet_im_online::Trait for Runtime { +impl pallet_im_online::Config for Runtime { type AuthorityId = ImOnlineId; type Event = Event; type ReportUnresponsiveness = Offences; type SessionDuration = SessionDuration; type UnsignedPriority = ImOnlineUnsignedPriority; - type WeightInfo = (); + type WeightInfo = weights::pallet_im_online::WeightInfo; } -impl pallet_grandpa::Trait for Runtime { +impl pallet_grandpa::Config for Runtime { type Event = Event; type Call = Call; @@ -569,17 +645,8 @@ impl pallet_grandpa::Trait for Runtime { )>>::IdentificationTuple; type HandleEquivocation = pallet_grandpa::EquivocationHandler; -} -parameter_types! { - pub WindowSize: BlockNumber = pallet_finality_tracker::DEFAULT_WINDOW_SIZE.into(); - pub ReportLatency: BlockNumber = pallet_finality_tracker::DEFAULT_REPORT_LATENCY.into(); -} - -impl pallet_finality_tracker::Trait for Runtime { - type OnFinalizationStalled = (); - type WindowSize = WindowSize; - type ReportLatency = ReportLatency; + type WeightInfo = (); } /// Submits transaction with the node's public and signature type. Adheres to the signed extension @@ -591,7 +658,7 @@ impl frame_system::offchain::CreateSignedTransaction for R call: Call, public: ::Signer, account: AccountId, - nonce: ::Index, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { // take the biggest period possible. let period = BlockHashCount::get() @@ -641,11 +708,12 @@ parameter_types! { pub Prefix: &'static [u8] = b"Pay KSMs to the Kusama account:"; } -impl claims::Trait for Runtime { +impl claims::Config for Runtime { type Event = Event; type VestingSchedule = Vesting; type Prefix = Prefix; type MoveClaimOrigin = pallet_collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>; + type WeightInfo = weights::runtime_common_claims::WeightInfo; } parameter_types! { @@ -658,7 +726,7 @@ parameter_types! { pub const MaxRegistrars: u32 = 20; } -impl pallet_identity::Trait for Runtime { +impl pallet_identity::Config for Runtime { type Event = Event; type Currency = Balances; type Slashed = Treasury; @@ -670,13 +738,13 @@ impl pallet_identity::Trait for Runtime { type MaxRegistrars = MaxRegistrars; type RegistrarOrigin = MoreThanHalfCouncil; type ForceOrigin = MoreThanHalfCouncil; - type WeightInfo = (); + type WeightInfo = weights::pallet_identity::WeightInfo; } -impl pallet_utility::Trait for Runtime { +impl pallet_utility::Config for Runtime { type Event = Event; type Call = Call; - type WeightInfo = weights::pallet_utility::WeightInfo; + type WeightInfo = weights::pallet_utility::WeightInfo; } parameter_types! { @@ -687,14 +755,14 @@ parameter_types! { pub const MaxSignatories: u16 = 100; } -impl pallet_multisig::Trait for Runtime { +impl pallet_multisig::Config for Runtime { type Event = Event; type Call = Call; type Currency = Balances; type DepositBase = DepositBase; type DepositFactor = DepositFactor; type MaxSignatories = MaxSignatories; - type WeightInfo = (); + type WeightInfo = weights::pallet_multisig::WeightInfo; } parameter_types! { @@ -704,7 +772,7 @@ parameter_types! { pub const RecoveryDeposit: Balance = 5 * DOLLARS; } -impl pallet_recovery::Trait for Runtime { +impl pallet_recovery::Config for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -725,7 +793,7 @@ parameter_types! { pub const SocietyModuleId: ModuleId = ModuleId(*b"py/socie"); } -impl pallet_society::Trait for Runtime { +impl pallet_society::Config for Runtime { type Event = Event; type Currency = Balances; type Randomness = RandomnessCollectiveFlip; @@ -746,12 +814,12 @@ parameter_types! { pub const MinVestedTransfer: Balance = 100 * DOLLARS; } -impl pallet_vesting::Trait for Runtime { +impl pallet_vesting::Config for Runtime { type Event = Event; type Currency = Balances; type BlockNumberToBalance = ConvertInto; type MinVestedTransfer = MinVestedTransfer; - type WeightInfo = (); + type WeightInfo = weights::pallet_vesting::WeightInfo; } parameter_types! { @@ -765,10 +833,6 @@ parameter_types! { pub const MaxPending: u16 = 32; } -impl dummy::Trait for Runtime { - type Event = Event; -} - /// The type used to represent the kinds of proxying allowed. #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug)] pub enum ProxyType { @@ -796,7 +860,6 @@ impl InstanceFilter for ProxyType { Call::Staking(..) | Call::Offences(..) | Call::Session(..) | - Call::FinalityTracker(..) | Call::Grandpa(..) | Call::ImOnline(..) | Call::AuthorityDiscovery(..) | @@ -806,11 +869,9 @@ impl InstanceFilter for ProxyType { Call::ElectionsPhragmen(..) | Call::TechnicalMembership(..) | Call::Treasury(..) | + Call::Bounties(..) | + Call::Tips(..) | Call::Claims(..) | - Call::DummyParachains(..) | - Call::DummyAttestations(..) | - Call::DummySlots(..) | - Call::DummyRegistrar(..) | Call::Utility(..) | Call::Identity(..) | Call::Society(..) | @@ -829,15 +890,23 @@ impl InstanceFilter for ProxyType { Call::Multisig(..) ), ProxyType::Governance => matches!(c, - Call::Democracy(..) | Call::Council(..) | Call::TechnicalCommittee(..) - | Call::ElectionsPhragmen(..) | Call::Treasury(..) | Call::Utility(..) + Call::Democracy(..) | + Call::Council(..) | + Call::TechnicalCommittee(..) | + Call::ElectionsPhragmen(..) | + Call::Treasury(..) | + Call::Bounties(..) | + Call::Tips(..) | + Call::Utility(..) ), ProxyType::Staking => matches!(c, - Call::Staking(..) | Call::Utility(..) + Call::Staking(..) | + Call::Session(..) | + Call::Utility(..) ), ProxyType::IdentityJudgement => matches!(c, - Call::Identity(pallet_identity::Call::provide_judgement(..)) - | Call::Utility(pallet_utility::Call::batch(..)) + Call::Identity(pallet_identity::Call::provide_judgement(..)) | + Call::Utility(..) ) } } @@ -852,7 +921,7 @@ impl InstanceFilter for ProxyType { } } -impl pallet_proxy::Trait for Runtime { +impl pallet_proxy::Config for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -860,21 +929,26 @@ impl pallet_proxy::Trait for Runtime { type ProxyDepositBase = ProxyDepositBase; type ProxyDepositFactor = ProxyDepositFactor; type MaxProxies = MaxProxies; - type WeightInfo = weights::pallet_proxy::WeightInfo; + type WeightInfo = weights::pallet_proxy::WeightInfo; type MaxPending = MaxPending; type CallHasher = BlakeTwo256; type AnnouncementDepositBase = AnnouncementDepositBase; type AnnouncementDepositFactor = AnnouncementDepositFactor; } +// When this is removed, should also remove `OldSessionKeys`. +pub struct UpgradeSessionKeys; +impl frame_support::traits::OnRuntimeUpgrade for UpgradeSessionKeys { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + Session::upgrade_keys::(transform_session_keys); + Perbill::from_percent(50) * BlockWeights::get().max_block + } +} + pub struct CustomOnRuntimeUpgrade; impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { fn on_runtime_upgrade() -> frame_support::weights::Weight { - if pallet_scheduler::Module::::migrate_v1_to_t2() { - ::MaximumBlockWeight::get() - } else { - ::DbWeight::get().reads(1) + 500_000_000 - } + 0 } } @@ -885,68 +959,67 @@ construct_runtime! { UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. - System: frame_system::{Module, Call, Storage, Config, Event}, - RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage}, + System: frame_system::{Module, Call, Storage, Config, Event} = 0, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage} = 32, // Must be before session. - Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, + Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned} = 1, - Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, - Indices: pallet_indices::{Module, Call, Storage, Config, Event}, - Balances: pallet_balances::{Module, Call, Storage, Config, Event}, - TransactionPayment: pallet_transaction_payment::{Module, Storage}, + Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent} = 2, + Indices: pallet_indices::{Module, Call, Storage, Config, Event} = 3, + Balances: pallet_balances::{Module, Call, Storage, Config, Event} = 4, + TransactionPayment: pallet_transaction_payment::{Module, Storage} = 33, // Consensus support. - Authorship: pallet_authorship::{Module, Call, Storage}, - Staking: pallet_staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - Offences: pallet_offences::{Module, Call, Storage, Event}, - Historical: session_historical::{Module}, - Session: pallet_session::{Module, Call, Storage, Event, Config}, - FinalityTracker: pallet_finality_tracker::{Module, Call, Storage, Inherent}, - Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, - AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, + Authorship: pallet_authorship::{Module, Call, Storage} = 5, + Staking: pallet_staking::{Module, Call, Storage, Config, Event, ValidateUnsigned} = 6, + Offences: pallet_offences::{Module, Call, Storage, Event} = 7, + Historical: session_historical::{Module} = 34, + Session: pallet_session::{Module, Call, Storage, Event, Config} = 8, + Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned} = 10, + ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config} = 11, + AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config} = 12, // Governance stuff; uncallable initially. - Democracy: pallet_democracy::{Module, Call, Storage, Config, Event}, - Council: pallet_collective::::{Module, Call, Storage, Origin, Event, Config}, - TechnicalCommittee: pallet_collective::::{Module, Call, Storage, Origin, Event, Config}, - ElectionsPhragmen: pallet_elections_phragmen::{Module, Call, Storage, Event, Config}, - TechnicalMembership: pallet_membership::::{Module, Call, Storage, Event, Config}, - Treasury: pallet_treasury::{Module, Call, Storage, Event}, + Democracy: pallet_democracy::{Module, Call, Storage, Config, Event} = 13, + Council: pallet_collective::::{Module, Call, Storage, Origin, Event, Config} = 14, + TechnicalCommittee: pallet_collective::::{Module, Call, Storage, Origin, Event, Config} = 15, + ElectionsPhragmen: pallet_elections_phragmen::{Module, Call, Storage, Event, Config} = 16, + TechnicalMembership: pallet_membership::::{Module, Call, Storage, Event, Config} = 17, + Treasury: pallet_treasury::{Module, Call, Storage, Config, Event} = 18, // Claims. Usable initially. - Claims: claims::{Module, Call, Storage, Event, Config, ValidateUnsigned}, - - // Old parachains stuff. All dummies to avoid messing up the transaction indices. - DummyParachains: dummy::::{Module, Call}, - DummyAttestations: dummy::::{Module, Call}, - DummySlots: dummy::::{Module, Call, Event}, - DummyRegistrar: dummy::::{Module, Call, Event}, + Claims: claims::{Module, Call, Storage, Event, Config, ValidateUnsigned} = 19, // Utility module. - Utility: pallet_utility::{Module, Call, Event}, + Utility: pallet_utility::{Module, Call, Event} = 24, // Less simple identity module. - Identity: pallet_identity::{Module, Call, Storage, Event}, + Identity: pallet_identity::{Module, Call, Storage, Event} = 25, // Society module. - Society: pallet_society::{Module, Call, Storage, Event}, + Society: pallet_society::{Module, Call, Storage, Event} = 26, // Social recovery module. - Recovery: pallet_recovery::{Module, Call, Storage, Event}, + Recovery: pallet_recovery::{Module, Call, Storage, Event} = 27, // Vesting. Usable initially, but removed once all vesting is finished. - Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, + Vesting: pallet_vesting::{Module, Call, Storage, Event, Config} = 28, // System scheduler. - Scheduler: pallet_scheduler::{Module, Call, Storage, Event}, + Scheduler: pallet_scheduler::{Module, Call, Storage, Event} = 29, // Proxy module. Late addition. - Proxy: pallet_proxy::{Module, Call, Storage, Event}, + Proxy: pallet_proxy::{Module, Call, Storage, Event} = 30, // Multisig module. Late addition. - Multisig: pallet_multisig::{Module, Call, Storage, Event}, + Multisig: pallet_multisig::{Module, Call, Storage, Event} = 31, + + // Bounties module. + Bounties: pallet_bounties::{Module, Call, Storage, Event} = 35, + + // Tips module. + Tips: pallet_tips::{Module, Call, Storage, Event} = 36, } } @@ -981,7 +1054,7 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllModules, - CustomOnRuntimeUpgrade + UpgradeSessionKeys, >; /// The payload being signed in the transactions. pub type SignedPayload = generic::SignedPayload; @@ -1048,56 +1121,70 @@ sp_api::impl_runtime_apis! { } } - // Dummy implementation to continue supporting old parachains runtime temporarily. - impl p_v0::ParachainHost for Runtime { - fn validators() -> Vec { - // this is a compile-time check of size equality. note that we don't invoke - // the function and nothing here is unsafe. - let _ = core::mem::transmute::; - - // Yes, these aren't actually the parachain session keys. - // It doesn't matter, but we shouldn't return a zero-sized vector here. - // As there are no parachains - Session::validators() - .into_iter() - .map(|k| k.using_encoded(|s| Decode::decode(&mut &s[..])) - .expect("correct size and raw-bytes; qed")) - .collect() + impl primitives::v1::ParachainHost for Runtime { + fn validators() -> Vec { + Vec::new() } - fn duty_roster() -> p_v0::DutyRoster { - let v = Session::validators(); - p_v0::DutyRoster { validator_duty: (0..v.len()).map(|_| p_v0::Chain::Relay).collect() } + + fn validator_groups() -> (Vec>, GroupRotationInfo) { + (Vec::new(), GroupRotationInfo { session_start_block: 0, group_rotation_frequency: 0, now: 0 }) } - fn active_parachains() -> Vec<(p_v0::Id, Option<(p_v0::CollatorId, p_v0::Retriable)>)> { + + fn availability_cores() -> Vec> { Vec::new() } - fn global_validation_data() -> p_v0::GlobalValidationData { - p_v0::GlobalValidationData { - max_code_size: 1, - max_head_data_size: 1, - block_number: System::block_number().saturating_sub(1), - } + + fn full_validation_data(_: Id, _: OccupiedCoreAssumption) + -> Option> { + None } - fn local_validation_data(_id: p_v0::Id) -> Option { + + fn persisted_validation_data(_: Id, _: OccupiedCoreAssumption) + -> Option> { None } - fn parachain_code(_id: p_v0::Id) -> Option { + fn check_validation_outputs( + _: Id, + _: primitives::v1::CandidateCommitments, + ) -> bool { + false + } + + fn session_index_for_child() -> SessionIndex { + 0 + } + + fn session_info(_: SessionIndex) -> Option { None } - fn get_heads(_extrinsics: Vec<::Extrinsic>) - -> Option> - { + + fn validation_code(_: Id, _: OccupiedCoreAssumption) -> Option { None } - fn signing_context() -> p_v0::SigningContext { - p_v0::SigningContext { - parent_hash: System::parent_hash(), - session_index: Session::current_index(), - } + + fn historical_validation_code(_: Id, _: BlockNumber) -> Option { + None } - fn downward_messages(_id: p_v0::Id) -> Vec { + + fn candidate_pending_availability(_: Id) -> Option> { + None + } + + fn candidate_events() -> Vec> { + Vec::new() + } + + fn dmq_contents( + _recipient: Id, + ) -> Vec> { Vec::new() } + + fn inbound_hrmp_channels_contents( + _recipient: Id + ) -> BTreeMap>> { + BTreeMap::new() + } } impl fg_primitives::GrandpaApi for Runtime { @@ -1124,7 +1211,7 @@ sp_api::impl_runtime_apis! { _set_id: fg_primitives::SetId, authority_id: fg_primitives::AuthorityId, ) -> Option { - use codec::Encode; + use parity_scale_codec::Encode; Historical::prove((fg_primitives::KEY_TYPE, authority_id)) .map(|p| p.encode()) @@ -1153,11 +1240,19 @@ sp_api::impl_runtime_apis! { Babe::current_epoch_start() } + fn current_epoch() -> babe_primitives::Epoch { + Babe::current_epoch() + } + + fn next_epoch() -> babe_primitives::Epoch { + Babe::next_epoch() + } + fn generate_key_ownership_proof( _slot_number: babe_primitives::SlotNumber, authority_id: babe_primitives::AuthorityId, ) -> Option { - use codec::Encode; + use parity_scale_codec::Encode; Historical::prove((babe_primitives::KEY_TYPE, authority_id)) .map(|p| p.encode()) @@ -1223,9 +1318,9 @@ sp_api::impl_runtime_apis! { use pallet_offences_benchmarking::Module as OffencesBench; use frame_system_benchmarking::Module as SystemBench; - impl pallet_session_benchmarking::Trait for Runtime {} - impl pallet_offences_benchmarking::Trait for Runtime {} - impl frame_system_benchmarking::Trait for Runtime {} + impl pallet_session_benchmarking::Config for Runtime {} + impl pallet_offences_benchmarking::Config for Runtime {} + impl frame_system_benchmarking::Config for Runtime {} let whitelist: Vec = vec![ // Block Number @@ -1245,20 +1340,25 @@ sp_api::impl_runtime_apis! { let mut batches = Vec::::new(); let params = (&config, &whitelist); // Polkadot - add_benchmark!(params, batches, claims, Claims); + add_benchmark!(params, batches, runtime_common::claims, Claims); // Substrate add_benchmark!(params, batches, pallet_balances, Balances); + add_benchmark!(params, batches, pallet_bounties, Bounties); add_benchmark!(params, batches, pallet_collective, Council); add_benchmark!(params, batches, pallet_democracy, Democracy); add_benchmark!(params, batches, pallet_elections_phragmen, ElectionsPhragmen); add_benchmark!(params, batches, pallet_identity, Identity); add_benchmark!(params, batches, pallet_im_online, ImOnline); + add_benchmark!(params, batches, pallet_indices, Indices); + add_benchmark!(params, batches, pallet_multisig, Multisig); add_benchmark!(params, batches, pallet_offences, OffencesBench::); + add_benchmark!(params, batches, pallet_proxy, Proxy); add_benchmark!(params, batches, pallet_scheduler, Scheduler); add_benchmark!(params, batches, pallet_session, SessionBench::); add_benchmark!(params, batches, pallet_staking, Staking); add_benchmark!(params, batches, frame_system, SystemBench::); add_benchmark!(params, batches, pallet_timestamp, Timestamp); + add_benchmark!(params, batches, pallet_tips, Tips); add_benchmark!(params, batches, pallet_treasury, Treasury); add_benchmark!(params, batches, pallet_utility, Utility); add_benchmark!(params, batches, pallet_vesting, Vesting); @@ -1268,3 +1368,76 @@ sp_api::impl_runtime_apis! { } } } + +#[cfg(test)] +mod test_fees { + use super::*; + use frame_support::weights::WeightToFeePolynomial; + use frame_support::storage::StorageValue; + use sp_runtime::FixedPointNumber; + use frame_support::weights::GetDispatchInfo; + use parity_scale_codec::Encode; + use pallet_transaction_payment::Multiplier; + use separator::Separatable; + + + #[test] + #[ignore] + fn block_cost() { + let max_block_weight = BlockWeights::get().max_block; + let raw_fee = WeightToFee::calc(&max_block_weight); + + println!( + "Full Block weight == {} // WeightToFee(full_block) == {} plank", + max_block_weight, + raw_fee.separated_string(), + ); + } + + #[test] + #[ignore] + fn transfer_cost_min_multiplier() { + let min_multiplier = runtime_common::MinimumMultiplier::get(); + let call = >::transfer_keep_alive(Default::default(), Default::default()); + let info = call.get_dispatch_info(); + // convert to outer call. + let call = Call::Balances(call); + let len = call.using_encoded(|e| e.len()) as u32; + + let mut ext = sp_io::TestExternalities::new_empty(); + ext.execute_with(|| { + pallet_transaction_payment::NextFeeMultiplier::put(min_multiplier); + let fee = TransactionPayment::compute_fee(len, &info, 0); + println!( + "weight = {:?} // multiplier = {:?} // full transfer fee = {:?}", + info.weight.separated_string(), + pallet_transaction_payment::NextFeeMultiplier::get(), + fee.separated_string(), + ); + }); + + ext.execute_with(|| { + let mul = Multiplier::saturating_from_rational(1, 1000_000_000u128); + pallet_transaction_payment::NextFeeMultiplier::put(mul); + let fee = TransactionPayment::compute_fee(len, &info, 0); + println!( + "weight = {:?} // multiplier = {:?} // full transfer fee = {:?}", + info.weight.separated_string(), + pallet_transaction_payment::NextFeeMultiplier::get(), + fee.separated_string(), + ); + }); + + ext.execute_with(|| { + let mul = Multiplier::saturating_from_rational(1, 1u128); + pallet_transaction_payment::NextFeeMultiplier::put(mul); + let fee = TransactionPayment::compute_fee(len, &info, 0); + println!( + "weight = {:?} // multiplier = {:?} // full transfer fee = {:?}", + info.weight.separated_string(), + pallet_transaction_payment::NextFeeMultiplier::get(), + fee.separated_string(), + ); + }); + } +} diff --git a/runtime/kusama/src/weights/frame_system.rs b/runtime/kusama/src/weights/frame_system.rs index 9522fa75203906ab3c7264154a4b33835375843c..b44c68542e73cc5c6595ef424c5c81adbdcfcadb 100644 --- a/runtime/kusama/src/weights/frame_system.rs +++ b/runtime/kusama/src/weights/frame_system.rs @@ -1,58 +1,77 @@ -// This file is part of Substrate. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. -// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// 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. -// 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. +// 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 . +//! Weights for frame_system +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-10-30, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/polkadot +// benchmark +// --chain +// kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=frame_system +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header +// ./file_header.txt +// --output=./runtime/kusama/src/weights/ -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 #![allow(unused_parens)] +#![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl frame_system::WeightInfo for WeightInfo { - // WARNING! Some components were not used: ["b"] - fn remark() -> Weight { - (1305000 as Weight) +/// Weight functions for frame_system. +pub struct WeightInfo(PhantomData); +impl frame_system::WeightInfo for WeightInfo { + fn remark(_b: u32, ) -> Weight { + (1_815_000 as Weight) } fn set_heap_pages() -> Weight { - (2023000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (2_463_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // WARNING! Some components were not used: ["d"] fn set_changes_trie_config() -> Weight { - (10026000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (11_280_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn set_storage(i: u32, ) -> Weight { (0 as Weight) - .saturating_add((656000 as Weight).saturating_mul(i as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + .saturating_add((821_000 as Weight).saturating_mul(i as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) } fn kill_storage(i: u32, ) -> Weight { - (4327000 as Weight) - .saturating_add((478000 as Weight).saturating_mul(i as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + (0 as Weight) + .saturating_add((549_000 as Weight).saturating_mul(i as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) } fn kill_prefix(p: u32, ) -> Weight { - (8349000 as Weight) - .saturating_add((838000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) + (0 as Weight) + .saturating_add((872_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) } fn suicide() -> Weight { - (29247000 as Weight) + (35_050_000 as Weight) } } diff --git a/runtime/kusama/src/weights/mod.rs b/runtime/kusama/src/weights/mod.rs index 25efdf81eda29e74be30095bf57be66121c69ca6..177e16717332ddbe094d33008e182dfd9863be9a 100644 --- a/runtime/kusama/src/weights/mod.rs +++ b/runtime/kusama/src/weights/mod.rs @@ -1,26 +1,37 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// 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. +// 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. -// 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 collection of weight modules used for pallets in the runtime. +//! A list of the different weight modules for our runtime. pub mod frame_system; pub mod pallet_balances; +pub mod pallet_bounties; pub mod pallet_collective; pub mod pallet_democracy; +pub mod pallet_elections_phragmen; +pub mod pallet_identity; +pub mod pallet_im_online; +pub mod pallet_indices; +pub mod pallet_multisig; +pub mod pallet_proxy; +pub mod pallet_scheduler; +pub mod pallet_session; pub mod pallet_staking; pub mod pallet_timestamp; +pub mod pallet_tips; +pub mod pallet_treasury; pub mod pallet_utility; -pub mod pallet_proxy; +pub mod pallet_vesting; +pub mod runtime_common_claims; diff --git a/runtime/kusama/src/weights/pallet_balances.rs b/runtime/kusama/src/weights/pallet_balances.rs index 53431ba48f2f4d878476122b30daaf481ac03487..7e6848c2fb3ac39382ceb245fab79dd452da83d4 100644 --- a/runtime/kusama/src/weights/pallet_balances.rs +++ b/runtime/kusama/src/weights/pallet_balances.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -13,35 +13,59 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +//! Autogenerated weights for pallet_balances +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 -/// Weights for the Balances Pallet +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_balances +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; -pub struct WeightInfo; -impl pallet_balances::WeightInfo for WeightInfo { + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_balances. +pub struct WeightInfo(PhantomData); +impl pallet_balances::WeightInfo for WeightInfo { fn transfer() -> Weight { - (65949000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (93_087_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_keep_alive() -> Weight { - (46665000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (63_971_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_creating() -> Weight { - (27086000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (35_018_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_killing() -> Weight { - (33424000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (44_144_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_transfer() -> Weight { - (65343000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (91_707_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } } diff --git a/runtime/kusama/src/weights/pallet_bounties.rs b/runtime/kusama/src/weights/pallet_bounties.rs new file mode 100644 index 0000000000000000000000000000000000000000..562e13c4b980ab50c645df3720727975aa323304 --- /dev/null +++ b/runtime/kusama/src/weights/pallet_bounties.rs @@ -0,0 +1,108 @@ +// This file is part of Substrate. + +// Copyright (C) 2020 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_bounties +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-11-20, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 128 + +// Executed Command: +// target/release/substrate +// benchmark +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_bounties +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./frame/bounties/src/weights.rs +// --template=./.maintain/frame-weight-template.hbs + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for pallet_bounties using the Substrate node and recommended hardware. +pub struct WeightInfo(PhantomData); +impl pallet_bounties::WeightInfo for WeightInfo { + fn propose_bounty(d: u32, ) -> Weight { + (64_778_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(d as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn approve_bounty() -> Weight { + (18_293_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn propose_curator() -> Weight { + (14_248_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn unassign_curator() -> Weight { + (52_100_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn accept_curator() -> Weight { + (52_564_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn award_bounty() -> Weight { + (37_426_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn claim_bounty() -> Weight { + (176_077_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + fn close_bounty_proposed() -> Weight { + (51_162_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn close_bounty_active() -> Weight { + (116_907_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn extend_bounty_expiry() -> Weight { + (36_419_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn spend_funds(b: u32, ) -> Weight { + (7_562_000 as Weight) + // Standard Error: 16_000 + .saturating_add((77_328_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(b as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(b as Weight))) + } +} diff --git a/runtime/kusama/src/weights/pallet_collective.rs b/runtime/kusama/src/weights/pallet_collective.rs index 32b4ad02d7aa94c8007429b24bef2f062b310036..678d3c316811486d060ddeccc09c13116b5091aa 100644 --- a/runtime/kusama/src/weights/pallet_collective.rs +++ b/runtime/kusama/src/weights/pallet_collective.rs @@ -1,97 +1,140 @@ -// Copyright (C) 2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. -// 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. +// 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_collective +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_collective +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc6 #![allow(unused_parens)] #![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl pallet_collective::WeightInfo for WeightInfo { +/// Weight functions for pallet_collective. +pub struct WeightInfo(PhantomData); +impl pallet_collective::WeightInfo for WeightInfo { fn set_members(m: u32, n: u32, p: u32, ) -> Weight { (0 as Weight) - .saturating_add((21040000 as Weight).saturating_mul(m as Weight)) - .saturating_add((173000 as Weight).saturating_mul(n as Weight)) - .saturating_add((31595000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(p as Weight))) - .saturating_add(DbWeight::get().writes(2 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) + // Standard Error: 9_000 + .saturating_add((20_739_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 9_000 + .saturating_add((50_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 9_000 + .saturating_add((28_199_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(p as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) } fn execute(b: u32, m: u32, ) -> Weight { - (43359000 as Weight) - .saturating_add((4000 as Weight).saturating_mul(b as Weight)) - .saturating_add((123000 as Weight).saturating_mul(m as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) + (30_949_000 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 0 + .saturating_add((111_000 as Weight).saturating_mul(m as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) } fn propose_execute(b: u32, m: u32, ) -> Weight { - (54134000 as Weight) - .saturating_add((4000 as Weight).saturating_mul(b as Weight)) - .saturating_add((239000 as Weight).saturating_mul(m as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) + (37_904_000 as Weight) + // Standard Error: 0 + .saturating_add((4_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 0 + .saturating_add((220_000 as Weight).saturating_mul(m as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) } fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { - (90650000 as Weight) - .saturating_add((5000 as Weight).saturating_mul(b as Weight)) - .saturating_add((152000 as Weight).saturating_mul(m as Weight)) - .saturating_add((970000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(4 as Weight)) + (62_075_000 as Weight) + // Standard Error: 0 + .saturating_add((5_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 0 + .saturating_add((115_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 0 + .saturating_add((588_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn vote(m: u32, ) -> Weight { - (74460000 as Weight) - .saturating_add((290000 as Weight).saturating_mul(m as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (43_811_000 as Weight) + // Standard Error: 0 + .saturating_add((281_000 as Weight).saturating_mul(m as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn close_early_disapproved(m: u32, p: u32, ) -> Weight { - (86360000 as Weight) - .saturating_add((232000 as Weight).saturating_mul(m as Weight)) - .saturating_add((954000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (59_086_000 as Weight) + // Standard Error: 1_000 + .saturating_add((222_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 1_000 + .saturating_add((542_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn close_early_approved(b: u32, m: u32, p: u32, ) -> Weight { - (123653000 as Weight) - .saturating_add((1000 as Weight).saturating_mul(b as Weight)) - .saturating_add((287000 as Weight).saturating_mul(m as Weight)) - .saturating_add((920000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (84_535_000 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 0 + .saturating_add((221_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 0 + .saturating_add((557_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn close_disapproved(m: u32, p: u32, ) -> Weight { - (95395000 as Weight) - .saturating_add((236000 as Weight).saturating_mul(m as Weight)) - .saturating_add((965000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (65_098_000 as Weight) + // Standard Error: 0 + .saturating_add((221_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 0 + .saturating_add((552_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn close_approved(b: u32, m: u32, p: u32, ) -> Weight { - (135284000 as Weight) - .saturating_add((4000 as Weight).saturating_mul(b as Weight)) - .saturating_add((218000 as Weight).saturating_mul(m as Weight)) - .saturating_add((951000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(5 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (90_884_000 as Weight) + // Standard Error: 0 + .saturating_add((4_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 0 + .saturating_add((221_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 0 + .saturating_add((558_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn disapprove_proposal(p: u32, ) -> Weight { - (50500000 as Weight) - .saturating_add((966000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (34_674_000 as Weight) + // Standard Error: 0 + .saturating_add((552_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } } diff --git a/runtime/kusama/src/weights/pallet_democracy.rs b/runtime/kusama/src/weights/pallet_democracy.rs index 676281309c3fac02e24e52dc74ba710fc33a4802..d6ee82eb959a172c45080a36490716bfdc3b97c8 100644 --- a/runtime/kusama/src/weights/pallet_democracy.rs +++ b/runtime/kusama/src/weights/pallet_democracy.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -13,144 +13,195 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +//! Autogenerated weights for pallet_democracy +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 -//! Weights for the Democracy Pallet -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_democracy +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; -pub struct WeightInfo; -impl pallet_democracy::WeightInfo for WeightInfo { +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_democracy. +pub struct WeightInfo(PhantomData); +impl pallet_democracy::WeightInfo for WeightInfo { fn propose() -> Weight { - (49113000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (76_513_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn second(s: u32, ) -> Weight { - (42067000 as Weight) - .saturating_add((220000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (50_536_000 as Weight) + // Standard Error: 0 + .saturating_add((194_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn vote_new(r: u32, ) -> Weight { - (54159000 as Weight) - .saturating_add((252000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (60_328_000 as Weight) + // Standard Error: 0 + .saturating_add((227_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn vote_existing(r: u32, ) -> Weight { - (54145000 as Weight) - .saturating_add((262000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (60_063_000 as Weight) + // Standard Error: 0 + .saturating_add((232_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn emergency_cancel() -> Weight { - (31071000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (37_941_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn blacklist(p: u32, ) -> Weight { + (121_082_000 as Weight) + // Standard Error: 7_000 + .saturating_add((816_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) } fn external_propose(v: u32, ) -> Weight { - (14282000 as Weight) - .saturating_add((109000 as Weight).saturating_mul(v as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (18_656_000 as Weight) + // Standard Error: 0 + .saturating_add((107_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn external_propose_majority() -> Weight { - (3478000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (4_291_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn external_propose_default() -> Weight { - (3442000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (4_484_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn fast_track() -> Weight { - (30820000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (38_722_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn veto_external(v: u32, ) -> Weight { - (30971000 as Weight) - .saturating_add((184000 as Weight).saturating_mul(v as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (39_271_000 as Weight) + // Standard Error: 0 + .saturating_add((187_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn cancel_proposal(p: u32, ) -> Weight { + (84_923_000 as Weight) + // Standard Error: 0 + .saturating_add((879_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn cancel_referendum() -> Weight { - (20431000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (22_591_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn cancel_queued(r: u32, ) -> Weight { - (42438000 as Weight) - .saturating_add((3284000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (42_351_000 as Weight) + // Standard Error: 1_000 + .saturating_add((3_421_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn on_initialize_base(r: u32, ) -> Weight { - (70826000 as Weight) - .saturating_add((10716000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(6 as Weight)) - .saturating_add(DbWeight::get().reads((2 as Weight).saturating_mul(r as Weight))) - .saturating_add(DbWeight::get().writes(5 as Weight)) + (16_859_000 as Weight) + // Standard Error: 3_000 + .saturating_add((6_940_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) } fn delegate(r: u32, ) -> Weight { - (72046000 as Weight) - .saturating_add((7837000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) - .saturating_add(DbWeight::get().writes(4 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) + (81_043_000 as Weight) + // Standard Error: 2_000 + .saturating_add((10_032_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) } fn undelegate(r: u32, ) -> Weight { - (41028000 as Weight) - .saturating_add((7810000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) - .saturating_add(DbWeight::get().writes(2 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) + (40_537_000 as Weight) + // Standard Error: 2_000 + .saturating_add((10_019_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) } fn clear_public_proposals() -> Weight { - (3643000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_649_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn note_preimage(b: u32, ) -> Weight { - (46629000 as Weight) - .saturating_add((4000 as Weight).saturating_mul(b as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (57_601_000 as Weight) + // Standard Error: 0 + .saturating_add((4_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn note_imminent_preimage(b: u32, ) -> Weight { - (31147000 as Weight) - .saturating_add((3000 as Weight).saturating_mul(b as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (39_448_000 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn reap_preimage(b: u32, ) -> Weight { - (42848000 as Weight) - .saturating_add((3000 as Weight).saturating_mul(b as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (53_441_000 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn unlock_remove(r: u32, ) -> Weight { - (45333000 as Weight) - .saturating_add((171000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (50_814_000 as Weight) + // Standard Error: 0 + .saturating_add((39_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn unlock_set(r: u32, ) -> Weight { - (44424000 as Weight) - .saturating_add((291000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (46_171_000 as Weight) + // Standard Error: 0 + .saturating_add((222_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn remove_vote(r: u32, ) -> Weight { - (28250000 as Weight) - .saturating_add((283000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (28_134_000 as Weight) + // Standard Error: 0 + .saturating_add((217_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn remove_other_vote(r: u32, ) -> Weight { - (28250000 as Weight) - .saturating_add((283000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (28_233_000 as Weight) + // Standard Error: 0 + .saturating_add((219_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } } diff --git a/runtime/kusama/src/weights/pallet_elections_phragmen.rs b/runtime/kusama/src/weights/pallet_elections_phragmen.rs new file mode 100644 index 0000000000000000000000000000000000000000..93342c226600d0b91e0488fbd142145d3bc39b59 --- /dev/null +++ b/runtime/kusama/src/weights/pallet_elections_phragmen.rs @@ -0,0 +1,116 @@ +// Copyright 2017-2020 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_elections_phragmen +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_elections_phragmen +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_elections_phragmen. +pub struct WeightInfo(PhantomData); +impl pallet_elections_phragmen::WeightInfo for WeightInfo { + fn vote(v: u32, ) -> Weight { + (86_473_000 as Weight) + // Standard Error: 9_000 + .saturating_add((199_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn vote_update(v: u32, ) -> Weight { + (53_531_000 as Weight) + // Standard Error: 8_000 + .saturating_add((126_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn remove_voter() -> Weight { + (69_725_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn report_defunct_voter_correct(c: u32, v: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 2_000 + .saturating_add((1_673_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 53_000 + .saturating_add((33_921_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn report_defunct_voter_incorrect(c: u32, v: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 0 + .saturating_add((1_696_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 12_000 + .saturating_add((33_906_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn submit_candidacy(c: u32, ) -> Weight { + (70_603_000 as Weight) + // Standard Error: 0 + .saturating_add((276_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn renounce_candidacy_candidate(c: u32, ) -> Weight { + (42_985_000 as Weight) + // Standard Error: 0 + .saturating_add((140_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn renounce_candidacy_members() -> Weight { + (76_320_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn renounce_candidacy_runners_up() -> Weight { + (46_198_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn remove_member_with_replacement() -> Weight { + (115_357_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + fn remove_member_wrong_refund() -> Weight { + (8_869_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/pallet_identity.rs b/runtime/kusama/src/weights/pallet_identity.rs new file mode 100644 index 0000000000000000000000000000000000000000..86d5e5261ccd820975d7410cc31ff3fd397b0d42 --- /dev/null +++ b/runtime/kusama/src/weights/pallet_identity.rs @@ -0,0 +1,179 @@ +// Copyright 2017-2020 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_identity +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_identity +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_identity. +pub struct WeightInfo(PhantomData); +impl pallet_identity::WeightInfo for WeightInfo { + fn add_registrar(r: u32, ) -> Weight { + (28_419_000 as Weight) + // Standard Error: 2_000 + .saturating_add((289_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_identity(r: u32, x: u32, ) -> Weight { + (73_891_000 as Weight) + // Standard Error: 19_000 + .saturating_add((279_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 2_000 + .saturating_add((1_819_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_subs_new(s: u32, ) -> Weight { + (52_415_000 as Weight) + // Standard Error: 1_000 + .saturating_add((9_876_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + } + fn set_subs_old(p: u32, ) -> Weight { + (48_406_000 as Weight) + // Standard Error: 0 + .saturating_add((3_392_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) + } + fn clear_identity(r: u32, s: u32, x: u32, ) -> Weight { + (61_817_000 as Weight) + // Standard Error: 8_000 + .saturating_add((202_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_000 + .saturating_add((3_417_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 1_000 + .saturating_add((1_075_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + } + fn request_judgement(r: u32, x: u32, ) -> Weight { + (73_843_000 as Weight) + // Standard Error: 9_000 + .saturating_add((348_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_000 + .saturating_add((2_085_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn cancel_request(r: u32, x: u32, ) -> Weight { + (63_423_000 as Weight) + // Standard Error: 11_000 + .saturating_add((237_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_000 + .saturating_add((2_067_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_fee(r: u32, ) -> Weight { + (10_954_000 as Weight) + // Standard Error: 1_000 + .saturating_add((255_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_account_id(r: u32, ) -> Weight { + (12_327_000 as Weight) + // Standard Error: 1_000 + .saturating_add((263_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_fields(r: u32, ) -> Weight { + (11_006_000 as Weight) + // Standard Error: 1_000 + .saturating_add((255_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn provide_judgement(r: u32, x: u32, ) -> Weight { + (49_635_000 as Weight) + // Standard Error: 9_000 + .saturating_add((296_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_000 + .saturating_add((2_075_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn kill_identity(r: u32, s: u32, x: u32, ) -> Weight { + (101_563_000 as Weight) + // Standard Error: 6_000 + .saturating_add((207_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 0 + .saturating_add((3_404_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((8_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + } + fn add_sub(s: u32, ) -> Weight { + (73_298_000 as Weight) + // Standard Error: 0 + .saturating_add((183_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn rename_sub(s: u32, ) -> Weight { + (23_667_000 as Weight) + // Standard Error: 0 + .saturating_add((25_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn remove_sub(s: u32, ) -> Weight { + (69_636_000 as Weight) + // Standard Error: 0 + .saturating_add((160_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn quit_sub(s: u32, ) -> Weight { + (45_890_000 as Weight) + // Standard Error: 0 + .saturating_add((156_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/pallet_im_online.rs b/runtime/kusama/src/weights/pallet_im_online.rs new file mode 100644 index 0000000000000000000000000000000000000000..9281292314b05017b521be320eeb7a05451494c1 --- /dev/null +++ b/runtime/kusama/src/weights/pallet_im_online.rs @@ -0,0 +1,55 @@ +// Copyright 2017-2020 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 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_im_online +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_im_online. +pub struct WeightInfo(PhantomData); +impl pallet_im_online::WeightInfo for WeightInfo { + fn validate_unsigned_and_then_heartbeat(k: u32, e: u32, ) -> Weight { + (112_814_000 as Weight) + // Standard Error: 0 + .saturating_add((215_000 as Weight).saturating_mul(k as Weight)) + // Standard Error: 2_000 + .saturating_add((491_000 as Weight).saturating_mul(e as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/pallet_indices.rs b/runtime/kusama/src/weights/pallet_indices.rs new file mode 100644 index 0000000000000000000000000000000000000000..1f5274946142d1e2abf10be9e011c13d6d24a9e8 --- /dev/null +++ b/runtime/kusama/src/weights/pallet_indices.rs @@ -0,0 +1,71 @@ +// Copyright 2017-2020 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_indices +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_indices +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_indices. +pub struct WeightInfo(PhantomData); +impl pallet_indices::WeightInfo for WeightInfo { + fn claim() -> Weight { + (53_201_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer() -> Weight { + (59_579_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn free() -> Weight { + (47_496_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_transfer() -> Weight { + (49_084_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn freeze() -> Weight { + (44_478_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/pallet_multisig.rs b/runtime/kusama/src/weights/pallet_multisig.rs new file mode 100644 index 0000000000000000000000000000000000000000..0cd3cf1968c25290a7c0041ef2bde5949988d4fb --- /dev/null +++ b/runtime/kusama/src/weights/pallet_multisig.rs @@ -0,0 +1,124 @@ +// Copyright 2017-2020 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_multisig +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_multisig +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_multisig. +pub struct WeightInfo(PhantomData); +impl pallet_multisig::WeightInfo for WeightInfo { + fn as_multi_threshold_1(z: u32, ) -> Weight { + (12_476_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + } + fn as_multi_create(s: u32, z: u32, ) -> Weight { + (69_580_000 as Weight) + // Standard Error: 0 + .saturating_add((89_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_create_store(s: u32, z: u32, ) -> Weight { + (78_436_000 as Weight) + // Standard Error: 0 + .saturating_add((92_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_approve(s: u32, z: u32, ) -> Weight { + (41_554_000 as Weight) + // Standard Error: 0 + .saturating_add((108_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_approve_store(s: u32, z: u32, ) -> Weight { + (74_444_000 as Weight) + // Standard Error: 0 + .saturating_add((124_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_complete(s: u32, z: u32, ) -> Weight { + (85_497_000 as Weight) + // Standard Error: 0 + .saturating_add((245_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((5_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn approve_as_multi_create(s: u32, ) -> Weight { + (69_232_000 as Weight) + // Standard Error: 0 + .saturating_add((86_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_approve(s: u32, ) -> Weight { + (40_932_000 as Weight) + // Standard Error: 0 + .saturating_add((107_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_complete(s: u32, ) -> Weight { + (157_594_000 as Weight) + // Standard Error: 0 + .saturating_add((245_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn cancel_as_multi(s: u32, ) -> Weight { + (109_613_000 as Weight) + // Standard Error: 0 + .saturating_add((89_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/pallet_proxy.rs b/runtime/kusama/src/weights/pallet_proxy.rs index 5d8655e6c3b0fa31d618b6b112e75c44eaf64f23..8943f9ef74375c808e92731cb81f070336b521df 100644 --- a/runtime/kusama/src/weights/pallet_proxy.rs +++ b/runtime/kusama/src/weights/pallet_proxy.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -13,74 +13,111 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +//! Autogenerated weights for pallet_proxy +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_proxy +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; -pub struct WeightInfo; -impl pallet_proxy::WeightInfo for WeightInfo { +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_proxy. +pub struct WeightInfo(PhantomData); +impl pallet_proxy::WeightInfo for WeightInfo { fn proxy(p: u32, ) -> Weight { - (26127000 as Weight) - .saturating_add((214000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) + (30_904_000 as Weight) + // Standard Error: 1_000 + .saturating_add((196_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) } fn proxy_announced(a: u32, p: u32, ) -> Weight { - (55405000 as Weight) - .saturating_add((774000 as Weight).saturating_mul(a as Weight)) - .saturating_add((209000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (65_146_000 as Weight) + // Standard Error: 1_000 + .saturating_add((825_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 1_000 + .saturating_add((185_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn remove_announcement(a: u32, p: u32, ) -> Weight { - (35879000 as Weight) - .saturating_add((783000 as Weight).saturating_mul(a as Weight)) - .saturating_add((20000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (41_395_000 as Weight) + // Standard Error: 1_000 + .saturating_add((818_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 1_000 + .saturating_add((11_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn reject_announcement(a: u32, p: u32, ) -> Weight { - (36097000 as Weight) - .saturating_add((780000 as Weight).saturating_mul(a as Weight)) - .saturating_add((12000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (41_431_000 as Weight) + // Standard Error: 1_000 + .saturating_add((820_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 1_000 + .saturating_add((13_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn announce(a: u32, p: u32, ) -> Weight { - (53769000 as Weight) - .saturating_add((675000 as Weight).saturating_mul(a as Weight)) - .saturating_add((214000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (65_751_000 as Weight) + // Standard Error: 1_000 + .saturating_add((703_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 1_000 + .saturating_add((186_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn add_proxy(p: u32, ) -> Weight { - (36082000 as Weight) - .saturating_add((234000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (44_708_000 as Weight) + // Standard Error: 1_000 + .saturating_add((196_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxy(p: u32, ) -> Weight { - (32885000 as Weight) - .saturating_add((267000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (40_043_000 as Weight) + // Standard Error: 1_000 + .saturating_add((235_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxies(p: u32, ) -> Weight { - (31735000 as Weight) - .saturating_add((215000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (38_286_000 as Weight) + // Standard Error: 1_000 + .saturating_add((189_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn anonymous(p: u32, ) -> Weight { - (50907000 as Weight) - .saturating_add((61000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (63_581_000 as Weight) + // Standard Error: 1_000 + .saturating_add((25_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn kill_anonymous(p: u32, ) -> Weight { - (33926000 as Weight) - .saturating_add((208000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (41_113_000 as Weight) + // Standard Error: 1_000 + .saturating_add((187_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } } diff --git a/runtime/kusama/src/weights/pallet_scheduler.rs b/runtime/kusama/src/weights/pallet_scheduler.rs new file mode 100644 index 0000000000000000000000000000000000000000..f4bdbbfaf70d83bdc1ae65eec8d23b1f8c64407a --- /dev/null +++ b/runtime/kusama/src/weights/pallet_scheduler.rs @@ -0,0 +1,74 @@ +// Copyright 2017-2020 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_scheduler +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_scheduler +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_scheduler. +pub struct WeightInfo(PhantomData); +impl pallet_scheduler::WeightInfo for WeightInfo { + fn schedule(s: u32, ) -> Weight { + (34_006_000 as Weight) + // Standard Error: 0 + .saturating_add((47_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn cancel(s: u32, ) -> Weight { + (30_954_000 as Weight) + // Standard Error: 6_000 + .saturating_add((3_073_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn schedule_named(s: u32, ) -> Weight { + (44_217_000 as Weight) + // Standard Error: 1_000 + .saturating_add((66_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn cancel_named(s: u32, ) -> Weight { + (35_521_000 as Weight) + // Standard Error: 6_000 + .saturating_add((3_084_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/pallet_session.rs b/runtime/kusama/src/weights/pallet_session.rs new file mode 100644 index 0000000000000000000000000000000000000000..1304deb4457e05817462b65ff4964e6723b75fb0 --- /dev/null +++ b/runtime/kusama/src/weights/pallet_session.rs @@ -0,0 +1,56 @@ +// Copyright 2017-2020 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_session +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_session +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_session. +pub struct WeightInfo(PhantomData); +impl pallet_session::WeightInfo for WeightInfo { + fn set_keys() -> Weight { + (91_470_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } + fn purge_keys() -> Weight { + (53_966_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/pallet_staking.rs b/runtime/kusama/src/weights/pallet_staking.rs index 3379cb76749f2a06bcf83ffc223ea462e147c878..7f19219ac50224926f22c270f594531bac3e6cfe 100644 --- a/runtime/kusama/src/weights/pallet_staking.rs +++ b/runtime/kusama/src/weights/pallet_staking.rs @@ -1,168 +1,208 @@ -// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. -// 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. +// 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_staking +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_staking +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ -//! Default weights of pallet-staking. -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc6 #![allow(unused_parens)] #![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl pallet_staking::WeightInfo for WeightInfo { +/// Weight functions for pallet_staking. +pub struct WeightInfo(PhantomData); +impl pallet_staking::WeightInfo for WeightInfo { fn bond() -> Weight { - (144278000 as Weight) - .saturating_add(DbWeight::get().reads(5 as Weight)) - .saturating_add(DbWeight::get().writes(4 as Weight)) + (97_060_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn bond_extra() -> Weight { - (110715000 as Weight) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (76_691_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn unbond() -> Weight { - (99840000 as Weight) - .saturating_add(DbWeight::get().reads(5 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (69_501_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn withdraw_unbonded_update(s: u32, ) -> Weight { - (100728000 as Weight) - .saturating_add((63000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(5 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (69_487_000 as Weight) + // Standard Error: 0 + .saturating_add((28_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn withdraw_unbonded_kill(s: u32, ) -> Weight { - (168879000 as Weight) - .saturating_add((6666000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(7 as Weight)) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + (113_859_000 as Weight) + // Standard Error: 1_000 + .saturating_add((3_977_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } fn validate() -> Weight { - (35539000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (23_991_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn nominate(n: u32, ) -> Weight { - (48596000 as Weight) - .saturating_add((308000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (31_051_000 as Weight) + // Standard Error: 12_000 + .saturating_add((398_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn chill() -> Weight { - (35144000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (23_608_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn set_payee() -> Weight { - (24255000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (16_106_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_controller() -> Weight { - (52294000 as Weight) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (35_097_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn set_validator_count() -> Weight { - (5185000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_247_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_no_eras() -> Weight { - (5907000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_667_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_new_era() -> Weight { - (5917000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_661_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_new_era_always() -> Weight { - (5952000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_619_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_invulnerables(v: u32, ) -> Weight { - (6324000 as Weight) - .saturating_add((9000 as Weight).saturating_mul(v as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_787_000 as Weight) + // Standard Error: 0 + .saturating_add((9_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_unstake(s: u32, ) -> Weight { - (119691000 as Weight) - .saturating_add((6681000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + (77_193_000 as Weight) + // Standard Error: 1_000 + .saturating_add((3_980_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } fn cancel_deferred_slash(s: u32, ) -> Weight { - (5820201000 as Weight) - .saturating_add((34672000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (5_838_529_000 as Weight) + // Standard Error: 388_000 + .saturating_add((34_638_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn payout_stakers_dead_controller(n: u32, ) -> Weight { - (0 as Weight) - .saturating_add((92486000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(n as Weight))) + (134_866_000 as Weight) + // Standard Error: 13_000 + .saturating_add((59_407_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(11 as Weight)) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(n as Weight))) } fn payout_stakers_alive_staked(n: u32, ) -> Weight { - (0 as Weight) - .saturating_add((117324000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads((5 as Weight).saturating_mul(n as Weight))) - .saturating_add(DbWeight::get().writes((3 as Weight).saturating_mul(n as Weight))) + (169_692_000 as Weight) + // Standard Error: 14_000 + .saturating_add((77_518_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(12 as Weight)) + .saturating_add(T::DbWeight::get().reads((5 as Weight).saturating_mul(n as Weight))) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(n as Weight))) } fn rebond(l: u32, ) -> Weight { - (71316000 as Weight) - .saturating_add((142000 as Weight).saturating_mul(l as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (47_084_000 as Weight) + // Standard Error: 2_000 + .saturating_add((103_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn set_history_depth(e: u32, ) -> Weight { (0 as Weight) - .saturating_add((51901000 as Weight).saturating_mul(e as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(4 as Weight)) - .saturating_add(DbWeight::get().writes((7 as Weight).saturating_mul(e as Weight))) + // Standard Error: 63_000 + .saturating_add((38_667_000 as Weight).saturating_mul(e as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + .saturating_add(T::DbWeight::get().writes((7 as Weight).saturating_mul(e as Weight))) } fn reap_stash(s: u32, ) -> Weight { - (147166000 as Weight) - .saturating_add((6661000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + (97_545_000 as Weight) + // Standard Error: 0 + .saturating_add((3_988_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } fn new_era(v: u32, n: u32, ) -> Weight { (0 as Weight) - .saturating_add((1440459000 as Weight).saturating_mul(v as Weight)) - .saturating_add((182580000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads(10 as Weight)) - .saturating_add(DbWeight::get().reads((4 as Weight).saturating_mul(v as Weight))) - .saturating_add(DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((3 as Weight).saturating_mul(v as Weight))) + // Standard Error: 672_000 + .saturating_add((735_440_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 33_000 + .saturating_add((104_408_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().reads((4 as Weight).saturating_mul(v as Weight))) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(v as Weight))) } fn submit_solution_better(v: u32, n: u32, a: u32, w: u32, ) -> Weight { (0 as Weight) - .saturating_add((964000 as Weight).saturating_mul(v as Weight)) - .saturating_add((432000 as Weight).saturating_mul(n as Weight)) - .saturating_add((204294000 as Weight).saturating_mul(a as Weight)) - .saturating_add((9546000 as Weight).saturating_mul(w as Weight)) - .saturating_add(DbWeight::get().reads(6 as Weight)) - .saturating_add(DbWeight::get().reads((4 as Weight).saturating_mul(a as Weight))) - .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(w as Weight))) - .saturating_add(DbWeight::get().writes(2 as Weight)) + // Standard Error: 45_000 + .saturating_add((1_479_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 18_000 + .saturating_add((630_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 45_000 + .saturating_add((99_647_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 94_000 + .saturating_add((8_674_000 as Weight).saturating_mul(w as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().reads((4 as Weight).saturating_mul(a as Weight))) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(w as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } } diff --git a/runtime/kusama/src/weights/pallet_timestamp.rs b/runtime/kusama/src/weights/pallet_timestamp.rs index cfd5f192d35298b512ee75e4d26acf11355ce3ba..e4173ab5f960011d8156f3e5f59bbd9d672bf661 100644 --- a/runtime/kusama/src/weights/pallet_timestamp.rs +++ b/runtime/kusama/src/weights/pallet_timestamp.rs @@ -1,34 +1,54 @@ -// Copyright (C) 2020 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 FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 +// Copyright 2017-2020 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_timestamp +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_timestamp +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + #![allow(unused_parens)] +#![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl pallet_timestamp::WeightInfo for WeightInfo { - // WARNING! Some components were not used: ["t"] +/// Weight functions for pallet_timestamp. +pub struct WeightInfo(PhantomData); +impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { - (9133000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (11_338_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // WARNING! Some components were not used: ["t"] fn on_finalize() -> Weight { - (5915000 as Weight) + (6_080_000 as Weight) } } diff --git a/runtime/kusama/src/weights/pallet_tips.rs b/runtime/kusama/src/weights/pallet_tips.rs new file mode 100644 index 0000000000000000000000000000000000000000..7a30ae060bdc8a18990d6f6d28846329c2d9ce0a --- /dev/null +++ b/runtime/kusama/src/weights/pallet_tips.rs @@ -0,0 +1,90 @@ +// This file is part of Substrate. + +// Copyright (C) 2020 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_tips +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-20, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 128 + +// Executed Command: +// target/release/substrate +// benchmark +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_tips +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./frame/tips/src/weights.rs +// --template=./.maintain/frame-weight-template.hbs + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for pallet_tips using the Substrate node and recommended hardware. +pub struct WeightInfo(PhantomData); +impl pallet_tips::WeightInfo for WeightInfo { + fn report_awesome(r: u32, ) -> Weight { + (73_795_000 as Weight) + // Standard Error: 0 + .saturating_add((2_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn retract_tip() -> Weight { + (61_753_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn tip_new(r: u32, t: u32, ) -> Weight { + (47_731_000 as Weight) + // Standard Error: 0 + .saturating_add((2_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 0 + .saturating_add((154_000 as Weight).saturating_mul(t as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn tip(t: u32, ) -> Weight { + (35_215_000 as Weight) + // Standard Error: 1_000 + .saturating_add((712_000 as Weight).saturating_mul(t as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn close_tip(t: u32, ) -> Weight { + (117_027_000 as Weight) + // Standard Error: 1_000 + .saturating_add((375_000 as Weight).saturating_mul(t as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn slash_tip(t: u32, ) -> Weight { + (37_184_000 as Weight) + // Standard Error: 0 + .saturating_add((11_000 as Weight).saturating_mul(t as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/pallet_treasury.rs b/runtime/kusama/src/weights/pallet_treasury.rs new file mode 100644 index 0000000000000000000000000000000000000000..43ed53f898b069ff7bbd7d8faf8faa96835a3767 --- /dev/null +++ b/runtime/kusama/src/weights/pallet_treasury.rs @@ -0,0 +1,69 @@ +// Copyright 2017-2020 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_treasury +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_treasury +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_treasury. +pub struct WeightInfo(PhantomData); +impl pallet_treasury::WeightInfo for WeightInfo { + fn propose_spend() -> Weight { + (55_957_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn reject_proposal() -> Weight { + (45_616_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn approve_proposal() -> Weight { + (13_362_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn on_initialize_proposals(p: u32, ) -> Weight { + (74_689_000 as Weight) + .saturating_add((71_943_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(p as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(p as Weight))) + } +} diff --git a/runtime/kusama/src/weights/pallet_utility.rs b/runtime/kusama/src/weights/pallet_utility.rs index c9ae0d7d2333b19bec65e4f5c1556df65b21e086..10d6f0ac5aadbb4635bb2292afff69124960dd34 100644 --- a/runtime/kusama/src/weights/pallet_utility.rs +++ b/runtime/kusama/src/weights/pallet_utility.rs @@ -1,35 +1,59 @@ -// This file is part of Substrate. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. -// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// 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. -// 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. +// 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_utility +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_utility +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 #![allow(unused_parens)] #![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl pallet_utility::WeightInfo for WeightInfo { +/// Weight functions for pallet_utility. +pub struct WeightInfo(PhantomData); +impl pallet_utility::WeightInfo for WeightInfo { fn batch(c: u32, ) -> Weight { - (16461000 as Weight) - .saturating_add((1982000 as Weight).saturating_mul(c as Weight)) + (19_612_000 as Weight) + // Standard Error: 0 + .saturating_add((1_988_000 as Weight).saturating_mul(c as Weight)) } - // WARNING! Some components were not used: ["u"] fn as_derivative() -> Weight { - (4086000 as Weight) + (5_849_000 as Weight) + } + fn batch_all(c: u32, ) -> Weight { + (21_934_000 as Weight) + // Standard Error: 0 + .saturating_add((1_503_000 as Weight).saturating_mul(c as Weight)) } } diff --git a/runtime/kusama/src/weights/pallet_vesting.rs b/runtime/kusama/src/weights/pallet_vesting.rs new file mode 100644 index 0000000000000000000000000000000000000000..398b4da6782de6eb243fd0c8102c6ee4b5c39c94 --- /dev/null +++ b/runtime/kusama/src/weights/pallet_vesting.rs @@ -0,0 +1,88 @@ +// Copyright 2017-2020 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_vesting +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_vesting +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_vesting. +pub struct WeightInfo(PhantomData); +impl pallet_vesting::WeightInfo for WeightInfo { + fn vest_locked(l: u32, ) -> Weight { + (54_809_000 as Weight) + // Standard Error: 0 + .saturating_add((133_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn vest_unlocked(l: u32, ) -> Weight { + (59_001_000 as Weight) + // Standard Error: 2_000 + .saturating_add((107_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn vest_other_locked(l: u32, ) -> Weight { + (54_779_000 as Weight) + // Standard Error: 0 + .saturating_add((130_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn vest_other_unlocked(l: u32, ) -> Weight { + (58_762_000 as Weight) + // Standard Error: 2_000 + .saturating_add((109_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn vested_transfer(l: u32, ) -> Weight { + (119_976_000 as Weight) + // Standard Error: 8_000 + .saturating_add((174_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn force_vested_transfer(l: u32, ) -> Weight { + (119_342_000 as Weight) + // Standard Error: 8_000 + .saturating_add((168_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/runtime_common_claims.rs b/runtime/kusama/src/weights/runtime_common_claims.rs new file mode 100644 index 0000000000000000000000000000000000000000..16f1bd7eebcf3f4d03dff4757bca9b71d465065c --- /dev/null +++ b/runtime/kusama/src/weights/runtime_common_claims.rs @@ -0,0 +1,71 @@ +// Copyright 2017-2020 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 runtime_common::claims +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-30, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_common::claims +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/runtime_common_claims.rs + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for runtime_common::claims. +pub struct WeightInfo(PhantomData); +impl runtime_common::claims::WeightInfo for WeightInfo { + fn claim() -> Weight { + (466_963_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(7 as Weight)) + } + fn mint_claim() -> Weight { + (19_167_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn claim_attest() -> Weight { + (471_682_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(7 as Weight)) + } + fn attest() -> Weight { + (156_820_000 as Weight) + .saturating_add(T::DbWeight::get().reads(8 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + } + fn move_claim() -> Weight { + (39_992_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(7 as Weight)) + } +} diff --git a/runtime/parachains/Cargo.toml b/runtime/parachains/Cargo.toml index a2aef4d65cb1cd83bcd1593523cb560319bc7c49..a75413a9bb6a3d4df990c685bfa706786aa76a09 100644 --- a/runtime/parachains/Cargo.toml +++ b/runtime/parachains/Cargo.toml @@ -6,11 +6,11 @@ edition = "2018" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } -log = { version = "0.3.9", optional = true } -rustc-hex = { version = "2.0.1", default-features = false } -serde = { version = "1.0.102", default-features = false } -serde_derive = { version = "1.0.102", optional = true } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +log = "0.4.11" +rustc-hex = { version = "2.1.0", default-features = false } +serde = { version = "1.0.118", features = [ "derive" ], optional = true } +derive_more = "0.99.11" sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -20,7 +20,9 @@ sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master sp-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } +pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -32,14 +34,17 @@ pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "ma pallet-offences = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +xcm = { package = "xcm", path = "../../xcm", default-features = false } +xcm-executor = { package = "xcm-executor", path = "../../xcm/xcm-executor", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } -libsecp256k1 = { version = "0.3.2", default-features = false, optional = true } +libsecp256k1 = { version = "0.3.5", default-features = false, optional = true } -rand = { version = "0.7", default-features = false } -rand_chacha = { version = "0.2.2", default-features = false } +rand = { version = "0.8.1", default-features = false } +rand_chacha = { version = "0.3.0", default-features = false } [dev-dependencies] -hex-literal = "0.2.1" +futures = "0.3.8" +hex-literal = "0.3.1" keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -47,9 +52,10 @@ sp-application-crypto = { git = "https://github.com/paritytech/substrate", branc pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "master" } pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master" } -serde_json = "1.0.41" -libsecp256k1 = "0.3.2" +serde_json = "1.0.61" +libsecp256k1 = "0.3.5" sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master"} [features] @@ -57,15 +63,14 @@ default = ["std"] no_std = [] std = [ "bitvec/std", - "codec/std", - "log", + "parity-scale-codec/std", "rustc-hex/std", - "serde_derive", - "serde/std", + "serde", "primitives/std", "inherents/std", "sp-core/std", "sp-api/std", + "sp-keystore", "sp-std/std", "sp-io/std", "frame-support/std", @@ -79,6 +84,8 @@ std = [ "frame-system/std", "pallet-timestamp/std", "pallet-vesting/std", + "xcm/std", + "xcm-executor/std", ] runtime-benchmarks = [ "libsecp256k1/hmac", diff --git a/runtime/parachains/src/configuration.rs b/runtime/parachains/src/configuration.rs index 9b51404fc06bf69108f30c74dad1f79dce08d124..847a16b11cdd9ac987fb4f8263cfc2385349314d 100644 --- a/runtime/parachains/src/configuration.rs +++ b/runtime/parachains/src/configuration.rs @@ -19,65 +19,244 @@ //! Configuration can change only at session boundaries and is buffered until then. use sp_std::prelude::*; -use primitives::v1::ValidatorId; +use primitives::v1::{Balance, ValidatorId, SessionIndex}; use frame_support::{ decl_storage, decl_module, decl_error, + ensure, dispatch::DispatchResult, weights::{DispatchClass, Weight}, }; -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; use frame_system::ensure_root; +use sp_runtime::traits::Zero; /// All configuration of the runtime with respect to parachains and parathreads. -#[derive(Clone, Encode, Decode, PartialEq, Default)] -#[cfg_attr(test, derive(Debug))] +#[derive(Clone, Encode, Decode, PartialEq, sp_core::RuntimeDebug)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] pub struct HostConfiguration { + // NOTE: This structure is used by parachains via merkle proofs. Therefore, this struct requires + // special treatment. + // + // A parachain requested this struct can only depend on the subset of this struct. Specifically, + // only a first few fields can be depended upon. These fields cannot be changed without + // corresponding migration of the parachains. + + /** + * The parameters that are required for the parachains. + */ + + /// 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, + /// 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 size upper bound of the `CandidateCommitments`. + pub max_upward_message_size: u32, + /// The maximum number of messages that a candidate can contain. + /// + /// This parameter affects the size upper bound of the `CandidateCommitments`. + pub max_upward_message_num_per_candidate: 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 minimum frequency at which parachains can update their validation code. pub validation_upgrade_frequency: BlockNumber, /// The delay, in blocks, before a validation upgrade is applied. pub validation_upgrade_delay: BlockNumber, + + /** + * The parameters that are not essential, but still may be of interest for parachains. + */ + + /// The maximum POV block size, in bytes. + pub max_pov_size: 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 amount of weight we wish to devote to the processing the dispatchable upward messages + /// stage. + /// + /// NOTE that this is a soft limit and could be exceeded. + pub preferred_dispatchable_upward_messages_step_weight: Weight, + /// 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 is allowed to open. + pub hrmp_max_parathread_outbound_channels: u32, + /// Number of sessions after which an HRMP open channel request expires. + pub hrmp_open_request_ttl: u32, + /// The deposit that the sender should provide for opening an HRMP channel. + pub hrmp_sender_deposit: Balance, + /// The deposit that the recipient should provide for accepting opening an HRMP channel. + pub hrmp_recipient_deposit: Balance, + /// 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 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, + + /** + * Parameters that will unlikely be needed by parachains. + */ + /// The acceptance period, in blocks. This is the amount of blocks after availability that validators /// and fishermen have to perform secondary checks or issue reports. pub acceptance_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 execution cores to dedicate to parathread execution. pub parathread_cores: u32, /// The number of retries that a parathread author has to submit their block. pub parathread_retries: u32, - /// How often parachain groups should be rotated across parachains. Must be non-zero. + /// How often parachain groups should be rotated across parachains. + /// + /// Must be non-zero. 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. + /// the chain. + /// + /// Must be at least 1. pub chain_availability_period: BlockNumber, /// The availability period, in blocks, for parathreads. Same as the `chain_availability_period`, - /// but a differing timeout due to differing requirements. Must be at least 1. + /// 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 parachains and parathreads. pub scheduling_lookahead: u32, + /// The maximum number of validators to have per core. + /// + /// `None` means no maximum. + pub max_validators_per_core: Option, + /// The amount of sessions to keep for disputes. + pub dispute_period: SessionIndex, + /// 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 do of the RelayVRFModulo approval assignment criterion. + pub relay_vrf_modulo_samples: u32, } -pub trait Trait: frame_system::Trait { } +impl> Default for HostConfiguration { + fn default() -> Self { + Self { + group_rotation_frequency: 1u32.into(), + chain_availability_period: 1u32.into(), + thread_availability_period: 1u32.into(), + no_show_slots: 1u32.into(), + validation_upgrade_frequency: Default::default(), + validation_upgrade_delay: Default::default(), + acceptance_period: Default::default(), + max_code_size: Default::default(), + max_pov_size: Default::default(), + max_head_data_size: Default::default(), + parathread_cores: Default::default(), + parathread_retries: Default::default(), + scheduling_lookahead: Default::default(), + max_validators_per_core: Default::default(), + dispute_period: Default::default(), + 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(), + preferred_dispatchable_upward_messages_step_weight: Default::default(), + max_upward_message_size: Default::default(), + max_upward_message_num_per_candidate: Default::default(), + hrmp_open_request_ttl: 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_max_parathread_inbound_channels: Default::default(), + hrmp_channel_max_message_size: Default::default(), + hrmp_max_parachain_outbound_channels: Default::default(), + hrmp_max_parathread_outbound_channels: Default::default(), + hrmp_max_message_num_per_candidate: Default::default(), + } + } +} + +impl HostConfiguration { + /// Checks that this instance is consistent with the requirements on each individual member. + /// + /// # Panic + /// + /// This function panics if any member is not set properly. + fn check_consistency(&self) { + if self.group_rotation_frequency.is_zero() { + panic!("`group_rotation_frequency` must be non-zero!") + } + + if self.chain_availability_period.is_zero() { + panic!("`chain_availability_period` must be at least 1!") + } + + if self.thread_availability_period.is_zero() { + panic!("`thread_availability_period` must be at least 1!") + } + + if self.no_show_slots.is_zero() { + panic!("`no_show_slots` must be at least 1!") + } + } +} + +pub trait Config: frame_system::Config { } decl_storage! { - trait Store for Module as Configuration { + trait Store for Module as Configuration { /// The active configuration for the current session. - Config get(fn config) config(): HostConfiguration; + ActiveConfig get(fn config) config(): HostConfiguration; /// Pending configuration (if any) for the next session. PendingConfig: Option>; } + add_extra_genesis { + build(|config: &Self| { + config.config.check_consistency(); + }) + } } decl_error! { - pub enum Error for Module { } + pub enum Error for Module { + /// The new value for a configuration parameter is invalid. + InvalidNewValue, + } } decl_module! { /// The parachains configuration module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; /// Set the validation upgrade frequency. @@ -120,6 +299,16 @@ decl_module! { Ok(()) } + /// Set the max POV block size for incoming upgrades. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_max_pov_size(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.max_pov_size, new) != new + }); + Ok(()) + } + /// Set the max head data size for paras. #[weight = (1_000, DispatchClass::Operational)] pub fn set_max_head_data_size(origin, new: u32) -> DispatchResult { @@ -155,6 +344,9 @@ decl_module! { #[weight = (1_000, DispatchClass::Operational)] pub fn set_group_rotation_frequency(origin, new: T::BlockNumber) -> DispatchResult { ensure_root(origin)?; + + ensure!(!new.is_zero(), Error::::InvalidNewValue); + Self::update_config_member(|config| { sp_std::mem::replace(&mut config.group_rotation_frequency, new) != new }); @@ -165,6 +357,9 @@ decl_module! { #[weight = (1_000, DispatchClass::Operational)] pub fn set_chain_availability_period(origin, new: T::BlockNumber) -> DispatchResult { ensure_root(origin)?; + + ensure!(!new.is_zero(), Error::::InvalidNewValue); + Self::update_config_member(|config| { sp_std::mem::replace(&mut config.chain_availability_period, new) != new }); @@ -175,6 +370,9 @@ decl_module! { #[weight = (1_000, DispatchClass::Operational)] pub fn set_thread_availability_period(origin, new: T::BlockNumber) -> DispatchResult { ensure_root(origin)?; + + ensure!(!new.is_zero(), Error::::InvalidNewValue); + Self::update_config_member(|config| { sp_std::mem::replace(&mut config.thread_availability_period, new) != new }); @@ -190,10 +388,255 @@ decl_module! { }); Ok(()) } + + /// Set the maximum number of validators to assign to any core. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_max_validators_per_core(origin, new: Option) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.max_validators_per_core, new) != new + }); + Ok(()) + } + + /// Set the dispute period, in number of sessions to keep for disputes. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_dispute_period(origin, new: SessionIndex) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.dispute_period, new) != new + }); + Ok(()) + } + + /// Set the no show slots, in number of number of consensus slots. + /// Must be at least 1. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_no_show_slots(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + + ensure!(!new.is_zero(), Error::::InvalidNewValue); + + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.no_show_slots, new) != new + }); + Ok(()) + } + + /// Set the total number of delay tranches. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_n_delay_tranches(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.n_delay_tranches, new) != new + }); + Ok(()) + } + + /// Set the zeroth delay tranche width. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_zeroth_delay_tranche_width(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.zeroth_delay_tranche_width, new) != new + }); + Ok(()) + } + + /// Set the number of validators needed to approve a block. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_needed_approvals(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.needed_approvals, new) != new + }); + Ok(()) + } + + /// Set the number of samples to do of the RelayVRFModulo approval assignment criterion. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_relay_vrf_modulo_samples(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.relay_vrf_modulo_samples, new) != new + }); + Ok(()) + } + + /// Sets the maximum items that can present in a upward dispatch queue at once. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_max_upward_queue_count(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.max_upward_queue_count, new) != new + }); + Ok(()) + } + + /// Sets the maximum total size of items that can present in a upward dispatch queue at once. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_max_upward_queue_size(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.max_upward_queue_size, new) != new + }); + Ok(()) + } + + /// Set the critical downward message size. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_max_downward_message_size(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.max_downward_message_size, new) != new + }); + Ok(()) + } + + /// Sets the soft limit for the phase of dispatching dispatchable upward messages. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_preferred_dispatchable_upward_messages_step_weight(origin, new: Weight) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.preferred_dispatchable_upward_messages_step_weight, new) != new + }); + Ok(()) + } + + /// Sets the maximum size of an upward message that can be sent by a candidate. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_max_upward_message_size(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.max_upward_message_size, new) != new + }); + Ok(()) + } + + /// Sets the maximum number of messages that a candidate can contain. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_max_upward_message_num_per_candidate(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.max_upward_message_num_per_candidate, new) != new + }); + Ok(()) + } + + /// Sets the number of sessions after which an HRMP open channel request expires. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_hrmp_open_request_ttl(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.hrmp_open_request_ttl, new) != new + }); + Ok(()) + } + + /// Sets the amount of funds that the sender should provide for opening an HRMP channel. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_hrmp_sender_deposit(origin, new: Balance) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.hrmp_sender_deposit, new) != new + }); + Ok(()) + } + + /// Sets the amount of funds that the recipient should provide for accepting opening an HRMP + /// channel. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_hrmp_recipient_deposit(origin, new: Balance) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.hrmp_recipient_deposit, new) != new + }); + Ok(()) + } + + /// Sets the maximum number of messages allowed in an HRMP channel at once. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_hrmp_channel_max_capacity(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.hrmp_channel_max_capacity, new) != new + }); + Ok(()) + } + + /// Sets the maximum total size of messages in bytes allowed in an HRMP channel at once. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_hrmp_channel_max_total_size(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.hrmp_channel_max_total_size, new) != new + }); + Ok(()) + } + + /// Sets the maximum number of inbound HRMP channels a parachain is allowed to accept. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_hrmp_max_parachain_inbound_channels(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.hrmp_max_parachain_inbound_channels, new) != new + }); + Ok(()) + } + + /// Sets the maximum number of inbound HRMP channels a parathread is allowed to accept. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_hrmp_max_parathread_inbound_channels(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.hrmp_max_parathread_inbound_channels, new) != new + }); + Ok(()) + } + + /// Sets the maximum size of a message that could ever be put into an HRMP channel. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_hrmp_channel_max_message_size(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.hrmp_channel_max_message_size, new) != new + }); + Ok(()) + } + + /// Sets the maximum number of outbound HRMP channels a parachain is allowed to open. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_hrmp_max_parachain_outbound_channels(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.hrmp_max_parachain_outbound_channels, new) != new + }); + Ok(()) + } + + /// Sets the maximum number of outbound HRMP channels a parathread is allowed to open. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_hrmp_max_parathread_outbound_channels(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.hrmp_max_parathread_outbound_channels, new) != new + }); + Ok(()) + } + + /// Sets the maximum number of outbound HRMP messages can be sent by a candidate. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_hrmp_max_message_num_per_candidate(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.hrmp_max_message_num_per_candidate, new) != new + }); + Ok(()) + } } } -impl Module { +impl Module { /// Called by the initializer to initialize the configuration module. pub(crate) fn initializer_initialize(_now: T::BlockNumber) -> Weight { 0 @@ -205,7 +648,7 @@ impl Module { /// Called by the initializer to note that a new session has started. pub(crate) fn initializer_on_new_session(_validators: &[ValidatorId], _queued: &[ValidatorId]) { if let Some(pending) = ::PendingConfig::take() { - ::Config::set(pending); + ::ActiveConfig::set(pending); } } @@ -261,6 +704,7 @@ mod tests { validation_upgrade_delay: 10, acceptance_period: 5, max_code_size: 100_000, + max_pov_size: 1024, max_head_data_size: 1_000, parathread_cores: 2, parathread_retries: 5, @@ -268,6 +712,30 @@ mod tests { chain_availability_period: 10, thread_availability_period: 8, scheduling_lookahead: 3, + max_validators_per_core: None, + dispute_period: 239, + no_show_slots: 240, + n_delay_tranches: 241, + zeroth_delay_tranche_width: 242, + needed_approvals: 242, + relay_vrf_modulo_samples: 243, + max_upward_queue_count: 1337, + max_upward_queue_size: 228, + max_downward_message_size: 2048, + preferred_dispatchable_upward_messages_step_weight: 20000, + max_upward_message_size: 448, + max_upward_message_num_per_candidate: 5, + hrmp_open_request_ttl: 1312, + hrmp_sender_deposit: 22, + hrmp_recipient_deposit: 4905, + hrmp_channel_max_capacity: 3921, + hrmp_channel_max_total_size: 7687, + hrmp_max_parachain_inbound_channels: 3722, + hrmp_max_parathread_inbound_channels: 1967, + hrmp_channel_max_message_size: 8192, + hrmp_max_parachain_outbound_channels: 100, + hrmp_max_parathread_outbound_channels: 200, + hrmp_max_message_num_per_candidate: 20, }; assert!(::PendingConfig::get().is_none()); @@ -284,6 +752,9 @@ mod tests { Configuration::set_max_code_size( Origin::root(), new_config.max_code_size, ).unwrap(); + Configuration::set_max_pov_size( + Origin::root(), new_config.max_pov_size, + ).unwrap(); Configuration::set_max_head_data_size( Origin::root(), new_config.max_head_data_size, ).unwrap(); @@ -305,6 +776,89 @@ mod tests { Configuration::set_scheduling_lookahead( Origin::root(), new_config.scheduling_lookahead, ).unwrap(); + Configuration::set_max_validators_per_core( + Origin::root(), new_config.max_validators_per_core, + ).unwrap(); + Configuration::set_dispute_period( + Origin::root(), new_config.dispute_period, + ).unwrap(); + Configuration::set_no_show_slots( + Origin::root(), new_config.no_show_slots, + ).unwrap(); + Configuration::set_n_delay_tranches( + Origin::root(), new_config.n_delay_tranches, + ).unwrap(); + Configuration::set_zeroth_delay_tranche_width( + Origin::root(), new_config.zeroth_delay_tranche_width, + ).unwrap(); + Configuration::set_needed_approvals( + Origin::root(), new_config.needed_approvals, + ).unwrap(); + Configuration::set_relay_vrf_modulo_samples( + Origin::root(), new_config.relay_vrf_modulo_samples, + ).unwrap(); + Configuration::set_max_upward_queue_count( + Origin::root(), new_config.max_upward_queue_count, + ).unwrap(); + Configuration::set_max_upward_queue_size( + Origin::root(), new_config.max_upward_queue_size, + ).unwrap(); + Configuration::set_max_downward_message_size( + Origin::root(), new_config.max_downward_message_size, + ).unwrap(); + Configuration::set_preferred_dispatchable_upward_messages_step_weight( + Origin::root(), new_config.preferred_dispatchable_upward_messages_step_weight, + ).unwrap(); + Configuration::set_max_upward_message_size( + Origin::root(), new_config.max_upward_message_size, + ).unwrap(); + Configuration::set_max_upward_message_num_per_candidate( + Origin::root(), new_config.max_upward_message_num_per_candidate, + ).unwrap(); + Configuration::set_hrmp_open_request_ttl( + Origin::root(), + new_config.hrmp_open_request_ttl, + ).unwrap(); + Configuration::set_hrmp_sender_deposit( + Origin::root(), + new_config.hrmp_sender_deposit, + ).unwrap(); + Configuration::set_hrmp_recipient_deposit( + Origin::root(), + new_config.hrmp_recipient_deposit, + ).unwrap(); + Configuration::set_hrmp_channel_max_capacity( + Origin::root(), + new_config.hrmp_channel_max_capacity, + ).unwrap(); + Configuration::set_hrmp_channel_max_total_size( + Origin::root(), + new_config.hrmp_channel_max_total_size, + ).unwrap(); + Configuration::set_hrmp_max_parachain_inbound_channels( + Origin::root(), + new_config.hrmp_max_parachain_inbound_channels, + ).unwrap(); + Configuration::set_hrmp_max_parathread_inbound_channels( + Origin::root(), + new_config.hrmp_max_parathread_inbound_channels, + ).unwrap(); + Configuration::set_hrmp_channel_max_message_size( + Origin::root(), + new_config.hrmp_channel_max_message_size, + ).unwrap(); + Configuration::set_hrmp_max_parachain_outbound_channels( + Origin::root(), + new_config.hrmp_max_parachain_outbound_channels, + ).unwrap(); + Configuration::set_hrmp_max_parathread_outbound_channels( + Origin::root(), + new_config.hrmp_max_parathread_outbound_channels, + ).unwrap(); + Configuration::set_hrmp_max_message_num_per_candidate( + Origin::root(), + new_config.hrmp_max_message_num_per_candidate, + ).unwrap(); assert_eq!(::PendingConfig::get(), Some(new_config)); }) @@ -324,4 +878,42 @@ mod tests { assert!(::PendingConfig::get().is_none()) }); } + + #[test] + fn verify_externally_accessible() { + // This test verifies that the value can be accessed through the well known keys and the + // host configuration decodes into the abridged version. + + use primitives::v1::{well_known_keys, AbridgedHostConfiguration}; + + new_test_ext(Default::default()).execute_with(|| { + let ground_truth = HostConfiguration::default(); + + // Make sure that the configuration is stored in the storage. + ::ActiveConfig::put(ground_truth.clone()); + + // Extract the active config via the well known key. + let raw_active_config = sp_io::storage::get(well_known_keys::ACTIVE_CONFIG) + .expect("config must be present in storage under ACTIVE_CONFIG"); + let abridged_config = AbridgedHostConfiguration::decode(&mut &raw_active_config[..]) + .expect("HostConfiguration must be decodable into AbridgedHostConfiguration"); + + assert_eq!( + abridged_config, + AbridgedHostConfiguration { + max_code_size: ground_truth.max_code_size, + max_head_data_size: ground_truth.max_head_data_size, + max_upward_queue_count: ground_truth.max_upward_queue_count, + max_upward_queue_size: ground_truth.max_upward_queue_size, + max_upward_message_size: ground_truth.max_upward_message_size, + max_upward_message_num_per_candidate: ground_truth + .max_upward_message_num_per_candidate, + hrmp_max_message_num_per_candidate: ground_truth + .hrmp_max_message_num_per_candidate, + validation_upgrade_frequency: ground_truth.validation_upgrade_frequency, + validation_upgrade_delay: ground_truth.validation_upgrade_delay, + }, + ); + }); + } } diff --git a/runtime/parachains/src/dmp.rs b/runtime/parachains/src/dmp.rs new file mode 100644 index 0000000000000000000000000000000000000000..49fb2f8a5732303a6973b2dbfd8b273a0bde08b7 --- /dev/null +++ b/runtime/parachains/src/dmp.rs @@ -0,0 +1,389 @@ +// Copyright 2020 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::{self, HostConfiguration}, + initializer, +}; +use frame_support::{decl_module, decl_storage, StorageMap, weights::Weight, traits::Get}; +use sp_std::{fmt, prelude::*}; +use sp_runtime::traits::{BlakeTwo256, Hash as HashT, SaturatedConversion}; +use primitives::v1::{Id as ParaId, DownwardMessage, InboundDownwardMessage, Hash}; + +/// An error sending a downward message. +#[cfg_attr(test, derive(Debug))] +pub enum QueueDownwardMessageError { + /// The message being sent exceeds the configured max message size. + ExceedsMaxMessageSize, +} + +/// An error returned by [`check_processed_downward_messages`] that indicates an acceptance check +/// didn't pass. +pub enum ProcessedDownwardMessagesAcceptanceErr { + /// If there are pending messages then `processed_downward_messages` should be at least 1, + AdvancementRule, + /// `processed_downward_messages` should not be greater than the number of pending messages. + Underflow { + processed_downward_messages: u32, + dmq_length: u32, + }, +} + +impl fmt::Debug for ProcessedDownwardMessagesAcceptanceErr { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + use ProcessedDownwardMessagesAcceptanceErr::*; + match *self { + AdvancementRule => write!( + fmt, + "DMQ is not empty, but processed_downward_messages is 0", + ), + Underflow { + processed_downward_messages, + dmq_length, + } => write!( + fmt, + "processed_downward_messages = {}, but dmq_length is only {}", + processed_downward_messages, dmq_length, + ), + } + } +} + +pub trait Config: frame_system::Config + configuration::Config {} + +decl_storage! { + trait Store for Module as Dmp { + /// Paras that are to be cleaned up at the end of the session. + /// The entries are sorted ascending by the para id. + OutgoingParas: Vec; + + /// The downward messages addressed for a certain para. + DownwardMessageQueues: map hasher(twox_64_concat) ParaId => Vec>; + /// A mapping that stores the downward message queue MQC head for each para. + /// + /// Each link in this chain has a form: + /// `(prev_head, B, H(M))`, where + /// - `prev_head`: is the previous head hash or zero if none. + /// - `B`: is the relay-chain block number in which a message was appended. + /// - `H(M)`: is the hash of the message being appended. + DownwardMessageQueueHeads: map hasher(twox_64_concat) ParaId => Hash; + } +} + +decl_module! { + /// The DMP module. + pub struct Module for enum Call where origin: ::Origin { } +} + +/// Routines and getters related to downward message passing. +impl Module { + /// Block initialization logic, called by initializer. + pub(crate) fn initializer_initialize(_now: T::BlockNumber) -> Weight { + 0 + } + + /// Block finalization logic, called by initializer. + pub(crate) fn initializer_finalize() {} + + /// Called by the initializer to note that a new session has started. + pub(crate) fn initializer_on_new_session( + _notification: &initializer::SessionChangeNotification, + ) { + Self::perform_outgoing_para_cleanup(); + } + + /// Iterate over all paras that were registered for offboarding and remove all the data + /// associated with them. + fn perform_outgoing_para_cleanup() { + let outgoing = OutgoingParas::take(); + for outgoing_para in outgoing { + Self::clean_dmp_after_outgoing(outgoing_para); + } + } + + fn clean_dmp_after_outgoing(outgoing_para: ParaId) { + ::DownwardMessageQueues::remove(&outgoing_para); + ::DownwardMessageQueueHeads::remove(&outgoing_para); + } + + /// Schedule a para to be cleaned up at the start of the next session. + pub(crate) fn schedule_para_cleanup(id: ParaId) { + OutgoingParas::mutate(|v| { + if let Err(i) = v.binary_search(&id) { + v.insert(i, id); + } + }); + } + + /// Enqueue a downward message to a specific recipient para. + /// + /// When encoded, the message should not exceed the `config.max_downward_message_size`. + /// Otherwise, the message won't be sent and `Err` will be returned. + /// + /// It is possible to send a downward message to a non-existent para. That, however, would lead + /// to a dangling storage. If the caller cannot statically prove that the recipient exists + /// then the caller should perform a runtime check. + pub fn queue_downward_message( + config: &HostConfiguration, + para: ParaId, + msg: DownwardMessage, + ) -> Result<(), QueueDownwardMessageError> { + let serialized_len = msg.len() as u32; + if serialized_len > config.max_downward_message_size { + return Err(QueueDownwardMessageError::ExceedsMaxMessageSize); + } + + let inbound = InboundDownwardMessage { + msg, + sent_at: >::block_number(), + }; + + // obtain the new link in the MQC and update the head. + ::DownwardMessageQueueHeads::mutate(para, |head| { + let new_head = + BlakeTwo256::hash_of(&(*head, inbound.sent_at, T::Hashing::hash_of(&inbound.msg))); + *head = new_head; + }); + + ::DownwardMessageQueues::mutate(para, |v| { + v.push(inbound); + }); + + Ok(()) + } + + /// Checks if the number of processed downward messages is valid. + pub(crate) fn check_processed_downward_messages( + para: ParaId, + processed_downward_messages: u32, + ) -> Result<(), ProcessedDownwardMessagesAcceptanceErr> { + let dmq_length = Self::dmq_length(para); + + if dmq_length > 0 && processed_downward_messages == 0 { + return Err(ProcessedDownwardMessagesAcceptanceErr::AdvancementRule); + } + if dmq_length < processed_downward_messages { + return Err(ProcessedDownwardMessagesAcceptanceErr::Underflow { + processed_downward_messages, + dmq_length, + }); + } + + Ok(()) + } + + /// Prunes the specified number of messages from the downward message queue of the given para. + pub(crate) fn prune_dmq(para: ParaId, processed_downward_messages: u32) -> Weight { + ::DownwardMessageQueues::mutate(para, |q| { + let processed_downward_messages = processed_downward_messages as usize; + if processed_downward_messages > q.len() { + // reaching this branch is unexpected due to the constraint established by + // `check_processed_downward_messages`. But better be safe than sorry. + q.clear(); + } else { + *q = q.split_off(processed_downward_messages); + } + }); + T::DbWeight::get().reads_writes(1, 1) + } + + /// Returns the Head of Message Queue Chain for the given para or `None` if there is none + /// associated with it. + pub(crate) fn dmq_mqc_head(para: ParaId) -> Hash { + ::DownwardMessageQueueHeads::get(¶) + } + + /// Returns the number of pending downward messages addressed to the given para. + /// + /// Returns 0 if the para doesn't have an associated downward message queue. + pub(crate) fn dmq_length(para: ParaId) -> u32 { + ::DownwardMessageQueues::decode_len(¶) + .unwrap_or(0) + .saturated_into::() + } + + /// Returns the downward message queue contents for the given para. + /// + /// The most recent messages are the latest in the vector. + pub(crate) fn dmq_contents(recipient: ParaId) -> Vec> { + ::DownwardMessageQueues::get(&recipient) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use primitives::v1::BlockNumber; + use frame_support::StorageValue; + use frame_support::traits::{OnFinalize, OnInitialize}; + use parity_scale_codec::Encode; + use crate::mock::{Configuration, new_test_ext, System, Dmp, GenesisConfig as MockGenesisConfig}; + + pub(crate) fn run_to_block(to: BlockNumber, new_session: Option>) { + while System::block_number() < to { + let b = System::block_number(); + Dmp::initializer_finalize(); + System::on_finalize(b); + + System::on_initialize(b + 1); + System::set_block_number(b + 1); + + if new_session.as_ref().map_or(false, |v| v.contains(&(b + 1))) { + Dmp::initializer_on_new_session(&Default::default()); + } + Dmp::initializer_initialize(b + 1); + } + } + + fn default_genesis_config() -> MockGenesisConfig { + MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: crate::configuration::HostConfiguration { + max_downward_message_size: 1024, + ..Default::default() + }, + }, + ..Default::default() + } + } + + fn queue_downward_message( + para_id: ParaId, + msg: DownwardMessage, + ) -> Result<(), QueueDownwardMessageError> { + Dmp::queue_downward_message(&Configuration::config(), para_id, msg) + } + + #[test] + fn scheduled_cleanup_performed() { + let a = ParaId::from(1312); + let b = ParaId::from(228); + let c = ParaId::from(123); + + new_test_ext(default_genesis_config()).execute_with(|| { + run_to_block(1, None); + + // enqueue downward messages to A, B and C. + queue_downward_message(a, vec![1, 2, 3]).unwrap(); + queue_downward_message(b, vec![4, 5, 6]).unwrap(); + queue_downward_message(c, vec![7, 8, 9]).unwrap(); + + Dmp::schedule_para_cleanup(a); + + // run to block without session change. + run_to_block(2, None); + + assert!(!::DownwardMessageQueues::get(&a).is_empty()); + assert!(!::DownwardMessageQueues::get(&b).is_empty()); + assert!(!::DownwardMessageQueues::get(&c).is_empty()); + + Dmp::schedule_para_cleanup(b); + + // run to block changing the session. + run_to_block(3, Some(vec![3])); + + assert!(::DownwardMessageQueues::get(&a).is_empty()); + assert!(::DownwardMessageQueues::get(&b).is_empty()); + assert!(!::DownwardMessageQueues::get(&c).is_empty()); + + // verify that the outgoing paras are emptied. + assert!(OutgoingParas::get().is_empty()) + }); + } + + #[test] + fn dmq_length_and_head_updated_properly() { + let a = ParaId::from(1312); + let b = ParaId::from(228); + + new_test_ext(default_genesis_config()).execute_with(|| { + assert_eq!(Dmp::dmq_length(a), 0); + assert_eq!(Dmp::dmq_length(b), 0); + + queue_downward_message(a, vec![1, 2, 3]).unwrap(); + + assert_eq!(Dmp::dmq_length(a), 1); + assert_eq!(Dmp::dmq_length(b), 0); + assert!(!Dmp::dmq_mqc_head(a).is_zero()); + assert!(Dmp::dmq_mqc_head(b).is_zero()); + }); + } + + #[test] + fn check_processed_downward_messages() { + let a = ParaId::from(1312); + + new_test_ext(default_genesis_config()).execute_with(|| { + // processed_downward_messages=0 is allowed when the DMQ is empty. + assert!(Dmp::check_processed_downward_messages(a, 0).is_ok()); + + queue_downward_message(a, vec![1, 2, 3]).unwrap(); + queue_downward_message(a, vec![4, 5, 6]).unwrap(); + queue_downward_message(a, vec![7, 8, 9]).unwrap(); + + // 0 doesn't pass if the DMQ has msgs. + assert!(!Dmp::check_processed_downward_messages(a, 0).is_ok()); + // a candidate can consume up to 3 messages + assert!(Dmp::check_processed_downward_messages(a, 1).is_ok()); + assert!(Dmp::check_processed_downward_messages(a, 2).is_ok()); + assert!(Dmp::check_processed_downward_messages(a, 3).is_ok()); + // there is no 4 messages in the queue + assert!(!Dmp::check_processed_downward_messages(a, 4).is_ok()); + }); + } + + #[test] + fn dmq_pruning() { + let a = ParaId::from(1312); + + new_test_ext(default_genesis_config()).execute_with(|| { + assert_eq!(Dmp::dmq_length(a), 0); + + queue_downward_message(a, vec![1, 2, 3]).unwrap(); + queue_downward_message(a, vec![4, 5, 6]).unwrap(); + queue_downward_message(a, vec![7, 8, 9]).unwrap(); + assert_eq!(Dmp::dmq_length(a), 3); + + // pruning 0 elements shouldn't change anything. + Dmp::prune_dmq(a, 0); + assert_eq!(Dmp::dmq_length(a), 3); + + Dmp::prune_dmq(a, 2); + assert_eq!(Dmp::dmq_length(a), 1); + }); + } + + #[test] + fn queue_downward_message_critical() { + let a = ParaId::from(1312); + + let mut genesis = default_genesis_config(); + genesis.configuration.config.max_downward_message_size = 7; + + new_test_ext(genesis).execute_with(|| { + let smol = [0; 3].to_vec(); + let big = [0; 8].to_vec(); + + // still within limits + assert_eq!(smol.encode().len(), 4); + assert!(queue_downward_message(a, smol).is_ok()); + + // that's too big + assert_eq!(big.encode().len(), 9); + assert!(queue_downward_message(a, big).is_err()); + }); + } +} diff --git a/runtime/parachains/src/hrmp.rs b/runtime/parachains/src/hrmp.rs new file mode 100644 index 0000000000000000000000000000000000000000..eb0e9aa603ba179e6b84ae27b18814ccc18c115c --- /dev/null +++ b/runtime/parachains/src/hrmp.rs @@ -0,0 +1,1625 @@ +// Copyright 2020 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::{ + ensure_parachain, + configuration::{self, HostConfiguration}, + initializer, paras, dmp, +}; +use parity_scale_codec::{Decode, Encode}; +use frame_support::{ + decl_storage, decl_module, decl_error, ensure, traits::Get, weights::Weight, StorageMap, + StorageValue, dispatch::DispatchResult, +}; +use primitives::v1::{ + Balance, Hash, HrmpChannelId, Id as ParaId, InboundHrmpMessage, OutboundHrmpMessage, + SessionIndex, +}; +use sp_runtime::traits::{BlakeTwo256, Hash as HashT}; +use sp_std::{ + mem, fmt, + collections::{btree_map::BTreeMap, btree_set::BTreeSet}, + prelude::*, +}; + +/// A description of a request to open an HRMP channel. +#[derive(Encode, Decode)] +pub struct HrmpOpenChannelRequest { + /// Indicates if this request was confirmed by the recipient. + pub confirmed: bool, + /// How many session boundaries ago this request was seen. + pub age: SessionIndex, + /// The amount that the sender supplied at the time of creation of this request. + pub sender_deposit: Balance, + /// The maximum message size that could be put into the channel. + pub max_message_size: u32, + /// The maximum number of messages that can be pending in the channel at once. + pub max_capacity: u32, + /// The maximum total size of the messages that can be pending in the channel at once. + pub max_total_size: u32, +} + +/// A metadata of an HRMP channel. +#[derive(Encode, Decode)] +#[cfg_attr(test, derive(Debug))] +pub struct HrmpChannel { + // NOTE: This structure is used by parachains via merkle proofs. Therefore, this struct requires + // special treatment. + // + // A parachain requested this struct can only depend on the subset of this struct. Specifically, + // only a first few fields can be depended upon (See `AbridgedHrmpChannel`). These fields cannot + // be changed without corresponding migration of parachains. + + /// The maximum number of messages that can be pending in the channel at once. + pub max_capacity: u32, + /// The maximum total size of the messages that can be pending in the channel at once. + pub max_total_size: u32, + /// The maximum message size that could be put into the channel. + pub max_message_size: u32, + /// The current number of messages pending in the channel. + /// Invariant: should be less or equal to `max_capacity`.s`. + pub msg_count: u32, + /// The total size in bytes of all message payloads in the channel. + /// Invariant: should be less or equal to `max_total_size`. + pub total_size: u32, + /// A head of the Message Queue Chain for this channel. Each link in this chain has a form: + /// `(prev_head, B, H(M))`, where + /// - `prev_head`: is the previous value of `mqc_head` or zero if none. + /// - `B`: is the [relay-chain] block number in which a message was appended + /// - `H(M)`: is the hash of the message being appended. + /// This value is initialized to a special value that consists of all zeroes which indicates + /// that no messages were previously added. + pub mqc_head: Option, + /// The amount that the sender supplied as a deposit when opening this channel. + pub sender_deposit: Balance, + /// The amount that the recipient supplied as a deposit when accepting opening this channel. + pub recipient_deposit: Balance, +} + +/// An error returned by [`check_hrmp_watermark`] that indicates an acceptance criteria check +/// didn't pass. +pub enum HrmpWatermarkAcceptanceErr { + AdvancementRule { + new_watermark: BlockNumber, + last_watermark: BlockNumber, + }, + AheadRelayParent { + new_watermark: BlockNumber, + relay_chain_parent_number: BlockNumber, + }, + LandsOnBlockWithNoMessages { + new_watermark: BlockNumber, + }, +} + +/// An error returned by [`check_outbound_hrmp`] that indicates an acceptance criteria check +/// didn't pass. +pub enum OutboundHrmpAcceptanceErr { + MoreMessagesThanPermitted { + sent: u32, + permitted: u32, + }, + NotSorted { + idx: u32, + }, + NoSuchChannel { + idx: u32, + channel_id: HrmpChannelId, + }, + MaxMessageSizeExceeded { + idx: u32, + msg_size: u32, + max_size: u32, + }, + TotalSizeExceeded { + idx: u32, + total_size: u32, + limit: u32, + }, + CapacityExceeded { + idx: u32, + count: u32, + limit: u32, + }, +} + +impl fmt::Debug for HrmpWatermarkAcceptanceErr +where + BlockNumber: fmt::Debug, +{ + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + use HrmpWatermarkAcceptanceErr::*; + match self { + AdvancementRule { + new_watermark, + last_watermark, + } => write!( + fmt, + "the HRMP watermark is not advanced relative to the last watermark ({:?} > {:?})", + new_watermark, last_watermark, + ), + AheadRelayParent { + new_watermark, + relay_chain_parent_number, + } => write!( + fmt, + "the HRMP watermark is ahead the relay-parent ({:?} > {:?})", + new_watermark, relay_chain_parent_number + ), + LandsOnBlockWithNoMessages { new_watermark } => write!( + fmt, + "the HRMP watermark ({:?}) doesn't land on a block with messages received", + new_watermark + ), + } + } +} + +impl fmt::Debug for OutboundHrmpAcceptanceErr { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + use OutboundHrmpAcceptanceErr::*; + match self { + MoreMessagesThanPermitted { sent, permitted } => write!( + fmt, + "more HRMP messages than permitted by config ({} > {})", + sent, permitted, + ), + NotSorted { idx } => write!( + fmt, + "the HRMP messages are not sorted (first unsorted is at index {})", + idx, + ), + NoSuchChannel { idx, channel_id } => write!( + fmt, + "the HRMP message at index {} is sent to a non existent channel {:?}->{:?}", + idx, channel_id.sender, channel_id.recipient, + ), + MaxMessageSizeExceeded { + idx, + msg_size, + max_size, + } => write!( + fmt, + "the HRMP message at index {} exceeds the negotiated channel maximum message size ({} > {})", + idx, msg_size, max_size, + ), + TotalSizeExceeded { + idx, + total_size, + limit, + } => write!( + fmt, + "sending the HRMP message at index {} would exceed the neogitiated 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 ({} > {})", + idx, count, limit, + ), + } + } +} + +pub trait Config: frame_system::Config + configuration::Config + paras::Config + dmp::Config { + type Origin: From + + From<::Origin> + + Into::Origin>>; +} + +decl_storage! { + trait Store for Module as Hrmp { + /// Paras that are to be cleaned up at the end of the session. + /// The entries are sorted ascending by the para id. + OutgoingParas: Vec; + + + /// The set of pending HRMP open channel requests. + /// + /// The set is accompanied by a list for iteration. + /// + /// Invariant: + /// - There are no channels that exists in list but not in the set and vice versa. + HrmpOpenChannelRequests: map hasher(twox_64_concat) HrmpChannelId => Option; + HrmpOpenChannelRequestsList: Vec; + + /// This mapping tracks how many open channel requests are inititated 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 hasher(twox_64_concat) ParaId => u32; + /// This mapping tracks how many open channel requests were accepted by a given recipient para. + /// Invariant: `HrmpOpenChannelRequests` should contain the same number of items `(_, X)` with + /// `confirmed` set to true, as the number of `HrmpAcceptedChannelRequestCount` for `X`. + HrmpAcceptedChannelRequestCount: map hasher(twox_64_concat) ParaId => u32; + + /// A set of pending HRMP close channel requests that are going to be closed during the session change. + /// Used for checking if a given channel is registered for closure. + /// + /// The set is accompanied by a list for iteration. + /// + /// Invariant: + /// - There are no channels that exists in list but not in the set and vice versa. + HrmpCloseChannelRequests: map hasher(twox_64_concat) HrmpChannelId => Option<()>; + HrmpCloseChannelRequestsList: Vec; + + /// The HRMP watermark associated with each para. + /// Invariant: + /// - each para `P` used here as a key should satisfy `Paras::is_valid_para(P)` within a session. + HrmpWatermarks: map hasher(twox_64_concat) ParaId => Option; + /// HRMP channel data associated with each para. + /// Invariant: + /// - each participant in the channel should satisfy `Paras::is_valid_para(P)` within a session. + HrmpChannels: map hasher(twox_64_concat) HrmpChannelId => Option; + /// Ingress/egress indexes allow to find all the senders and receivers given the opposite + /// side. I.e. + /// + /// (a) ingress index allows to find all the senders for a given recipient. + /// (b) egress index allows to find all the recipients for a given sender. + /// + /// Invariants: + /// - for each ingress index entry for `P` each item `I` in the index should present in `HrmpChannels` + /// as `(I, P)`. + /// - for each egress index entry for `P` each item `E` in the index should present in `HrmpChannels` + /// as `(P, E)`. + /// - there should be no other dangling channels in `HrmpChannels`. + /// - the vectors are sorted. + HrmpIngressChannelsIndex: map hasher(twox_64_concat) ParaId => Vec; + // NOTE that this field is used by parachains via merkle storage proofs, therefore changing + // the format will require migration of parachains. + HrmpEgressChannelsIndex: map hasher(twox_64_concat) ParaId => Vec; + + /// Storage for the messages for each channel. + /// Invariant: cannot be non-empty if the corresponding channel in `HrmpChannels` is `None`. + HrmpChannelContents: map hasher(twox_64_concat) HrmpChannelId => Vec>; + /// Maintains a mapping that can be used to answer the question: + /// What paras sent a message at the given block number for a given reciever. + /// Invariants: + /// - The inner `Vec` is never empty. + /// - The inner `Vec` cannot store two same `ParaId`. + /// - The outer vector is sorted ascending by block number and cannot store two items with the same + /// block number. + HrmpChannelDigests: map hasher(twox_64_concat) ParaId => Vec<(T::BlockNumber, Vec)>; + } +} + +decl_error! { + pub enum Error for Module { + /// The sender tried to open a channel to themselves. + OpenHrmpChannelToSelf, + /// The recipient is not a valid para. + OpenHrmpChannelInvalidRecipient, + /// The requested capacity is zero. + OpenHrmpChannelZeroCapacity, + /// The requested capacity exceeds the global limit. + OpenHrmpChannelCapacityExceedsLimit, + /// The requested maximum message size is 0. + OpenHrmpChannelZeroMessageSize, + /// The open request requested the message size that exceeds the global limit. + OpenHrmpChannelMessageSizeExceedsLimit, + /// The channel already exists + OpenHrmpChannelAlreadyExists, + /// There is already a request to open the same channel. + OpenHrmpChannelAlreadyRequested, + /// The sender already has the maximum number of allowed outbound channels. + OpenHrmpChannelLimitExceeded, + /// The channel from the sender to the origin doesn't exist. + AcceptHrmpChannelDoesntExist, + /// The channel is already confirmed. + AcceptHrmpChannelAlreadyConfirmed, + /// The recipient already has the maximum number of allowed inbound channels. + AcceptHrmpChannelLimitExceeded, + /// The origin tries to close a channel where it is neither the sender nor the recipient. + CloseHrmpChannelUnauthorized, + /// The channel to be closed doesn't exist. + CloseHrmpChannelDoesntExist, + /// The channel close request is already requested. + CloseHrmpChannelAlreadyUnderway, + } +} + +decl_module! { + /// The HRMP module. + pub struct Module for enum Call where origin: ::Origin { + type Error = Error; + + /// Initiate opening a channel from a parachain to a given recipient with given channel + /// parameters. + /// + /// - `proposed_max_capacity` - specifies how many messages can be in the channel at once. + /// - `proposed_max_message_size` - specifies the maximum size of any of the messages. + /// + /// These numbers are a subject to the relay-chain configuration limits. + /// + /// The channel can be opened only after the recipient confirms it and only on a session + /// change. + #[weight = 0] + pub fn hrmp_init_open_channel( + origin, + recipient: ParaId, + proposed_max_capacity: u32, + proposed_max_message_size: u32, + ) -> DispatchResult { + let origin = ensure_parachain(::Origin::from(origin))?; + Self::init_open_channel( + origin, + recipient, + proposed_max_capacity, + proposed_max_message_size + )?; + Ok(()) + } + + /// Accept a pending open channel request from the given sender. + /// + /// The channel will be opened only on the next session boundary. + #[weight = 0] + pub fn hrmp_accept_open_channel(origin, sender: ParaId) -> DispatchResult { + let origin = ensure_parachain(::Origin::from(origin))?; + Self::accept_open_channel(origin, sender)?; + Ok(()) + } + + /// Initiate unilateral closing of a channel. The origin must be either the sender or the + /// recipient in the channel being closed. + /// + /// The closure can only happen on a session change. + #[weight = 0] + pub fn hrmp_close_channel(origin, channel_id: HrmpChannelId) -> DispatchResult { + let origin = ensure_parachain(::Origin::from(origin))?; + Self::close_channel(origin, channel_id)?; + Ok(()) + } + } +} + +/// Routines and getters related to HRMP. +impl Module { + /// Block initialization logic, called by initializer. + pub(crate) fn initializer_initialize(_now: T::BlockNumber) -> Weight { + 0 + } + + /// Block finalization logic, called by initializer. + pub(crate) fn initializer_finalize() {} + + /// Called by the initializer to note that a new session has started. + pub(crate) fn initializer_on_new_session( + notification: &initializer::SessionChangeNotification, + ) { + Self::perform_outgoing_para_cleanup(); + Self::process_hrmp_open_channel_requests(¬ification.prev_config); + Self::process_hrmp_close_channel_requests(); + } + + /// Iterate over all paras that were registered for offboarding and remove all the data + /// associated with them. + fn perform_outgoing_para_cleanup() { + let outgoing = OutgoingParas::take(); + for outgoing_para in outgoing { + Self::clean_hrmp_after_outgoing(outgoing_para); + } + } + + /// Schedule a para to be cleaned up at the start of the next session. + pub(crate) fn schedule_para_cleanup(id: ParaId) { + OutgoingParas::mutate(|v| { + if let Err(i) = v.binary_search(&id) { + v.insert(i, id); + } + }); + } + + /// Remove all storage entries associated with the given para. + pub(super) fn clean_hrmp_after_outgoing(outgoing_para: ParaId) { + ::HrmpOpenChannelRequestCount::remove(&outgoing_para); + ::HrmpAcceptedChannelRequestCount::remove(&outgoing_para); + + // close all channels where the outgoing para acts as the recipient. + for sender in ::HrmpIngressChannelsIndex::take(&outgoing_para) { + Self::close_hrmp_channel(&HrmpChannelId { + sender, + recipient: outgoing_para.clone(), + }); + } + // close all channels where the outgoing para acts as the sender. + for recipient in ::HrmpEgressChannelsIndex::take(&outgoing_para) { + Self::close_hrmp_channel(&HrmpChannelId { + sender: outgoing_para.clone(), + recipient, + }); + } + } + + /// Iterate over all open channel requests and: + /// + /// - prune the stale requests + /// - enact the confirmed requests + pub(super) fn process_hrmp_open_channel_requests(config: &HostConfiguration) { + let mut open_req_channels = ::HrmpOpenChannelRequestsList::get(); + if open_req_channels.is_empty() { + return; + } + + // iterate the vector starting from the end making our way to the beginning. This way we + // can leverage `swap_remove` to efficiently remove an item during iteration. + let mut idx = open_req_channels.len(); + loop { + // bail if we've iterated over all items. + if idx == 0 { + break; + } + + idx -= 1; + let channel_id = open_req_channels[idx].clone(); + let mut request = ::HrmpOpenChannelRequests::get(&channel_id).expect( + "can't be `None` due to the invariant that the list contains the same items as the set; qed", + ); + + if request.confirmed { + if >::is_valid_para(channel_id.sender) + && >::is_valid_para(channel_id.recipient) + { + ::HrmpChannels::insert( + &channel_id, + HrmpChannel { + sender_deposit: request.sender_deposit, + recipient_deposit: config.hrmp_recipient_deposit, + max_capacity: request.max_capacity, + max_total_size: request.max_total_size, + max_message_size: request.max_message_size, + msg_count: 0, + total_size: 0, + mqc_head: None, + }, + ); + + ::HrmpIngressChannelsIndex::mutate(&channel_id.recipient, |v| { + if let Err(i) = v.binary_search(&channel_id.sender) { + v.insert(i, channel_id.sender); + } + }); + ::HrmpEgressChannelsIndex::mutate(&channel_id.sender, |v| { + if let Err(i) = v.binary_search(&channel_id.recipient) { + v.insert(i, channel_id.recipient); + } + }); + } + + let new_open_channel_req_cnt = + ::HrmpOpenChannelRequestCount::get(&channel_id.sender) + .saturating_sub(1); + if new_open_channel_req_cnt != 0 { + ::HrmpOpenChannelRequestCount::insert( + &channel_id.sender, + new_open_channel_req_cnt, + ); + } else { + ::HrmpOpenChannelRequestCount::remove(&channel_id.sender); + } + + let new_accepted_channel_req_cnt = + ::HrmpAcceptedChannelRequestCount::get(&channel_id.recipient) + .saturating_sub(1); + if new_accepted_channel_req_cnt != 0 { + ::HrmpAcceptedChannelRequestCount::insert( + &channel_id.recipient, + new_accepted_channel_req_cnt, + ); + } else { + ::HrmpAcceptedChannelRequestCount::remove(&channel_id.recipient); + } + + let _ = open_req_channels.swap_remove(idx); + ::HrmpOpenChannelRequests::remove(&channel_id); + } else { + request.age += 1; + if request.age == config.hrmp_open_request_ttl { + // got stale + + ::HrmpOpenChannelRequestCount::mutate(&channel_id.sender, |v| { + *v -= 1; + }); + + // TODO: return deposit https://github.com/paritytech/polkadot/issues/1907 + + let _ = open_req_channels.swap_remove(idx); + ::HrmpOpenChannelRequests::remove(&channel_id); + } + } + } + + ::HrmpOpenChannelRequestsList::put(open_req_channels); + } + + /// Iterate over all close channel requests unconditionally closing the channels. + pub(super) fn process_hrmp_close_channel_requests() { + let close_reqs = ::HrmpCloseChannelRequestsList::take(); + for condemned_ch_id in close_reqs { + ::HrmpCloseChannelRequests::remove(&condemned_ch_id); + Self::close_hrmp_channel(&condemned_ch_id); + + // clean up the indexes. + ::HrmpEgressChannelsIndex::mutate(&condemned_ch_id.sender, |v| { + if let Ok(i) = v.binary_search(&condemned_ch_id.recipient) { + v.remove(i); + } + }); + ::HrmpIngressChannelsIndex::mutate(&condemned_ch_id.recipient, |v| { + if let Ok(i) = v.binary_search(&condemned_ch_id.sender) { + v.remove(i); + } + }); + } + } + + /// Close and remove the designated HRMP channel. + /// + /// This includes returning the deposits. However, it doesn't include updating the ingress/egress + /// indicies. + pub(super) fn close_hrmp_channel(channel_id: &HrmpChannelId) { + // TODO: return deposit https://github.com/paritytech/polkadot/issues/1907 + + ::HrmpChannels::remove(channel_id); + ::HrmpChannelContents::remove(channel_id); + } + + /// Check that the candidate of the given recipient controls the HRMP watermark properly. + pub(crate) fn check_hrmp_watermark( + recipient: ParaId, + relay_chain_parent_number: T::BlockNumber, + new_hrmp_watermark: T::BlockNumber, + ) -> Result<(), HrmpWatermarkAcceptanceErr> { + // First, check where the watermark CANNOT legally land. + // + // (a) For ensuring that messages are eventually, a rule requires each parablock new + // watermark should be greater than the last one. + // + // (b) However, a parachain cannot read into "the future", therefore the watermark should + // not be greater than the relay-chain context block which the parablock refers to. + if let Some(last_watermark) = ::HrmpWatermarks::get(&recipient) { + if new_hrmp_watermark <= last_watermark { + return Err(HrmpWatermarkAcceptanceErr::AdvancementRule { + new_watermark: new_hrmp_watermark, + last_watermark, + }); + } + } + if new_hrmp_watermark > relay_chain_parent_number { + return Err(HrmpWatermarkAcceptanceErr::AheadRelayParent { + new_watermark: new_hrmp_watermark, + relay_chain_parent_number, + }); + } + + // Second, check where the watermark CAN land. It's one of the following: + // + // (a) The relay parent block number. + // (b) A relay-chain block in which this para received at least one message. + if new_hrmp_watermark == relay_chain_parent_number { + Ok(()) + } else { + let digest = ::HrmpChannelDigests::get(&recipient); + if !digest + .binary_search_by_key(&new_hrmp_watermark, |(block_no, _)| *block_no) + .is_ok() + { + return Err(HrmpWatermarkAcceptanceErr::LandsOnBlockWithNoMessages { + new_watermark: new_hrmp_watermark, + }); + } + Ok(()) + } + } + + pub(crate) fn check_outbound_hrmp( + config: &HostConfiguration, + sender: ParaId, + out_hrmp_msgs: &[OutboundHrmpMessage], + ) -> Result<(), OutboundHrmpAcceptanceErr> { + if out_hrmp_msgs.len() as u32 > config.hrmp_max_message_num_per_candidate { + return Err(OutboundHrmpAcceptanceErr::MoreMessagesThanPermitted { + sent: out_hrmp_msgs.len() as u32, + permitted: config.hrmp_max_message_num_per_candidate, + }); + } + + let mut last_recipient = None::; + + for (idx, out_msg) in out_hrmp_msgs + .iter() + .enumerate() + .map(|(idx, out_msg)| (idx as u32, out_msg)) + { + match last_recipient { + // the messages must be sorted in ascending order and there must be no two messages sent + // to the same recipient. Thus we can check that every recipient is strictly greater than + // the previous one. + Some(last_recipient) if out_msg.recipient <= last_recipient => { + return Err(OutboundHrmpAcceptanceErr::NotSorted { idx }); + } + _ => last_recipient = Some(out_msg.recipient), + } + + let channel_id = HrmpChannelId { + sender, + recipient: out_msg.recipient, + }; + + let channel = match ::HrmpChannels::get(&channel_id) { + Some(channel) => channel, + None => { + return Err(OutboundHrmpAcceptanceErr::NoSuchChannel { channel_id, idx }); + } + }; + + let msg_size = out_msg.data.len() as u32; + if msg_size > channel.max_message_size { + return Err(OutboundHrmpAcceptanceErr::MaxMessageSizeExceeded { + idx, + msg_size, + max_size: channel.max_message_size, + }); + } + + let new_total_size = channel.total_size + out_msg.data.len() as u32; + if new_total_size > channel.max_total_size { + return Err(OutboundHrmpAcceptanceErr::TotalSizeExceeded { + idx, + total_size: new_total_size, + limit: channel.max_total_size, + }); + } + + let new_msg_count = channel.msg_count + 1; + if new_msg_count > channel.max_capacity { + return Err(OutboundHrmpAcceptanceErr::CapacityExceeded { + idx, + count: new_msg_count, + limit: channel.max_capacity, + }); + } + } + + Ok(()) + } + + pub(crate) fn prune_hrmp(recipient: ParaId, new_hrmp_watermark: T::BlockNumber) -> Weight { + let mut weight = 0; + + // sift through the incoming messages digest to collect the paras that sent at least one + // message to this parachain between the old and new watermarks. + let senders = ::HrmpChannelDigests::mutate(&recipient, |digest| { + let mut senders = BTreeSet::new(); + let mut leftover = Vec::with_capacity(digest.len()); + for (block_no, paras_sent_msg) in mem::replace(digest, Vec::new()) { + if block_no <= new_hrmp_watermark { + senders.extend(paras_sent_msg); + } else { + leftover.push((block_no, paras_sent_msg)); + } + } + *digest = leftover; + senders + }); + weight += T::DbWeight::get().reads_writes(1, 1); + + // having all senders we can trivially find out the channels which we need to prune. + let channels_to_prune = senders + .into_iter() + .map(|sender| HrmpChannelId { sender, recipient }); + for channel_id in channels_to_prune { + // prune each channel up to the new watermark keeping track how many messages we removed + // and what is the total byte size of them. + let (mut pruned_cnt, mut pruned_size) = (0, 0); + + let contents = ::HrmpChannelContents::get(&channel_id); + let mut leftover = Vec::with_capacity(contents.len()); + for msg in contents { + if msg.sent_at <= new_hrmp_watermark { + pruned_cnt += 1; + pruned_size += msg.data.len(); + } else { + leftover.push(msg); + } + } + if !leftover.is_empty() { + ::HrmpChannelContents::insert(&channel_id, leftover); + } else { + ::HrmpChannelContents::remove(&channel_id); + } + + // update the channel metadata. + ::HrmpChannels::mutate(&channel_id, |channel| { + if let Some(ref mut channel) = channel { + channel.msg_count -= pruned_cnt as u32; + channel.total_size -= pruned_size as u32; + } + }); + + weight += T::DbWeight::get().reads_writes(2, 2); + } + + ::HrmpWatermarks::insert(&recipient, new_hrmp_watermark); + weight += T::DbWeight::get().reads_writes(0, 1); + + weight + } + + /// Process the outbound HRMP messages by putting them into the appropriate recipient queues. + /// + /// Returns the amount of weight consumed. + pub(crate) fn queue_outbound_hrmp( + sender: ParaId, + out_hrmp_msgs: Vec>, + ) -> Weight { + let mut weight = 0; + let now = >::block_number(); + + for out_msg in out_hrmp_msgs { + let channel_id = HrmpChannelId { + sender, + recipient: out_msg.recipient, + }; + + let mut channel = match ::HrmpChannels::get(&channel_id) { + Some(channel) => channel, + None => { + // apparently, that since acceptance of this candidate the recipient was + // offboarded and the channel no longer exists. + continue; + } + }; + + let inbound = InboundHrmpMessage { + sent_at: now, + data: out_msg.data, + }; + + // book keeping + channel.msg_count += 1; + channel.total_size += inbound.data.len() as u32; + + // compute the new MQC head of the channel + let prev_head = channel.mqc_head.clone().unwrap_or(Default::default()); + let new_head = BlakeTwo256::hash_of(&( + prev_head, + inbound.sent_at, + T::Hashing::hash_of(&inbound.data), + )); + channel.mqc_head = Some(new_head); + + ::HrmpChannels::insert(&channel_id, channel); + ::HrmpChannelContents::append(&channel_id, inbound); + + // The digests are sorted in ascending by block number order. Assuming absence of + // contextual execution, there are only two possible scenarios here: + // + // (a) It's the first time anybody sends a message to this recipient within this block. + // In this case, the digest vector would be empty or the block number of the latest + // entry is smaller than the current. + // + // (b) Somebody has already sent a message within the current block. That means that + // the block number of the latest entry is equal to the current. + // + // Note that having the latest entry greater than the current block number is a logical + // error. + let mut recipient_digest = + ::HrmpChannelDigests::get(&channel_id.recipient); + if let Some(cur_block_digest) = recipient_digest + .last_mut() + .filter(|(block_no, _)| *block_no == now) + .map(|(_, ref mut d)| d) + { + cur_block_digest.push(sender); + } else { + recipient_digest.push((now, vec![sender])); + } + ::HrmpChannelDigests::insert(&channel_id.recipient, recipient_digest); + + weight += T::DbWeight::get().reads_writes(2, 2); + } + + weight + } + + /// Initiate opening a channel from a parachain to a given recipient with given channel + /// parameters. + /// + /// Basically the same as [`hrmp_init_open_channel`](Module::hrmp_init_open_channel) but intendend for calling directly from + /// other pallets rather than dispatched. + pub fn init_open_channel( + origin: ParaId, + recipient: ParaId, + proposed_max_capacity: u32, + proposed_max_message_size: u32, + ) -> Result<(), Error> { + ensure!(origin != recipient, Error::::OpenHrmpChannelToSelf); + ensure!( + >::is_valid_para(recipient), + Error::::OpenHrmpChannelInvalidRecipient, + ); + + let config = >::config(); + ensure!( + proposed_max_capacity > 0, + Error::::OpenHrmpChannelZeroCapacity, + ); + ensure!( + proposed_max_capacity <= config.hrmp_channel_max_capacity, + Error::::OpenHrmpChannelCapacityExceedsLimit, + ); + ensure!( + proposed_max_message_size > 0, + Error::::OpenHrmpChannelZeroMessageSize, + ); + ensure!( + proposed_max_message_size <= config.hrmp_channel_max_message_size, + Error::::OpenHrmpChannelMessageSizeExceedsLimit, + ); + + let channel_id = HrmpChannelId { + sender: origin, + recipient, + }; + ensure!( + ::HrmpOpenChannelRequests::get(&channel_id).is_none(), + Error::::OpenHrmpChannelAlreadyExists, + ); + ensure!( + ::HrmpChannels::get(&channel_id).is_none(), + Error::::OpenHrmpChannelAlreadyRequested, + ); + + let egress_cnt = + ::HrmpEgressChannelsIndex::decode_len(&origin).unwrap_or(0) as u32; + let open_req_cnt = ::HrmpOpenChannelRequestCount::get(&origin); + let channel_num_limit = if >::is_parathread(origin) { + config.hrmp_max_parathread_outbound_channels + } else { + config.hrmp_max_parachain_outbound_channels + }; + ensure!( + egress_cnt + open_req_cnt < channel_num_limit, + Error::::OpenHrmpChannelLimitExceeded, + ); + + // TODO: Deposit https://github.com/paritytech/polkadot/issues/1907 + + ::HrmpOpenChannelRequestCount::insert(&origin, open_req_cnt + 1); + ::HrmpOpenChannelRequests::insert( + &channel_id, + HrmpOpenChannelRequest { + confirmed: false, + age: 0, + sender_deposit: config.hrmp_sender_deposit, + max_capacity: proposed_max_capacity, + max_message_size: proposed_max_message_size, + max_total_size: config.hrmp_channel_max_total_size, + }, + ); + ::HrmpOpenChannelRequestsList::append(channel_id); + + let notification_bytes = { + use xcm::v0::Xcm; + use parity_scale_codec::Encode as _; + + Xcm::HrmpNewChannelOpenRequest { + sender: u32::from(origin), + max_capacity: proposed_max_capacity, + max_message_size: proposed_max_message_size, + } + .encode() + }; + if let Err(dmp::QueueDownwardMessageError::ExceedsMaxMessageSize) = + >::queue_downward_message(&config, recipient, notification_bytes) + { + // this should never happen unless the max downward message size is configured to an + // jokingly small number. + debug_assert!(false); + } + + Ok(()) + } + + /// Accept a pending open channel request from the given sender. + /// + /// Basically the same as [`hrmp_accept_open_channel`](Module::hrmp_accept_open_channel) but intendend for calling directly from + /// other pallets rather than dispatched. + pub fn accept_open_channel(origin: ParaId, sender: ParaId) -> Result<(), Error> { + let channel_id = HrmpChannelId { + sender, + recipient: origin, + }; + let mut channel_req = ::HrmpOpenChannelRequests::get(&channel_id) + .ok_or(Error::::AcceptHrmpChannelDoesntExist)?; + ensure!( + !channel_req.confirmed, + Error::::AcceptHrmpChannelAlreadyConfirmed, + ); + + // check if by accepting this open channel request, this parachain would exceed the + // number of inbound channels. + let config = >::config(); + let channel_num_limit = if >::is_parathread(origin) { + config.hrmp_max_parathread_inbound_channels + } else { + config.hrmp_max_parachain_inbound_channels + }; + let ingress_cnt = + ::HrmpIngressChannelsIndex::decode_len(&origin).unwrap_or(0) as u32; + let accepted_cnt = ::HrmpAcceptedChannelRequestCount::get(&origin); + ensure!( + ingress_cnt + accepted_cnt < channel_num_limit, + Error::::AcceptHrmpChannelLimitExceeded, + ); + + // TODO: Deposit https://github.com/paritytech/polkadot/issues/1907 + + // persist the updated open channel request and then increment the number of accepted + // channels. + channel_req.confirmed = true; + ::HrmpOpenChannelRequests::insert(&channel_id, channel_req); + ::HrmpAcceptedChannelRequestCount::insert(&origin, accepted_cnt + 1); + + let notification_bytes = { + use parity_scale_codec::Encode as _; + use xcm::v0::Xcm; + + Xcm::HrmpChannelAccepted { + recipient: u32::from(origin), + } + .encode() + }; + if let Err(dmp::QueueDownwardMessageError::ExceedsMaxMessageSize) = + >::queue_downward_message(&config, sender, notification_bytes) + { + // this should never happen unless the max downward message size is configured to an + // jokingly small number. + debug_assert!(false); + } + + Ok(()) + } + + fn close_channel(origin: ParaId, channel_id: HrmpChannelId) -> Result<(), Error> { + // check if the origin is allowed to close the channel. + ensure!( + origin == channel_id.sender || origin == channel_id.recipient, + Error::::CloseHrmpChannelUnauthorized, + ); + + // check if the channel requested to close does exist. + ensure!( + ::HrmpChannels::get(&channel_id).is_some(), + Error::::CloseHrmpChannelDoesntExist, + ); + + // check that there is no outstanding close request for this channel + ensure!( + ::HrmpCloseChannelRequests::get(&channel_id).is_none(), + Error::::CloseHrmpChannelAlreadyUnderway, + ); + + ::HrmpCloseChannelRequests::insert(&channel_id, ()); + ::HrmpCloseChannelRequestsList::append(channel_id.clone()); + + let config = >::config(); + let notification_bytes = { + use parity_scale_codec::Encode as _; + use xcm::v0::Xcm; + + Xcm::HrmpChannelClosing { + initiator: u32::from(origin), + sender: u32::from(channel_id.sender), + recipient: u32::from(channel_id.recipient), + } + .encode() + }; + 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) + { + // this should never happen unless the max downward message size is configured to an + // jokingly small number. + debug_assert!(false); + } + + Ok(()) + } + + /// Returns the list of MQC heads for the inbound channels of the given recipient para paired + /// with the sender para ids. This vector is sorted ascending by the para id and doesn't contain + /// multiple entries with the same sender. + pub(crate) fn hrmp_mqc_heads(recipient: ParaId) -> Vec<(ParaId, Hash)> { + let sender_set = ::HrmpIngressChannelsIndex::get(&recipient); + + // The ingress channels vector is sorted, thus `mqc_heads` is sorted as well. + let mut mqc_heads = Vec::with_capacity(sender_set.len()); + for sender in sender_set { + let channel_metadata = + ::HrmpChannels::get(&HrmpChannelId { sender, recipient }); + let mqc_head = channel_metadata + .and_then(|metadata| metadata.mqc_head) + .unwrap_or(Hash::default()); + mqc_heads.push((sender, mqc_head)); + } + + mqc_heads + } + + /// Returns contents of all channels addressed to the given recipient. Channels that have no + /// messages in them are also included. + pub(crate) fn inbound_hrmp_channels_contents( + recipient: ParaId, + ) -> BTreeMap>> { + let sender_set = ::HrmpIngressChannelsIndex::get(&recipient); + + let mut inbound_hrmp_channels_contents = BTreeMap::new(); + for sender in sender_set { + let channel_contents = + ::HrmpChannelContents::get(&HrmpChannelId { sender, recipient }); + inbound_hrmp_channels_contents.insert(sender, channel_contents); + } + + inbound_hrmp_channels_contents + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::{ + new_test_ext, Configuration, Paras, Hrmp, System, GenesisConfig as MockGenesisConfig, + }; + use primitives::v1::BlockNumber; + use std::collections::{BTreeMap, HashSet}; + + fn run_to_block(to: BlockNumber, new_session: Option>) { + use frame_support::traits::{OnFinalize as _, OnInitialize as _}; + + while System::block_number() < to { + let b = System::block_number(); + + // NOTE: this is in reverse initialization order. + Hrmp::initializer_finalize(); + Paras::initializer_finalize(); + + System::on_finalize(b); + + System::on_initialize(b + 1); + System::set_block_number(b + 1); + + if new_session.as_ref().map_or(false, |v| v.contains(&(b + 1))) { + // NOTE: this is in initialization order. + Paras::initializer_on_new_session(&Default::default()); + Hrmp::initializer_on_new_session(&Default::default()); + } + + // NOTE: this is in initialization order. + Paras::initializer_initialize(b + 1); + Hrmp::initializer_initialize(b + 1); + } + } + + struct GenesisConfigBuilder { + hrmp_channel_max_capacity: u32, + hrmp_channel_max_message_size: u32, + hrmp_max_parathread_outbound_channels: u32, + hrmp_max_parachain_outbound_channels: u32, + hrmp_max_parathread_inbound_channels: u32, + hrmp_max_parachain_inbound_channels: u32, + hrmp_max_message_num_per_candidate: u32, + hrmp_channel_max_total_size: u32, + } + + impl Default for GenesisConfigBuilder { + fn default() -> Self { + Self { + hrmp_channel_max_capacity: 2, + hrmp_channel_max_message_size: 8, + hrmp_max_parathread_outbound_channels: 1, + hrmp_max_parachain_outbound_channels: 2, + hrmp_max_parathread_inbound_channels: 1, + hrmp_max_parachain_inbound_channels: 2, + hrmp_max_message_num_per_candidate: 2, + hrmp_channel_max_total_size: 16, + } + } + } + + impl GenesisConfigBuilder { + fn build(self) -> crate::mock::GenesisConfig { + let mut genesis = default_genesis_config(); + let config = &mut genesis.configuration.config; + config.hrmp_channel_max_capacity = self.hrmp_channel_max_capacity; + config.hrmp_channel_max_message_size = self.hrmp_channel_max_message_size; + config.hrmp_max_parathread_outbound_channels = + self.hrmp_max_parathread_outbound_channels; + config.hrmp_max_parachain_outbound_channels = self.hrmp_max_parachain_outbound_channels; + config.hrmp_max_parathread_inbound_channels = self.hrmp_max_parathread_inbound_channels; + config.hrmp_max_parachain_inbound_channels = self.hrmp_max_parachain_inbound_channels; + config.hrmp_max_message_num_per_candidate = self.hrmp_max_message_num_per_candidate; + config.hrmp_channel_max_total_size = self.hrmp_channel_max_total_size; + genesis + } + } + + fn default_genesis_config() -> MockGenesisConfig { + MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: crate::configuration::HostConfiguration { + max_downward_message_size: 1024, + ..Default::default() + }, + }, + ..Default::default() + } + } + + fn register_parachain(id: ParaId) { + Paras::schedule_para_initialize( + id, + crate::paras::ParaGenesisArgs { + parachain: true, + genesis_head: vec![1].into(), + validation_code: vec![1].into(), + }, + ); + } + + fn deregister_parachain(id: ParaId) { + Paras::schedule_para_cleanup(id); + } + + fn channel_exists(sender: ParaId, recipient: ParaId) -> bool { + ::HrmpChannels::get(&HrmpChannelId { sender, recipient }).is_some() + } + + fn assert_storage_consistency_exhaustive() { + use frame_support::IterableStorageMap; + + assert_eq!( + ::HrmpOpenChannelRequests::iter() + .map(|(k, _)| k) + .collect::>(), + ::HrmpOpenChannelRequestsList::get() + .into_iter() + .collect::>(), + ); + + // verify that the set of keys in `HrmpOpenChannelRequestCount` corresponds to the set + // of _senders_ in `HrmpOpenChannelRequests`. + // + // having ensured that, we can go ahead and go over all counts and verify that they match. + assert_eq!( + ::HrmpOpenChannelRequestCount::iter() + .map(|(k, _)| k) + .collect::>(), + ::HrmpOpenChannelRequests::iter() + .map(|(k, _)| k.sender) + .collect::>(), + ); + for (open_channel_initiator, expected_num) in + ::HrmpOpenChannelRequestCount::iter() + { + let actual_num = ::HrmpOpenChannelRequests::iter() + .filter(|(ch, _)| ch.sender == open_channel_initiator) + .count() as u32; + assert_eq!(expected_num, actual_num); + } + + // The same as above, but for accepted channel request count. Note that we are interested + // only in confirmed open requests. + assert_eq!( + ::HrmpAcceptedChannelRequestCount::iter() + .map(|(k, _)| k) + .collect::>(), + ::HrmpOpenChannelRequests::iter() + .filter(|(_, v)| v.confirmed) + .map(|(k, _)| k.recipient) + .collect::>(), + ); + for (channel_recipient, expected_num) in + ::HrmpAcceptedChannelRequestCount::iter() + { + let actual_num = ::HrmpOpenChannelRequests::iter() + .filter(|(ch, v)| ch.recipient == channel_recipient && v.confirmed) + .count() as u32; + assert_eq!(expected_num, actual_num); + } + + assert_eq!( + ::HrmpCloseChannelRequests::iter() + .map(|(k, _)| k) + .collect::>(), + ::HrmpCloseChannelRequestsList::get() + .into_iter() + .collect::>(), + ); + + // A HRMP watermark can be None for an onboarded parachain. However, an offboarded parachain + // cannot have an HRMP watermark: it should've been cleanup. + assert_contains_only_onboarded( + ::HrmpWatermarks::iter().map(|(k, _)| k), + "HRMP watermarks should contain only onboarded paras", + ); + + // An entry in `HrmpChannels` indicates that the channel is open. Only open channels can + // have contents. + for (non_empty_channel, contents) in ::HrmpChannelContents::iter() { + assert!(::HrmpChannels::contains_key( + &non_empty_channel + )); + + // pedantic check: there should be no empty vectors in storage, those should be modeled + // by a removed kv pair. + assert!(!contents.is_empty()); + } + + // Senders and recipients must be onboarded. Otherwise, all channels associated with them + // are removed. + assert_contains_only_onboarded( + ::HrmpChannels::iter().flat_map(|(k, _)| vec![k.sender, k.recipient]), + "senders and recipients in all channels should be onboarded", + ); + + // Check the docs for `HrmpIngressChannelsIndex` and `HrmpEgressChannelsIndex` in decl + // storage to get an index what are the channel mappings indexes. + // + // Here, from indexes. + // + // ingress egress + // + // a -> [x, y] x -> [a, b] + // b -> [x, z] y -> [a] + // z -> [b] + // + // we derive a list of channels they represent. + // + // (a, x) (a, x) + // (a, y) (a, y) + // (b, x) (b, x) + // (b, z) (b, z) + // + // and then that we compare that to the channel list in the `HrmpChannels`. + let channel_set_derived_from_ingress = ::HrmpIngressChannelsIndex::iter() + .flat_map(|(p, v)| v.into_iter().map(|i| (i, p)).collect::>()) + .collect::>(); + let channel_set_derived_from_egress = ::HrmpEgressChannelsIndex::iter() + .flat_map(|(p, v)| v.into_iter().map(|e| (p, e)).collect::>()) + .collect::>(); + let channel_set_ground_truth = ::HrmpChannels::iter() + .map(|(k, _)| (k.sender, k.recipient)) + .collect::>(); + assert_eq!( + channel_set_derived_from_ingress, + channel_set_derived_from_egress + ); + assert_eq!(channel_set_derived_from_egress, channel_set_ground_truth); + + ::HrmpIngressChannelsIndex::iter() + .map(|(_, v)| v) + .for_each(|v| assert_is_sorted(&v, "HrmpIngressChannelsIndex")); + ::HrmpEgressChannelsIndex::iter() + .map(|(_, v)| v) + .for_each(|v| assert_is_sorted(&v, "HrmpIngressChannelsIndex")); + + assert_contains_only_onboarded( + ::HrmpChannelDigests::iter().map(|(k, _)| k), + "HRMP channel digests should contain only onboarded paras", + ); + for (_digest_for_para, digest) in ::HrmpChannelDigests::iter() { + // Assert that items are in **strictly** ascending order. The strictness also implies + // there are no duplicates. + assert!(digest.windows(2).all(|xs| xs[0].0 < xs[1].0)); + + for (_, mut senders) in digest { + assert!(!senders.is_empty()); + + // check for duplicates. For that we sort the vector, then perform deduplication. + // if the vector stayed the same, there are no duplicates. + senders.sort(); + let orig_senders = senders.clone(); + senders.dedup(); + assert_eq!( + orig_senders, senders, + "duplicates removed implies existence of duplicates" + ); + } + } + + fn assert_contains_only_onboarded(iter: impl Iterator, cause: &str) { + for para in iter { + assert!( + Paras::is_valid_para(para), + "{}: {} para is offboarded", + cause, + para + ); + } + } + } + + fn assert_is_sorted(slice: &[T], id: &str) { + assert!( + slice.windows(2).all(|xs| xs[0] <= xs[1]), + "{} supposed to be sorted", + id + ); + } + + #[test] + fn empty_state_consistent_state() { + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + assert_storage_consistency_exhaustive(); + }); + } + + #[test] + fn open_channel_works() { + let para_a = 1.into(); + let para_b = 3.into(); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + // We need both A & B to be registered and alive parachains. + register_parachain(para_a); + register_parachain(para_b); + + run_to_block(5, Some(vec![5])); + Hrmp::init_open_channel(para_a, para_b, 2, 8).unwrap(); + assert_storage_consistency_exhaustive(); + + Hrmp::accept_open_channel(para_b, para_a).unwrap(); + assert_storage_consistency_exhaustive(); + + // Advance to a block 6, but without session change. That means that the channel has + // not been created yet. + run_to_block(6, None); + assert!(!channel_exists(para_a, para_b)); + assert_storage_consistency_exhaustive(); + + // Now let the session change happen and thus open the channel. + run_to_block(8, Some(vec![8])); + assert!(channel_exists(para_a, para_b)); + }); + } + + #[test] + fn close_channel_works() { + let para_a = 5.into(); + let para_b = 2.into(); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + register_parachain(para_a); + register_parachain(para_b); + + run_to_block(5, Some(vec![5])); + Hrmp::init_open_channel(para_a, para_b, 2, 8).unwrap(); + Hrmp::accept_open_channel(para_b, para_a).unwrap(); + + run_to_block(6, Some(vec![6])); + assert!(channel_exists(para_a, para_b)); + + // Close the channel. The effect is not immediate, but rather deferred to the next + // session change. + Hrmp::close_channel( + para_b, + HrmpChannelId { + sender: para_a, + recipient: para_b, + }, + ) + .unwrap(); + assert!(channel_exists(para_a, para_b)); + assert_storage_consistency_exhaustive(); + + // After the session change the channel should be closed. + run_to_block(8, Some(vec![8])); + assert!(!channel_exists(para_a, para_b)); + assert_storage_consistency_exhaustive(); + }); + } + + #[test] + fn send_recv_messages() { + let para_a = 32.into(); + let para_b = 64.into(); + + let mut genesis = GenesisConfigBuilder::default(); + genesis.hrmp_channel_max_message_size = 20; + genesis.hrmp_channel_max_total_size = 20; + new_test_ext(genesis.build()).execute_with(|| { + register_parachain(para_a); + register_parachain(para_b); + + run_to_block(5, Some(vec![5])); + Hrmp::init_open_channel(para_a, para_b, 2, 20).unwrap(); + Hrmp::accept_open_channel(para_b, para_a).unwrap(); + + // On Block 6: + // A sends a message to B + run_to_block(6, Some(vec![6])); + assert!(channel_exists(para_a, para_b)); + let msgs = vec![OutboundHrmpMessage { + recipient: para_b, + data: b"this is an emergency".to_vec(), + }]; + let config = Configuration::config(); + assert!(Hrmp::check_outbound_hrmp(&config, para_a, &msgs).is_ok()); + let _ = Hrmp::queue_outbound_hrmp(para_a, msgs); + assert_storage_consistency_exhaustive(); + + // On Block 7: + // B receives the message sent by A. B sets the watermark to 6. + run_to_block(7, None); + assert!(Hrmp::check_hrmp_watermark(para_b, 7, 6).is_ok()); + let _ = Hrmp::prune_hrmp(para_b, 6); + assert_storage_consistency_exhaustive(); + }); + } + + #[test] + fn accept_incoming_request_and_offboard() { + let para_a = 32.into(); + let para_b = 64.into(); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + register_parachain(para_a); + register_parachain(para_b); + + run_to_block(5, Some(vec![5])); + Hrmp::init_open_channel(para_a, para_b, 2, 8).unwrap(); + Hrmp::accept_open_channel(para_b, para_a).unwrap(); + deregister_parachain(para_a); + + // On Block 6: session change. The channel should not be created. + run_to_block(6, Some(vec![6])); + assert!(!Paras::is_valid_para(para_a)); + assert!(!channel_exists(para_a, para_b)); + assert_storage_consistency_exhaustive(); + }); + } + + #[test] + fn check_sent_messages() { + let para_a = 32.into(); + let para_b = 64.into(); + let para_c = 97.into(); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + register_parachain(para_a); + register_parachain(para_b); + register_parachain(para_c); + + run_to_block(5, Some(vec![5])); + + // Open two channels to the same receiver, b: + // a -> b, c -> b + Hrmp::init_open_channel(para_a, para_b, 2, 8).unwrap(); + Hrmp::accept_open_channel(para_b, para_a).unwrap(); + Hrmp::init_open_channel(para_c, para_b, 2, 8).unwrap(); + Hrmp::accept_open_channel(para_b, para_c).unwrap(); + + // On Block 6: session change. + run_to_block(6, Some(vec![6])); + assert!(Paras::is_valid_para(para_a)); + + let msgs = vec![OutboundHrmpMessage { + recipient: para_b, + data: b"knock".to_vec(), + }]; + let config = Configuration::config(); + assert!(Hrmp::check_outbound_hrmp(&config, para_a, &msgs).is_ok()); + let _ = Hrmp::queue_outbound_hrmp(para_a, msgs.clone()); + + // Verify that the sent messages are there and that also the empty channels are present. + let mqc_heads = Hrmp::hrmp_mqc_heads(para_b); + let contents = Hrmp::inbound_hrmp_channels_contents(para_b); + assert_eq!( + contents, + vec![ + ( + para_a, + vec![InboundHrmpMessage { + sent_at: 6, + data: b"knock".to_vec(), + }] + ), + (para_c, vec![]) + ] + .into_iter() + .collect::>(), + ); + assert_eq!( + mqc_heads, + vec![ + ( + para_a, + hex_literal::hex!( + "3bba6404e59c91f51deb2ae78f1273ebe75896850713e13f8c0eba4b0996c483" + ) + .into() + ), + (para_c, Default::default()) + ], + ); + + assert_storage_consistency_exhaustive(); + }); + } + + #[test] + fn verify_externally_accessible() { + use primitives::v1::{well_known_keys, AbridgedHrmpChannel}; + + let para_a = 20.into(); + let para_b = 21.into(); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + // Register two parachains, wait until a session change, then initiate channel open + // request and accept that, and finally wait until the next session. + register_parachain(para_a); + register_parachain(para_b); + run_to_block(5, Some(vec![5])); + Hrmp::init_open_channel(para_a, para_b, 2, 8).unwrap(); + Hrmp::accept_open_channel(para_b, para_a).unwrap(); + run_to_block(8, Some(vec![8])); + + // Here we have a channel a->b opened. + // + // Try to obtain this channel from the storage and + // decode it into the abridged version. + assert!(channel_exists(para_a, para_b)); + let raw_hrmp_channel = + sp_io::storage::get(&well_known_keys::hrmp_channels(HrmpChannelId { + sender: para_a, + recipient: para_b, + })) + .expect("the channel exists and we must be able to get it through well known keys"); + let abridged_hrmp_channel = AbridgedHrmpChannel::decode(&mut &raw_hrmp_channel[..]) + .expect("HrmpChannel should be decodable as AbridgedHrmpChannel"); + + assert_eq!( + abridged_hrmp_channel, + AbridgedHrmpChannel { + max_capacity: 2, + max_total_size: 16, + max_message_size: 8, + msg_count: 0, + total_size: 0, + mqc_head: None, + }, + ); + + // Now, verify that we can access and decode the egress index. + let raw_egress_index = + sp_io::storage::get( + &well_known_keys::hrmp_egress_channel_index(para_a) + ) + .expect("the egress index must be present for para_a"); + let egress_index = >::decode(&mut &raw_egress_index[..]) + .expect("egress index should be decodable as a list of para ids"); + assert_eq!( + egress_index, + vec![para_b], + ); + }); + } +} diff --git a/runtime/parachains/src/inclusion.rs b/runtime/parachains/src/inclusion.rs index a22ca47389b5429712fff18f5a92d989ce025e34..4f0466f788c74c83cc4f75c72c042f8ddc59dc69 100644 --- a/runtime/parachains/src/inclusion.rs +++ b/runtime/parachains/src/inclusion.rs @@ -25,18 +25,18 @@ use primitives::v1::{ ValidatorId, CandidateCommitments, CandidateDescriptor, ValidatorIndex, Id as ParaId, AvailabilityBitfield as AvailabilityBitfield, SignedAvailabilityBitfields, SigningContext, BackedCandidate, CoreIndex, GroupIndex, CommittedCandidateReceipt, - CandidateReceipt, HeadData, + CandidateReceipt, HeadData, CandidateHash, Hash, }; use frame_support::{ decl_storage, decl_module, decl_error, decl_event, ensure, debug, dispatch::DispatchResult, IterableStorageMap, weights::Weight, traits::Get, }; -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; use sp_staking::SessionIndex; use sp_runtime::{DispatchError, traits::{One, Saturating}}; -use crate::{configuration, paras, scheduler::CoreAssignment}; +use crate::{configuration, paras, dmp, ump, hrmp, scheduler::CoreAssignment}; /// 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. @@ -58,10 +58,14 @@ pub struct AvailabilityBitfieldRecord { pub struct CandidatePendingAvailability { /// The availability core this is assigned to. core: CoreIndex, + /// The candidate hash. + hash: CandidateHash, /// The candidate descriptor. descriptor: CandidateDescriptor, /// The received availability votes. One bit per validator. availability_votes: BitVec, + /// The backers of the candidate pending availability. + backers: BitVec, /// The block number of the relay-parent of the receipt. relay_parent_number: N, /// The block number of the relay-chain block this was backed in. @@ -83,16 +87,42 @@ impl CandidatePendingAvailability { pub(crate) fn core_occupied(&self)-> CoreIndex { self.core.clone() } + + /// Get the candidate hash. + pub(crate) fn candidate_hash(&self) -> CandidateHash { + self.hash + } + + /// Get the canddiate descriptor. + pub(crate) fn candidate_descriptor(&self) -> &CandidateDescriptor { + &self.descriptor + } } -pub trait Trait: - frame_system::Trait + paras::Trait + configuration::Trait +/// A hook for applying validator rewards +pub trait RewardValidators { + // Reward the validators with the given indices for issuing backing statements. + fn reward_backing(validators: impl IntoIterator); + // Reward the validators with the given indices for issuing availability bitfields. + // Validators are sent to this hook when they have contributed to the availability + // of a candidate by setting a bit in their bitfield. + fn reward_bitfields(validators: impl IntoIterator); +} + +pub trait Config: + frame_system::Config + + paras::Config + + dmp::Config + + ump::Config + + hrmp::Config + + configuration::Config { - type Event: From> + Into<::Event>; + type Event: From> + Into<::Event>; + type RewardValidators: RewardValidators; } decl_storage! { - trait Store for Module as ParaInclusion { + trait Store for Module as ParaInclusion { /// The latest bitfield for each validator, referred to by their index in the validator set. AvailabilityBitfields: map hasher(twox_64_concat) ValidatorIndex => Option>; @@ -114,7 +144,7 @@ decl_storage! { } decl_error! { - pub enum Error for Module { + pub enum Error for Module { /// Availability bitfield has unexpected size. WrongBitfieldSize, /// Multiple bitfields submitted by same validator or validators out of order by index. @@ -131,8 +161,12 @@ decl_error! { WrongCollator, /// Scheduled cores out of order. ScheduledOutOfOrder, + /// Head data exceeds the configured maximum. + HeadDataTooLarge, /// Code upgrade prematurely. PrematureCodeUpgrade, + /// Output code is too large + NewCodeTooLarge, /// Candidate not in parent context. CandidateNotInParentContext, /// The bitfield contains a bit relating to an unassigned availability core. @@ -149,11 +183,19 @@ decl_error! { ValidationDataHashMismatch, /// Internal error only returned when compiled with debug assertions. InternalError, + /// The downward message queue is not processed correctly. + IncorrectDownwardMessageHandling, + /// At least one upward message sent does not pass the acceptance criteria. + InvalidUpwardMessages, + /// The candidate didn't follow the rules of HRMP watermark advancement. + HrmpWatermarkMishandling, + /// The HRMP messages sent by the candidate is not valid. + InvalidOutboundHrmp, } } decl_event! { - pub enum Event where ::Hash { + pub enum Event where ::Hash { /// A candidate was backed. [candidate, head_data] CandidateBacked(CandidateReceipt, HeadData), /// A candidate was included. [candidate, head_data] @@ -165,8 +207,8 @@ decl_event! { decl_module! { /// The parachain-candidate inclusion module. - pub struct Module - for enum Call where origin: ::Origin + pub struct Module + for enum Call where origin: ::Origin { type Error = Error; @@ -174,8 +216,9 @@ decl_module! { } } -impl Module { +const LOG_TARGET: &str = "parachains_runtime_inclusion"; +impl Module { /// Block initialization logic, called by initializer. pub(crate) fn initializer_initialize(_now: T::BlockNumber) -> Weight { 0 } @@ -304,7 +347,7 @@ impl Module { { if pending_availability.availability_votes.count_ones() >= threshold { >::remove(¶_id); - let commitments = match ::take(¶_id) { + let commitments = match PendingAvailabilityCommitments::take(¶_id) { Some(commitments) => commitments, None => { debug::warn!(r#" @@ -323,6 +366,8 @@ impl Module { Self::enact_candidate( pending_availability.relay_parent_number, receipt, + pending_availability.backers, + pending_availability.availability_votes, ); freed_cores.push(pending_availability.core); @@ -337,17 +382,17 @@ impl Module { Ok(freed_cores) } - /// Process candidates that have been backed. Provide a set of candidates and scheduled cores. + /// Process candidates that have been backed. Provide the relay storage root, a set of candidates + /// and 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. pub(crate) fn process_candidates( + parent_storage_root: Hash, candidates: Vec>, scheduled: Vec, group_validators: impl Fn(GroupIndex) -> Option>, - ) - -> Result, DispatchError> - { + ) -> Result, DispatchError> { ensure!(candidates.len() <= scheduled.len(), Error::::UnscheduledCandidate); if scheduled.is_empty() { @@ -356,14 +401,17 @@ impl Module { let validators = Validators::get(); let parent_hash = >::parent_hash(); - let config = >::config(); + + // At the moment we assume (and in fact enforce, below) that the relay-parent is always one + // before of the block where we include a candidate (i.e. this code path). let now = >::block_number(); let relay_parent_number = now - One::one(); + let check_cx = CandidateCheckContext::::new(now, relay_parent_number); // do all checks before writing storage. - let core_indices = { + let core_indices_and_backers = { let mut skip = 0; - let mut core_indices = Vec::with_capacity(candidates.len()); + let mut core_indices_and_backers = Vec::with_capacity(candidates.len()); let mut last_core = None; let mut check_assignment_in_order = |assignment: &CoreAssignment| -> DispatchResult { @@ -392,35 +440,42 @@ impl Module { // In the meantime, we do certain sanity checks on the candidates and on the scheduled // list. 'a: - for candidate in &candidates { + for (candidate_idx, candidate) in candidates.iter().enumerate() { let para_id = candidate.descriptor().para_id; + let mut backers = bitvec::bitvec![BitOrderLsb0, u8; 0; validators.len()]; // we require that the candidate is in the context of the parent block. ensure!( candidate.descriptor().relay_parent == parent_hash, Error::::CandidateNotInParentContext, ); - - // if any, the code upgrade attempt is allowed. - let valid_upgrade_attempt = - candidate.candidate.commitments.new_validation_code.is_none() || - >::last_code_upgrade(para_id, true) - .map_or( - true, - |last| last <= relay_parent_number && - relay_parent_number.saturating_sub(last) - >= config.validation_upgrade_frequency, - ); - - ensure!( - valid_upgrade_attempt, - Error::::PrematureCodeUpgrade, - ); ensure!( candidate.descriptor().check_collator_signature().is_ok(), Error::::NotCollatorSigned, ); + if let Err(err) = check_cx + .check_validation_outputs( + para_id, + &candidate.candidate.commitments.head_data, + &candidate.candidate.commitments.new_validation_code, + candidate.candidate.commitments.processed_downward_messages, + &candidate.candidate.commitments.upward_messages, + T::BlockNumber::from(candidate.candidate.commitments.hrmp_watermark), + &candidate.candidate.commitments.horizontal_messages, + ) + { + frame_support::debug::RuntimeLogger::init(); + log::debug!( + target: LOG_TARGET, + "Validation outputs checking during inclusion of a candidate {} for parachain `{}` failed: {:?}", + candidate_idx, + u32::from(para_id), + err, + ); + Err(err.strip_into_dispatch_err::())?; + }; + for (i, assignment) in scheduled[skip..].iter().enumerate() { check_assignment_in_order(assignment)?; @@ -435,7 +490,11 @@ impl Module { { // this should never fail because the para is registered let persisted_validation_data = - match crate::util::make_persisted_validation_data::(para_id) { + match crate::util::make_persisted_validation_data::( + para_id, + relay_parent_number, + parent_storage_root, + ) { Some(l) => l, None => { // We don't want to error out here because it will @@ -484,9 +543,19 @@ impl Module { ), Err(()) => { Err(Error::::InvalidBacking)?; } } + + for (bit_idx, _) in candidate + .validator_indices.iter() + .enumerate().filter(|(_, signed)| **signed) + { + let val_idx = group_vals.get(bit_idx) + .expect("this query done above; qed"); + + backers.set(*val_idx as _, true); + } } - core_indices.push(assignment.core); + core_indices_and_backers.push((assignment.core, backers)); continue 'a; } } @@ -498,18 +567,19 @@ impl Module { false, Error::::UnscheduledCandidate, ); - }; + } // check remainder of scheduled cores, if any. for assignment in scheduled[skip..].iter() { check_assignment_in_order(assignment)?; } - core_indices + core_indices_and_backers }; // one more sweep for actually writing to storage. - for (candidate, core) in candidates.into_iter().zip(core_indices.iter().cloned()) { + let core_indices = core_indices_and_backers.iter().map(|&(ref c, _)| c.clone()).collect(); + for (candidate, (core, backers)) in candidates.into_iter().zip(core_indices_and_backers) { let para_id = candidate.descriptor().para_id; // initialize all availability votes to 0. @@ -521,6 +591,8 @@ impl Module { candidate.candidate.commitments.head_data.clone(), )); + let candidate_hash = candidate.candidate.hash(); + let (descriptor, commitments) = ( candidate.candidate.descriptor, candidate.candidate.commitments, @@ -528,10 +600,12 @@ impl Module { >::insert(¶_id, CandidatePendingAvailability { core, + hash: candidate_hash, descriptor, availability_votes, relay_parent_number, - backed_in_number: now, + backers, + backed_in_number: check_cx.now, }); ::insert(¶_id, commitments); } @@ -539,14 +613,59 @@ impl Module { Ok(core_indices) } + /// Run the acceptance criteria checks on the given candidate commitments. + pub(crate) fn check_validation_outputs_for_runtime_api( + para_id: ParaId, + validation_outputs: primitives::v1::CandidateCommitments, + ) -> bool { + // This function is meant to be called from the runtime APIs against the relay-parent, hence + // `relay_parent_number` is equal to `now`. + let now = >::block_number(); + let relay_parent_number = now; + let check_cx = CandidateCheckContext::::new(now, relay_parent_number); + + if let Err(err) = check_cx.check_validation_outputs( + para_id, + &validation_outputs.head_data, + &validation_outputs.new_validation_code, + validation_outputs.processed_downward_messages, + &validation_outputs.upward_messages, + T::BlockNumber::from(validation_outputs.hrmp_watermark), + &validation_outputs.horizontal_messages, + ) { + frame_support::debug::RuntimeLogger::init(); + log::debug!( + target: LOG_TARGET, + "Validation outputs checking for parachain `{}` failed: {:?}", + u32::from(para_id), + err, + ); + false + } else { + true + } + } + fn enact_candidate( relay_parent_number: T::BlockNumber, receipt: CommittedCandidateReceipt, + backers: BitVec, + availability_votes: BitVec, ) -> Weight { let plain = receipt.to_plain(); let commitments = receipt.commitments; let config = >::config(); + T::RewardValidators::reward_backing(backers.iter().enumerate() + .filter(|(_, backed)| **backed) + .map(|(i, _)| i as _) + ); + + T::RewardValidators::reward_bitfields(availability_votes.iter().enumerate() + .filter(|(_, voted)| **voted) + .map(|(i, _)| i as _) + ); + // initial weight is config read. let mut weight = T::DbWeight::get().reads_writes(1, 0); if let Some(new_code) = commitments.new_validation_code { @@ -557,6 +676,24 @@ impl Module { ); } + // enact the messaging facet of the candidate. + weight += >::prune_dmq( + receipt.descriptor.para_id, + commitments.processed_downward_messages, + ); + weight += >::enact_upward_messages( + receipt.descriptor.para_id, + commitments.upward_messages, + ); + weight += >::prune_hrmp( + receipt.descriptor.para_id, + T::BlockNumber::from(commitments.hrmp_watermark), + ); + weight += >::queue_outbound_hrmp( + receipt.descriptor.para_id, + commitments.horizontal_messages, + ); + Self::deposit_event( Event::::CandidateIncluded(plain, commitments.head_data.clone()) ); @@ -625,6 +762,8 @@ impl Module { Self::enact_candidate( pending.relay_parent_number, candidate, + pending.backers, + pending.availability_votes, ); } } @@ -654,18 +793,118 @@ const fn availability_threshold(n_validators: usize) -> usize { threshold } +#[derive(derive_more::From, Debug)] +enum AcceptanceCheckErr { + HeadDataTooLarge, + PrematureCodeUpgrade, + NewCodeTooLarge, + ProcessedDownwardMessages(dmp::ProcessedDownwardMessagesAcceptanceErr), + UpwardMessages(ump::AcceptanceCheckErr), + HrmpWatermark(hrmp::HrmpWatermarkAcceptanceErr), + OutboundHrmp(hrmp::OutboundHrmpAcceptanceErr), +} + +impl AcceptanceCheckErr { + /// Returns the same error so that it can be threaded through a needle of `DispatchError` and + /// ultimately returned from a `Dispatchable`. + fn strip_into_dispatch_err(self) -> Error { + use AcceptanceCheckErr::*; + match self { + HeadDataTooLarge => Error::::HeadDataTooLarge, + PrematureCodeUpgrade => Error::::PrematureCodeUpgrade, + NewCodeTooLarge => Error::::NewCodeTooLarge, + ProcessedDownwardMessages(_) => Error::::IncorrectDownwardMessageHandling, + UpwardMessages(_) => Error::::InvalidUpwardMessages, + HrmpWatermark(_) => Error::::HrmpWatermarkMishandling, + OutboundHrmp(_) => Error::::InvalidOutboundHrmp, + } + } +} + +/// A collection of data required for checking a candidate. +struct CandidateCheckContext { + config: configuration::HostConfiguration, + now: T::BlockNumber, + relay_parent_number: T::BlockNumber, +} + +impl CandidateCheckContext { + fn new(now: T::BlockNumber, relay_parent_number: T::BlockNumber) -> Self { + Self { + config: >::config(), + now, + relay_parent_number, + } + } + + /// Check the given outputs after candidate validation on whether it passes the acceptance + /// criteria. + fn check_validation_outputs( + &self, + para_id: ParaId, + head_data: &HeadData, + new_validation_code: &Option, + processed_downward_messages: u32, + upward_messages: &[primitives::v1::UpwardMessage], + hrmp_watermark: T::BlockNumber, + horizontal_messages: &[primitives::v1::OutboundHrmpMessage], + ) -> Result<(), AcceptanceCheckErr> { + ensure!( + head_data.0.len() <= self.config.max_head_data_size as _, + AcceptanceCheckErr::HeadDataTooLarge, + ); + + // if any, the code upgrade attempt is allowed. + if let Some(new_validation_code) = new_validation_code { + let valid_upgrade_attempt = >::last_code_upgrade(para_id, true) + .map_or(true, |last| { + last <= self.relay_parent_number + && self.relay_parent_number.saturating_sub(last) + >= self.config.validation_upgrade_frequency + }); + ensure!( + valid_upgrade_attempt, + AcceptanceCheckErr::PrematureCodeUpgrade, + ); + ensure!( + new_validation_code.0.len() <= self.config.max_code_size as _, + AcceptanceCheckErr::NewCodeTooLarge, + ); + } + + // check if the candidate passes the messaging acceptance criteria + >::check_processed_downward_messages( + para_id, + processed_downward_messages, + )?; + >::check_upward_messages(&self.config, para_id, upward_messages)?; + >::check_hrmp_watermark( + para_id, + self.relay_parent_number, + hrmp_watermark, + )?; + >::check_outbound_hrmp(&self.config, para_id, horizontal_messages)?; + + Ok(()) + } +} + #[cfg(test)] mod tests { use super::*; + use std::sync::Arc; + use futures::executor::block_on; + use primitives::v0::PARACHAIN_KEY_TYPE_ID; use primitives::v1::{BlockNumber, Hash}; use primitives::v1::{ SignedAvailabilityBitfield, CompactStatement as Statement, ValidityAttestation, CollatorId, CandidateCommitments, SignedStatement, CandidateDescriptor, ValidationCode, }; + use sp_keystore::{SyncCryptoStorePtr, SyncCryptoStore}; use frame_support::traits::{OnFinalize, OnInitialize}; use keyring::Sr25519Keyring; - + use sc_keystore::LocalKeystore; use crate::mock::{ new_test_ext, Configuration, Paras, System, Inclusion, GenesisConfig as MockGenesisConfig, Test, @@ -678,6 +917,7 @@ mod tests { fn default_config() -> HostConfiguration { let mut config = HostConfiguration::default(); config.parathread_cores = 1; + config.max_code_size = 3; config } @@ -724,10 +964,11 @@ mod tests { assert!(candidate.descriptor().check_collator_signature().is_ok()); } - fn back_candidate( + async fn back_candidate( candidate: CommittedCandidateReceipt, validators: &[Sr25519Keyring], group: &[ValidatorIndex], + keystore: &SyncCryptoStorePtr, signing_context: &SigningContext, kind: BackingKind, ) -> BackedCandidate { @@ -748,11 +989,12 @@ mod tests { *validator_indices.get_mut(idx_in_group).unwrap() = true; let signature = SignedStatement::sign( + &keystore, Statement::Valid(candidate_hash), signing_context, *val_idx, - &key.pair().into(), - ).signature().clone(); + &key.public().into(), + ).await.unwrap().signature().clone(); validity_votes.push(ValidityAttestation::Explicit(signature).into()); } @@ -819,11 +1061,24 @@ mod tests { bitvec::bitvec![BitOrderLsb0, u8; 0; Validators::get().len()] } + fn default_backing_bitfield() -> BitVec { + bitvec::bitvec![BitOrderLsb0, u8; 0; Validators::get().len()] + } + + fn backing_bitfield(v: &[usize]) -> BitVec { + let mut b = default_backing_bitfield(); + for i in v { + b.set(*i, true); + } + b + } + fn validator_pubkeys(val_ids: &[Sr25519Keyring]) -> Vec { val_ids.iter().map(|v| v.public().into()).collect() } - fn sign_bitfield( + async fn sign_bitfield( + keystore: &SyncCryptoStorePtr, key: &Sr25519Keyring, validator_index: ValidatorIndex, bitfield: AvailabilityBitfield, @@ -832,11 +1087,12 @@ mod tests { -> SignedAvailabilityBitfield { SignedAvailabilityBitfield::sign( + &keystore, bitfield, &signing_context, validator_index, - &key.pair().into(), - ) + &key.public().into(), + ).await.unwrap() } #[derive(Default)] @@ -847,6 +1103,7 @@ mod tests { relay_parent: Hash, persisted_validation_data_hash: Hash, new_validation_code: Option, + hrmp_watermark: BlockNumber, } impl TestCandidateBuilder { @@ -862,6 +1119,7 @@ mod tests { commitments: CandidateCommitments { head_data: self.head_data, new_validation_code: self.new_validation_code, + hrmp_watermark: self.hrmp_watermark, ..Default::default() }, } @@ -869,8 +1127,13 @@ mod tests { } fn make_vdata_hash(para_id: ParaId) -> Option { + let relay_parent_number = >::block_number() - 1; let persisted_validation_data - = crate::util::make_persisted_validation_data::(para_id)?; + = crate::util::make_persisted_validation_data::( + para_id, + relay_parent_number, + Default::default(), + )?; Some(persisted_validation_data.hash()) } @@ -885,19 +1148,23 @@ mod tests { let default_candidate = TestCandidateBuilder::default().build(); >::insert(chain_a, CandidatePendingAvailability { core: CoreIndex::from(0), + hash: default_candidate.hash(), descriptor: default_candidate.descriptor.clone(), availability_votes: default_availability_votes(), relay_parent_number: 0, backed_in_number: 0, + backers: default_backing_bitfield(), }); PendingAvailabilityCommitments::insert(chain_a, default_candidate.commitments.clone()); >::insert(&chain_b, CandidatePendingAvailability { core: CoreIndex::from(1), + 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(), }); PendingAvailabilityCommitments::insert(chain_b, default_candidate.commitments); @@ -931,6 +1198,10 @@ mod tests { Sr25519Keyring::Dave, Sr25519Keyring::Ferdie, ]; + let keystore: SyncCryptoStorePtr = Arc::new(LocalKeystore::in_memory()); + for validator in validators.iter() { + SyncCryptoStore::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(|| { @@ -953,12 +1224,13 @@ mod tests { { let mut bare_bitfield = default_bitfield(); bare_bitfield.0.push(false); - let signed = sign_bitfield( + let signed = block_on(sign_bitfield( + &keystore, &validators[0], 0, bare_bitfield, &signing_context, - ); + )); assert!(Inclusion::process_bitfields( vec![signed], @@ -969,12 +1241,13 @@ mod tests { // duplicate. { let bare_bitfield = default_bitfield(); - let signed = sign_bitfield( + let signed = block_on(sign_bitfield( + &keystore, &validators[0], 0, bare_bitfield, &signing_context, - ); + )); assert!(Inclusion::process_bitfields( vec![signed.clone(), signed], @@ -985,19 +1258,21 @@ mod tests { // out of order. { let bare_bitfield = default_bitfield(); - let signed_0 = sign_bitfield( + let signed_0 = block_on(sign_bitfield( + &keystore, &validators[0], 0, bare_bitfield.clone(), &signing_context, - ); + )); - let signed_1 = sign_bitfield( + let signed_1 = block_on(sign_bitfield( + &keystore, &validators[1], 1, bare_bitfield, &signing_context, - ); + )); assert!(Inclusion::process_bitfields( vec![signed_1, signed_0], @@ -1009,12 +1284,13 @@ mod tests { { let mut bare_bitfield = default_bitfield(); *bare_bitfield.0.get_mut(0).unwrap() = true; - let signed = sign_bitfield( + let signed = block_on(sign_bitfield( + &keystore, &validators[0], 0, bare_bitfield, &signing_context, - ); + )); assert!(Inclusion::process_bitfields( vec![signed], @@ -1025,12 +1301,13 @@ mod tests { // empty bitfield signed: always OK, but kind of useless. { let bare_bitfield = default_bitfield(); - let signed = sign_bitfield( + let signed = block_on(sign_bitfield( + &keystore, &validators[0], 0, bare_bitfield, &signing_context, - ); + )); assert!(Inclusion::process_bitfields( vec![signed], @@ -1047,20 +1324,23 @@ mod tests { 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(), }); PendingAvailabilityCommitments::insert(chain_a, default_candidate.commitments); *bare_bitfield.0.get_mut(0).unwrap() = true; - let signed = sign_bitfield( + let signed = block_on(sign_bitfield( + &keystore, &validators[0], 0, bare_bitfield, &signing_context, - ); + )); assert!(Inclusion::process_bitfields( vec![signed], @@ -1080,19 +1360,22 @@ mod tests { 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(), }); *bare_bitfield.0.get_mut(0).unwrap() = true; - let signed = sign_bitfield( + let signed = block_on(sign_bitfield( + &keystore, &validators[0], 0, bare_bitfield, &signing_context, - ); + )); // no core is freed assert_eq!( @@ -1120,6 +1403,10 @@ mod tests { Sr25519Keyring::Dave, Sr25519Keyring::Ferdie, ]; + let keystore: SyncCryptoStorePtr = Arc::new(LocalKeystore::in_memory()); + for validator in validators.iter() { + SyncCryptoStore::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(|| { @@ -1146,10 +1433,12 @@ mod tests { >::insert(chain_a, CandidatePendingAvailability { core: CoreIndex::from(0), + hash: candidate_a.hash(), descriptor: candidate_a.descriptor, availability_votes: default_availability_votes(), relay_parent_number: 0, backed_in_number: 0, + backers: backing_bitfield(&[3, 4]), }); PendingAvailabilityCommitments::insert(chain_a, candidate_a.commitments); @@ -1161,10 +1450,12 @@ mod tests { >::insert(chain_b, CandidatePendingAvailability { core: CoreIndex::from(1), + hash: candidate_b.hash(), descriptor: candidate_b.descriptor, availability_votes: default_availability_votes(), relay_parent_number: 0, backed_in_number: 0, + backers: backing_bitfield(&[0, 2]), }); PendingAvailabilityCommitments::insert(chain_b, candidate_b.commitments); @@ -1200,12 +1491,13 @@ mod tests { return None }; - Some(sign_bitfield( + Some(block_on(sign_bitfield( + &keystore, key, i as ValidatorIndex, to_sign, &signing_context, - )) + ))) }).collect(); assert!(Inclusion::process_bitfields( @@ -1234,6 +1526,25 @@ mod tests { // and check that chain head was enacted. assert_eq!(Paras::para_head(&chain_a), Some(vec![1, 2, 3, 4].into())); + + // Check that rewards are applied. + { + let rewards = crate::mock::availability_rewards(); + + assert_eq!(rewards.len(), 4); + assert_eq!(rewards.get(&0).unwrap(), &1); + assert_eq!(rewards.get(&1).unwrap(), &1); + assert_eq!(rewards.get(&2).unwrap(), &1); + assert_eq!(rewards.get(&3).unwrap(), &1); + } + + { + let rewards = crate::mock::backing_rewards(); + + assert_eq!(rewards.len(), 2); + assert_eq!(rewards.get(&3).unwrap(), &1); + assert_eq!(rewards.get(&4).unwrap(), &1); + } }); } @@ -1243,6 +1554,9 @@ mod tests { let chain_b = ParaId::from(2); let thread_a = ParaId::from(3); + // The block number of the relay-parent for testing. + const RELAY_PARENT_NUM: BlockNumber = 4; + let paras = vec![(chain_a, true), (chain_b, true), (thread_a, false)]; let validators = vec![ Sr25519Keyring::Alice, @@ -1251,6 +1565,10 @@ mod tests { Sr25519Keyring::Dave, Sr25519Keyring::Ferdie, ]; + let keystore: SyncCryptoStorePtr = Arc::new(LocalKeystore::in_memory()); + for validator in validators.iter() { + SyncCryptoStore::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(|| { @@ -1299,8 +1617,9 @@ mod tests { let mut candidate = TestCandidateBuilder { para_id: chain_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([1; 32]), + 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( @@ -1308,16 +1627,18 @@ mod tests { &mut candidate, ); - let backed = back_candidate( + let backed = block_on(back_candidate( candidate, &validators, group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); assert_eq!( Inclusion::process_candidates( + Default::default(), vec![backed], vec![chain_b_assignment.clone()], &group_validators, @@ -1331,15 +1652,17 @@ mod tests { let mut candidate_a = TestCandidateBuilder { para_id: chain_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([1; 32]), + pov_hash: Hash::repeat_byte(1), persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), + hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() }.build(); let mut candidate_b = TestCandidateBuilder { para_id: chain_b, relay_parent: System::parent_hash(), - pov_hash: Hash::from([2; 32]), + pov_hash: Hash::repeat_byte(2), persisted_validation_data_hash: make_vdata_hash(chain_b).unwrap(), + hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() }.build(); @@ -1353,25 +1676,28 @@ mod tests { &mut candidate_b, ); - let backed_a = back_candidate( + let backed_a = block_on(back_candidate( candidate_a, &validators, group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); - let backed_b = back_candidate( + let backed_b = block_on(back_candidate( candidate_b, &validators, group_validators(GroupIndex::from(1)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); // out-of-order manifests as unscheduled. assert_eq!( Inclusion::process_candidates( + Default::default(), vec![backed_b, backed_a], vec![chain_a_assignment.clone(), chain_b_assignment.clone()], &group_validators, @@ -1385,8 +1711,9 @@ mod tests { let mut candidate = TestCandidateBuilder { para_id: chain_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([1; 32]), + 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( @@ -1394,16 +1721,18 @@ mod tests { &mut candidate, ); - let backed = back_candidate( + let backed = block_on(back_candidate( candidate, &validators, group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Lacking, - ); + )); assert_eq!( Inclusion::process_candidates( + Default::default(), vec![backed], vec![chain_a_assignment.clone()], &group_validators, @@ -1414,13 +1743,13 @@ mod tests { // candidate not in parent context. { - let wrong_parent_hash = Hash::from([222; 32]); + let wrong_parent_hash = Hash::repeat_byte(222); assert!(System::parent_hash() != wrong_parent_hash); let mut candidate = TestCandidateBuilder { para_id: chain_a, relay_parent: wrong_parent_hash, - pov_hash: Hash::from([1; 32]), + pov_hash: Hash::repeat_byte(1), persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), ..Default::default() }.build(); @@ -1429,16 +1758,18 @@ mod tests { &mut candidate, ); - let backed = back_candidate( + let backed = block_on(back_candidate( candidate, &validators, group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); assert_eq!( Inclusion::process_candidates( + Default::default(), vec![backed], vec![chain_a_assignment.clone()], &group_validators, @@ -1452,8 +1783,9 @@ mod tests { let mut candidate = TestCandidateBuilder { para_id: thread_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([1; 32]), + pov_hash: Hash::repeat_byte(1), persisted_validation_data_hash: make_vdata_hash(thread_a).unwrap(), + hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() }.build(); @@ -1463,16 +1795,18 @@ mod tests { &mut candidate, ); - let backed = back_candidate( + let backed = block_on(back_candidate( candidate, &validators, group_validators(GroupIndex::from(2)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); assert_eq!( Inclusion::process_candidates( + Default::default(), vec![backed], vec![ chain_a_assignment.clone(), @@ -1490,8 +1824,9 @@ mod tests { let mut candidate = TestCandidateBuilder { para_id: thread_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([1; 32]), + pov_hash: Hash::repeat_byte(1), persisted_validation_data_hash: make_vdata_hash(thread_a).unwrap(), + hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() }.build(); @@ -1502,18 +1837,20 @@ mod tests { ); // change the candidate after signing. - candidate.descriptor.pov_hash = Hash::from([2; 32]); + candidate.descriptor.pov_hash = Hash::repeat_byte(2); - let backed = back_candidate( + let backed = block_on(back_candidate( candidate, &validators, group_validators(GroupIndex::from(2)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); assert_eq!( Inclusion::process_candidates( + Default::default(), vec![backed], vec![thread_a_assignment.clone()], &group_validators, @@ -1527,8 +1864,9 @@ mod tests { let mut candidate = TestCandidateBuilder { para_id: chain_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([1; 32]), + pov_hash: Hash::repeat_byte(1), persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), + hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() }.build(); @@ -1537,26 +1875,30 @@ mod tests { &mut candidate, ); - let backed = back_candidate( + let backed = block_on(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(), }); ::insert(&chain_a, candidate.commitments); assert_eq!( Inclusion::process_candidates( + Default::default(), vec![backed], vec![chain_a_assignment.clone()], &group_validators, @@ -1573,8 +1915,9 @@ mod tests { let mut candidate = TestCandidateBuilder { para_id: chain_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([1; 32]), + pov_hash: Hash::repeat_byte(1), persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), + hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() }.build(); @@ -1586,16 +1929,18 @@ mod tests { // this is not supposed to happen ::insert(&chain_a, candidate.commitments.clone()); - let backed = back_candidate( + let backed = block_on(back_candidate( candidate, &validators, group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); assert_eq!( Inclusion::process_candidates( + Default::default(), vec![backed], vec![chain_a_assignment.clone()], &group_validators, @@ -1611,9 +1956,10 @@ mod tests { let mut candidate = TestCandidateBuilder { para_id: chain_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([1; 32]), + pov_hash: Hash::repeat_byte(1), new_validation_code: Some(vec![5, 6, 7, 8].into()), persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), + hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() }.build(); @@ -1622,13 +1968,14 @@ mod tests { &mut candidate, ); - let backed = back_candidate( + let backed = block_on(back_candidate( candidate, &validators, group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); Paras::schedule_code_upgrade( chain_a, @@ -1640,6 +1987,7 @@ mod tests { assert_eq!( Inclusion::process_candidates( + Default::default(), vec![backed], vec![chain_a_assignment.clone()], &group_validators, @@ -1653,8 +2001,9 @@ mod tests { let mut candidate = TestCandidateBuilder { para_id: chain_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([1; 32]), + pov_hash: Hash::repeat_byte(1), persisted_validation_data_hash: [42u8; 32].into(), + hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() }.build(); @@ -1663,16 +2012,18 @@ mod tests { &mut candidate, ); - let backed = back_candidate( + let backed = block_on(back_candidate( candidate, &validators, group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); assert_eq!( Inclusion::process_candidates( + Default::default(), vec![backed], vec![chain_a_assignment.clone()], &group_validators, @@ -1689,6 +2040,9 @@ mod tests { let chain_b = ParaId::from(2); let thread_a = ParaId::from(3); + // The block number of the relay-parent for testing. + const RELAY_PARENT_NUM: BlockNumber = 4; + let paras = vec![(chain_a, true), (chain_b, true), (thread_a, false)]; let validators = vec![ Sr25519Keyring::Alice, @@ -1697,6 +2051,10 @@ mod tests { Sr25519Keyring::Dave, Sr25519Keyring::Ferdie, ]; + let keystore: SyncCryptoStorePtr = Arc::new(LocalKeystore::in_memory()); + for validator in validators.iter() { + SyncCryptoStore::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(|| { @@ -1743,8 +2101,9 @@ mod tests { let mut candidate_a = TestCandidateBuilder { para_id: chain_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([1; 32]), + 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( @@ -1755,8 +2114,9 @@ mod tests { let mut candidate_b = TestCandidateBuilder { para_id: chain_b, relay_parent: System::parent_hash(), - pov_hash: Hash::from([2; 32]), + 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( @@ -1767,8 +2127,9 @@ mod tests { let mut candidate_c = TestCandidateBuilder { para_id: thread_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([3; 32]), + pov_hash: Hash::repeat_byte(3), persisted_validation_data_hash: make_vdata_hash(thread_a).unwrap(), + hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() }.build(); collator_sign_candidate( @@ -1776,31 +2137,35 @@ mod tests { &mut candidate_c, ); - let backed_a = back_candidate( + let backed_a = block_on(back_candidate( candidate_a.clone(), &validators, group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); - let backed_b = back_candidate( + let backed_b = block_on(back_candidate( candidate_b.clone(), &validators, group_validators(GroupIndex::from(1)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); - let backed_c = back_candidate( + let backed_c = block_on(back_candidate( candidate_c.clone(), &validators, group_validators(GroupIndex::from(2)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); let occupied_cores = Inclusion::process_candidates( + Default::default(), vec![backed_a, backed_b, backed_c], vec![ chain_a_assignment.clone(), @@ -1816,10 +2181,12 @@ mod tests { >::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_bitfield(&[0, 1]), }) ); assert_eq!( @@ -1831,10 +2198,12 @@ mod tests { >::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_bitfield(&[2, 3]), }) ); assert_eq!( @@ -1846,10 +2215,12 @@ mod tests { >::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]), }) ); assert_eq!( @@ -1863,6 +2234,9 @@ mod tests { fn can_include_candidate_with_ok_code_upgrade() { let chain_a = ParaId::from(1); + // The block number of the relay-parent for testing. + const RELAY_PARENT_NUM: BlockNumber = 4; + let paras = vec![(chain_a, true)]; let validators = vec![ Sr25519Keyring::Alice, @@ -1871,6 +2245,10 @@ mod tests { Sr25519Keyring::Dave, Sr25519Keyring::Ferdie, ]; + let keystore: SyncCryptoStorePtr = Arc::new(LocalKeystore::in_memory()); + for validator in validators.iter() { + SyncCryptoStore::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(|| { @@ -1899,9 +2277,10 @@ mod tests { let mut candidate_a = TestCandidateBuilder { para_id: chain_a, relay_parent: System::parent_hash(), - pov_hash: Hash::from([1; 32]), + 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()), + hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() }.build(); collator_sign_candidate( @@ -1909,15 +2288,17 @@ mod tests { &mut candidate_a, ); - let backed_a = back_candidate( + let backed_a = block_on(back_candidate( candidate_a.clone(), &validators, group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &keystore, &signing_context, BackingKind::Threshold, - ); + )); let occupied_cores = Inclusion::process_candidates( + Default::default(), vec![backed_a], vec![ chain_a_assignment.clone(), @@ -1931,10 +2312,12 @@ mod tests { >::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_bitfield(&[0, 1, 2]), }) ); assert_eq!( @@ -1958,6 +2341,10 @@ mod tests { Sr25519Keyring::Dave, Sr25519Keyring::Ferdie, ]; + let keystore: SyncCryptoStorePtr = Arc::new(LocalKeystore::in_memory()); + for validator in validators.iter() { + SyncCryptoStore::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(|| { @@ -2001,19 +2388,23 @@ mod tests { let candidate = TestCandidateBuilder::default().build(); >::insert(&chain_a, CandidatePendingAvailability { core: CoreIndex::from(0), + hash: candidate.hash(), descriptor: candidate.descriptor.clone(), availability_votes: default_availability_votes(), relay_parent_number: 5, backed_in_number: 6, + backers: default_backing_bitfield(), }); ::insert(&chain_a, candidate.commitments.clone()); >::insert(&chain_b, CandidatePendingAvailability { core: CoreIndex::from(1), + hash: candidate.hash(), descriptor: candidate.descriptor, availability_votes: default_availability_votes(), relay_parent_number: 6, backed_in_number: 7, + backers: default_backing_bitfield(), }); ::insert(&chain_b, candidate.commitments); diff --git a/runtime/parachains/src/inclusion_inherent.rs b/runtime/parachains/src/inclusion_inherent.rs index f9a7465d91282d60274c53d121af203df8aaaa2e..3747f33fda5514d02b3063acd583a38255c28ce1 100644 --- a/runtime/parachains/src/inclusion_inherent.rs +++ b/runtime/parachains/src/inclusion_inherent.rs @@ -23,11 +23,11 @@ use sp_std::prelude::*; use primitives::v1::{ - BackedCandidate, SignedAvailabilityBitfields, INCLUSION_INHERENT_IDENTIFIER, + BackedCandidate, SignedAvailabilityBitfields, INCLUSION_INHERENT_IDENTIFIER, Header, }; use frame_support::{ decl_error, decl_module, decl_storage, ensure, - dispatch::DispatchResult, + dispatch::DispatchResultWithPostInfo, weights::{DispatchClass, Weight}, traits::Get, }; @@ -35,13 +35,20 @@ use frame_system::ensure_none; use crate::{ inclusion, scheduler::{self, FreedReason}, + ump, }; use inherents::{InherentIdentifier, InherentData, MakeFatalError, ProvideInherent}; -pub trait Trait: inclusion::Trait + scheduler::Trait {} +// In the future, we should benchmark these consts; these are all untested assumptions for now. +const BACKED_CANDIDATE_WEIGHT: Weight = 100_000; +const INCLUSION_INHERENT_CLAIMED_WEIGHT: Weight = 1_000_000_000; +// we assume that 75% of an inclusion inherent's weight is used processing backed candidates +const MINIMAL_INCLUSION_INHERENT_WEIGHT: Weight = INCLUSION_INHERENT_CLAIMED_WEIGHT / 4; + +pub trait Config: inclusion::Config + scheduler::Config {} decl_storage! { - trait Store for Module as ParaInclusionInherent { + trait Store for Module as ParaInclusionInherent { /// Whether the inclusion inherent was included within this block. /// /// The `Option<()>` is effectively a bool, but it never hits storage in the `None` variant @@ -53,15 +60,18 @@ decl_storage! { } decl_error! { - pub enum Error for Module { + pub enum Error for Module { /// Inclusion inherent called more than once per block. TooManyInclusionInherents, + /// The hash of the submitted parent header doesn't correspond to the saved block hash of + /// the parent. + InvalidParentHeader, } } decl_module! { /// The inclusion inherent module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; fn on_initialize() -> Weight { @@ -75,15 +85,26 @@ decl_module! { } /// Include backed candidates and bitfields. - #[weight = (1_000_000_000, DispatchClass::Mandatory)] + #[weight = ( + MINIMAL_INCLUSION_INHERENT_WEIGHT + backed_candidates.len() as Weight * BACKED_CANDIDATE_WEIGHT, + DispatchClass::Mandatory, + )] pub fn inclusion( origin, signed_bitfields: SignedAvailabilityBitfields, backed_candidates: Vec>, - ) -> DispatchResult { + parent_header: Header, + ) -> DispatchResultWithPostInfo { ensure_none(origin)?; ensure!(!::exists(), Error::::TooManyInclusionInherents); + // Check that the submitted parent header indeed corresponds to the previous block hash. + let parent_hash = >::parent_hash(); + ensure!( + parent_header.hash().as_ref() == parent_hash.as_ref(), + Error::::InvalidParentHeader, + ); + // Process new availability bitfields, yielding any availability cores whose // work has now concluded. let freed_concluded = >::process_bitfields( @@ -103,10 +124,15 @@ decl_module! { let freed = freed_concluded.into_iter().map(|c| (c, FreedReason::Concluded)) .chain(freed_timeout.into_iter().map(|c| (c, FreedReason::TimedOut))); - >::schedule(freed.collect()); + >::schedule(freed); + + let backed_candidates = limit_backed_candidates::(backed_candidates); + let backed_candidates_len = backed_candidates.len() as Weight; // Process backed candidates according to scheduled cores. + let parent_storage_root = parent_header.state_root; let occupied = >::process_candidates( + parent_storage_root, backed_candidates, >::scheduled(), >::group_validators, @@ -115,15 +141,42 @@ decl_module! { // Note which of the scheduled cores were actually occupied by a backed candidate. >::occupied(&occupied); + // Give some time slice to dispatch pending upward messages. + >::process_pending_upward_messages(); + // And track that we've finished processing the inherent for this block. Included::set(Some(())); - Ok(()) + Ok(Some( + MINIMAL_INCLUSION_INHERENT_WEIGHT + + (backed_candidates_len * BACKED_CANDIDATE_WEIGHT) + ).into()) } } } -impl ProvideInherent for Module { +/// Limit the number of backed candidates processed in order to stay within block weight limits. +/// +/// Use a configured assumption about the weight required to process a backed candidate and the +/// current block weight as of the execution of this function to ensure that we don't overload +/// the block with candidate processing. +/// +/// If the backed candidates exceed the available block weight remaining, then skips all of them. +/// This is somewhat less desirable than attempting to fit some of them, but is more fair in the +/// even that we can't trust the provisioner to provide a fair / random ordering of candidates. +fn limit_backed_candidates( + backed_candidates: Vec>, +) -> Vec> { + // the weight of the inclusion inherent is already included in the current block weight, + // so our operation is simple: if the block is currently overloaded, make this intrinsic smaller + if frame_system::Module::::block_weight().total() > ::BlockWeights::get().max_block { + Vec::new() + } else { + backed_candidates + } +} + +impl ProvideInherent for Module { type Call = Call; type Error = MakeFatalError<()>; const INHERENT_IDENTIFIER: InherentIdentifier = INCLUSION_INHERENT_IDENTIFIER; @@ -131,14 +184,180 @@ impl ProvideInherent for Module { fn create_inherent(data: &InherentData) -> Option { data.get_data(&Self::INHERENT_IDENTIFIER) .expect("inclusion inherent data failed to decode") - .map(|(signed_bitfields, backed_candidates): (SignedAvailabilityBitfields, Vec>)| { - // Sanity check: session changes can invalidate an inherent, and we _really_ don't want that to happen. - // See github.com/paritytech/polkadot/issues/1327 - if Self::inclusion(frame_system::RawOrigin::None.into(), signed_bitfields.clone(), backed_candidates.clone()).is_ok() { - Call::inclusion(signed_bitfields, backed_candidates) - } else { - Call::inclusion(Vec::new().into(), Vec::new()) + .map( + |(signed_bitfields, backed_candidates, parent_header): ( + SignedAvailabilityBitfields, + Vec>, + Header, + )| { + // Sanity check: session changes can invalidate an inherent, and we _really_ don't want that to happen. + // See github.com/paritytech/polkadot/issues/1327 + if Self::inclusion( + frame_system::RawOrigin::None.into(), + signed_bitfields.clone(), + backed_candidates.clone(), + parent_header.clone(), + ) + .is_ok() + { + Call::inclusion(signed_bitfields, backed_candidates, parent_header) + } else { + Call::inclusion(Vec::new().into(), Vec::new(), parent_header) + } + } + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use crate::mock::{ + new_test_ext, System, GenesisConfig as MockGenesisConfig, Test + }; + + mod limit_backed_candidates { + use super::*; + + #[test] + fn does_not_truncate_on_empty_block() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + let backed_candidates = vec![BackedCandidate::default()]; + System::set_block_consumed_resources(0, 0); + assert_eq!(limit_backed_candidates::(backed_candidates).len(), 1); + }); + } + + #[test] + fn does_not_truncate_on_exactly_full_block() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + let backed_candidates = vec![BackedCandidate::default()]; + let max_block_weight = ::BlockWeights::get().max_block; + // if the consumed resources are precisely equal to the max block weight, we do not truncate. + System::set_block_consumed_resources(max_block_weight, 0); + assert_eq!(limit_backed_candidates::(backed_candidates).len(), 1); + }); + } + + #[test] + fn truncates_on_over_full_block() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + let backed_candidates = vec![BackedCandidate::default()]; + let max_block_weight = ::BlockWeights::get().max_block; + // if the consumed resources are precisely equal to the max block weight, we do not truncate. + System::set_block_consumed_resources(max_block_weight + 1, 0); + assert_eq!(limit_backed_candidates::(backed_candidates).len(), 0); + }); + } + + #[test] + fn all_backed_candidates_get_truncated() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + let backed_candidates = vec![BackedCandidate::default(); 10]; + let max_block_weight = ::BlockWeights::get().max_block; + // if the consumed resources are precisely equal to the max block weight, we do not truncate. + System::set_block_consumed_resources(max_block_weight + 1, 0); + assert_eq!(limit_backed_candidates::(backed_candidates).len(), 0); + }); + } + } + + mod inclusion_inherent_weight { + use super::*; + + use crate::mock::{ + new_test_ext, System, GenesisConfig as MockGenesisConfig, Test + }; + + use frame_support::traits::UnfilteredDispatchable; + + fn default_header() -> Header { + Header { + parent_hash: Default::default(), + number: 0, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: Default::default(), + } + } + + /// We expect the weight of the inclusion inherent not to change when no truncation occurs: + /// its weight is dynamically computed from the size of the backed candidates list, and is + /// already incorporated into the current block weight when it is selected by the provisioner. + #[test] + fn weight_does_not_change_on_happy_path() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + let header = default_header(); + System::set_block_number(1); + System::set_parent_hash(header.hash()); + + // number of bitfields doesn't affect the inclusion inherent weight, so we can mock it with an empty one + let signed_bitfields = Vec::new(); + // backed candidates must not be empty, so we can demonstrate that the weight has not changed + let backed_candidates = vec![BackedCandidate::default(); 10]; + + // the expected weight can always be computed by this formula + let expected_weight = MINIMAL_INCLUSION_INHERENT_WEIGHT + + (backed_candidates.len() as Weight * BACKED_CANDIDATE_WEIGHT); + + // we've used half the block weight; there's plenty of margin + let max_block_weight = ::BlockWeights::get().max_block; + let used_block_weight = max_block_weight / 2; + System::set_block_consumed_resources(used_block_weight, 0); + + // execute the inclusion inherent + let post_info = Call::::inclusion(signed_bitfields, backed_candidates, default_header()) + .dispatch_bypass_filter(None.into()).unwrap_err().post_info; + + // we don't directly check the block's weight post-call. Instead, we check that the + // call has returned the appropriate post-dispatch weight for refund, and trust + // Substrate to do the right thing with that information. + // + // In this case, the weight system can update the actual weight with the same amount, + // or return `None` to indicate that the pre-computed weight should not change. + // Either option is acceptable for our purposes. + if let Some(actual_weight) = post_info.actual_weight { + assert_eq!(actual_weight, expected_weight); } - }) + }); + } + + /// We expect the weight of the inclusion inherent to change when truncation occurs: its + /// weight was initially dynamically computed from the size of the backed candidates list, + /// but was reduced by truncation. + #[test] + fn weight_changes_when_backed_candidates_are_truncated() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + let header = default_header(); + System::set_block_number(1); + System::set_parent_hash(header.hash()); + + // number of bitfields doesn't affect the inclusion inherent weight, so we can mock it with an empty one + let signed_bitfields = Vec::new(); + // backed candidates must not be empty, so we can demonstrate that the weight has not changed + let backed_candidates = vec![BackedCandidate::default(); 10]; + + // the expected weight with no blocks is just the minimum weight + let expected_weight = MINIMAL_INCLUSION_INHERENT_WEIGHT; + + // oops, looks like this mandatory call pushed the block weight over the limit + let max_block_weight = ::BlockWeights::get().max_block; + let used_block_weight = max_block_weight + 1; + System::set_block_consumed_resources(used_block_weight, 0); + + // execute the inclusion inherent + let post_info = Call::::inclusion(signed_bitfields, backed_candidates, header) + .dispatch_bypass_filter(None.into()).unwrap(); + + // we don't directly check the block's weight post-call. Instead, we check that the + // call has returned the appropriate post-dispatch weight for refund, and trust + // Substrate to do the right thing with that information. + assert_eq!( + post_info.actual_weight.unwrap(), + expected_weight, + ); + }); + } } } diff --git a/runtime/parachains/src/initializer.rs b/runtime/parachains/src/initializer.rs index 11481e7ffdf02696b549d85ee209b14a7f5f216e..dd194489253ddd73995612e57c023453fcf13f8b 100644 --- a/runtime/parachains/src/initializer.rs +++ b/runtime/parachains/src/initializer.rs @@ -25,12 +25,14 @@ use primitives::v1::ValidatorId; use frame_support::{ decl_storage, decl_module, decl_error, traits::Randomness, }; -use sp_runtime::traits::One; -use codec::{Encode, Decode}; -use crate::{configuration::{self, HostConfiguration}, paras, scheduler, inclusion}; +use parity_scale_codec::{Encode, Decode}; +use crate::{ + configuration::{self, HostConfiguration}, + paras, scheduler, inclusion, session_info, dmp, ump, hrmp, +}; /// Information about a session change that has just occurred. -#[derive(Default, Clone)] +#[derive(Clone)] pub struct SessionChangeNotification { /// The new validators in the session. pub validators: Vec, @@ -46,23 +48,43 @@ pub struct SessionChangeNotification { pub session_index: sp_staking::SessionIndex, } +impl> Default for SessionChangeNotification { + fn default() -> Self { + Self { + validators: Vec::new(), + queued: Vec::new(), + prev_config: HostConfiguration::default(), + new_config: HostConfiguration::default(), + random_seed: Default::default(), + session_index: Default::default(), + } + } +} + #[derive(Encode, Decode)] -struct BufferedSessionChange { - apply_at: N, +struct BufferedSessionChange { validators: Vec, queued: Vec, session_index: sp_staking::SessionIndex, } -pub trait Trait: - frame_system::Trait + configuration::Trait + paras::Trait + scheduler::Trait + inclusion::Trait +pub trait Config: + frame_system::Config + + configuration::Config + + paras::Config + + scheduler::Config + + inclusion::Config + + session_info::Config + + dmp::Config + + ump::Config + + hrmp::Config { /// A randomness beacon. type Randomness: Randomness; } decl_storage! { - trait Store for Module as Initializer { + trait Store for Module as Initializer { /// Whether the parachains modules have been initialized within this block. /// /// Semantically a bool, but this guarantees it should never hit the trie, @@ -74,50 +96,43 @@ decl_storage! { HasInitialized: Option<()>; /// Buffered session changes along with the block number at which they should be applied. /// - /// Typically this will be empty or one element long, with the single element having a block - /// number of the next block. + /// Typically this will be empty or one element long. Apart from that this item never hits + /// the storage. /// /// However this is a `Vec` regardless to handle various edge cases that may occur at runtime /// upgrade boundaries or if governance intervenes. - BufferedSessionChanges: Vec>; + BufferedSessionChanges: Vec; } } decl_error! { - pub enum Error for Module { } + pub enum Error for Module { } } decl_module! { /// The initializer module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; fn on_initialize(now: T::BlockNumber) -> Weight { - // Apply buffered session changes before initializing modules, so they - // can be initialized with respect to the current validator set. - >::mutate(|v| { - let drain_up_to = v.iter().take_while(|b| b.apply_at <= now).count(); - - // apply only the last session as all others lasted less than a block (weirdly). - if let Some(buffered) = v.drain(..drain_up_to).last() { - Self::apply_new_session( - buffered.session_index, - buffered.validators, - buffered.queued, - ); - } - }); - // The other modules are initialized in this order: // - Configuration // - Paras // - Scheduler // - Inclusion + // - SessionInfo // - Validity + // - DMP + // - UMP + // - HRMP let total_weight = configuration::Module::::initializer_initialize(now) + paras::Module::::initializer_initialize(now) + scheduler::Module::::initializer_initialize(now) + - inclusion::Module::::initializer_initialize(now); + inclusion::Module::::initializer_initialize(now) + + session_info::Module::::initializer_initialize(now) + + dmp::Module::::initializer_initialize(now) + + ump::Module::::initializer_initialize(now) + + hrmp::Module::::initializer_initialize(now); HasInitialized::set(Some(())); @@ -126,17 +141,34 @@ decl_module! { fn on_finalize() { // reverse initialization order. - + hrmp::Module::::initializer_finalize(); + ump::Module::::initializer_finalize(); + dmp::Module::::initializer_finalize(); + session_info::Module::::initializer_finalize(); inclusion::Module::::initializer_finalize(); scheduler::Module::::initializer_finalize(); paras::Module::::initializer_finalize(); configuration::Module::::initializer_finalize(); + + // Apply buffered session changes as the last thing. This way the runtime APIs and the + // next block will observe the next session. + // + // Note that we only apply the last session as all others lasted less than a block (weirdly). + if let Some(BufferedSessionChange { + session_index, + validators, + queued, + }) = BufferedSessionChanges::take().pop() + { + Self::apply_new_session(session_index, validators, queued); + } + HasInitialized::take(); } } } -impl Module { +impl Module { fn apply_new_session( session_index: sp_staking::SessionIndex, validators: Vec, @@ -170,10 +202,14 @@ impl Module { paras::Module::::initializer_on_new_session(¬ification); scheduler::Module::::initializer_on_new_session(¬ification); inclusion::Module::::initializer_on_new_session(¬ification); + session_info::Module::::initializer_on_new_session(¬ification); + dmp::Module::::initializer_on_new_session(¬ification); + ump::Module::::initializer_on_new_session(¬ification); + hrmp::Module::::initializer_on_new_session(¬ification); } /// Should be called when a new session occurs. Buffers the session notification to be applied - /// at the next block. If `queued` is `None`, the `validators` are considered queued. + /// at the end of the block. If `queued` is `None`, the `validators` are considered queued. fn on_new_session<'a, I: 'a>( _changed: bool, session_index: sp_staking::SessionIndex, @@ -189,8 +225,7 @@ impl Module { validators.clone() }; - >::mutate(|v| v.push(BufferedSessionChange { - apply_at: >::block_number() + One::one(), + BufferedSessionChanges::mutate(|v| v.push(BufferedSessionChange { validators, queued, session_index, @@ -198,11 +233,11 @@ impl Module { } } -impl sp_runtime::BoundToRuntimeAppPublic for Module { +impl sp_runtime::BoundToRuntimeAppPublic for Module { type Public = ValidatorId; } -impl pallet_session::OneSessionHandler for Module { +impl pallet_session::OneSessionHandler for Module { type Key = ValidatorId; fn on_genesis_session<'a, I: 'a>(_validators: I) @@ -224,7 +259,7 @@ impl pallet_session::OneSessionHandler>::get(); + let v = ::get(); assert_eq!(v.len(), 1); - - let apply_at = now + 1; - assert_eq!(v[0].apply_at, apply_at); }); } #[test] - fn session_change_applied_on_initialize() { + fn session_change_applied_on_finalize() { new_test_ext(Default::default()).execute_with(|| { Initializer::on_initialize(1); - - let now = System::block_number(); Initializer::on_new_session( false, 1, @@ -262,9 +292,9 @@ mod tests { Some(Vec::new().into_iter()), ); - Initializer::on_initialize(now + 1); + Initializer::on_finalize(1); - assert!(>::get().is_empty()); + assert!(::get().is_empty()); }); } diff --git a/runtime/parachains/src/lib.rs b/runtime/parachains/src/lib.rs index b707c3e39eaf4ff1b6b7b8a83dd86f8a3249f1c0..f7cf7cf3350e7acfda5419150bad9d072243030a 100644 --- a/runtime/parachains/src/lib.rs +++ b/runtime/parachains/src/lib.rs @@ -20,21 +20,20 @@ //! particular the `Initializer` module, as it is responsible for initializing the state //! of the other modules. - #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::result; -use sp_runtime::traits::BadOrigin; -use primitives::v1::Id as ParaId; -use codec::{Decode, Encode}; - pub mod configuration; pub mod inclusion; pub mod inclusion_inherent; pub mod initializer; pub mod paras; pub mod scheduler; -pub mod validity; +pub mod session_info; +pub mod origin; +pub mod dmp; +pub mod ump; +pub mod hrmp; +pub mod reward_points; pub mod runtime_api_impl; @@ -43,21 +42,26 @@ mod util; #[cfg(test)] mod mock; -/// Origin for the parachains. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum Origin { - /// It comes from a parachain. - Parachain(ParaId), +pub use origin::{Origin, ensure_parachain}; + +/// Schedule a para to be initialized at the start of the next session with the given genesis data. +pub fn schedule_para_initialize( + id: primitives::v1::Id, + genesis: paras::ParaGenesisArgs, +) { + >::schedule_para_initialize(id, genesis); } -/// Ensure that the origin `o` represents a parachain. -/// Returns `Ok` with the parachain ID that effected the extrinsic or an `Err` otherwise. -pub fn ensure_parachain(o: OuterOrigin) -> result::Result - where OuterOrigin: Into> +/// Schedule a para to be cleaned up at the start of the next session. +pub fn schedule_para_cleanup(id: primitives::v1::Id) +where + T: paras::Config + + dmp::Config + + ump::Config + + hrmp::Config, { - match o.into() { - Ok(Origin::Parachain(id)) => Ok(id), - _ => Err(BadOrigin), - } + >::schedule_para_cleanup(id); + >::schedule_para_cleanup(id); + >::schedule_para_cleanup(id); + >::schedule_para_cleanup(id); } diff --git a/runtime/parachains/src/mock.rs b/runtime/parachains/src/mock.rs index 7001b1c1df9c09e4ce384f7b48b2dcfd808657b0..7ae33c01b3fe93dbbb4aeeb7ec7fb8a3ef0e79da 100644 --- a/runtime/parachains/src/mock.rs +++ b/runtime/parachains/src/mock.rs @@ -17,26 +17,28 @@ //! Mocks for all the traits. use sp_io::TestExternalities; -use sp_core::{H256}; -use sp_runtime::{ - Perbill, - traits::{ - BlakeTwo256, IdentityLookup, - }, +use sp_core::H256; +use sp_runtime::traits::{ + BlakeTwo256, IdentityLookup, }; -use primitives::v1::{BlockNumber, Header}; +use primitives::v1::{AuthorityDiscoveryId, BlockNumber, Header, ValidatorIndex}; use frame_support::{ impl_outer_origin, impl_outer_dispatch, impl_outer_event, parameter_types, - weights::Weight, traits::Randomness as RandomnessT, + traits::Randomness as RandomnessT, }; +use std::cell::RefCell; +use std::collections::HashMap; use crate::inclusion; +use crate as parachains; /// A test runtime struct. #[derive(Clone, Eq, PartialEq)] pub struct Test; impl_outer_origin! { - pub enum Origin for Test { } + pub enum Origin for Test { + parachains + } } impl_outer_dispatch! { @@ -62,13 +64,15 @@ impl RandomnessT for TestRandomness { parameter_types! { pub const BlockHashCount: u32 = 250; - pub const MaximumBlockWeight: Weight = 4 * 1024 * 1024; - pub const MaximumBlockLength: u32 = 4 * 1024 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); + pub BlockWeights: frame_system::limits::BlockWeights = + frame_system::limits::BlockWeights::simple_max(4 * 1024 * 1024); } -impl frame_system::Trait for Test { +impl frame_system::Config for Test { type BaseCallFilter = (); + type BlockWeights = BlockWeights; + type BlockLength = (); + type DbWeight = (); type Origin = Origin; type Call = Call; type Index = u64; @@ -80,33 +84,87 @@ impl frame_system::Trait for Test { type Header = Header; type Event = TestEvent; type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); - type BlockExecutionWeight = (); - type ExtrinsicBaseWeight = (); - type MaximumExtrinsicWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = (); - type ModuleToIndex = (); + type PalletInfo = (); type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); + type SS58Prefix = (); } -impl crate::initializer::Trait for Test { +impl crate::initializer::Config for Test { type Randomness = TestRandomness; } -impl crate::configuration::Trait for Test { } +impl crate::configuration::Config for Test { } -impl crate::paras::Trait for Test { } +impl crate::paras::Config for Test { + type Origin = Origin; +} -impl crate::scheduler::Trait for Test { } +impl crate::dmp::Config for Test { } -impl crate::inclusion::Trait for Test { +impl crate::ump::Config for Test { + type UmpSink = crate::ump::mock_sink::MockUmpSink; +} + +impl crate::hrmp::Config for Test { + type Origin = Origin; +} + +impl crate::scheduler::Config for Test { } + +impl crate::inclusion::Config for Test { type Event = TestEvent; + type RewardValidators = TestRewardValidators; +} + +impl crate::inclusion_inherent::Config for Test { } + +impl crate::session_info::Config for Test { } + +impl crate::session_info::AuthorityDiscoveryConfig for Test { + fn authorities() -> Vec { + Vec::new() + } +} + +thread_local! { + pub static BACKING_REWARDS: RefCell> + = RefCell::new(HashMap::new()); + + pub static AVAILABILITY_REWARDS: RefCell> + = RefCell::new(HashMap::new()); +} + +pub fn backing_rewards() -> HashMap { + BACKING_REWARDS.with(|r| r.borrow().clone()) +} + +pub fn availability_rewards() -> HashMap { + AVAILABILITY_REWARDS.with(|r| r.borrow().clone()) +} + +pub struct TestRewardValidators; + +impl inclusion::RewardValidators for TestRewardValidators { + fn reward_backing(v: impl IntoIterator) { + BACKING_REWARDS.with(|r| { + let mut r = r.borrow_mut(); + for i in v { + *r.entry(i).or_insert(0) += 1; + } + }) + } + fn reward_bitfields(v: impl IntoIterator) { + AVAILABILITY_REWARDS.with(|r| { + let mut r = r.borrow_mut(); + for i in v { + *r.entry(i).or_insert(0) += 1; + } + }) + } } pub type System = frame_system::Module; @@ -120,14 +178,29 @@ pub type Configuration = crate::configuration::Module; /// Mocked paras. pub type Paras = crate::paras::Module; +/// Mocked DMP +pub type Dmp = crate::dmp::Module; + +/// Mocked UMP +pub type Ump = crate::ump::Module; + +/// Mocked HRMP +pub type Hrmp = crate::hrmp::Module; + /// Mocked scheduler. pub type Scheduler = crate::scheduler::Module; /// Mocked inclusion module. pub type Inclusion = crate::inclusion::Module; +/// Mocked session info module. +pub type SessionInfo = crate::session_info::Module; + /// Create a new set of test externalities. pub fn new_test_ext(state: GenesisConfig) -> TestExternalities { + BACKING_REWARDS.with(|r| r.borrow_mut().clear()); + AVAILABILITY_REWARDS.with(|r| r.borrow_mut().clear()); + let mut t = state.system.build_storage::().unwrap(); state.configuration.assimilate_storage(&mut t).unwrap(); state.paras.assimilate_storage(&mut t).unwrap(); diff --git a/runtime/parachains/src/origin.rs b/runtime/parachains/src/origin.rs new file mode 100644 index 0000000000000000000000000000000000000000..f238b91fba9d1a9552618489ee2332ec80457f66 --- /dev/null +++ b/runtime/parachains/src/origin.rs @@ -0,0 +1,59 @@ +// Copyright 2020 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 . + +//! Declaration of the parachain specific origin and a pallet that hosts it. + +use sp_std::result; +use sp_runtime::traits::BadOrigin; +use primitives::v1::Id as ParaId; +use parity_scale_codec::{Decode, Encode}; + +/// Origin for the parachains. +#[derive(PartialEq, Eq, Clone, Encode, Decode, sp_core::RuntimeDebug)] +pub enum Origin { + /// It comes from a parachain. + Parachain(ParaId), +} + +/// Ensure that the origin `o` represents a parachain. +/// Returns `Ok` with the parachain ID that effected the extrinsic or an `Err` otherwise. +pub fn ensure_parachain(o: OuterOrigin) -> result::Result + where OuterOrigin: Into> +{ + match o.into() { + Ok(Origin::Parachain(id)) => Ok(id), + _ => Err(BadOrigin), + } +} + +/// The origin module. +pub trait Config: frame_system::Config {} + +frame_support::decl_module! { + /// There is no way to register an origin type in `construct_runtime` without a pallet the origin + /// belongs to. + /// + /// This module fulfills only the single purpose of housing the `Origin` in `construct_runtime`. + /// + // ideally, though, the `construct_runtime` should support a free-standing origin. + pub struct Module for enum Call where origin: ::Origin {} +} + +impl From for Origin { + fn from(id: u32) -> Origin { + Origin::Parachain(id.into()) + } +} diff --git a/runtime/parachains/src/paras.rs b/runtime/parachains/src/paras.rs index f2a64de6c3d0c877535d3f2dd36922859ebb5f57..7a9375b029b74939f5e6022f0f84b097e4be744b 100644 --- a/runtime/parachains/src/paras.rs +++ b/runtime/parachains/src/paras.rs @@ -24,6 +24,7 @@ //! only occur at session boundaries. use sp_std::prelude::*; +use sp_std::result; #[cfg(feature = "std")] use sp_std::marker::PhantomData; use primitives::v1::{ @@ -35,14 +36,21 @@ use frame_support::{ traits::Get, weights::Weight, }; -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; use crate::{configuration, initializer::SessionChangeNotification}; use sp_core::RuntimeDebug; #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; -pub trait Trait: frame_system::Trait + configuration::Trait { } +pub use crate::Origin; + +pub trait Config: frame_system::Config + configuration::Config { + /// The outer origin type. + type Origin: From + + From<::Origin> + + Into::Origin>>; +} // the two key times necessary to track for every code replacement. #[derive(Default, Encode, Decode)] @@ -168,9 +176,8 @@ pub struct ParaGenesisArgs { pub parachain: bool, } - decl_storage! { - trait Store for Module as Paras { + trait Store for Module as Paras { /// All parachains. Ordered ascending by ParaId. Parathreads are not included. Parachains get(fn parachains): Vec; /// All parathreads. @@ -206,7 +213,7 @@ decl_storage! { /// Upcoming paras instantiation arguments. UpcomingParasGenesis: map hasher(twox_64_concat) ParaId => Option; /// Paras that are to be cleaned up at the end of the session. - OutgoingParas: Vec; + OutgoingParas get(fn outgoing_paras): Vec; } add_extra_genesis { @@ -217,7 +224,7 @@ decl_storage! { } #[cfg(feature = "std")] -fn build(config: &GenesisConfig) { +fn build(config: &GenesisConfig) { let mut parachains: Vec<_> = config.paras .iter() .filter(|(_, args)| args.parachain) @@ -237,17 +244,17 @@ fn build(config: &GenesisConfig) { } decl_error! { - pub enum Error for Module { } + pub enum Error for Module { } } decl_module! { /// The parachains configuration module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; } } -impl Module { +impl Module { /// Called by the initializer to initialize the configuration module. pub(crate) fn initializer_initialize(now: T::BlockNumber) -> Weight { Self::prune_old_code(now) @@ -389,7 +396,7 @@ impl Module { } /// Schedule a para to be initialized at the start of the next session. - pub fn schedule_para_initialize(id: ParaId, genesis: ParaGenesisArgs) -> Weight { + pub(crate) fn schedule_para_initialize(id: ParaId, genesis: ParaGenesisArgs) -> Weight { let dup = UpcomingParas::mutate(|v| { match v.binary_search(&id) { Ok(_) => true, @@ -411,7 +418,7 @@ impl Module { } /// Schedule a para to be cleaned up at the start of the next session. - pub fn schedule_para_cleanup(id: ParaId) -> Weight { + pub(crate) fn schedule_para_cleanup(id: ParaId) -> Weight { let upcoming_weight = UpcomingParas::mutate(|v| { match v.binary_search(&id) { Ok(i) => { @@ -534,6 +541,12 @@ impl Module { } } + /// Returns whether the given ID refers to a valid para. + pub fn is_valid_para(id: ParaId) -> bool { + Self::parachains().binary_search(&id).is_ok() + || Self::is_parathread(id) + } + /// Whether a para ID corresponds to any live parathread. pub(crate) fn is_parathread(id: ParaId) -> bool { Parathreads::get(&id).is_some() diff --git a/runtime/parachains/src/reward_points.rs b/runtime/parachains/src/reward_points.rs new file mode 100644 index 0000000000000000000000000000000000000000..7ff208d6d13250f848f95ce3c51251eaeaad927c --- /dev/null +++ b/runtime/parachains/src/reward_points.rs @@ -0,0 +1,55 @@ +// Copyright 2020 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 . + +//! An implementation of the `RewardValidators` trait used by `inclusion` that employs +//! `pallet-staking` to compute the rewards. +//! +//! Based on https://w3f-research.readthedocs.io/en/latest/polkadot/Token%20Economics.html +//! which doesn't currently mention availability bitfields. As such, we don't reward them +//! for the time being, although we will build schemes to do so in the future. + +use primitives::v1::ValidatorIndex; +use pallet_staking::SessionInterface; + +/// The amount of era points given by backing a candidate that is included. +pub const BACKING_POINTS: u32 = 20; + +/// Rewards validators for participating in parachains with era points in pallet-staking. +pub struct RewardValidatorsWithEraPoints(sp_std::marker::PhantomData); + +fn reward_by_indices(points: u32, indices: I) where + C: pallet_staking::Config, + I: IntoIterator +{ + // Fetch the validators from the _session_ because sessions are offset from eras + // and we are rewarding for behavior in current session. + let validators = C::SessionInterface::validators(); + let rewards = indices.into_iter() + .filter_map(|i| validators.get(i as usize).map(|v| v.clone())) + .map(|v| (v, points)); + + >::reward_by_ids(rewards); +} + +impl crate::inclusion::RewardValidators for RewardValidatorsWithEraPoints + where C: pallet_staking::Config +{ + fn reward_backing(validators: impl IntoIterator) { + reward_by_indices::(BACKING_POINTS, validators); + } + + fn reward_bitfields(_validators: impl IntoIterator) { } +} diff --git a/runtime/parachains/src/runtime_api_impl/v1.rs b/runtime/parachains/src/runtime_api_impl/v1.rs index 716d3eed9cb1d0036a9921c2c24bfc3d759ac4d9..46503d2977c58f3c34e347417ae9fe4e95f632f5 100644 --- a/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/runtime/parachains/src/runtime_api_impl/v1.rs @@ -18,23 +18,24 @@ //! functions. use sp_std::prelude::*; +use sp_std::collections::btree_map::BTreeMap; use primitives::v1::{ ValidatorId, ValidatorIndex, GroupRotationInfo, CoreState, ValidationData, Id as ParaId, OccupiedCoreAssumption, SessionIndex, ValidationCode, CommittedCandidateReceipt, ScheduledCore, OccupiedCore, CoreOccupied, CoreIndex, - GroupIndex, CandidateEvent, PersistedValidationData, + GroupIndex, CandidateEvent, PersistedValidationData, SessionInfo, + InboundDownwardMessage, InboundHrmpMessage, Hash, }; -use sp_runtime::traits::Zero; use frame_support::debug; -use crate::{initializer, inclusion, scheduler, configuration, paras}; +use crate::{initializer, inclusion, scheduler, configuration, paras, session_info, dmp, hrmp}; /// Implementation for the `validators` function of the runtime API. -pub fn validators() -> Vec { +pub fn validators() -> Vec { >::validators() } /// Implementation for the `validator_groups` function of the runtime API. -pub fn validator_groups() -> ( +pub fn validator_groups() -> ( Vec>, GroupRotationInfo, ) { @@ -45,7 +46,7 @@ pub fn validator_groups() -> ( } /// Implementation for the `availability_cores` function of the runtime API. -pub fn availability_cores() -> Vec> { +pub fn availability_cores() -> Vec> { let cores = >::availability_cores(); let parachains = >::parachains(); let config = >::config(); @@ -55,10 +56,6 @@ pub fn availability_cores() -> Vec() -> Vec>::next_up_on_available( CoreIndex(i as u32) ), @@ -116,6 +112,8 @@ pub fn availability_cores() -> Vec { @@ -126,7 +124,6 @@ pub fn availability_cores() -> Vec>::next_up_on_available( CoreIndex(i as u32) ), @@ -143,6 +140,8 @@ pub fn availability_cores() -> Vec() -> Vec( +fn with_assumption( para_id: ParaId, assumption: OccupiedCoreAssumption, build: F, ) -> Option where - Trait: inclusion::Trait, + Config: inclusion::Config, F: FnOnce() -> Option, { match assumption { OccupiedCoreAssumption::Included => { - >::force_enact(para_id); + >::force_enact(para_id); build() } OccupiedCoreAssumption::TimedOut => { build() } OccupiedCoreAssumption::Free => { - if >::pending_availability(para_id).is_some() { + if >::pending_availability(para_id).is_some() { None } else { build() @@ -188,36 +187,57 @@ fn with_assumption( } /// Implementation for the `full_validation_data` function of the runtime API. -pub fn full_validation_data( +pub fn full_validation_data( para_id: ParaId, assumption: OccupiedCoreAssumption, -) - -> Option> -{ - with_assumption::( - para_id, - assumption, - || Some(ValidationData { - persisted: crate::util::make_persisted_validation_data::(para_id)?, - transient: crate::util::make_transient_validation_data::(para_id)?, - }), - ) +) -> Option> { + use parity_scale_codec::Decode as _; + let relay_parent_number = >::block_number(); + let relay_storage_root = Hash::decode(&mut &sp_io::storage::root()[..]) + .expect("storage root must decode to the Hash type; qed"); + with_assumption::(para_id, assumption, || { + Some(ValidationData { + persisted: crate::util::make_persisted_validation_data::( + para_id, + relay_parent_number, + relay_storage_root, + )?, + transient: crate::util::make_transient_validation_data::( + para_id, + relay_parent_number, + )?, + }) + }) } /// Implementation for the `persisted_validation_data` function of the runtime API. -pub fn persisted_validation_data( +pub fn persisted_validation_data( para_id: ParaId, assumption: OccupiedCoreAssumption, ) -> Option> { - with_assumption::( - para_id, - assumption, - || crate::util::make_persisted_validation_data::(para_id), - ) + use parity_scale_codec::Decode as _; + let relay_parent_number = >::block_number(); + let relay_storage_root = Hash::decode(&mut &sp_io::storage::root()[..]) + .expect("storage root must decode to the Hash type; qed"); + with_assumption::(para_id, assumption, || { + crate::util::make_persisted_validation_data::( + para_id, + relay_parent_number, + relay_storage_root, + ) + }) +} + +/// Implementation for the `check_validation_outputs` function of the runtime API. +pub fn check_validation_outputs( + para_id: ParaId, + outputs: primitives::v1::CandidateCommitments, +) -> bool { + >::check_validation_outputs_for_runtime_api(para_id, outputs) } /// Implementation for the `session_index_for_child` function of the runtime API. -pub fn session_index_for_child() -> SessionIndex { +pub fn session_index_for_child() -> SessionIndex { // Just returns the session index from `inclusion`. Runtime APIs follow // initialization so the initializer will have applied any pending session change // which is expected at the child of the block whose context the runtime API was invoked @@ -229,7 +249,7 @@ pub fn session_index_for_child() -> SessionIndex { } /// Implementation for the `validation_code` function of the runtime API. -pub fn validation_code( +pub fn validation_code( para_id: ParaId, assumption: OccupiedCoreAssumption, ) -> Option { @@ -240,8 +260,16 @@ pub fn validation_code( ) } +/// Implementation for the `historical_validation_code` function of the runtime API. +pub fn historical_validation_code( + para_id: ParaId, + context_height: T::BlockNumber, +) -> Option { + >::validation_code_at(para_id, context_height, None) +} + /// Implementation for the `candidate_pending_availability` function of the runtime API. -pub fn candidate_pending_availability(para_id: ParaId) +pub fn candidate_pending_availability(para_id: ParaId) -> Option> { >::candidate_pending_availability(para_id) @@ -252,8 +280,8 @@ pub fn candidate_pending_availability(para_id: ParaId) // this means it can run in a different session than other runtime APIs at the same block. pub fn candidate_events(extract_event: F) -> Vec> where - T: initializer::Trait, - F: Fn(::Event) -> Option>, + T: initializer::Config, + F: Fn(::Event) -> Option>, { use inclusion::Event as RawEvent; @@ -266,3 +294,22 @@ where }) .collect() } + +/// Get the session info for the given session, if stored. +pub fn session_info(index: SessionIndex) -> Option { + >::session_info(index) +} + +/// Implementation for the `dmq_contents` function of the runtime API. +pub fn dmq_contents( + recipient: ParaId, +) -> Vec> { + >::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) +} diff --git a/runtime/parachains/src/scheduler.rs b/runtime/parachains/src/scheduler.rs index 455a07f94e7493b890e83042f3a77e9610472a08..e9c92b9bd702d187ff1af8714dca1b7737263328 100644 --- a/runtime/parachains/src/scheduler.rs +++ b/runtime/parachains/src/scheduler.rs @@ -45,8 +45,8 @@ use frame_support::{ decl_storage, decl_module, decl_error, weights::Weight, }; -use codec::{Encode, Decode}; -use sp_runtime::traits::{Saturating, Zero}; +use parity_scale_codec::{Encode, Decode}; +use sp_runtime::traits::Saturating; use rand::{SeedableRng, seq::SliceRandom}; use rand_chacha::ChaCha20Rng; @@ -153,10 +153,10 @@ impl CoreAssignment { } } -pub trait Trait: frame_system::Trait + configuration::Trait + paras::Trait { } +pub trait Config: frame_system::Config + configuration::Config + paras::Config { } decl_storage! { - trait Store for Module as ParaScheduler { + trait Store for Module as ParaScheduler { /// All the validator groups. One for each core. /// /// Bound: The number of cores is the sum of the numbers of parachains and parathread multiplexers. @@ -173,7 +173,9 @@ decl_storage! { /// The i'th parachain belongs to the i'th core, with the remaining cores all being /// parathread-multiplexers. /// - /// Bounded by the number of cores: one for each parachain and parathread multiplexer. + /// 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`. AvailabilityCores get(fn availability_cores): Vec>; /// An index used to ensure that only one claim on a parathread exists in the queue or is /// currently being handled by an occupied core. @@ -182,7 +184,7 @@ decl_storage! { ParathreadClaimIndex: Vec; /// The block number where the session start occurred. Used to track how many group rotations have occurred. SessionStartBlock get(fn session_start_block): T::BlockNumber; - /// Currently scheduled cores - free but up to be occupied. Ephemeral storage item that's wiped on finalization. + /// Currently scheduled cores - free but up to be occupied. /// /// Bounded by the number of cores: one for each parachain and parathread multiplexer. Scheduled get(fn scheduled): Vec; // sorted ascending by CoreIndex. @@ -190,26 +192,19 @@ decl_storage! { } decl_error! { - pub enum Error for Module { } + pub enum Error for Module { } } decl_module! { /// The scheduler module. - pub struct Module for enum Call where origin: ::Origin { + pub struct Module for enum Call where origin: ::Origin { type Error = Error; } } -impl Module { +impl Module { /// Called by the initializer to initialize the scheduler module. pub(crate) fn initializer_initialize(_now: T::BlockNumber) -> Weight { - Self::schedule(Vec::new()); - - 0 - } - - /// Called by the initializer to finalize the scheduler module. - pub(crate) fn initializer_finalize() { // Free all scheduled cores and return parathread claims to queue, with retries incremented. let config = >::config(); ParathreadQueue::mutate(|queue| { @@ -225,10 +220,16 @@ impl Module { } } } - }) + }); + + Self::schedule(Vec::new()); + 0 } + /// Called by the initializer to finalize the scheduler module. + pub(crate) fn initializer_finalize() {} + /// Called by the initializer to note that a new session has started. pub(crate) fn initializer_on_new_session(notification: &SessionChangeNotification) { let &SessionChangeNotification { @@ -241,7 +242,13 @@ impl Module { let mut thread_queue = ParathreadQueue::get(); let n_parachains = >::parachains().len() as u32; - let n_cores = n_parachains + config.parathread_cores; + let n_cores = core::cmp::max( + n_parachains + config.parathread_cores, + match config.max_validators_per_core { + Some(x) if x != 0 => { validators.len() as u32 / x }, + _ => 0, + }, + ); >::set(>::block_number()); AvailabilityCores::mutate(|cores| { @@ -273,8 +280,9 @@ impl Module { shuffled_indices.shuffle(&mut rng); - let group_base_size = validators.len() / n_cores as usize; - let n_larger_groups = validators.len() % n_cores as usize; + let group_base_size = shuffled_indices.len() / n_cores as usize; + let n_larger_groups = shuffled_indices.len() % n_cores as usize; + let groups: Vec> = (0..n_cores).map(|core_id| { let n_members = if (core_id as usize) < n_larger_groups { group_base_size + 1 @@ -367,7 +375,7 @@ impl Module { /// Schedule all unassigned cores, where possible. Provide a list of cores that should be considered /// newly-freed along with the reason for them being freed. The list is assumed to be sorted in /// ascending order by core index. - pub(crate) fn schedule(just_freed_cores: Vec<(CoreIndex, FreedReason)>) { + pub(crate) fn schedule(just_freed_cores: impl IntoIterator) { let mut cores = AvailabilityCores::get(); let config = >::config(); @@ -495,6 +503,7 @@ impl Module { Scheduled::set(scheduled); ParathreadQueue::set(parathread_queue); + AvailabilityCores::set(cores); } /// Note that the given cores have become occupied. Behavior undefined if any of the given cores were not scheduled @@ -558,11 +567,6 @@ impl Module { if at < session_start_block { return None } - if config.group_rotation_frequency.is_zero() { - // interpret this as "no rotations" - return Some(GroupIndex(core.0)); - } - let validator_groups = ValidatorGroups::get(); if core.0 as usize >= validator_groups.len() { return None } @@ -589,9 +593,6 @@ impl Module { /// timeouts, i.e. only within `max(config.chain_availability_period, config.thread_availability_period)` /// of the last rotation would this return `Some`, unless there are no rotations. /// - /// If there are no rotations (config.group_rotation_frequency == 0), - /// availability timeouts can occur at any block. - /// /// This really should not be a box, but is working around a compiler limitation filed here: /// https://github.com/rust-lang/rust/issues/73226 /// which prevents us from testing the code if using `impl Trait`. @@ -601,12 +602,7 @@ impl Module { let session_start = >::get(); let blocks_since_session_start = now.saturating_sub(session_start); - let no_rotation = config.group_rotation_frequency.is_zero(); - let blocks_since_last_rotation = if no_rotation { - ::zero() - } else { - blocks_since_session_start % config.group_rotation_frequency - }; + let blocks_since_last_rotation = blocks_since_session_start % config.group_rotation_frequency; let absolute_cutoff = sp_std::cmp::max( config.chain_availability_period, @@ -1054,6 +1050,73 @@ mod tests { }); } + #[test] + fn session_change_takes_only_max_per_core() { + let config = { + let mut config = default_config(); + config.parathread_cores = 0; + config.max_validators_per_core = Some(1); + config + }; + + let genesis_config = MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: config.clone(), + ..Default::default() + }, + ..Default::default() + }; + + new_test_ext(genesis_config).execute_with(|| { + let chain_a = ParaId::from(1); + let chain_b = ParaId::from(2); + let chain_c = ParaId::from(3); + + // ensure that we have 5 groups by registering 2 parachains. + Paras::schedule_para_initialize(chain_a, ParaGenesisArgs { + genesis_head: Vec::new().into(), + validation_code: Vec::new().into(), + parachain: true, + }); + Paras::schedule_para_initialize(chain_b, ParaGenesisArgs { + genesis_head: Vec::new().into(), + validation_code: Vec::new().into(), + parachain: true, + }); + Paras::schedule_para_initialize(chain_c, ParaGenesisArgs { + genesis_head: Vec::new().into(), + validation_code: Vec::new().into(), + parachain: false, + }); + + run_to_block(1, |number| match number { + 1 => Some(SessionChangeNotification { + new_config: config.clone(), + validators: vec![ + ValidatorId::from(Sr25519Keyring::Alice.public()), + ValidatorId::from(Sr25519Keyring::Bob.public()), + ValidatorId::from(Sr25519Keyring::Charlie.public()), + ValidatorId::from(Sr25519Keyring::Dave.public()), + ValidatorId::from(Sr25519Keyring::Eve.public()), + ValidatorId::from(Sr25519Keyring::Ferdie.public()), + ValidatorId::from(Sr25519Keyring::One.public()), + ], + random_seed: [99; 32], + ..Default::default() + }), + _ => None, + }); + + let groups = ValidatorGroups::get(); + assert_eq!(groups.len(), 7); + + // Every validator gets its own group, even though there are 2 paras. + for i in 0..7 { + assert_eq!(groups[i].len(), 1); + } + }); + } + #[test] fn schedule_schedules() { let genesis_config = MockGenesisConfig { @@ -1328,6 +1391,100 @@ mod tests { }); } + #[test] + fn schedule_clears_availability_cores() { + let genesis_config = MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: default_config(), + ..Default::default() + }, + ..Default::default() + }; + + let chain_a = ParaId::from(1); + let chain_b = ParaId::from(2); + let chain_c = ParaId::from(3); + + let schedule_blank_para = |id, is_chain| Paras::schedule_para_initialize(id, ParaGenesisArgs { + genesis_head: Vec::new().into(), + validation_code: Vec::new().into(), + parachain: is_chain, + }); + + new_test_ext(genesis_config).execute_with(|| { + assert_eq!(default_config().parathread_cores, 3); + + // register 3 parachains + schedule_blank_para(chain_a, true); + schedule_blank_para(chain_b, true); + schedule_blank_para(chain_c, true); + + // start a new session to activate, 5 validators for 5 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()), + ValidatorId::from(Sr25519Keyring::Dave.public()), + ValidatorId::from(Sr25519Keyring::Eve.public()), + ], + ..Default::default() + }), + _ => None, + }); + + run_to_block(2, |_| None); + + assert_eq!(Scheduler::scheduled().len(), 3); + + // cores 0, 1, and 2 should be occupied. mark them as such. + Scheduler::occupied(&[CoreIndex(0), CoreIndex(1), CoreIndex(2)]); + + { + let cores = AvailabilityCores::get(); + + assert!(cores[0].is_some()); + assert!(cores[1].is_some()); + assert!(cores[2].is_some()); + + assert!(Scheduler::scheduled().is_empty()); + } + + run_to_block(3, |_| None); + + // now note that cores 0 and 2 were freed. + Scheduler::schedule(vec![ + (CoreIndex(0), FreedReason::Concluded), + (CoreIndex(2), FreedReason::Concluded), + ]); + + { + let scheduled = Scheduler::scheduled(); + + assert_eq!(scheduled.len(), 2); + assert_eq!(scheduled[0], CoreAssignment { + core: CoreIndex(0), + para_id: chain_a, + kind: AssignmentKind::Parachain, + group_idx: GroupIndex(0), + }); + assert_eq!(scheduled[1], CoreAssignment { + core: CoreIndex(2), + para_id: chain_c, + kind: AssignmentKind::Parachain, + group_idx: GroupIndex(2), + }); + + // The freed cores should be `None` in `AvailabilityCores`. + let cores = AvailabilityCores::get(); + assert!(cores[0].is_none()); + assert!(cores[2].is_none()); + } + }); + } + #[test] fn schedule_rotates_groups() { let config = { @@ -1492,8 +1649,10 @@ mod tests { } = default_config(); let collator = CollatorId::from(Sr25519Keyring::Alice.public()); - assert!(chain_availability_period < thread_availability_period && - thread_availability_period < group_rotation_frequency); + assert!( + chain_availability_period < thread_availability_period + && thread_availability_period < group_rotation_frequency + ); let chain_a = ParaId::from(1); let thread_a = ParaId::from(2); @@ -1583,92 +1742,6 @@ mod tests { }); } - #[test] - fn availability_predicate_no_rotation() { - let genesis_config = MockGenesisConfig { - configuration: crate::configuration::GenesisConfig { - config: HostConfiguration { - group_rotation_frequency: 0, // no rotation - ..default_config() - }, - ..Default::default() - }, - ..Default::default() - }; - let HostConfiguration { - chain_availability_period, - thread_availability_period, - .. - } = default_config(); - let collator = CollatorId::from(Sr25519Keyring::Alice.public()); - - let chain_a = ParaId::from(1); - let thread_a = ParaId::from(2); - - let schedule_blank_para = |id, is_chain| Paras::schedule_para_initialize(id, ParaGenesisArgs { - genesis_head: Vec::new().into(), - validation_code: Vec::new().into(), - parachain: is_chain, - }); - - new_test_ext(genesis_config).execute_with(|| { - schedule_blank_para(chain_a, true); - schedule_blank_para(thread_a, false); - - // start a new session with our chain & thread registered. - run_to_block(1, |number| match number { - 1 => Some(SessionChangeNotification { - new_config: HostConfiguration{ - // Note: the `group_rotation_frequency` config change - // is not accounted for on session change - // group_rotation_frequency: 0, - ..default_config() - }, - validators: vec![ - ValidatorId::from(Sr25519Keyring::Alice.public()), - ValidatorId::from(Sr25519Keyring::Bob.public()), - ValidatorId::from(Sr25519Keyring::Charlie.public()), - ValidatorId::from(Sr25519Keyring::Dave.public()), - ValidatorId::from(Sr25519Keyring::Eve.public()), - ], - ..Default::default() - }), - _ => None, - }); - - // assign some availability cores. - { - AvailabilityCores::mutate(|cores| { - cores[0] = Some(CoreOccupied::Parachain); - cores[1] = Some(CoreOccupied::Parathread(ParathreadEntry { - claim: ParathreadClaim(thread_a, collator), - retries: 0, - })) - }); - } - run_to_block(1 + 1, |_| None); - run_to_block(1 + 1 + 100500, |_| None); - { - let pred = Scheduler::availability_timeout_predicate() - .expect("predicate exists with no rotation"); - - let now = System::block_number(); - - assert!(!pred(CoreIndex(0), now)); // assigned: chain - assert!(!pred(CoreIndex(1), now)); // assigned: thread - assert!(pred(CoreIndex(2), now)); - - // check the tighter bound on chains vs threads. - assert!(pred(CoreIndex(0), now - chain_availability_period)); - assert!(pred(CoreIndex(1), now - thread_availability_period)); - - // check the threshold is exact. - assert!(!pred(CoreIndex(0), now - chain_availability_period + 1)); - assert!(!pred(CoreIndex(1), now - thread_availability_period + 1)); - } - }); - } - #[test] fn next_up_on_available_uses_next_scheduled_or_none_for_thread() { let mut config = default_config(); diff --git a/runtime/parachains/src/session_info.rs b/runtime/parachains/src/session_info.rs new file mode 100644 index 0000000000000000000000000000000000000000..64bf4d76b5f09813f5abd08e853178ed0041c5e6 --- /dev/null +++ b/runtime/parachains/src/session_info.rs @@ -0,0 +1,292 @@ +// Copyright 2020 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 . + +//! The session info module provides information about validator sets +//! from prior sessions needed for approvals and disputes. +//! +//! See https://w3f.github.io/parachain-implementers-guide/runtime/session_info.html. + +use primitives::v1::{AssignmentId, AuthorityDiscoveryId, SessionIndex, SessionInfo}; +use frame_support::{ + decl_storage, decl_module, decl_error, + weights::Weight, +}; +use crate::{configuration, paras, scheduler}; +use sp_std::vec::Vec; + +pub trait Config: + frame_system::Config + + configuration::Config + + paras::Config + + scheduler::Config + + AuthorityDiscoveryConfig +{ +} + +decl_storage! { + trait Store for Module as ParaSessionInfo { + /// Assignment keys for the current session. + /// Note that this API is private due to it being prone to 'off-by-one' at session boundaries. + /// When in doubt, use `Sessions` API instead. + AssignmentKeysUnsafe: Vec; + /// The earliest session for which previous session info is stored. + EarliestStoredSession get(fn earliest_stored_session): SessionIndex; + /// 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. + Sessions get(fn session_info): map hasher(identity) SessionIndex => Option; + } +} + +decl_error! { + pub enum Error for Module { } +} + +decl_module! { + /// The session info module. + pub struct Module for enum Call where origin: ::Origin { + type Error = Error; + } +} + +/// An abstraction for the authority discovery pallet +/// to help with mock testing. +pub trait AuthorityDiscoveryConfig { + /// Retrieve authority identifiers of the current and next authority set. + fn authorities() -> Vec; +} + +impl AuthorityDiscoveryConfig for T { + fn authorities() -> Vec { + >::authorities() + } +} + +impl Module { + /// Handle an incoming session change. + pub(crate) fn initializer_on_new_session( + notification: &crate::initializer::SessionChangeNotification + ) { + let config = >::config(); + + let dispute_period = config.dispute_period; + let n_parachains = >::parachains().len() as u32; + + let validators = notification.validators.clone(); + let discovery_keys = ::authorities(); + let assignment_keys = AssignmentKeysUnsafe::get(); + let validator_groups = >::validator_groups(); + let n_cores = n_parachains + config.parathread_cores; + 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; + let no_show_slots = config.no_show_slots; + let needed_approvals = config.needed_approvals; + + let new_session_index = notification.session_index; + let old_earliest_stored_session = EarliestStoredSession::get(); + let new_earliest_stored_session = new_session_index.saturating_sub(dispute_period); + let new_earliest_stored_session = core::cmp::max(new_earliest_stored_session, old_earliest_stored_session); + // remove all entries from `Sessions` from the previous value up to the new value + // avoid a potentially heavy loop when introduced on a live chain + if old_earliest_stored_session != 0 || Sessions::get(0).is_some() { + for idx in old_earliest_stored_session..new_earliest_stored_session { + Sessions::remove(&idx); + } + // update `EarliestStoredSession` based on `config.dispute_period` + EarliestStoredSession::set(new_earliest_stored_session); + } else { + // just introduced on a live chain + EarliestStoredSession::set(new_session_index); + } + // create a new entry in `Sessions` with information about the current session + let new_session_info = SessionInfo { + validators, + discovery_keys, + assignment_keys, + validator_groups, + n_cores, + zeroth_delay_tranche_width, + relay_vrf_modulo_samples, + n_delay_tranches, + no_show_slots, + needed_approvals, + }; + Sessions::insert(&new_session_index, &new_session_info); + } + + /// Called by the initializer to initialize the session info module. + pub(crate) fn initializer_initialize(_now: T::BlockNumber) -> Weight { + 0 + } + + /// Called by the initializer to finalize the session info module. + pub(crate) fn initializer_finalize() {} +} + +impl sp_runtime::BoundToRuntimeAppPublic for Module { + type Public = AssignmentId; +} + +impl pallet_session::OneSessionHandler for Module { + type Key = AssignmentId; + + fn on_genesis_session<'a, I: 'a>(_validators: I) + where I: Iterator + { + + } + + fn on_new_session<'a, I: 'a>(_changed: bool, validators: I, _queued: I) + where I: Iterator + { + let assignment_keys: Vec<_> = validators.map(|(_, v)| v).collect(); + AssignmentKeysUnsafe::set(assignment_keys); + } + + fn on_disabled(_i: usize) { } +} + + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::{ + new_test_ext, Configuration, SessionInfo, System, GenesisConfig as MockGenesisConfig, + Origin, + }; + use crate::initializer::SessionChangeNotification; + use crate::configuration::HostConfiguration; + use frame_support::traits::{OnFinalize, OnInitialize}; + use primitives::v1::BlockNumber; + + fn run_to_block( + to: BlockNumber, + new_session: impl Fn(BlockNumber) -> Option>, + ) { + while System::block_number() < to { + let b = System::block_number(); + + SessionInfo::initializer_finalize(); + Configuration::initializer_finalize(); + + System::on_finalize(b); + + System::on_initialize(b + 1); + System::set_block_number(b + 1); + + if let Some(notification) = new_session(b + 1) { + Configuration::initializer_on_new_session(¬ification.validators, ¬ification.queued); + SessionInfo::initializer_on_new_session(¬ification); + } + + Configuration::initializer_initialize(b + 1); + SessionInfo::initializer_initialize(b + 1); + } + } + + fn default_config() -> HostConfiguration { + HostConfiguration { + parathread_cores: 1, + dispute_period: 2, + needed_approvals: 3, + ..Default::default() + } + } + + fn genesis_config() -> MockGenesisConfig { + MockGenesisConfig { + configuration: configuration::GenesisConfig { + config: default_config(), + ..Default::default() + }, + ..Default::default() + } + } + + fn session_changes(n: BlockNumber) -> Option> { + match n { + 100 => Some(SessionChangeNotification { + session_index: 10, + ..Default::default() + }), + 200 => Some(SessionChangeNotification { + session_index: 20, + ..Default::default() + }), + 300 => Some(SessionChangeNotification { + session_index: 30, + ..Default::default() + }), + 400 => Some(SessionChangeNotification { + session_index: 40, + ..Default::default() + }), + _ => None, + } + } + + fn new_session_every_block(n: BlockNumber) -> Option> { + Some(SessionChangeNotification{ + session_index: n, + ..Default::default() + }) + } + + #[test] + fn session_pruning_is_based_on_dispute_period() { + new_test_ext(genesis_config()).execute_with(|| { + let default_info = primitives::v1::SessionInfo::default(); + Sessions::insert(9, default_info); + run_to_block(100, session_changes); + // but the first session change is not based on dispute_period + assert_eq!(EarliestStoredSession::get(), 10); + // and we didn't prune the last changes + assert!(Sessions::get(9).is_some()); + + // changing dispute_period works + let dispute_period = 5; + Configuration::set_dispute_period(Origin::root(), dispute_period).unwrap(); + run_to_block(200, session_changes); + assert_eq!(EarliestStoredSession::get(), 20 - dispute_period); + + // we don't have that many sessions stored + let new_dispute_period = 16; + Configuration::set_dispute_period(Origin::root(), new_dispute_period).unwrap(); + run_to_block(300, session_changes); + assert_eq!(EarliestStoredSession::get(), 20 - dispute_period); + + // now we do + run_to_block(400, session_changes); + assert_eq!(EarliestStoredSession::get(), 40 - new_dispute_period); + }) + } + + #[test] + fn session_info_is_based_on_config() { + new_test_ext(genesis_config()).execute_with(|| { + run_to_block(1, new_session_every_block); + let session = Sessions::get(&1).unwrap(); + assert_eq!(session.needed_approvals, 3); + + // change some param + Configuration::set_needed_approvals(Origin::root(), 42).unwrap(); + run_to_block(2, new_session_every_block); + let session = Sessions::get(&2).unwrap(); + assert_eq!(session.needed_approvals, 42); + }) + } +} diff --git a/runtime/parachains/src/ump.rs b/runtime/parachains/src/ump.rs new file mode 100644 index 0000000000000000000000000000000000000000..35c0188c5b5f8f3ff9d1b8e501499cbe227683b0 --- /dev/null +++ b/runtime/parachains/src/ump.rs @@ -0,0 +1,937 @@ +// Copyright 2020 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::{self, HostConfiguration}, + initializer, +}; +use sp_std::{fmt, prelude::*}; +use sp_std::collections::{btree_map::BTreeMap, vec_deque::VecDeque}; +use frame_support::{decl_module, decl_storage, StorageMap, StorageValue, weights::Weight, traits::Get}; +use primitives::v1::{Id as ParaId, UpwardMessage}; + +/// All upward messages coming from parachains will be funneled into an implementation of this trait. +/// +/// The message is opaque from the perspective of UMP. The message size can range from 0 to +/// `config.max_upward_message_size`. +/// +/// It's up to the implementation of this trait to decide what to do with a message as long as it +/// returns the amount of weight consumed in the process of handling. Ignoring a message is a valid +/// strategy. +/// +/// There are no guarantees on how much time it takes for the message sent by a candidate to end up +/// in the sink after the candidate was enacted. That typically depends on the UMP traffic, the sizes +/// of upward messages and the configuration of UMP. +/// +/// It is possible that by the time the message is sank the origin parachain was offboarded. It is +/// up to the implementer to check that if it cares. +pub trait UmpSink { + /// Process an incoming upward message and return the amount of weight it consumed. + /// + /// See the trait docs for more details. + fn process_upward_message(origin: ParaId, msg: Vec) -> Weight; +} + +/// An implementation of a sink that just swallows the message without consuming any weight. +impl UmpSink for () { + fn process_upward_message(_: ParaId, _: Vec) -> Weight { + 0 + } +} + +/// A specific implementation of a UmpSink where messages are in the XCM format +/// and will be forwarded to the XCM Executor. +pub struct XcmSink(sp_std::marker::PhantomData); + +impl UmpSink for XcmSink { + fn process_upward_message(origin: ParaId, msg: Vec) -> Weight { + use parity_scale_codec::Decode; + use xcm::VersionedXcm; + use xcm::v0::{Junction, MultiLocation, ExecuteXcm}; + use xcm_executor::XcmExecutor; + + let weight: Weight = 0; + + if let Ok(versioned_xcm_message) = VersionedXcm::decode(&mut &msg[..]) { + match versioned_xcm_message { + VersionedXcm::V0(xcm_message) => { + let xcm_junction: Junction = Junction::Parachain { id: origin.into() }; + let xcm_location: MultiLocation = xcm_junction.into(); + // TODO: Do something with result. + let _result = XcmExecutor::::execute_xcm(xcm_location, xcm_message); + } + } + } else { + frame_support::debug::error!( + target: "xcm", + "Failed to decode versioned XCM from upward message.", + ); + } + + // TODO: to be sound, this implementation must ensure that returned (and thus consumed) + // weight is limited to some small portion of the total block weight (as a ballpark, 1/4, 1/8 + // or lower). + weight + } +} + +/// An error returned by [`check_upward_messages`] that indicates a violation of one of acceptance +/// criteria rules. +pub enum AcceptanceCheckErr { + MoreMessagesThanPermitted { + sent: u32, + permitted: u32, + }, + MessageSize { + idx: u32, + msg_size: u32, + max_size: u32, + }, + CapacityExceeded { + count: u32, + limit: u32, + }, + TotalSizeExceeded { + total_size: u32, + limit: u32, + }, +} + +impl fmt::Debug for AcceptanceCheckErr { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + match *self { + AcceptanceCheckErr::MoreMessagesThanPermitted { sent, permitted } => write!( + fmt, + "more upward messages than permitted by config ({} > {})", + sent, permitted, + ), + AcceptanceCheckErr::MessageSize { + idx, + msg_size, + max_size, + } => write!( + fmt, + "upward message idx {} larger than permitted by config ({} > {})", + idx, msg_size, max_size, + ), + AcceptanceCheckErr::CapacityExceeded { count, limit } => write!( + fmt, + "the ump queue would have more items than permitted by config ({} > {})", + count, limit, + ), + AcceptanceCheckErr::TotalSizeExceeded { total_size, limit } => write!( + fmt, + "the ump queue would have grown past the max size permitted by config ({} > {})", + total_size, limit, + ), + } + } +} + +pub trait Config: frame_system::Config + configuration::Config { + /// A place where all received upward messages are funneled. + type UmpSink: UmpSink; +} + +decl_storage! { + trait Store for Module as Ump { + /// Paras that are to be cleaned up at the end of the session. + /// The entries are sorted ascending by the para id. + OutgoingParas: Vec; + + /// The messages waiting to be handled by the relay-chain originating from a certain parachain. + /// + /// Note that some upward messages might have been already processed by the inclusion logic. E.g. + /// channel management messages. + /// + /// The messages are processed in FIFO order. + RelayDispatchQueues: map hasher(twox_64_concat) ParaId => VecDeque; + /// Size of the dispatch queues. Caches sizes of the queues in `RelayDispatchQueue`. + /// + /// First item in the tuple is the count of messages and second + /// is the total length (in bytes) of the message payloads. + /// + /// Note that this is an auxilary mapping: it's possible to tell the byte size and the number of + /// messages only looking at `RelayDispatchQueues`. This mapping is separate to avoid the cost of + /// loading the whole message queue if only the total size and count are required. + /// + /// Invariant: + /// - The set of keys should exactly match the set of keys of `RelayDispatchQueues`. + // NOTE that this field is used by parachains via merkle storage proofs, therefore changing + // the format will require migration of parachains. + RelayDispatchQueueSize: map hasher(twox_64_concat) ParaId => (u32, u32); + /// The ordered list of `ParaId`s that have a `RelayDispatchQueue` entry. + /// + /// Invariant: + /// - The set of items from this vector should be exactly the set of the keys in + /// `RelayDispatchQueues` and `RelayDispatchQueueSize`. + NeedsDispatch: Vec; + /// This is the para that gets will get dispatched first during the next upward dispatchable queue + /// execution round. + /// + /// Invariant: + /// - If `Some(para)`, then `para` must be present in `NeedsDispatch`. + NextDispatchRoundStartWith: Option; + } +} + +decl_module! { + /// The UMP module. + pub struct Module for enum Call where origin: ::Origin { + } +} + +/// Routines related to the upward message passing. +impl Module { + /// Block initialization logic, called by initializer. + pub(crate) fn initializer_initialize(_now: T::BlockNumber) -> Weight { + 0 + } + + /// Block finalization logic, called by initializer. + pub(crate) fn initializer_finalize() {} + + /// Called by the initializer to note that a new session has started. + pub(crate) fn initializer_on_new_session( + _notification: &initializer::SessionChangeNotification, + ) { + Self::perform_outgoing_para_cleanup(); + } + + /// Iterate over all paras that were registered for offboarding and remove all the data + /// associated with them. + fn perform_outgoing_para_cleanup() { + let outgoing = OutgoingParas::take(); + for outgoing_para in outgoing { + Self::clean_ump_after_outgoing(outgoing_para); + } + } + + /// Schedule a para to be cleaned up at the start of the next session. + pub(crate) fn schedule_para_cleanup(id: ParaId) { + OutgoingParas::mutate(|v| { + if let Err(i) = v.binary_search(&id) { + v.insert(i, id); + } + }); + } + + fn clean_ump_after_outgoing(outgoing_para: ParaId) { + ::RelayDispatchQueueSize::remove(&outgoing_para); + ::RelayDispatchQueues::remove(&outgoing_para); + + // Remove the outgoing para from the `NeedsDispatch` list and from + // `NextDispatchRoundStartWith`. + // + // That's needed for maintaining invariant that `NextDispatchRoundStartWith` points to an + // existing item in `NeedsDispatch`. + ::NeedsDispatch::mutate(|v| { + if let Ok(i) = v.binary_search(&outgoing_para) { + v.remove(i); + } + }); + ::NextDispatchRoundStartWith::mutate(|v| { + *v = v.filter(|p| *p == outgoing_para) + }); + } + + /// Check that all the upward messages sent by a candidate pass the acceptance criteria. Returns + /// false, if any of the messages doesn't pass. + pub(crate) fn check_upward_messages( + config: &HostConfiguration, + para: ParaId, + upward_messages: &[UpwardMessage], + ) -> Result<(), AcceptanceCheckErr> { + if upward_messages.len() as u32 > config.max_upward_message_num_per_candidate { + return Err(AcceptanceCheckErr::MoreMessagesThanPermitted { + sent: upward_messages.len() as u32, + permitted: config.max_upward_message_num_per_candidate, + }); + } + + let (mut para_queue_count, mut para_queue_size) = + ::RelayDispatchQueueSize::get(¶); + + for (idx, msg) in upward_messages.into_iter().enumerate() { + let msg_size = msg.len() as u32; + if msg_size > config.max_upward_message_size { + return Err(AcceptanceCheckErr::MessageSize { + idx: idx as u32, + msg_size, + max_size: config.max_upward_message_size, + }); + } + para_queue_count += 1; + para_queue_size += msg_size; + } + + // make sure that the queue is not overfilled. + // we do it here only once since returning false invalidates the whole relay-chain block. + if para_queue_count > config.max_upward_queue_count { + return Err(AcceptanceCheckErr::CapacityExceeded { + count: para_queue_count, + limit: config.max_upward_queue_count, + }); + } + if para_queue_size > config.max_upward_queue_size { + return Err(AcceptanceCheckErr::TotalSizeExceeded { + total_size: para_queue_size, + limit: config.max_upward_queue_size, + }); + } + + Ok(()) + } + + /// Enacts all the upward messages sent by a candidate. + pub(crate) fn enact_upward_messages( + para: ParaId, + upward_messages: Vec, + ) -> Weight { + let mut weight = 0; + + if !upward_messages.is_empty() { + let (extra_cnt, extra_size) = upward_messages + .iter() + .fold((0, 0), |(cnt, size), d| (cnt + 1, size + d.len() as u32)); + + ::RelayDispatchQueues::mutate(¶, |v| { + v.extend(upward_messages.into_iter()) + }); + + ::RelayDispatchQueueSize::mutate(¶, |(ref mut cnt, ref mut size)| { + *cnt += extra_cnt; + *size += extra_size; + }); + + ::NeedsDispatch::mutate(|v| { + if let Err(i) = v.binary_search(¶) { + v.insert(i, para); + } + }); + + weight += T::DbWeight::get().reads_writes(3, 3); + } + + weight + } + + /// Devote some time into dispatching pending upward messages. + pub(crate) fn process_pending_upward_messages() { + let mut used_weight_so_far = 0; + + let config = >::config(); + let mut cursor = NeedsDispatchCursor::new::(); + let mut queue_cache = QueueCache::new(); + + while let Some(dispatchee) = cursor.peek() { + if used_weight_so_far >= config.preferred_dispatchable_upward_messages_step_weight { + // Then check whether we've reached or overshoot the + // preferred weight for the dispatching stage. + // + // if so - bail. + break; + } + + // dequeue the next message from the queue of the dispatchee + let (upward_message, became_empty) = queue_cache.dequeue::(dispatchee); + if let Some(upward_message) = upward_message { + used_weight_so_far += + T::UmpSink::process_upward_message(dispatchee, upward_message); + } + + if became_empty { + // the queue is empty now - this para doesn't need attention anymore. + cursor.remove(); + } else { + cursor.advance(); + } + } + + cursor.flush::(); + queue_cache.flush::(); + } +} + +/// To avoid constant fetching, deserializing and serialization the queues are cached. +/// +/// After an item dequeued from a queue for the first time, the queue is stored in this struct rather +/// than being serialized and persisted. +/// +/// This implementation works best when: +/// +/// 1. when the queues are shallow +/// 2. the dispatcher makes more than one cycle +/// +/// if the queues are deep and there are many we would load and keep the queues for a long time, +/// thus increasing the peak memory consumption of the wasm runtime. Under such conditions persisting +/// queues might play better since it's unlikely that they are going to be requested once more. +/// +/// On the other hand, the situation when deep queues exist and it takes more than one dipsatcher +/// cycle to traverse the queues is already sub-optimal and better be avoided. +/// +/// This struct is not supposed to be dropped but rather to be consumed by [`flush`]. +struct QueueCache(BTreeMap); + +struct QueueCacheEntry { + queue: VecDeque, + count: u32, + total_size: u32, +} + +impl QueueCache { + fn new() -> Self { + Self(BTreeMap::new()) + } + + /// Dequeues one item from the upward message queue of the given para. + /// + /// Returns `(upward_message, became_empty)`, where + /// + /// - `upward_message` a dequeued message or `None` if the queue _was_ empty. + /// - `became_empty` is true if the queue _became_ empty. + fn dequeue(&mut self, para: ParaId) -> (Option, bool) { + let cache_entry = self.0.entry(para).or_insert_with(|| { + let queue = as Store>::RelayDispatchQueues::get(¶); + let (count, total_size) = as Store>::RelayDispatchQueueSize::get(¶); + QueueCacheEntry { + queue, + count, + total_size, + } + }); + let upward_message = cache_entry.queue.pop_front(); + if let Some(ref msg) = upward_message { + cache_entry.count -= 1; + cache_entry.total_size -= msg.len() as u32; + } + + let became_empty = cache_entry.queue.is_empty(); + (upward_message, became_empty) + } + + /// Flushes the updated queues into the storage. + fn flush(self) { + // NOTE we use an explicit method here instead of Drop impl because it has unwanted semantics + // within runtime. It is dangerous to use because of double-panics and flushing on a panic + // is not necessary as well. + for ( + para, + QueueCacheEntry { + queue, + count, + total_size, + }, + ) in self.0 + { + if queue.is_empty() { + // remove the entries altogether. + as Store>::RelayDispatchQueues::remove(¶); + as Store>::RelayDispatchQueueSize::remove(¶); + } else { + as Store>::RelayDispatchQueues::insert(¶, queue); + as Store>::RelayDispatchQueueSize::insert(¶, (count, total_size)); + } + } + } +} + +/// A cursor that iterates over all entries in `NeedsDispatch`. +/// +/// This cursor will start with the para indicated by `NextDispatchRoundStartWith` storage entry. +/// This cursor is cyclic meaning that after reaching the end it will jump to the beginning. Unlike +/// an iterator, this cursor allows removing items during the iteration. +/// +/// Each iteration cycle *must be* concluded with a call to either `advance` or `remove`. +/// +/// This struct is not supposed to be dropped but rather to be consumed by [`flush`]. +#[derive(Debug)] +struct NeedsDispatchCursor { + needs_dispatch: Vec, + cur_idx: usize, +} + +impl NeedsDispatchCursor { + fn new() -> Self { + let needs_dispatch: Vec = as Store>::NeedsDispatch::get(); + let start_with = as Store>::NextDispatchRoundStartWith::get(); + + let start_with_idx = match start_with { + Some(para) => match needs_dispatch.binary_search(¶) { + Ok(found_idx) => found_idx, + Err(_supposed_idx) => { + // well that's weird because we maintain an invariant that + // `NextDispatchRoundStartWith` must point into one of the items in + // `NeedsDispatch`. + // + // let's select 0 as the starting index as a safe bet. + debug_assert!(false); + 0 + } + }, + None => 0, + }; + + Self { + needs_dispatch, + cur_idx: start_with_idx, + } + } + + /// Returns the item the cursor points to. + fn peek(&self) -> Option { + self.needs_dispatch.get(self.cur_idx).cloned() + } + + /// Moves the cursor to the next item. + fn advance(&mut self) { + if self.needs_dispatch.is_empty() { + return; + } + self.cur_idx = (self.cur_idx + 1) % self.needs_dispatch.len(); + } + + /// Removes the item under the cursor. + fn remove(&mut self) { + if self.needs_dispatch.is_empty() { + return; + } + let _ = self.needs_dispatch.remove(self.cur_idx); + + // we might've removed the last element and that doesn't necessarily mean that `needs_dispatch` + // became empty. Reposition the cursor in this case to the beginning. + if self.needs_dispatch.get(self.cur_idx).is_none() { + self.cur_idx = 0; + } + } + + /// Flushes the dispatcher state into the persistent storage. + fn flush(self) { + let next_one = self.peek(); + as Store>::NextDispatchRoundStartWith::set(next_one); + as Store>::NeedsDispatch::put(self.needs_dispatch); + } +} + +#[cfg(test)] +pub(crate) mod mock_sink { + //! An implementation of a mock UMP sink that allows attaching a probe for mocking the weights + //! and checking the sent messages. + //! + //! A default behavior of the UMP sink is to ignore an incoming message and return 0 weight. + //! + //! A probe can be attached to the mock UMP sink. When attached, the mock sink would consult the + //! probe to check whether the received message was expected and what weight it should return. + //! + //! There are two rules on how to use a probe: + //! + //! 1. There can be only one active probe at a time. Creation of another probe while there is + //! already an active one leads to a panic. The probe is scoped to a thread where it was created. + //! + //! 2. All messages expected by the probe must be received by the time of dropping it. Unreceived + //! messages will lead to a panic while dropping a probe. + + use super::{UmpSink, UpwardMessage, ParaId}; + use std::cell::RefCell; + use std::collections::vec_deque::VecDeque; + use frame_support::weights::Weight; + + #[derive(Debug)] + struct UmpExpectation { + expected_origin: ParaId, + expected_msg: UpwardMessage, + mock_weight: Weight, + } + + std::thread_local! { + // `Some` here indicates that there is an active probe. + static HOOK: RefCell>> = RefCell::new(None); + } + + pub struct MockUmpSink; + impl UmpSink for MockUmpSink { + fn process_upward_message(actual_origin: ParaId, actual_msg: Vec) -> Weight { + HOOK.with(|opt_hook| match &mut *opt_hook.borrow_mut() { + Some(hook) => { + let UmpExpectation { + expected_origin, + expected_msg, + mock_weight, + } = match hook.pop_front() { + Some(expectation) => expectation, + None => { + panic!( + "The probe is active but didn't expect the message:\n\n\t{:?}.", + actual_msg, + ); + } + }; + assert_eq!(expected_origin, actual_origin); + assert_eq!(expected_msg, actual_msg); + mock_weight + } + None => 0, + }) + } + } + + pub struct Probe { + _private: (), + } + + impl Probe { + pub fn new() -> Self { + HOOK.with(|opt_hook| { + let prev = opt_hook.borrow_mut().replace(VecDeque::default()); + + // that can trigger if there were two probes were created during one session which + // is may be a bit strict, but may save time figuring out what's wrong. + // if you land here and you do need the two probes in one session consider + // dropping the the existing probe explicitly. + assert!(prev.is_none()); + }); + Self { _private: () } + } + + /// Add an expected message. + /// + /// The enqueued messages are processed in FIFO order. + pub fn assert_msg( + &mut self, + expected_origin: ParaId, + expected_msg: UpwardMessage, + mock_weight: Weight, + ) { + HOOK.with(|opt_hook| { + opt_hook + .borrow_mut() + .as_mut() + .unwrap() + .push_back(UmpExpectation { + expected_origin, + expected_msg, + mock_weight, + }) + }); + } + } + + impl Drop for Probe { + fn drop(&mut self) { + let _ = HOOK.try_with(|opt_hook| { + let prev = opt_hook.borrow_mut().take().expect( + "this probe was created and hasn't been yet destroyed; + the probe cannot be replaced; + there is only one probe at a time allowed; + thus it cannot be `None`; + qed", + ); + + if !prev.is_empty() { + // some messages are left unchecked. We should notify the developer about this. + // however, we do so only if the thread doesn't panic already. Otherwise, the + // developer would get a SIGILL or SIGABRT without a meaningful error message. + if !std::thread::panicking() { + panic!( + "the probe is dropped and not all expected messages arrived: {:?}", + prev + ); + } + } + }); + // an `Err` here signals here that the thread local was already destroyed. + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use super::mock_sink::Probe; + use crate::mock::{Configuration, Ump, new_test_ext, GenesisConfig as MockGenesisConfig}; + use frame_support::IterableStorageMap; + use std::collections::HashSet; + + struct GenesisConfigBuilder { + max_upward_message_size: u32, + max_upward_message_num_per_candidate: u32, + max_upward_queue_count: u32, + max_upward_queue_size: u32, + preferred_dispatchable_upward_messages_step_weight: Weight, + } + + impl Default for GenesisConfigBuilder { + fn default() -> Self { + Self { + max_upward_message_size: 16, + max_upward_message_num_per_candidate: 2, + max_upward_queue_count: 4, + max_upward_queue_size: 64, + preferred_dispatchable_upward_messages_step_weight: 1000, + } + } + } + + impl GenesisConfigBuilder { + fn build(self) -> crate::mock::GenesisConfig { + let mut genesis = default_genesis_config(); + let config = &mut genesis.configuration.config; + + config.max_upward_message_size = self.max_upward_message_size; + config.max_upward_message_num_per_candidate = self.max_upward_message_num_per_candidate; + config.max_upward_queue_count = self.max_upward_queue_count; + config.max_upward_queue_size = self.max_upward_queue_size; + config.preferred_dispatchable_upward_messages_step_weight = + self.preferred_dispatchable_upward_messages_step_weight; + genesis + } + } + + fn default_genesis_config() -> MockGenesisConfig { + MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: crate::configuration::HostConfiguration { + max_downward_message_size: 1024, + ..Default::default() + }, + }, + ..Default::default() + } + } + + fn queue_upward_msg(para: ParaId, msg: UpwardMessage) { + let msgs = vec![msg]; + assert!(Ump::check_upward_messages(&Configuration::config(), para, &msgs).is_ok()); + let _ = Ump::enact_upward_messages(para, msgs); + } + + fn assert_storage_consistency_exhaustive() { + // check that empty queues don't clutter the storage. + for (_para, queue) in ::RelayDispatchQueues::iter() { + assert!(!queue.is_empty()); + } + + // actually count the counts and sizes in queues and compare them to the bookkeeped version. + for (para, queue) in ::RelayDispatchQueues::iter() { + let (expected_count, expected_size) = ::RelayDispatchQueueSize::get(para); + let (actual_count, actual_size) = + queue.into_iter().fold((0, 0), |(acc_count, acc_size), x| { + (acc_count + 1, acc_size + x.len() as u32) + }); + + assert_eq!(expected_count, actual_count); + assert_eq!(expected_size, actual_size); + } + + // since we wipe the empty queues the sets of paras in queue contents, queue sizes and + // need dispatch set should all be equal. + let queue_contents_set = ::RelayDispatchQueues::iter() + .map(|(k, _)| k) + .collect::>(); + let queue_sizes_set = ::RelayDispatchQueueSize::iter() + .map(|(k, _)| k) + .collect::>(); + let needs_dispatch_set = ::NeedsDispatch::get() + .into_iter() + .collect::>(); + assert_eq!(queue_contents_set, queue_sizes_set); + assert_eq!(queue_contents_set, needs_dispatch_set); + + // `NextDispatchRoundStartWith` should point into a para that is tracked. + if let Some(para) = ::NextDispatchRoundStartWith::get() { + assert!(queue_contents_set.contains(¶)); + } + + // `NeedsDispatch` is always sorted. + assert!( + ::NeedsDispatch::get() + .windows(2) + .all(|xs| xs[0] <= xs[1]) + ); + } + + #[test] + fn dispatch_empty() { + new_test_ext(default_genesis_config()).execute_with(|| { + assert_storage_consistency_exhaustive(); + + // make sure that the case with empty queues is handled properly + Ump::process_pending_upward_messages(); + + assert_storage_consistency_exhaustive(); + }); + } + + #[test] + fn dispatch_single_message() { + let a = ParaId::from(228); + let msg = vec![1, 2, 3]; + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + let mut probe = Probe::new(); + + probe.assert_msg(a, msg.clone(), 0); + queue_upward_msg(a, msg); + + Ump::process_pending_upward_messages(); + + assert_storage_consistency_exhaustive(); + }); + } + + #[test] + fn dispatch_resume_after_exceeding_dispatch_stage_weight() { + let a = ParaId::from(128); + let c = ParaId::from(228); + let q = ParaId::from(911); + + let a_msg_1 = vec![1, 2, 3]; + let a_msg_2 = vec![3, 2, 1]; + let c_msg_1 = vec![4, 5, 6]; + let c_msg_2 = vec![9, 8, 7]; + let q_msg = b"we are Q".to_vec(); + + new_test_ext( + GenesisConfigBuilder { + preferred_dispatchable_upward_messages_step_weight: 500, + ..Default::default() + } + .build(), + ) + .execute_with(|| { + queue_upward_msg(q, q_msg.clone()); + queue_upward_msg(c, c_msg_1.clone()); + queue_upward_msg(a, a_msg_1.clone()); + queue_upward_msg(a, a_msg_2.clone()); + + assert_storage_consistency_exhaustive(); + + // we expect only two first messages to fit in the first iteration. + { + let mut probe = Probe::new(); + + probe.assert_msg(a, a_msg_1.clone(), 300); + probe.assert_msg(c, c_msg_1.clone(), 300); + Ump::process_pending_upward_messages(); + assert_storage_consistency_exhaustive(); + + drop(probe); + } + + queue_upward_msg(c, c_msg_2.clone()); + assert_storage_consistency_exhaustive(); + + // second iteration should process the second message. + { + let mut probe = Probe::new(); + + probe.assert_msg(q, q_msg.clone(), 500); + Ump::process_pending_upward_messages(); + assert_storage_consistency_exhaustive(); + + drop(probe); + } + + // 3rd iteration. + { + let mut probe = Probe::new(); + + probe.assert_msg(a, a_msg_2.clone(), 100); + probe.assert_msg(c, c_msg_2.clone(), 100); + Ump::process_pending_upward_messages(); + assert_storage_consistency_exhaustive(); + + drop(probe); + } + + // finally, make sure that the queue is empty. + { + let probe = Probe::new(); + + Ump::process_pending_upward_messages(); + assert_storage_consistency_exhaustive(); + + drop(probe); + } + }); + } + + #[test] + fn dispatch_correctly_handle_remove_of_latest() { + let a = ParaId::from(1991); + let b = ParaId::from(1999); + + let a_msg_1 = vec![1, 2, 3]; + let a_msg_2 = vec![3, 2, 1]; + let b_msg_1 = vec![4, 5, 6]; + + new_test_ext( + GenesisConfigBuilder { + preferred_dispatchable_upward_messages_step_weight: 900, + ..Default::default() + } + .build(), + ) + .execute_with(|| { + // We want to test here an edge case, where we remove the queue with the highest + // para id (i.e. last in the needs_dispatch order). + // + // If the last entry was removed we should proceed execution, assuming we still have + // weight available. + + queue_upward_msg(a, a_msg_1.clone()); + queue_upward_msg(a, a_msg_2.clone()); + queue_upward_msg(b, b_msg_1.clone()); + + { + let mut probe = Probe::new(); + + probe.assert_msg(a, a_msg_1.clone(), 300); + probe.assert_msg(b, b_msg_1.clone(), 300); + probe.assert_msg(a, a_msg_2.clone(), 300); + + Ump::process_pending_upward_messages(); + + drop(probe); + } + }); + } + + #[test] + 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). + + use primitives::v1::well_known_keys; + use parity_scale_codec::Decode as _; + + let a = ParaId::from(228); + let msg = vec![1, 2, 3]; + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + queue_upward_msg(a, msg); + + let raw_queue_size = sp_io::storage::get(&well_known_keys::relay_dispatch_queue_size(a)) + .expect("enqueing a message should create the dispatch queue\ + and it should be accessible via the well known keys"); + let (cnt, size) = <(u32, u32)>::decode(&mut &raw_queue_size[..]) + .expect("the dispatch queue size should be decodable into (u32, u32)"); + + assert_eq!(cnt, 1); + assert_eq!(size, 3); + }); + } +} diff --git a/runtime/parachains/src/util.rs b/runtime/parachains/src/util.rs index 028d65c5d9579dd0332e35c6fec206048e100d5f..ce041981eb1cab57dabb188aa37c777ab4e3adf4 100644 --- a/runtime/parachains/src/util.rs +++ b/runtime/parachains/src/util.rs @@ -17,35 +17,40 @@ //! Utilities that don't belong to any particular module but may draw //! on all modules. -use sp_runtime::traits::{One, Saturating}; -use primitives::v1::{Id as ParaId, PersistedValidationData, TransientValidationData}; -use sp_std::prelude::*; +use sp_runtime::traits::Saturating; +use primitives::v1::{Id as ParaId, PersistedValidationData, TransientValidationData, Hash}; -use crate::{configuration, paras}; +use crate::{configuration, paras, dmp, hrmp}; -/// Make the persisted validation data for a particular parachain. +/// Make the persisted validation data for a particular parachain, a specified relay-parent and it's +/// storage root. /// /// This ties together the storage of several modules. -pub fn make_persisted_validation_data( +pub fn make_persisted_validation_data( para_id: ParaId, + relay_parent_number: T::BlockNumber, + relay_storage_root: Hash, ) -> Option> { - let relay_parent_number = >::block_number() - One::one(); + let config = >::config(); Some(PersistedValidationData { parent_head: >::para_head(¶_id)?, block_number: relay_parent_number, - hrmp_mqc_heads: Vec::new(), + relay_storage_root, + hrmp_mqc_heads: >::hrmp_mqc_heads(para_id), + dmq_mqc_head: >::dmq_mqc_head(para_id), + max_pov_size: config.max_pov_size, }) } -/// Make the transient validation data for a particular parachain. +/// Make the transient validation data for a particular parachain and a specified relay-parent. /// /// This ties together the storage of several modules. -pub fn make_transient_validation_data( +pub fn make_transient_validation_data( para_id: ParaId, + relay_parent_number: T::BlockNumber, ) -> Option> { let config = >::config(); - let relay_parent_number = >::block_number() - One::one(); let freq = config.validation_upgrade_frequency; let delay = config.validation_upgrade_delay; @@ -67,5 +72,6 @@ pub fn make_transient_validation_data( max_head_data_size: config.max_head_data_size, balance: 0, code_upgrade_allowed, + dmq_length: >::dmq_length(para_id), }) } diff --git a/runtime/polkadot/Cargo.toml b/runtime/polkadot/Cargo.toml index d9ee9d799abf67c8426cf4186158d4f62281bdb6..00f9cb019fe66b2908b7acf5c87e1d97dd47ce50 100644 --- a/runtime/polkadot/Cargo.toml +++ b/runtime/polkadot/Cargo.toml @@ -1,19 +1,19 @@ [package] name = "polkadot-runtime" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } -log = { version = "0.3.9", optional = true } -rustc-hex = { version = "2.0.1", default-features = false } -serde = { version = "1.0.102", default-features = false } -serde_derive = { version = "1.0.102", optional = true } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +log = { version = "0.4.11", optional = true } +rustc-hex = { version = "2.1.0", default-features = false } +serde = { version = "1.0.118", default-features = false } +serde_derive = { version = "1.0.117", optional = true } static_assertions = "1.1.0" -smallvec = "1.4.1" +smallvec = "1.6.1" authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -34,13 +34,13 @@ pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-bounties = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-elections-phragmen = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-finality-tracker = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -59,6 +59,7 @@ pallet-staking-reward-curve = { git = "https://github.com/paritytech/substrate", frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-tips = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -67,22 +68,22 @@ frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -hex-literal = { version = "0.2.1" } +hex-literal = { version = "0.3.1", optional = true } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } [dev-dependencies] -hex-literal = "0.2.1" -libsecp256k1 = "0.3.2" -tiny-keccak = "1.5.0" +hex-literal = "0.3.1" +libsecp256k1 = "0.3.5" +tiny-keccak = "2.0.2" keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -trie-db = "0.22.0" -serde_json = "1.0.41" +trie-db = "0.22.2" +serde_json = "1.0.61" [build-dependencies] -wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.6" } +substrate-wasm-builder = "3.0.0" [features] default = ["std"] @@ -94,7 +95,7 @@ std = [ "bitvec/std", "primitives/std", "rustc-hex/std", - "codec/std", + "parity-scale-codec/std", "inherents/std", "sp-core/std", "sp-api/std", @@ -105,13 +106,13 @@ std = [ "frame-support/std", "pallet-authorship/std", "pallet-balances/std", + "pallet-bounties/std", "pallet-transaction-payment/std", "pallet-transaction-payment-rpc-runtime-api/std", "pallet-collective/std", "pallet-elections-phragmen/std", "pallet-democracy/std", "frame-executive/std", - "pallet-finality-tracker/std", "pallet-grandpa/std", "pallet-identity/std", "pallet-im-online/std", @@ -130,6 +131,7 @@ std = [ "frame-system-rpc-runtime-api/std", "pallet-timestamp/std", "pallet-treasury/std", + "pallet-tips/std", "sp-version/std", "serde_derive", "serde/std", @@ -146,24 +148,33 @@ runtime-benchmarks = [ "runtime-common/runtime-benchmarks", "frame-benchmarking", "frame-support/runtime-benchmarks", - "frame-system-benchmarking", "frame-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", + "pallet-babe/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-collective/runtime-benchmarks", "pallet-democracy/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-multisig/runtime-benchmarks", + "pallet-proxy/runtime-benchmarks", "pallet-scheduler/runtime-benchmarks", "pallet-staking/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-treasury/runtime-benchmarks", + "pallet-bounties/runtime-benchmarks", + "pallet-tips/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", "pallet-vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", - # renable when optional - # "hex-literal", + "frame-system-benchmarking", + "hex-literal", ] + # When enabled, the runtime api will not be build. # # This is required by Cumulus to access certain types of the diff --git a/runtime/polkadot/build.rs b/runtime/polkadot/build.rs index f65f04914e538504463cacf744926cb97d0fd574..e4a139a06ae1a85fa05f0f90f568a1a7c2839160 100644 --- a/runtime/polkadot/build.rs +++ b/runtime/polkadot/build.rs @@ -12,14 +12,13 @@ // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with Polkadot. If not, see . -use wasm_builder_runner::WasmBuilder; +use substrate_wasm_builder::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("2.0.0") .import_memory() .export_heap_base() .build() diff --git a/runtime/polkadot/src/constants.rs b/runtime/polkadot/src/constants.rs index f784e9fca1ac43e3fb3c0864df2dd4876bf6a61a..d6704f3eb069991580fea8a2dc7902bcd1ca3900 100644 --- a/runtime/polkadot/src/constants.rs +++ b/runtime/polkadot/src/constants.rs @@ -61,7 +61,7 @@ pub mod fee { /// node's balance type. /// /// This should typically create a mapping between the following ranges: - /// - [0, frame_system::MaximumBlockWeight] + /// - [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: @@ -87,16 +87,16 @@ pub mod fee { #[cfg(test)] mod tests { use frame_support::weights::WeightToFeePolynomial; - use runtime_common::{MaximumBlockWeight, ExtrinsicBaseWeight}; + use runtime_common::{MAXIMUM_BLOCK_WEIGHT, ExtrinsicBaseWeight}; use super::fee::WeightToFee; use super::currency::{CENTS, DOLLARS, MILLICENTS}; #[test] - // This function tests that the fee for `MaximumBlockWeight` of weight is correct + // This function tests that the fee for `MAXIMUM_BLOCK_WEIGHT` of weight is correct fn full_block_fee_is_correct() { // A full block should cost 16 DOLLARS println!("Base: {}", ExtrinsicBaseWeight::get()); - let x = WeightToFee::calc(&MaximumBlockWeight::get()); + let x = WeightToFee::calc(&MAXIMUM_BLOCK_WEIGHT); let y = 16 * DOLLARS; assert!(x.max(y) - x.min(y) < MILLICENTS); } diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index b59f92ec08fc0e94adb6410a4cf297e2d9734fdb..e474d1c20b59cf10c53762558127607dd6eb7991 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -18,29 +18,35 @@ #![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"] +#![recursion_limit = "256"] +use pallet_transaction_payment::CurrencyAdapter; use runtime_common::{ - dummy, claims, SlowAdjustingFeeUpdate, - impls::{CurrencyToVoteHandler, ToAuthor}, - NegativeImbalance, BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, - MaximumBlockLength, BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, - MaximumExtrinsicWeight, purchase, ParachainSessionKeyPlaceholder, + claims, SlowAdjustingFeeUpdate, CurrencyToVote, + impls::DealWithFees, + BlockHashCount, RocksDbWeight, BlockWeights, BlockLength, OffchainSolutionWeightLimit, + ParachainSessionKeyPlaceholder, AssignmentSessionKeyPlaceholder, }; use sp_std::prelude::*; +use sp_std::collections::btree_map::BTreeMap; use sp_core::u32_trait::{_1, _2, _3, _4, _5}; -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; use primitives::v1::{ - AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, + AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CommittedCandidateReceipt, + CoreState, GroupRotationInfo, Hash, Id, Moment, Nonce, OccupiedCoreAssumption, + PersistedValidationData, Signature, ValidationCode, ValidationData, ValidatorId, ValidatorIndex, + InboundDownwardMessage, InboundHrmpMessage, SessionInfo, AssignmentId, +}; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, ModuleId, ApplyExtrinsicResult, + KeyTypeId, Percent, Permill, Perbill, curve::PiecewiseLinear, + transaction_validity::{TransactionValidity, TransactionSource, TransactionPriority}, + traits::{ + BlakeTwo256, Block as BlockT, OpaqueKeys, ConvertInto, IdentityLookup, + Extrinsic as ExtrinsicT, SaturatedConversion, Verify, + }, }; -use primitives::v0 as p_v0; -use sp_runtime::{create_runtime_str, generic, impl_opaque_keys, ModuleId, ApplyExtrinsicResult, KeyTypeId, Percent, Permill, Perbill, transaction_validity::{ - TransactionValidity, TransactionSource, TransactionPriority, -}, curve::PiecewiseLinear, traits::{ - BlakeTwo256, Block as BlockT, OpaqueKeys, ConvertInto, IdentityLookup, - Extrinsic as ExtrinsicT, SaturatedConversion, Verify, -}}; #[cfg(feature = "runtime-benchmarks")] use sp_runtime::RuntimeString; use sp_version::RuntimeVersion; @@ -51,7 +57,7 @@ use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use frame_support::{ parameter_types, construct_runtime, debug, RuntimeDebug, - traits::{KeyOwnerProofSystem, SplitTwoWays, Randomness, LockIdentifier, Filter}, + traits::{KeyOwnerProofSystem, Randomness, LockIdentifier, Filter}, weights::Weight, }; use frame_system::{EnsureRoot, EnsureOneOf}; @@ -86,7 +92,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot"), impl_name: create_runtime_str!("parity-polkadot"), authoring_version: 0, - spec_version: 24, + spec_version: 28, impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, @@ -108,21 +114,17 @@ pub struct BaseFilter; impl Filter for BaseFilter { fn filter(call: &Call) -> bool { match call { - // Parachains stuff - Call::DummyParachains(_) | Call::DummyAttestations(_) | Call::DummySlots(_) | Call::DummyRegistrar(_) | - Call::DummyPurchase(_) => - false, - // These modules are all allowed to be called by transactions: Call::Democracy(_) | Call::Council(_) | Call::TechnicalCommittee(_) | Call::TechnicalMembership(_) | Call::Treasury(_) | Call::ElectionsPhragmen(_) | Call::System(_) | Call::Scheduler(_) | Call::Indices(_) | Call::Babe(_) | Call::Timestamp(_) | Call::Balances(_) | Call::Authorship(_) | Call::Staking(_) | Call::Offences(_) | - Call::Session(_) | Call::FinalityTracker(_) | Call::Grandpa(_) | Call::ImOnline(_) | + Call::Session(_) | Call::Grandpa(_) | Call::ImOnline(_) | Call::AuthorityDiscovery(_) | Call::Utility(_) | Call::Claims(_) | Call::Vesting(_) | - Call::Identity(_) | Call::Proxy(_) | Call::Multisig(_) + Call::Identity(_) | Call::Proxy(_) | Call::Multisig(_) | + Call::Bounties(_) | Call::Tips(_) => true, } } @@ -136,10 +138,13 @@ type MoreThanHalfCouncil = EnsureOneOf< parameter_types! { pub const Version: RuntimeVersion = VERSION; + pub const SS58Prefix: u8 = 0; } -impl frame_system::Trait for Runtime { +impl frame_system::Config for Runtime { type BaseCallFilter = BaseFilter; + type BlockWeights = BlockWeights; + type BlockLength = BlockLength; type Origin = Origin; type Call = Call; type Index = Nonce; @@ -151,29 +156,31 @@ impl frame_system::Trait for Runtime { type Header = generic::Header; type Event = Event; type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; type DbWeight = RocksDbWeight; - type BlockExecutionWeight = BlockExecutionWeight; - type ExtrinsicBaseWeight = ExtrinsicBaseWeight; - type MaximumExtrinsicWeight = MaximumExtrinsicWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; - type ModuleToIndex = ModuleToIndex; + type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); - type SystemWeightInfo = weights::frame_system::WeightInfo; + type SystemWeightInfo = weights::frame_system::WeightInfo; + type SS58Prefix = SS58Prefix; } -impl pallet_scheduler::Trait for Runtime { +parameter_types! { + pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * + BlockWeights::get().max_block; + pub const MaxScheduledPerBlock: u32 = 50; +} + +impl pallet_scheduler::Config for Runtime { type Event = Event; type Origin = Origin; type PalletsOrigin = OriginCaller; type Call = Call; - type MaximumWeight = MaximumBlockWeight; + type MaximumWeight = MaximumSchedulerWeight; type ScheduleOrigin = EnsureRoot; - type WeightInfo = (); + type MaxScheduledPerBlock = MaxScheduledPerBlock; + type WeightInfo = weights::pallet_scheduler::WeightInfo; } parameter_types! { @@ -181,7 +188,7 @@ parameter_types! { pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } -impl pallet_babe::Trait for Runtime { +impl pallet_babe::Config for Runtime { type EpochDuration = EpochDuration; type ExpectedBlockTime = ExpectedBlockTime; @@ -201,49 +208,44 @@ impl pallet_babe::Trait for Runtime { )>>::IdentificationTuple; type HandleEquivocation = - pallet_babe::EquivocationHandler; + pallet_babe::EquivocationHandler; + + type WeightInfo = (); } parameter_types! { pub const IndexDeposit: Balance = 10 * DOLLARS; } -impl pallet_indices::Trait for Runtime { +impl pallet_indices::Config for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; type Event = Event; - type WeightInfo = (); + type WeightInfo = weights::pallet_indices::WeightInfo; } parameter_types! { pub const ExistentialDeposit: Balance = 100 * CENTS; + pub const MaxLocks: u32 = 50; } -/// Splits fees 80/20 between treasury and block author. -pub type DealWithFees = SplitTwoWays< - Balance, - NegativeImbalance, - _4, Treasury, // 4 parts (80%) goes to the treasury. - _1, ToAuthor, // 1 part (20%) goes to the block author. ->; - -impl pallet_balances::Trait for Runtime { +impl pallet_balances::Config for Runtime { type Balance = Balance; type DustRemoval = (); type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = weights::pallet_balances::WeightInfo; + type MaxLocks = MaxLocks; + type WeightInfo = weights::pallet_balances::WeightInfo; } parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; } -impl pallet_transaction_payment::Trait for Runtime { - type Currency = Balances; - type OnTransactionPayment = DealWithFees; +impl pallet_transaction_payment::Config for Runtime { + type OnChargeTransaction = CurrencyAdapter>; type TransactionByteFee = TransactionByteFee; type WeightToFee = WeightToFee; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; @@ -252,11 +254,11 @@ impl pallet_transaction_payment::Trait for Runtime { parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; } -impl pallet_timestamp::Trait for Runtime { +impl pallet_timestamp::Config for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; - type WeightInfo = weights::pallet_timestamp::WeightInfo; + type WeightInfo = weights::pallet_timestamp::WeightInfo; } parameter_types! { @@ -264,28 +266,58 @@ parameter_types! { } // TODO: substrate#2986 implement this properly -impl pallet_authorship::Trait for Runtime { +impl pallet_authorship::Config for Runtime { type FindAuthor = pallet_session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); type EventHandler = (Staking, ImOnline); } +impl_opaque_keys! { + pub struct OldSessionKeys { + pub grandpa: Grandpa, + pub babe: Babe, + pub im_online: ImOnline, + pub para_validator: ParachainSessionKeyPlaceholder, + pub authority_discovery: AuthorityDiscovery, + } +} + impl_opaque_keys! { pub struct SessionKeys { pub grandpa: Grandpa, pub babe: Babe, pub im_online: ImOnline, - pub parachain_validator: ParachainSessionKeyPlaceholder, + pub para_validator: ParachainSessionKeyPlaceholder, + pub para_assignment: AssignmentSessionKeyPlaceholder, pub authority_discovery: AuthorityDiscovery, } } +fn transform_session_keys(v: AccountId, old: OldSessionKeys) -> SessionKeys { + SessionKeys { + grandpa: old.grandpa, + babe: old.babe, + im_online: old.im_online, + para_validator: old.para_validator, + para_assignment: { + // We need to produce a dummy value that's unique for the validator. + let mut id = AssignmentId::default(); + let id_raw: &mut [u8] = id.as_mut(); + id_raw.copy_from_slice(v.as_ref()); + id_raw[0..4].copy_from_slice(b"asgn"); + + id + }, + authority_discovery: old.authority_discovery, + } +} + parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } -impl pallet_session::Trait for Runtime { +impl pallet_session::Config for Runtime { type Event = Event; type ValidatorId = AccountId; type ValidatorIdOf = pallet_staking::StashOf; @@ -295,10 +327,10 @@ impl pallet_session::Trait for Runtime { type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; - type WeightInfo = (); + type WeightInfo = weights::pallet_session::WeightInfo; } -impl pallet_session::historical::Trait for Runtime { +impl pallet_session::historical::Config for Runtime { type FullIdentification = pallet_staking::Exposure; type FullIdentificationOf = pallet_staking::ExposureOf; } @@ -326,7 +358,7 @@ parameter_types! { pub const BondingDuration: pallet_staking::EraIndex = 28; pub const SlashDeferDuration: pallet_staking::EraIndex = 27; pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const MaxNominatorRewardedPerValidator: u32 = 256; + pub const MaxNominatorRewardedPerValidator: u32 = 128; // last 15 minutes of the last session will be for election. pub const ElectionLookahead: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 16; pub const MaxIterations: u32 = 10; @@ -339,10 +371,10 @@ type SlashCancelOrigin = EnsureOneOf< pallet_collective::EnsureProportionAtLeast<_3, _4, AccountId, CouncilCollective> >; -impl pallet_staking::Trait for Runtime { +impl pallet_staking::Config for Runtime { type Currency = Balances; type UnixTime = Timestamp; - type CurrencyToVote = CurrencyToVoteHandler; + type CurrencyToVote = CurrencyToVote; type RewardRemainder = Treasury; type Event = Event; type Slash = Treasury; @@ -361,7 +393,10 @@ impl pallet_staking::Trait for Runtime { type UnsignedPriority = StakingUnsignedPriority; type MaxIterations = MaxIterations; type MinSolutionScoreBump = MinSolutionScoreBump; - type WeightInfo = weights::pallet_staking::WeightInfo; + // The unsigned solution weight targeted by the OCW. We set it to the maximum possible value of + // a single extrinsic. + type OffchainSolutionWeightLimit = OffchainSolutionWeightLimit; + type WeightInfo = weights::pallet_staking::WeightInfo; } parameter_types! { @@ -374,7 +409,7 @@ parameter_types! { pub const MaxRegistrars: u32 = 20; } -impl pallet_identity::Trait for Runtime { +impl pallet_identity::Config for Runtime { type Event = Event; type Currency = Balances; type BasicDeposit = BasicDeposit; @@ -386,7 +421,7 @@ impl pallet_identity::Trait for Runtime { type Slashed = Treasury; type ForceOrigin = MoreThanHalfCouncil; type RegistrarOrigin = MoreThanHalfCouncil; - type WeightInfo = (); + type WeightInfo = weights::pallet_identity::WeightInfo; } parameter_types! { @@ -400,9 +435,10 @@ parameter_types! { pub const PreimageByteDeposit: Balance = 1 * CENTS; pub const InstantAllowed: bool = true; pub const MaxVotes: u32 = 100; + pub const MaxProposals: u32 = 100; } -impl pallet_democracy::Trait for Runtime { +impl pallet_democracy::Config for Runtime { type Proposal = Call; type Event = Event; type Currency = Balances; @@ -439,10 +475,17 @@ impl pallet_democracy::Trait for Runtime { type InstantAllowed = InstantAllowed; type FastTrackVotingPeriod = FastTrackVotingPeriod; // To cancel a proposal which has been passed, 2/3 of the council must agree to it. - type CancellationOrigin = frame_system::EnsureOneOf, - frame_system::EnsureRoot, + EnsureRoot, >; + // To cancel a proposal before it has been passed, the technical committee must be unanimous or + // Root must agree. + type CancelProposalOrigin = EnsureOneOf, + EnsureRoot, + >; + type BlacklistOrigin = EnsureRoot; // Any single technical committee member may veto a coming council proposal, however they can // only do it once and it lasts only for the cooloff period. type VetoOrigin = pallet_collective::EnsureMember; @@ -453,7 +496,8 @@ impl pallet_democracy::Trait for Runtime { type Scheduler = Scheduler; type PalletsOrigin = OriginCaller; type MaxVotes = MaxVotes; - type WeightInfo = weights::pallet_democracy::WeightInfo; + type WeightInfo = weights::pallet_democracy::WeightInfo; + type MaxProposals = MaxProposals; } parameter_types! { @@ -463,7 +507,7 @@ parameter_types! { } type CouncilCollective = pallet_collective::Instance1; -impl pallet_collective::Trait for Runtime { +impl pallet_collective::Config for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; @@ -472,7 +516,7 @@ impl pallet_collective::Trait for Runtime { type MaxProposals = CouncilMaxProposals; type MaxMembers = CouncilMaxMembers; type DefaultVote = pallet_collective::PrimeDefaultVote; - type WeightInfo = weights::pallet_collective::WeightInfo; + type WeightInfo = weights::pallet_collective::WeightInfo; } parameter_types! { @@ -488,13 +532,13 @@ parameter_types! { // Make sure that there are no more than `MaxMembers` members elected via phragmen. const_assert!(DesiredMembers::get() <= CouncilMaxMembers::get()); -impl pallet_elections_phragmen::Trait for Runtime { +impl pallet_elections_phragmen::Config for Runtime { type Event = Event; type ModuleId = ElectionsPhragmenModuleId; type Currency = Balances; type ChangeMembers = Council; type InitializeMembers = Council; - type CurrencyToVote = CurrencyToVoteHandler; + type CurrencyToVote = frame_support::traits::U128CurrencyToVote; type CandidacyBond = CandidacyBond; type VotingBond = VotingBond; type LoserCandidate = Treasury; @@ -503,7 +547,7 @@ impl pallet_elections_phragmen::Trait for Runtime { type DesiredMembers = DesiredMembers; type DesiredRunnersUp = DesiredRunnersUp; type TermDuration = TermDuration; - type WeightInfo = (); + type WeightInfo = weights::pallet_elections_phragmen::WeightInfo; } parameter_types! { @@ -513,7 +557,7 @@ parameter_types! { } type TechnicalCollective = pallet_collective::Instance2; -impl pallet_collective::Trait for Runtime { +impl pallet_collective::Config for Runtime { type Origin = Origin; type Proposal = Call; type Event = Event; @@ -522,10 +566,10 @@ impl pallet_collective::Trait for Runtime { type MaxProposals = TechnicalMaxProposals; type MaxMembers = TechnicalMaxMembers; type DefaultVote = pallet_collective::PrimeDefaultVote; - type WeightInfo = weights::pallet_collective::WeightInfo; + type WeightInfo = weights::pallet_collective::WeightInfo; } -impl pallet_membership::Trait for Runtime { +impl pallet_membership::Config for Runtime { type Event = Event; type AddOrigin = MoreThanHalfCouncil; type RemoveOrigin = MoreThanHalfCouncil; @@ -546,7 +590,13 @@ parameter_types! { pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); pub const TipReportDepositBase: Balance = 1 * DOLLARS; - pub const TipReportDepositPerByte: Balance = 1 * CENTS; + pub const DataDepositPerByte: Balance = 1 * CENTS; + pub const BountyDepositBase: Balance = 1 * DOLLARS; + pub const BountyDepositPayoutDelay: BlockNumber = 8 * DAYS; + pub const BountyUpdatePeriod: BlockNumber = 90 * DAYS; + pub const MaximumReasonLength: u32 = 16384; + pub const BountyCuratorDeposit: Permill = Permill::from_percent(50); + pub const BountyValueMinimum: Balance = 10 * DOLLARS; } type ApproveOrigin = EnsureOneOf< @@ -555,59 +605,78 @@ type ApproveOrigin = EnsureOneOf< pallet_collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective> >; -impl pallet_treasury::Trait for Runtime { +impl pallet_treasury::Config for Runtime { type ModuleId = TreasuryModuleId; type Currency = Balances; type ApproveOrigin = ApproveOrigin; type RejectOrigin = MoreThanHalfCouncil; - type Tippers = ElectionsPhragmen; - type TipCountdown = TipCountdown; - type TipFindersFee = TipFindersFee; - type TipReportDepositBase = TipReportDepositBase; - type TipReportDepositPerByte = TipReportDepositPerByte; type Event = Event; - type ProposalRejection = Treasury; + type OnSlash = Treasury; type ProposalBond = ProposalBond; type ProposalBondMinimum = ProposalBondMinimum; type SpendPeriod = SpendPeriod; type Burn = Burn; type BurnDestination = (); - type WeightInfo = (); + type SpendFunds = Bounties; + type WeightInfo = weights::pallet_treasury::WeightInfo; +} + +impl pallet_bounties::Config for Runtime { + type Event = Event; + type BountyDepositBase = BountyDepositBase; + type BountyDepositPayoutDelay = BountyDepositPayoutDelay; + type BountyUpdatePeriod = BountyUpdatePeriod; + type BountyCuratorDeposit = BountyCuratorDeposit; + type BountyValueMinimum = BountyValueMinimum; + type DataDepositPerByte = DataDepositPerByte; + type MaximumReasonLength = MaximumReasonLength; + type WeightInfo = weights::pallet_bounties::WeightInfo; +} + +impl pallet_tips::Config for Runtime { + type Event = Event; + type DataDepositPerByte = DataDepositPerByte; + type MaximumReasonLength = MaximumReasonLength; + type Tippers = ElectionsPhragmen; + type TipCountdown = TipCountdown; + type TipFindersFee = TipFindersFee; + type TipReportDepositBase = TipReportDepositBase; + type WeightInfo = weights::pallet_tips::WeightInfo; } parameter_types! { - pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); + pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * BlockWeights::get().max_block; } -impl pallet_offences::Trait for Runtime { +impl pallet_offences::Config for Runtime { type Event = Event; type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; - type WeightInfo = (); } -impl pallet_authority_discovery::Trait for Runtime {} +impl pallet_authority_discovery::Config for Runtime {} parameter_types! { pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; } parameter_types! { - pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; + pub StakingUnsignedPriority: TransactionPriority = + Perbill::from_percent(90) * TransactionPriority::max_value(); pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); } -impl pallet_im_online::Trait for Runtime { +impl pallet_im_online::Config for Runtime { type AuthorityId = ImOnlineId; type Event = Event; type SessionDuration = SessionDuration; type ReportUnresponsiveness = Offences; type UnsignedPriority = ImOnlineUnsignedPriority; - type WeightInfo = (); + type WeightInfo = weights::pallet_im_online::WeightInfo; } -impl pallet_grandpa::Trait for Runtime { +impl pallet_grandpa::Config for Runtime { type Event = Event; type Call = Call; @@ -622,17 +691,8 @@ impl pallet_grandpa::Trait for Runtime { type KeyOwnerProofSystem = Historical; type HandleEquivocation = pallet_grandpa::EquivocationHandler; -} - -parameter_types! { - pub WindowSize: BlockNumber = pallet_finality_tracker::DEFAULT_WINDOW_SIZE.into(); - pub ReportLatency: BlockNumber = pallet_finality_tracker::DEFAULT_REPORT_LATENCY.into(); -} -impl pallet_finality_tracker::Trait for Runtime { - type OnFinalizationStalled = (); - type WindowSize = WindowSize; - type ReportLatency = ReportLatency; + type WeightInfo = (); } /// Submits a transaction with the node's public and signature type. Adheres to the signed extension @@ -644,7 +704,7 @@ impl frame_system::offchain::CreateSignedTransaction for R call: Call, public: ::Signer, account: AccountId, - nonce: ::Index, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { // take the biggest period possible. let period = BlockHashCount::get() @@ -699,30 +759,31 @@ parameter_types! { pub Prefix: &'static [u8] = b"Pay DOTs to the Polkadot account:"; } -impl claims::Trait for Runtime { +impl claims::Config for Runtime { type Event = Event; type VestingSchedule = Vesting; type Prefix = Prefix; /// At least 3/4 of the council must agree to a claim move before it can happen. type MoveClaimOrigin = pallet_collective::EnsureProportionAtLeast<_3, _4, AccountId, CouncilCollective>; + type WeightInfo = weights::runtime_common_claims::WeightInfo; } parameter_types! { pub const MinVestedTransfer: Balance = 100 * DOLLARS; } -impl pallet_vesting::Trait for Runtime { +impl pallet_vesting::Config for Runtime { type Event = Event; type Currency = Balances; type BlockNumberToBalance = ConvertInto; type MinVestedTransfer = MinVestedTransfer; - type WeightInfo = (); + type WeightInfo = weights::pallet_vesting::WeightInfo; } -impl pallet_utility::Trait for Runtime { +impl pallet_utility::Config for Runtime { type Event = Event; type Call = Call; - type WeightInfo = weights::pallet_utility::WeightInfo; + type WeightInfo = weights::pallet_utility::WeightInfo; } parameter_types! { @@ -733,14 +794,14 @@ parameter_types! { pub const MaxSignatories: u16 = 100; } -impl pallet_multisig::Trait for Runtime { +impl pallet_multisig::Config for Runtime { type Event = Event; type Call = Call; type Currency = Balances; type DepositBase = DepositBase; type DepositFactor = DepositFactor; type MaxSignatories = MaxSignatories; - type WeightInfo = (); + type WeightInfo = weights::pallet_multisig::WeightInfo; } parameter_types! { @@ -754,10 +815,6 @@ parameter_types! { pub const MaxPending: u16 = 32; } -impl dummy::Trait for Runtime { - type Event = Event; -} - /// The type used to represent the kinds of proxying allowed. #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug)] pub enum ProxyType { @@ -817,7 +874,6 @@ impl InstanceFilter for ProxyType { Call::Staking(..) | Call::Offences(..) | Call::Session(..) | - Call::FinalityTracker(..) | Call::Grandpa(..) | Call::ImOnline(..) | Call::AuthorityDiscovery(..) | @@ -827,10 +883,8 @@ impl InstanceFilter for ProxyType { Call::ElectionsPhragmen(..) | Call::TechnicalMembership(..) | Call::Treasury(..) | - Call::DummyParachains(..) | - Call::DummyAttestations(..) | - Call::DummySlots(..) | - Call::DummyRegistrar(..) | + Call::Bounties(..) | + Call::Tips(..) | Call::Claims(..) | Call::Vesting(pallet_vesting::Call::vest(..)) | Call::Vesting(pallet_vesting::Call::vest_other(..)) | @@ -841,15 +895,23 @@ impl InstanceFilter for ProxyType { Call::Multisig(..) ), ProxyType::Governance => matches!(c, - Call::Democracy(..) | Call::Council(..) | Call::TechnicalCommittee(..) - | Call::ElectionsPhragmen(..) | Call::Treasury(..) | Call::Utility(..) + Call::Democracy(..) | + Call::Council(..) | + Call::TechnicalCommittee(..) | + Call::ElectionsPhragmen(..) | + Call::Treasury(..) | + Call::Bounties(..) | + Call::Tips(..) | + Call::Utility(..) ), ProxyType::Staking => matches!(c, - Call::Staking(..) | Call::Utility(pallet_utility::Call::batch(..)) | Call::Utility(..) + Call::Staking(..) | + Call::Session(..) | + Call::Utility(..) ), ProxyType::IdentityJudgement => matches!(c, - Call::Identity(pallet_identity::Call::provide_judgement(..)) - | Call::Utility(pallet_utility::Call::batch(..)) + Call::Identity(pallet_identity::Call::provide_judgement(..)) | + Call::Utility(..) ) } } @@ -864,7 +926,7 @@ impl InstanceFilter for ProxyType { } } -impl pallet_proxy::Trait for Runtime { +impl pallet_proxy::Config for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -872,17 +934,26 @@ impl pallet_proxy::Trait for Runtime { type ProxyDepositBase = ProxyDepositBase; type ProxyDepositFactor = ProxyDepositFactor; type MaxProxies = MaxProxies; - type WeightInfo = weights::pallet_proxy::WeightInfo; + type WeightInfo = weights::pallet_proxy::WeightInfo; type MaxPending = MaxPending; type CallHasher = BlakeTwo256; type AnnouncementDepositBase = AnnouncementDepositBase; type AnnouncementDepositFactor = AnnouncementDepositFactor; } +// When this is removed, should also remove `OldSessionKeys`. +pub struct UpgradeSessionKeys; +impl frame_support::traits::OnRuntimeUpgrade for UpgradeSessionKeys { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + Session::upgrade_keys::(transform_session_keys); + Perbill::from_percent(50) * BlockWeights::get().max_block + } +} + pub struct CustomOnRuntimeUpgrade; impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { fn on_runtime_upgrade() -> frame_support::weights::Weight { - purchase::remove_pallet::() + 0 } } @@ -893,61 +964,58 @@ construct_runtime! { UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. - System: frame_system::{Module, Call, Storage, Config, Event}, - RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage}, - Scheduler: pallet_scheduler::{Module, Call, Storage, Event}, + System: frame_system::{Module, Call, Storage, Config, Event} = 0, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage} = 31, + Scheduler: pallet_scheduler::{Module, Call, Storage, Event} = 1, // Must be before session. - Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, + Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned} = 2, - Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, - Indices: pallet_indices::{Module, Call, Storage, Config, Event}, - Balances: pallet_balances::{Module, Call, Storage, Config, Event}, - TransactionPayment: pallet_transaction_payment::{Module, Storage}, + Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent} = 3, + Indices: pallet_indices::{Module, Call, Storage, Config, Event} = 4, + Balances: pallet_balances::{Module, Call, Storage, Config, Event} = 5, + TransactionPayment: pallet_transaction_payment::{Module, Storage} = 32, // Consensus support. - Authorship: pallet_authorship::{Module, Call, Storage}, - Staking: pallet_staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - Offences: pallet_offences::{Module, Call, Storage, Event}, - Historical: session_historical::{Module}, - Session: pallet_session::{Module, Call, Storage, Event, Config}, - FinalityTracker: pallet_finality_tracker::{Module, Call, Storage, Inherent}, - Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, - AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, + Authorship: pallet_authorship::{Module, Call, Storage} = 6, + Staking: pallet_staking::{Module, Call, Storage, Config, Event, ValidateUnsigned} = 7, + Offences: pallet_offences::{Module, Call, Storage, Event} = 8, + Historical: session_historical::{Module} = 33, + Session: pallet_session::{Module, Call, Storage, Event, Config} = 9, + Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned} = 11, + ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config} = 12, + AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config} = 13, // Governance stuff. - Democracy: pallet_democracy::{Module, Call, Storage, Config, Event}, - Council: pallet_collective::::{Module, Call, Storage, Origin, Event, Config}, - TechnicalCommittee: pallet_collective::::{Module, Call, Storage, Origin, Event, Config}, - ElectionsPhragmen: pallet_elections_phragmen::{Module, Call, Storage, Event, Config}, - TechnicalMembership: pallet_membership::::{Module, Call, Storage, Event, Config}, - Treasury: pallet_treasury::{Module, Call, Storage, Event}, - - // Old parachains stuff. All dummies to avoid messing up the transaction indices. - DummyParachains: dummy::::{Module, Call}, - DummyAttestations: dummy::::{Module, Call}, - DummySlots: dummy::::{Module, Call, Event}, - DummyRegistrar: dummy::::{Module, Call, Event}, + Democracy: pallet_democracy::{Module, Call, Storage, Config, Event} = 14, + Council: pallet_collective::::{Module, Call, Storage, Origin, Event, Config} = 15, + TechnicalCommittee: pallet_collective::::{Module, Call, Storage, Origin, Event, Config} = 16, + ElectionsPhragmen: pallet_elections_phragmen::{Module, Call, Storage, Event, Config} = 17, + TechnicalMembership: pallet_membership::::{Module, Call, Storage, Event, Config} = 18, + Treasury: pallet_treasury::{Module, Call, Storage, Config, Event} = 19, // Claims. Usable initially. - Claims: claims::{Module, Call, Storage, Event, Config, ValidateUnsigned}, + Claims: claims::{Module, Call, Storage, Event, Config, ValidateUnsigned} = 24, // Vesting. Usable initially, but removed once all vesting is finished. - Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, + Vesting: pallet_vesting::{Module, Call, Storage, Event, Config} = 25, // Cunning utilities. Usable initially. - Utility: pallet_utility::{Module, Call, Event}, - - // Old spot for the purchase pallet. Can be replaced later by a new pallet. - DummyPurchase: dummy::::{Module, Call, Event}, + Utility: pallet_utility::{Module, Call, Event} = 26, // Identity. Late addition. - Identity: pallet_identity::{Module, Call, Storage, Event}, + Identity: pallet_identity::{Module, Call, Storage, Event} = 28, // Proxy module. Late addition. - Proxy: pallet_proxy::{Module, Call, Storage, Event}, + Proxy: pallet_proxy::{Module, Call, Storage, Event} = 29, // Multisig dispatch. Late addition. - Multisig: pallet_multisig::{Module, Call, Storage, Event}, + Multisig: pallet_multisig::{Module, Call, Storage, Event} = 30, + + // Bounties module. + Bounties: pallet_bounties::{Module, Call, Storage, Event} = 34, + + // Tips module. + Tips: pallet_tips::{Module, Call, Storage, Event} = 35, + } } @@ -983,7 +1051,7 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllModules, - CustomOnRuntimeUpgrade + UpgradeSessionKeys, >; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; @@ -1049,56 +1117,70 @@ sp_api::impl_runtime_apis! { Executive::offchain_worker(header) } } - // Dummy implementation to continue supporting old parachains runtime temporarily. - impl p_v0::ParachainHost for Runtime { - fn validators() -> Vec { - // this is a compile-time check of size equality. note that we don't invoke - // the function and nothing here is unsafe. - let _ = core::mem::transmute::; - - // Yes, these aren't actually the parachain session keys. - // It doesn't matter, but we shouldn't return a zero-sized vector here. - // As there are no parachains - Session::validators() - .into_iter() - .map(|k| k.using_encoded(|s| Decode::decode(&mut &s[..])) - .expect("correct size and raw-bytes; qed")) - .collect() + + impl primitives::v1::ParachainHost for Runtime { + fn validators() -> Vec { + Vec::new() } - fn duty_roster() -> p_v0::DutyRoster { - let v = Session::validators(); - p_v0::DutyRoster { validator_duty: (0..v.len()).map(|_| p_v0::Chain::Relay).collect() } + + fn validator_groups() -> (Vec>, GroupRotationInfo) { + (Vec::new(), GroupRotationInfo { session_start_block: 0, group_rotation_frequency: 0, now: 0 }) } - fn active_parachains() -> Vec<(p_v0::Id, Option<(p_v0::CollatorId, p_v0::Retriable)>)> { + + fn availability_cores() -> Vec> { Vec::new() } - fn global_validation_data() -> p_v0::GlobalValidationData { - p_v0::GlobalValidationData { - max_code_size: 1, - max_head_data_size: 1, - block_number: System::block_number().saturating_sub(1), - } + + fn full_validation_data(_: Id, _: OccupiedCoreAssumption) + -> Option> { + None } - fn local_validation_data(_id: p_v0::Id) -> Option { + + fn persisted_validation_data(_: Id, _: OccupiedCoreAssumption) + -> Option> { None } - fn parachain_code(_id: p_v0::Id) -> Option { + + fn check_validation_outputs(_: Id, _: primitives::v1::CandidateCommitments) -> bool { + false + } + + fn session_index_for_child() -> SessionIndex { + 0 + } + + fn session_info(_: SessionIndex) -> Option { None } - fn get_heads(_extrinsics: Vec<::Extrinsic>) - -> Option> - { + + fn validation_code(_: Id, _: OccupiedCoreAssumption) -> Option { None } - fn signing_context() -> p_v0::SigningContext { - p_v0::SigningContext { - parent_hash: System::parent_hash(), - session_index: Session::current_index(), - } + + fn historical_validation_code(_: Id, _: BlockNumber) -> Option { + None } - fn downward_messages(_id: p_v0::Id) -> Vec { + + fn candidate_pending_availability(_: Id) -> Option> { + None + } + + fn candidate_events() -> Vec> { + Vec::new() + } + + fn dmq_contents( + _recipient: Id, + ) -> Vec> { Vec::new() } + + fn inbound_hrmp_channels_contents( + _recipient: Id + ) -> BTreeMap>> { + BTreeMap::new() + } + } impl fg_primitives::GrandpaApi for Runtime { @@ -1125,7 +1207,7 @@ sp_api::impl_runtime_apis! { _set_id: fg_primitives::SetId, authority_id: fg_primitives::AuthorityId, ) -> Option { - use codec::Encode; + use parity_scale_codec::Encode; Historical::prove((fg_primitives::KEY_TYPE, authority_id)) .map(|p| p.encode()) @@ -1154,11 +1236,19 @@ sp_api::impl_runtime_apis! { Babe::current_epoch_start() } + fn current_epoch() -> babe_primitives::Epoch { + Babe::current_epoch() + } + + fn next_epoch() -> babe_primitives::Epoch { + Babe::next_epoch() + } + fn generate_key_ownership_proof( _slot_number: babe_primitives::SlotNumber, authority_id: babe_primitives::AuthorityId, ) -> Option { - use codec::Encode; + use parity_scale_codec::Encode; Historical::prove((babe_primitives::KEY_TYPE, authority_id)) .map(|p| p.encode()) @@ -1224,9 +1314,9 @@ sp_api::impl_runtime_apis! { use pallet_offences_benchmarking::Module as OffencesBench; use frame_system_benchmarking::Module as SystemBench; - impl pallet_session_benchmarking::Trait for Runtime {} - impl pallet_offences_benchmarking::Trait for Runtime {} - impl frame_system_benchmarking::Trait for Runtime {} + impl pallet_session_benchmarking::Config for Runtime {} + impl pallet_offences_benchmarking::Config for Runtime {} + impl frame_system_benchmarking::Config for Runtime {} let whitelist: Vec = vec![ // Block Number @@ -1246,20 +1336,27 @@ sp_api::impl_runtime_apis! { let mut batches = Vec::::new(); let params = (&config, &whitelist); // Polkadot - add_benchmark!(params, batches, claims, Claims); + add_benchmark!(params, batches, runtime_common::claims, Claims); // Substrate add_benchmark!(params, batches, pallet_balances, Balances); + add_benchmark!(params, batches, pallet_bounties, Bounties); add_benchmark!(params, batches, pallet_collective, Council); add_benchmark!(params, batches, pallet_democracy, Democracy); add_benchmark!(params, batches, pallet_elections_phragmen, ElectionsPhragmen); + add_benchmark!(params, batches, pallet_identity, Identity); add_benchmark!(params, batches, pallet_im_online, ImOnline); + add_benchmark!(params, batches, pallet_indices, Indices); + add_benchmark!(params, batches, pallet_multisig, Multisig); add_benchmark!(params, batches, pallet_offences, OffencesBench::); + add_benchmark!(params, batches, pallet_proxy, Proxy); add_benchmark!(params, batches, pallet_scheduler, Scheduler); add_benchmark!(params, batches, pallet_session, SessionBench::); add_benchmark!(params, batches, pallet_staking, Staking); add_benchmark!(params, batches, frame_system, SystemBench::); add_benchmark!(params, batches, pallet_timestamp, Timestamp); + add_benchmark!(params, batches, pallet_tips, Tips); add_benchmark!(params, batches, pallet_treasury, Treasury); + add_benchmark!(params, batches, pallet_utility, Utility); add_benchmark!(params, batches, pallet_vesting, Vesting); if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } diff --git a/runtime/polkadot/src/weights/frame_system.rs b/runtime/polkadot/src/weights/frame_system.rs index 9522fa75203906ab3c7264154a4b33835375843c..87537327d8210eb0b85e34b792f6fd180c2c6bca 100644 --- a/runtime/polkadot/src/weights/frame_system.rs +++ b/runtime/polkadot/src/weights/frame_system.rs @@ -1,58 +1,76 @@ -// This file is part of Substrate. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. -// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// 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. -// 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. +// 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 . +//! Weights for frame_system +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-10-29, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=frame_system +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header +// ./file_header.txt +// --output=./runtime/polkadot/src/weights/ -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 #![allow(unused_parens)] +#![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl frame_system::WeightInfo for WeightInfo { - // WARNING! Some components were not used: ["b"] - fn remark() -> Weight { - (1305000 as Weight) +/// Weight functions for frame_system. +pub struct WeightInfo(PhantomData); +impl frame_system::WeightInfo for WeightInfo { + fn remark(_b: u32, ) -> Weight { + (1_851_000 as Weight) } fn set_heap_pages() -> Weight { - (2023000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (2_436_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // WARNING! Some components were not used: ["d"] fn set_changes_trie_config() -> Weight { - (10026000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (11_436_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn set_storage(i: u32, ) -> Weight { (0 as Weight) - .saturating_add((656000 as Weight).saturating_mul(i as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + .saturating_add((813_000 as Weight).saturating_mul(i as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) } fn kill_storage(i: u32, ) -> Weight { - (4327000 as Weight) - .saturating_add((478000 as Weight).saturating_mul(i as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + (0 as Weight) + .saturating_add((545_000 as Weight).saturating_mul(i as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) } fn kill_prefix(p: u32, ) -> Weight { - (8349000 as Weight) - .saturating_add((838000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) + (0 as Weight) + .saturating_add((869_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) } fn suicide() -> Weight { - (29247000 as Weight) + (35_460_000 as Weight) } } diff --git a/runtime/polkadot/src/weights/mod.rs b/runtime/polkadot/src/weights/mod.rs index 25efdf81eda29e74be30095bf57be66121c69ca6..cb9ea434b724d8c8adc9ad34d8f5862174d16172 100644 --- a/runtime/polkadot/src/weights/mod.rs +++ b/runtime/polkadot/src/weights/mod.rs @@ -1,26 +1,37 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// 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. +// 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. -// 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 collection of weight modules used for pallets in the runtime. +//! A list of the different weight modules for our runtime. pub mod frame_system; pub mod pallet_balances; pub mod pallet_collective; pub mod pallet_democracy; +pub mod pallet_elections_phragmen; +pub mod pallet_identity; +pub mod pallet_im_online; +pub mod pallet_indices; +pub mod pallet_multisig; +pub mod pallet_proxy; +pub mod pallet_scheduler; +pub mod pallet_session; pub mod pallet_staking; pub mod pallet_timestamp; +pub mod pallet_treasury; pub mod pallet_utility; -pub mod pallet_proxy; +pub mod pallet_vesting; +pub mod pallet_bounties; +pub mod pallet_tips; +pub mod runtime_common_claims; diff --git a/runtime/polkadot/src/weights/pallet_balances.rs b/runtime/polkadot/src/weights/pallet_balances.rs index 152f8cb8e981726052c2ce16b2087f54f1245556..c1998eafcbc78d216dba664fb614a733f4338cfc 100644 --- a/runtime/polkadot/src/weights/pallet_balances.rs +++ b/runtime/polkadot/src/weights/pallet_balances.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -13,35 +13,59 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +//! Autogenerated weights for pallet_balances +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-08, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_balances +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; -pub struct WeightInfo; -impl pallet_balances::WeightInfo for WeightInfo { + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_balances. +pub struct WeightInfo(PhantomData); +impl pallet_balances::WeightInfo for WeightInfo { fn transfer() -> Weight { - (65949000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (93_434_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_keep_alive() -> Weight { - (46665000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (64_060_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_creating() -> Weight { - (27086000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (35_345_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_killing() -> Weight { - (33424000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (44_679_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_transfer() -> Weight { - (65343000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (92_521_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } } diff --git a/runtime/polkadot/src/weights/pallet_bounties.rs b/runtime/polkadot/src/weights/pallet_bounties.rs new file mode 100644 index 0000000000000000000000000000000000000000..75756c905f20a30601c4cbab8a303dcff02bb7a2 --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_bounties.rs @@ -0,0 +1,109 @@ +// This file is part of Substrate. + +// Copyright (C) 2020 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_bounties +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-11-20, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 128 + +// Executed Command: +// target/release/substrate +// benchmark +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_bounties +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./frame/bounties/src/weights.rs +// --template=./.maintain/frame-weight-template.hbs + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for pallet_bounties using the Substrate node and recommended hardware. +pub struct WeightInfo(PhantomData); +impl pallet_bounties::WeightInfo for WeightInfo { + fn propose_bounty(d: u32, ) -> Weight { + (64_778_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(d as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn approve_bounty() -> Weight { + (18_293_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn propose_curator() -> Weight { + (14_248_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn unassign_curator() -> Weight { + (52_100_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn accept_curator() -> Weight { + (52_564_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn award_bounty() -> Weight { + (37_426_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn claim_bounty() -> Weight { + (176_077_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + fn close_bounty_proposed() -> Weight { + (51_162_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn close_bounty_active() -> Weight { + (116_907_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn extend_bounty_expiry() -> Weight { + (36_419_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn spend_funds(b: u32, ) -> Weight { + (7_562_000 as Weight) + // Standard Error: 16_000 + .saturating_add((77_328_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(b as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(b as Weight))) + } +} diff --git a/runtime/polkadot/src/weights/pallet_collective.rs b/runtime/polkadot/src/weights/pallet_collective.rs index 32b4ad02d7aa94c8007429b24bef2f062b310036..52e58a91e092de79eb4ab03058b9b7788b3649eb 100644 --- a/runtime/polkadot/src/weights/pallet_collective.rs +++ b/runtime/polkadot/src/weights/pallet_collective.rs @@ -1,97 +1,140 @@ -// Copyright (C) 2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. -// 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. +// 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_collective +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-08, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_collective +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc6 #![allow(unused_parens)] #![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl pallet_collective::WeightInfo for WeightInfo { +/// Weight functions for pallet_collective. +pub struct WeightInfo(PhantomData); +impl pallet_collective::WeightInfo for WeightInfo { fn set_members(m: u32, n: u32, p: u32, ) -> Weight { (0 as Weight) - .saturating_add((21040000 as Weight).saturating_mul(m as Weight)) - .saturating_add((173000 as Weight).saturating_mul(n as Weight)) - .saturating_add((31595000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(p as Weight))) - .saturating_add(DbWeight::get().writes(2 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) + // Standard Error: 9_000 + .saturating_add((20_774_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 9_000 + .saturating_add((140_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 9_000 + .saturating_add((28_269_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(p as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) } fn execute(b: u32, m: u32, ) -> Weight { - (43359000 as Weight) - .saturating_add((4000 as Weight).saturating_mul(b as Weight)) - .saturating_add((123000 as Weight).saturating_mul(m as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) + (31_199_000 as Weight) + // Standard Error: 0 + .saturating_add((4_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 0 + .saturating_add((112_000 as Weight).saturating_mul(m as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) } fn propose_execute(b: u32, m: u32, ) -> Weight { - (54134000 as Weight) - .saturating_add((4000 as Weight).saturating_mul(b as Weight)) - .saturating_add((239000 as Weight).saturating_mul(m as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) + (38_299_000 as Weight) + // Standard Error: 0 + .saturating_add((4_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 0 + .saturating_add((226_000 as Weight).saturating_mul(m as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) } fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { - (90650000 as Weight) - .saturating_add((5000 as Weight).saturating_mul(b as Weight)) - .saturating_add((152000 as Weight).saturating_mul(m as Weight)) - .saturating_add((970000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(4 as Weight)) + (62_096_000 as Weight) + // Standard Error: 0 + .saturating_add((5_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 0 + .saturating_add((120_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 0 + .saturating_add((595_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn vote(m: u32, ) -> Weight { - (74460000 as Weight) - .saturating_add((290000 as Weight).saturating_mul(m as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (44_252_000 as Weight) + // Standard Error: 0 + .saturating_add((286_000 as Weight).saturating_mul(m as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn close_early_disapproved(m: u32, p: u32, ) -> Weight { - (86360000 as Weight) - .saturating_add((232000 as Weight).saturating_mul(m as Weight)) - .saturating_add((954000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (59_479_000 as Weight) + // Standard Error: 0 + .saturating_add((221_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 0 + .saturating_add((549_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn close_early_approved(b: u32, m: u32, p: u32, ) -> Weight { - (123653000 as Weight) - .saturating_add((1000 as Weight).saturating_mul(b as Weight)) - .saturating_add((287000 as Weight).saturating_mul(m as Weight)) - .saturating_add((920000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (85_690_000 as Weight) + // Standard Error: 0 + .saturating_add((4_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 0 + .saturating_add((223_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 0 + .saturating_add((555_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn close_disapproved(m: u32, p: u32, ) -> Weight { - (95395000 as Weight) - .saturating_add((236000 as Weight).saturating_mul(m as Weight)) - .saturating_add((965000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (65_935_000 as Weight) + // Standard Error: 0 + .saturating_add((225_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 0 + .saturating_add((554_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn close_approved(b: u32, m: u32, p: u32, ) -> Weight { - (135284000 as Weight) - .saturating_add((4000 as Weight).saturating_mul(b as Weight)) - .saturating_add((218000 as Weight).saturating_mul(m as Weight)) - .saturating_add((951000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(5 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (92_386_000 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 0 + .saturating_add((224_000 as Weight).saturating_mul(m as Weight)) + // Standard Error: 0 + .saturating_add((562_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn disapprove_proposal(p: u32, ) -> Weight { - (50500000 as Weight) - .saturating_add((966000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (34_916_000 as Weight) + // Standard Error: 0 + .saturating_add((557_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } } diff --git a/runtime/polkadot/src/weights/pallet_democracy.rs b/runtime/polkadot/src/weights/pallet_democracy.rs index 676281309c3fac02e24e52dc74ba710fc33a4802..156e30c16caed8cfc08d076e8906c56a2c1dca04 100644 --- a/runtime/polkadot/src/weights/pallet_democracy.rs +++ b/runtime/polkadot/src/weights/pallet_democracy.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -13,144 +13,195 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +//! Autogenerated weights for pallet_democracy +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-08, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 -//! Weights for the Democracy Pallet -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_democracy +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; -pub struct WeightInfo; -impl pallet_democracy::WeightInfo for WeightInfo { +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_democracy. +pub struct WeightInfo(PhantomData); +impl pallet_democracy::WeightInfo for WeightInfo { fn propose() -> Weight { - (49113000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (78_090_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn second(s: u32, ) -> Weight { - (42067000 as Weight) - .saturating_add((220000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (51_177_000 as Weight) + // Standard Error: 0 + .saturating_add((192_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn vote_new(r: u32, ) -> Weight { - (54159000 as Weight) - .saturating_add((252000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (60_433_000 as Weight) + // Standard Error: 0 + .saturating_add((232_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn vote_existing(r: u32, ) -> Weight { - (54145000 as Weight) - .saturating_add((262000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (60_023_000 as Weight) + // Standard Error: 0 + .saturating_add((238_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn emergency_cancel() -> Weight { - (31071000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (38_461_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn blacklist(p: u32, ) -> Weight { + (121_984_000 as Weight) + // Standard Error: 7_000 + .saturating_add((836_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) } fn external_propose(v: u32, ) -> Weight { - (14282000 as Weight) - .saturating_add((109000 as Weight).saturating_mul(v as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (18_730_000 as Weight) + // Standard Error: 0 + .saturating_add((108_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn external_propose_majority() -> Weight { - (3478000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (4_251_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn external_propose_default() -> Weight { - (3442000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (4_239_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn fast_track() -> Weight { - (30820000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (38_645_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn veto_external(v: u32, ) -> Weight { - (30971000 as Weight) - .saturating_add((184000 as Weight).saturating_mul(v as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (39_490_000 as Weight) + // Standard Error: 0 + .saturating_add((184_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn cancel_proposal(p: u32, ) -> Weight { + (84_238_000 as Weight) + // Standard Error: 0 + .saturating_add((913_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn cancel_referendum() -> Weight { - (20431000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (22_688_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn cancel_queued(r: u32, ) -> Weight { - (42438000 as Weight) - .saturating_add((3284000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (42_080_000 as Weight) + // Standard Error: 1_000 + .saturating_add((3_577_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn on_initialize_base(r: u32, ) -> Weight { - (70826000 as Weight) - .saturating_add((10716000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(6 as Weight)) - .saturating_add(DbWeight::get().reads((2 as Weight).saturating_mul(r as Weight))) - .saturating_add(DbWeight::get().writes(5 as Weight)) + (16_213_000 as Weight) + // Standard Error: 2_000 + .saturating_add((7_057_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) } fn delegate(r: u32, ) -> Weight { - (72046000 as Weight) - .saturating_add((7837000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) - .saturating_add(DbWeight::get().writes(4 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) + (79_864_000 as Weight) + // Standard Error: 2_000 + .saturating_add((10_135_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) } fn undelegate(r: u32, ) -> Weight { - (41028000 as Weight) - .saturating_add((7810000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) - .saturating_add(DbWeight::get().writes(2 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) + (40_868_000 as Weight) + // Standard Error: 2_000 + .saturating_add((10_138_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(r as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(r as Weight))) } fn clear_public_proposals() -> Weight { - (3643000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_574_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn note_preimage(b: u32, ) -> Weight { - (46629000 as Weight) - .saturating_add((4000 as Weight).saturating_mul(b as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (57_683_000 as Weight) + // Standard Error: 0 + .saturating_add((4_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn note_imminent_preimage(b: u32, ) -> Weight { - (31147000 as Weight) - .saturating_add((3000 as Weight).saturating_mul(b as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (39_299_000 as Weight) + // Standard Error: 0 + .saturating_add((4_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn reap_preimage(b: u32, ) -> Weight { - (42848000 as Weight) - .saturating_add((3000 as Weight).saturating_mul(b as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (53_857_000 as Weight) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn unlock_remove(r: u32, ) -> Weight { - (45333000 as Weight) - .saturating_add((171000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (51_271_000 as Weight) + // Standard Error: 0 + .saturating_add((38_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn unlock_set(r: u32, ) -> Weight { - (44424000 as Weight) - .saturating_add((291000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (46_362_000 as Weight) + // Standard Error: 0 + .saturating_add((228_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn remove_vote(r: u32, ) -> Weight { - (28250000 as Weight) - .saturating_add((283000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (27_825_000 as Weight) + // Standard Error: 0 + .saturating_add((223_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn remove_other_vote(r: u32, ) -> Weight { - (28250000 as Weight) - .saturating_add((283000 as Weight).saturating_mul(r as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (27_987_000 as Weight) + // Standard Error: 0 + .saturating_add((223_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } } diff --git a/runtime/polkadot/src/weights/pallet_elections_phragmen.rs b/runtime/polkadot/src/weights/pallet_elections_phragmen.rs new file mode 100644 index 0000000000000000000000000000000000000000..0407fe84dd34ad90cdaeace2358d15d4f3f33428 --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_elections_phragmen.rs @@ -0,0 +1,116 @@ +// Copyright 2017-2020 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_elections_phragmen +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-08, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_elections_phragmen +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_elections_phragmen. +pub struct WeightInfo(PhantomData); +impl pallet_elections_phragmen::WeightInfo for WeightInfo { + fn vote(v: u32, ) -> Weight { + (88_644_000 as Weight) + // Standard Error: 7_000 + .saturating_add((130_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn vote_update(v: u32, ) -> Weight { + (54_456_000 as Weight) + // Standard Error: 3_000 + .saturating_add((133_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn remove_voter() -> Weight { + (71_138_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn report_defunct_voter_correct(c: u32, v: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 0 + .saturating_add((1_749_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 12_000 + .saturating_add((34_327_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn report_defunct_voter_incorrect(c: u32, v: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 0 + .saturating_add((1_755_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 9_000 + .saturating_add((34_280_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn submit_candidacy(c: u32, ) -> Weight { + (70_892_000 as Weight) + // Standard Error: 0 + .saturating_add((292_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn renounce_candidacy_candidate(c: u32, ) -> Weight { + (43_358_000 as Weight) + // Standard Error: 0 + .saturating_add((143_000 as Weight).saturating_mul(c as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn renounce_candidacy_members() -> Weight { + (75_956_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn renounce_candidacy_runners_up() -> Weight { + (46_888_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn remove_member_with_replacement() -> Weight { + (116_053_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + fn remove_member_wrong_refund() -> Weight { + (9_093_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/pallet_identity.rs b/runtime/polkadot/src/weights/pallet_identity.rs new file mode 100644 index 0000000000000000000000000000000000000000..d4e21417b92821355dd25f25afb6bcf5a7414b78 --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_identity.rs @@ -0,0 +1,179 @@ +// Copyright 2017-2020 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_identity +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-08, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_identity +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_identity. +pub struct WeightInfo(PhantomData); +impl pallet_identity::WeightInfo for WeightInfo { + fn add_registrar(r: u32, ) -> Weight { + (28_261_000 as Weight) + // Standard Error: 3_000 + .saturating_add((318_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_identity(r: u32, x: u32, ) -> Weight { + (73_360_000 as Weight) + // Standard Error: 19_000 + .saturating_add((234_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 2_000 + .saturating_add((1_863_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_subs_new(s: u32, ) -> Weight { + (52_544_000 as Weight) + // Standard Error: 1_000 + .saturating_add((9_959_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + } + fn set_subs_old(p: u32, ) -> Weight { + (48_351_000 as Weight) + // Standard Error: 0 + .saturating_add((3_391_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) + } + fn clear_identity(r: u32, s: u32, x: u32, ) -> Weight { + (62_001_000 as Weight) + // Standard Error: 8_000 + .saturating_add((171_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 0 + .saturating_add((3_390_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_089_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + } + fn request_judgement(r: u32, x: u32, ) -> Weight { + (74_257_000 as Weight) + // Standard Error: 8_000 + .saturating_add((334_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_000 + .saturating_add((2_141_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn cancel_request(r: u32, x: u32, ) -> Weight { + (62_893_000 as Weight) + // Standard Error: 11_000 + .saturating_add((231_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_000 + .saturating_add((2_117_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_fee(r: u32, ) -> Weight { + (10_890_000 as Weight) + // Standard Error: 1_000 + .saturating_add((268_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_account_id(r: u32, ) -> Weight { + (12_410_000 as Weight) + // Standard Error: 1_000 + .saturating_add((268_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_fields(r: u32, ) -> Weight { + (10_855_000 as Weight) + // Standard Error: 1_000 + .saturating_add((269_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn provide_judgement(r: u32, x: u32, ) -> Weight { + (49_519_000 as Weight) + // Standard Error: 9_000 + .saturating_add((299_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_000 + .saturating_add((2_127_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn kill_identity(r: u32, s: u32, x: u32, ) -> Weight { + (103_419_000 as Weight) + // Standard Error: 5_000 + .saturating_add((120_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 0 + .saturating_add((3_400_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + } + fn add_sub(s: u32, ) -> Weight { + (72_490_000 as Weight) + // Standard Error: 0 + .saturating_add((191_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn rename_sub(s: u32, ) -> Weight { + (23_454_000 as Weight) + // Standard Error: 0 + .saturating_add((25_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn remove_sub(s: u32, ) -> Weight { + (69_012_000 as Weight) + // Standard Error: 0 + .saturating_add((164_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn quit_sub(s: u32, ) -> Weight { + (45_725_000 as Weight) + // Standard Error: 0 + .saturating_add((158_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/pallet_im_online.rs b/runtime/polkadot/src/weights/pallet_im_online.rs new file mode 100644 index 0000000000000000000000000000000000000000..1e9a2b2f20ad61c43a3ee625cb812d919627164c --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_im_online.rs @@ -0,0 +1,55 @@ +// Copyright 2017-2020 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 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_im_online +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_im_online. +pub struct WeightInfo(PhantomData); +impl pallet_im_online::WeightInfo for WeightInfo { + fn validate_unsigned_and_then_heartbeat(k: u32, e: u32, ) -> Weight { + (111_740_000 as Weight) + // Standard Error: 0 + .saturating_add((217_000 as Weight).saturating_mul(k as Weight)) + // Standard Error: 1_000 + .saturating_add((510_000 as Weight).saturating_mul(e as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/pallet_indices.rs b/runtime/polkadot/src/weights/pallet_indices.rs new file mode 100644 index 0000000000000000000000000000000000000000..28bd0c88a71a5842231840d411db5a84ac81dab5 --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_indices.rs @@ -0,0 +1,71 @@ +// Copyright 2017-2020 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_indices +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_indices +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_indices. +pub struct WeightInfo(PhantomData); +impl pallet_indices::WeightInfo for WeightInfo { + fn claim() -> Weight { + (52_777_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer() -> Weight { + (59_482_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn free() -> Weight { + (48_062_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_transfer() -> Weight { + (49_541_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn freeze() -> Weight { + (45_151_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/pallet_multisig.rs b/runtime/polkadot/src/weights/pallet_multisig.rs new file mode 100644 index 0000000000000000000000000000000000000000..c7582995d07fd641a5d79b7e694dc1c892b88b25 --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_multisig.rs @@ -0,0 +1,124 @@ +// Copyright 2017-2020 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_multisig +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_multisig +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_multisig. +pub struct WeightInfo(PhantomData); +impl pallet_multisig::WeightInfo for WeightInfo { + fn as_multi_threshold_1(z: u32, ) -> Weight { + (12_532_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + } + fn as_multi_create(s: u32, z: u32, ) -> Weight { + (70_460_000 as Weight) + // Standard Error: 0 + .saturating_add((86_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_create_store(s: u32, z: u32, ) -> Weight { + (79_056_000 as Weight) + // Standard Error: 0 + .saturating_add((90_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_approve(s: u32, z: u32, ) -> Weight { + (42_175_000 as Weight) + // Standard Error: 0 + .saturating_add((113_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_approve_store(s: u32, z: u32, ) -> Weight { + (75_726_000 as Weight) + // Standard Error: 0 + .saturating_add((126_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_complete(s: u32, z: u32, ) -> Weight { + (87_543_000 as Weight) + // Standard Error: 0 + .saturating_add((247_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((5_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn approve_as_multi_create(s: u32, ) -> Weight { + (69_831_000 as Weight) + // Standard Error: 0 + .saturating_add((89_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_approve(s: u32, ) -> Weight { + (41_395_000 as Weight) + // Standard Error: 0 + .saturating_add((111_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_complete(s: u32, ) -> Weight { + (162_511_000 as Weight) + // Standard Error: 0 + .saturating_add((249_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn cancel_as_multi(s: u32, ) -> Weight { + (112_698_000 as Weight) + // Standard Error: 0 + .saturating_add((90_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/pallet_proxy.rs b/runtime/polkadot/src/weights/pallet_proxy.rs index 5d8655e6c3b0fa31d618b6b112e75c44eaf64f23..0ea750d212aae3913dfd4fc0ac43ea504c6e4cba 100644 --- a/runtime/polkadot/src/weights/pallet_proxy.rs +++ b/runtime/polkadot/src/weights/pallet_proxy.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -13,74 +13,111 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +//! Autogenerated weights for pallet_proxy +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_proxy +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; -pub struct WeightInfo; -impl pallet_proxy::WeightInfo for WeightInfo { +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_proxy. +pub struct WeightInfo(PhantomData); +impl pallet_proxy::WeightInfo for WeightInfo { fn proxy(p: u32, ) -> Weight { - (26127000 as Weight) - .saturating_add((214000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) + (31_560_000 as Weight) + // Standard Error: 1_000 + .saturating_add((190_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) } fn proxy_announced(a: u32, p: u32, ) -> Weight { - (55405000 as Weight) - .saturating_add((774000 as Weight).saturating_mul(a as Weight)) - .saturating_add((209000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (65_555_000 as Weight) + // Standard Error: 1_000 + .saturating_add((843_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 1_000 + .saturating_add((194_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn remove_announcement(a: u32, p: u32, ) -> Weight { - (35879000 as Weight) - .saturating_add((783000 as Weight).saturating_mul(a as Weight)) - .saturating_add((20000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (41_808_000 as Weight) + // Standard Error: 1_000 + .saturating_add((842_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 1_000 + .saturating_add((10_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn reject_announcement(a: u32, p: u32, ) -> Weight { - (36097000 as Weight) - .saturating_add((780000 as Weight).saturating_mul(a as Weight)) - .saturating_add((12000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (41_713_000 as Weight) + // Standard Error: 1_000 + .saturating_add((847_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 1_000 + .saturating_add((12_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn announce(a: u32, p: u32, ) -> Weight { - (53769000 as Weight) - .saturating_add((675000 as Weight).saturating_mul(a as Weight)) - .saturating_add((214000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (66_579_000 as Weight) + // Standard Error: 1_000 + .saturating_add((730_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 1_000 + .saturating_add((199_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn add_proxy(p: u32, ) -> Weight { - (36082000 as Weight) - .saturating_add((234000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (44_930_000 as Weight) + // Standard Error: 1_000 + .saturating_add((206_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxy(p: u32, ) -> Weight { - (32885000 as Weight) - .saturating_add((267000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (40_436_000 as Weight) + // Standard Error: 1_000 + .saturating_add((241_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxies(p: u32, ) -> Weight { - (31735000 as Weight) - .saturating_add((215000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (38_695_000 as Weight) + // Standard Error: 1_000 + .saturating_add((191_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn anonymous(p: u32, ) -> Weight { - (50907000 as Weight) - .saturating_add((61000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (64_695_000 as Weight) + // Standard Error: 1_000 + .saturating_add((13_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn kill_anonymous(p: u32, ) -> Weight { - (33926000 as Weight) - .saturating_add((208000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (41_503_000 as Weight) + // Standard Error: 1_000 + .saturating_add((192_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } } diff --git a/runtime/polkadot/src/weights/pallet_scheduler.rs b/runtime/polkadot/src/weights/pallet_scheduler.rs new file mode 100644 index 0000000000000000000000000000000000000000..d3fb9ff8b47eab901b1f2ed6f0991f4afae5258f --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_scheduler.rs @@ -0,0 +1,74 @@ +// Copyright 2017-2020 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_scheduler +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_scheduler +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_scheduler. +pub struct WeightInfo(PhantomData); +impl pallet_scheduler::WeightInfo for WeightInfo { + fn schedule(s: u32, ) -> Weight { + (34_190_000 as Weight) + // Standard Error: 0 + .saturating_add((41_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn cancel(s: u32, ) -> Weight { + (31_368_000 as Weight) + // Standard Error: 7_000 + .saturating_add((3_230_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn schedule_named(s: u32, ) -> Weight { + (44_444_000 as Weight) + // Standard Error: 1_000 + .saturating_add((55_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn cancel_named(s: u32, ) -> Weight { + (35_660_000 as Weight) + // Standard Error: 7_000 + .saturating_add((3_238_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/pallet_session.rs b/runtime/polkadot/src/weights/pallet_session.rs new file mode 100644 index 0000000000000000000000000000000000000000..f496e32ba510f95c4c85c5dbbe664c1728abc96b --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_session.rs @@ -0,0 +1,56 @@ +// Copyright 2017-2020 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_session +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_session +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_session. +pub struct WeightInfo(PhantomData); +impl pallet_session::WeightInfo for WeightInfo { + fn set_keys() -> Weight { + (95_877_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } + fn purge_keys() -> Weight { + (56_080_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/pallet_staking.rs b/runtime/polkadot/src/weights/pallet_staking.rs index 3379cb76749f2a06bcf83ffc223ea462e147c878..134f87b140bba4335c4e38f52da1ec7a01c19686 100644 --- a/runtime/polkadot/src/weights/pallet_staking.rs +++ b/runtime/polkadot/src/weights/pallet_staking.rs @@ -1,168 +1,208 @@ -// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. -// 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. +// 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_staking +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_staking +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ -//! Default weights of pallet-staking. -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc6 #![allow(unused_parens)] #![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl pallet_staking::WeightInfo for WeightInfo { +/// Weight functions for pallet_staking. +pub struct WeightInfo(PhantomData); +impl pallet_staking::WeightInfo for WeightInfo { fn bond() -> Weight { - (144278000 as Weight) - .saturating_add(DbWeight::get().reads(5 as Weight)) - .saturating_add(DbWeight::get().writes(4 as Weight)) + (98_601_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn bond_extra() -> Weight { - (110715000 as Weight) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (78_522_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn unbond() -> Weight { - (99840000 as Weight) - .saturating_add(DbWeight::get().reads(5 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (70_546_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn withdraw_unbonded_update(s: u32, ) -> Weight { - (100728000 as Weight) - .saturating_add((63000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(5 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (71_228_000 as Weight) + // Standard Error: 0 + .saturating_add((33_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn withdraw_unbonded_kill(s: u32, ) -> Weight { - (168879000 as Weight) - .saturating_add((6666000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(7 as Weight)) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + (116_427_000 as Weight) + // Standard Error: 1_000 + .saturating_add((4_046_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } fn validate() -> Weight { - (35539000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (24_212_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn nominate(n: u32, ) -> Weight { - (48596000 as Weight) - .saturating_add((308000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (31_922_000 as Weight) + // Standard Error: 12_000 + .saturating_add((418_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn chill() -> Weight { - (35144000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (24_183_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn set_payee() -> Weight { - (24255000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (16_569_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_controller() -> Weight { - (52294000 as Weight) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (35_580_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn set_validator_count() -> Weight { - (5185000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_217_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_no_eras() -> Weight { - (5907000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_688_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_new_era() -> Weight { - (5917000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_739_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_new_era_always() -> Weight { - (5952000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_611_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_invulnerables(v: u32, ) -> Weight { - (6324000 as Weight) - .saturating_add((9000 as Weight).saturating_mul(v as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_864_000 as Weight) + // Standard Error: 0 + .saturating_add((9_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_unstake(s: u32, ) -> Weight { - (119691000 as Weight) - .saturating_add((6681000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + (78_757_000 as Weight) + // Standard Error: 1_000 + .saturating_add((4_037_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } fn cancel_deferred_slash(s: u32, ) -> Weight { - (5820201000 as Weight) - .saturating_add((34672000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (5_845_293_000 as Weight) + // Standard Error: 388_000 + .saturating_add((34_621_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn payout_stakers_dead_controller(n: u32, ) -> Weight { - (0 as Weight) - .saturating_add((92486000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(n as Weight))) + (142_251_000 as Weight) + // Standard Error: 11_000 + .saturating_add((60_125_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(11 as Weight)) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(n as Weight))) } fn payout_stakers_alive_staked(n: u32, ) -> Weight { - (0 as Weight) - .saturating_add((117324000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads((5 as Weight).saturating_mul(n as Weight))) - .saturating_add(DbWeight::get().writes((3 as Weight).saturating_mul(n as Weight))) + (172_317_000 as Weight) + // Standard Error: 17_000 + .saturating_add((78_585_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(12 as Weight)) + .saturating_add(T::DbWeight::get().reads((5 as Weight).saturating_mul(n as Weight))) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(n as Weight))) } fn rebond(l: u32, ) -> Weight { - (71316000 as Weight) - .saturating_add((142000 as Weight).saturating_mul(l as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (48_379_000 as Weight) + // Standard Error: 1_000 + .saturating_add((109_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn set_history_depth(e: u32, ) -> Weight { (0 as Weight) - .saturating_add((51901000 as Weight).saturating_mul(e as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(4 as Weight)) - .saturating_add(DbWeight::get().writes((7 as Weight).saturating_mul(e as Weight))) + // Standard Error: 64_000 + .saturating_add((39_072_000 as Weight).saturating_mul(e as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + .saturating_add(T::DbWeight::get().writes((7 as Weight).saturating_mul(e as Weight))) } fn reap_stash(s: u32, ) -> Weight { - (147166000 as Weight) - .saturating_add((6661000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + (100_021_000 as Weight) + // Standard Error: 1_000 + .saturating_add((4_046_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } fn new_era(v: u32, n: u32, ) -> Weight { (0 as Weight) - .saturating_add((1440459000 as Weight).saturating_mul(v as Weight)) - .saturating_add((182580000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads(10 as Weight)) - .saturating_add(DbWeight::get().reads((4 as Weight).saturating_mul(v as Weight))) - .saturating_add(DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((3 as Weight).saturating_mul(v as Weight))) + // Standard Error: 759_000 + .saturating_add((751_624_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 38_000 + .saturating_add((106_491_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().reads((4 as Weight).saturating_mul(v as Weight))) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(v as Weight))) } fn submit_solution_better(v: u32, n: u32, a: u32, w: u32, ) -> Weight { (0 as Weight) - .saturating_add((964000 as Weight).saturating_mul(v as Weight)) - .saturating_add((432000 as Weight).saturating_mul(n as Weight)) - .saturating_add((204294000 as Weight).saturating_mul(a as Weight)) - .saturating_add((9546000 as Weight).saturating_mul(w as Weight)) - .saturating_add(DbWeight::get().reads(6 as Weight)) - .saturating_add(DbWeight::get().reads((4 as Weight).saturating_mul(a as Weight))) - .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(w as Weight))) - .saturating_add(DbWeight::get().writes(2 as Weight)) + // Standard Error: 44_000 + .saturating_add((1_321_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 17_000 + .saturating_add((535_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 44_000 + .saturating_add((102_449_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 91_000 + .saturating_add((7_907_000 as Weight).saturating_mul(w as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().reads((4 as Weight).saturating_mul(a as Weight))) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(w as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } } diff --git a/runtime/polkadot/src/weights/pallet_timestamp.rs b/runtime/polkadot/src/weights/pallet_timestamp.rs index cfd5f192d35298b512ee75e4d26acf11355ce3ba..4ebf6c1988c247643a6781c848f3b53c48981c9d 100644 --- a/runtime/polkadot/src/weights/pallet_timestamp.rs +++ b/runtime/polkadot/src/weights/pallet_timestamp.rs @@ -1,34 +1,54 @@ -// Copyright (C) 2020 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 FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 +// Copyright 2017-2020 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_timestamp +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_timestamp +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ + #![allow(unused_parens)] +#![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl pallet_timestamp::WeightInfo for WeightInfo { - // WARNING! Some components were not used: ["t"] +/// Weight functions for pallet_timestamp. +pub struct WeightInfo(PhantomData); +impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { - (9133000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (11_397_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // WARNING! Some components were not used: ["t"] fn on_finalize() -> Weight { - (5915000 as Weight) + (6_096_000 as Weight) } } diff --git a/runtime/polkadot/src/weights/pallet_tips.rs b/runtime/polkadot/src/weights/pallet_tips.rs new file mode 100644 index 0000000000000000000000000000000000000000..7a30ae060bdc8a18990d6f6d28846329c2d9ce0a --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_tips.rs @@ -0,0 +1,90 @@ +// This file is part of Substrate. + +// Copyright (C) 2020 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_tips +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-20, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 128 + +// Executed Command: +// target/release/substrate +// benchmark +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_tips +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./frame/tips/src/weights.rs +// --template=./.maintain/frame-weight-template.hbs + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for pallet_tips using the Substrate node and recommended hardware. +pub struct WeightInfo(PhantomData); +impl pallet_tips::WeightInfo for WeightInfo { + fn report_awesome(r: u32, ) -> Weight { + (73_795_000 as Weight) + // Standard Error: 0 + .saturating_add((2_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn retract_tip() -> Weight { + (61_753_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn tip_new(r: u32, t: u32, ) -> Weight { + (47_731_000 as Weight) + // Standard Error: 0 + .saturating_add((2_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 0 + .saturating_add((154_000 as Weight).saturating_mul(t as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn tip(t: u32, ) -> Weight { + (35_215_000 as Weight) + // Standard Error: 1_000 + .saturating_add((712_000 as Weight).saturating_mul(t as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn close_tip(t: u32, ) -> Weight { + (117_027_000 as Weight) + // Standard Error: 1_000 + .saturating_add((375_000 as Weight).saturating_mul(t as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn slash_tip(t: u32, ) -> Weight { + (37_184_000 as Weight) + // Standard Error: 0 + .saturating_add((11_000 as Weight).saturating_mul(t as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/pallet_treasury.rs b/runtime/polkadot/src/weights/pallet_treasury.rs new file mode 100644 index 0000000000000000000000000000000000000000..6ab5b0e545f06fcb510658e9d3d158909ff2dc41 --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_treasury.rs @@ -0,0 +1,69 @@ +// Copyright 2017-2020 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_treasury +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_treasury +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_treasury. +pub struct WeightInfo(PhantomData); +impl pallet_treasury::WeightInfo for WeightInfo { + fn propose_spend() -> Weight { + (55_957_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn reject_proposal() -> Weight { + (45_616_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn approve_proposal() -> Weight { + (13_362_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn on_initialize_proposals(p: u32, ) -> Weight { + (74_689_000 as Weight) + .saturating_add((71_943_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(p as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(p as Weight))) + } +} diff --git a/runtime/polkadot/src/weights/pallet_utility.rs b/runtime/polkadot/src/weights/pallet_utility.rs index c9ae0d7d2333b19bec65e4f5c1556df65b21e086..fd10a605de3d591edc8475b887ec58939bb42ebe 100644 --- a/runtime/polkadot/src/weights/pallet_utility.rs +++ b/runtime/polkadot/src/weights/pallet_utility.rs @@ -1,35 +1,59 @@ -// This file is part of Substrate. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. -// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// 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. -// 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. +// 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_utility +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_utility +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 #![allow(unused_parens)] #![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl pallet_utility::WeightInfo for WeightInfo { +/// Weight functions for pallet_utility. +pub struct WeightInfo(PhantomData); +impl pallet_utility::WeightInfo for WeightInfo { fn batch(c: u32, ) -> Weight { - (16461000 as Weight) - .saturating_add((1982000 as Weight).saturating_mul(c as Weight)) + (19_701_000 as Weight) + // Standard Error: 0 + .saturating_add((2_118_000 as Weight).saturating_mul(c as Weight)) } - // WARNING! Some components were not used: ["u"] fn as_derivative() -> Weight { - (4086000 as Weight) + (5_534_000 as Weight) + } + fn batch_all(c: u32, ) -> Weight { + (20_354_000 as Weight) + // Standard Error: 0 + .saturating_add((2_124_000 as Weight).saturating_mul(c as Weight)) } } diff --git a/runtime/polkadot/src/weights/pallet_vesting.rs b/runtime/polkadot/src/weights/pallet_vesting.rs new file mode 100644 index 0000000000000000000000000000000000000000..ba41d013d1809ffff03efd164f7064f4b00f26a8 --- /dev/null +++ b/runtime/polkadot/src/weights/pallet_vesting.rs @@ -0,0 +1,88 @@ +// Copyright 2017-2020 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_vesting +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_vesting +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_vesting. +pub struct WeightInfo(PhantomData); +impl pallet_vesting::WeightInfo for WeightInfo { + fn vest_locked(l: u32, ) -> Weight { + (55_961_000 as Weight) + // Standard Error: 0 + .saturating_add((138_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn vest_unlocked(l: u32, ) -> Weight { + (60_522_000 as Weight) + // Standard Error: 2_000 + .saturating_add((107_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn vest_other_locked(l: u32, ) -> Weight { + (55_712_000 as Weight) + // Standard Error: 0 + .saturating_add((135_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn vest_other_unlocked(l: u32, ) -> Weight { + (59_981_000 as Weight) + // Standard Error: 2_000 + .saturating_add((113_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn vested_transfer(l: u32, ) -> Weight { + (122_684_000 as Weight) + // Standard Error: 8_000 + .saturating_add((171_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn force_vested_transfer(l: u32, ) -> Weight { + (121_973_000 as Weight) + // Standard Error: 8_000 + .saturating_add((165_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } +} diff --git a/runtime/polkadot/src/weights/runtime_common_claims.rs b/runtime/polkadot/src/weights/runtime_common_claims.rs new file mode 100644 index 0000000000000000000000000000000000000000..da6996bb2b1391aba79939889f23c3c7e68f1824 --- /dev/null +++ b/runtime/polkadot/src/weights/runtime_common_claims.rs @@ -0,0 +1,71 @@ +// Copyright 2017-2020 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 runtime_common::claims +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-30, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=polkadot-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_common::claims +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/polkadot/src/weights/runtime_common_claims.rs + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for runtime_common::claims. +pub struct WeightInfo(PhantomData); +impl runtime_common::claims::WeightInfo for WeightInfo { + fn claim() -> Weight { + (466_905_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(7 as Weight)) + } + fn mint_claim() -> Weight { + (19_003_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn claim_attest() -> Weight { + (471_915_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(7 as Weight)) + } + fn attest() -> Weight { + (156_649_000 as Weight) + .saturating_add(T::DbWeight::get().reads(8 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + } + fn move_claim() -> Weight { + (39_612_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(7 as Weight)) + } +} diff --git a/runtime/polkadot/tests/weights.rs b/runtime/polkadot/tests/weights.rs deleted file mode 100644 index 76bcfeae7d8747dd42ed6dcdb25cc6a1b0f6ca88..0000000000000000000000000000000000000000 --- a/runtime/polkadot/tests/weights.rs +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright 2020 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 . - -//! Tests to make sure that Polkadot's weights and fees match what we -//! expect from Substrate. -//! -//! These test are not meant to be exhaustive, as it is inevitable that -//! weights in Substrate will change. Instead they are supposed to provide -//! some sort of indicator that calls we consider important (e.g pallet_balances::transfer) -//! have not suddenly changed from under us. -//! -//! Some of the tests in this crate print insightful logs. Run with: -//! -//! ``` -//! $ cargo test -p polkadot-runtime -- --nocapture --test-threads=1 -//! ``` - -use codec::Encode; -use frame_support::{ - traits::ContainsLengthBound, - weights::{constants::*, GetDispatchInfo, Weight, DispatchInfo}, -}; -use keyring::AccountKeyring; -use polkadot_runtime::constants::currency::*; -use polkadot_runtime::{self, Runtime}; -use primitives::v0::AccountId; -use runtime_common::MaximumBlockWeight; - -use pallet_elections_phragmen::Call as PhragmenCall; -use pallet_session::Call as SessionCall; -use pallet_staking::Call as StakingCall; -use frame_system::Call as SystemCall; -use pallet_treasury::Call as TreasuryCall; - -type DbWeight = ::DbWeight; - - -fn report_portion(name: &'static str, info: DispatchInfo, len: usize) { - let maximum_weight = ::MaximumBlockWeight::get(); - let fee = sp_io::TestExternalities::new(Default::default()).execute_with(|| { - >::compute_fee(len as u32, &info, 0) - }); - - let portion = info.weight as f64 / maximum_weight as f64; - - if portion > 0.5 { - panic!("Weight of some call seem to have exceeded half of the block. Probably something is wrong."); - } - - println!("\nCall {} (with default args) takes {} of the block weight, pays {} in fee.", name, portion, fee); -} - -#[test] -fn sanity_check_weight_per_time_constants_are_as_expected() { - // These values comes from Substrate, we want to make sure that if it - // ever changes we don't accidentally break Polkadot - assert_eq!(WEIGHT_PER_SECOND, 1_000_000_000_000); - assert_eq!(WEIGHT_PER_MILLIS, WEIGHT_PER_SECOND / 1000); - assert_eq!(WEIGHT_PER_MICROS, WEIGHT_PER_MILLIS / 1000); - assert_eq!(WEIGHT_PER_NANOS, WEIGHT_PER_MICROS / 1000); -} - -#[test] -fn weight_of_staking_bond_is_correct() { - let controller: AccountId = AccountKeyring::Alice.into(); - - // (144278000 as Weight) - // .saturating_add(DbWeight::get().reads(5 as Weight)) - // .saturating_add(DbWeight::get().writes(4 as Weight)) - let expected_weight = 144278000 + (DbWeight::get().read * 5) + (DbWeight::get().write * 4); - let call = StakingCall::bond::(controller, 1 * DOLLARS, Default::default()); - let info = call.get_dispatch_info(); - - assert_eq!(info.weight, expected_weight); - report_portion("staking_bond", info, call.encode().len()) -} - -#[test] -fn weight_of_staking_validate_is_correct() { - // (35539000 as Weight) - // .saturating_add(DbWeight::get().reads(2 as Weight)) - // .saturating_add(DbWeight::get().writes(2 as Weight)) - let expected_weight = 35539000 + (DbWeight::get().read * 2) + (DbWeight::get().write * 2); - let call = StakingCall::validate::(Default::default()); - let info = call.get_dispatch_info(); - - assert_eq!(info.weight, expected_weight); - report_portion("staking_validate", info, call.encode().len()) -} - -#[test] -fn weight_of_staking_nominate_is_correct() { - let targets: Vec = vec![Default::default(), Default::default(), Default::default()]; - - // (48596000 as Weight) - // .saturating_add((308000 as Weight).saturating_mul(n as Weight)) - // .saturating_add(DbWeight::get().reads(3 as Weight)) - // .saturating_add(DbWeight::get().writes(2 as Weight)) - let db_weight = (DbWeight::get().read * 3) + (DbWeight::get().write * 2); - let targets_weight = (308 * WEIGHT_PER_NANOS).saturating_mul(targets.len() as Weight); - - let expected_weight = db_weight.saturating_add(48596000).saturating_add(targets_weight); - let call = StakingCall::nominate::(targets); - let info = call.get_dispatch_info(); - - assert_eq!(info.weight, expected_weight); - report_portion("staking_nominate", info, call.encode().len()) -} - -#[test] -fn weight_of_staking_payout_staker_is_correct() { - // (0 as Weight) - // .saturating_add((117324000 as Weight).saturating_mul(n as Weight)) - // .saturating_add(DbWeight::get().reads((5 as Weight).saturating_mul(n as Weight))) - // .saturating_add(DbWeight::get().writes((3 as Weight).saturating_mul(n as Weight))) - let call = StakingCall::payout_stakers::(Default::default(), 0u32); - let info = call.get_dispatch_info(); - - let n = ::MaxNominatorRewardedPerValidator::get() as Weight; - let mut expected_weight = (117324000 as Weight).saturating_mul(n as Weight); - expected_weight += (DbWeight::get().read * 5 * n) + (DbWeight::get().write * 3 * n); - - assert_eq!(info.weight, expected_weight); - report_portion("staking_payout_stakers", info, call.encode().len()) -} - -#[test] -fn weight_of_system_set_code_is_correct() { - // #[weight = (T::MaximumBlockWeight::get(), DispatchClass::Operational)] - let expected_weight = MaximumBlockWeight::get(); - let weight = SystemCall::set_code::(vec![]).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_session_set_keys_is_correct() { - // #[weight = 200_000_000 - // + T::DbWeight::get().reads(2 + T::Keys::key_ids().len() as Weight) - // + T::DbWeight::get().writes(1 + T::Keys::key_ids().len() as Weight)] - // - // Polkadot has five possible session keys, so we default to key_ids.len() = 5 - let expected_weight = 200_000_000 + (DbWeight::get().read * (2 + 5)) + (DbWeight::get().write * (1 + 5)); - let weight = SessionCall::set_keys::(Default::default(), Default::default()).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_session_purge_keys_is_correct() { - // #[weight = 120_000_000 - // + T::DbWeight::get().reads_writes(2, 1 + T::Keys::key_ids().len() as Weight)] - // - // Polkadot has five possible session keys, so we default to key_ids.len() = 5 - let expected_weight = 120_000_000 + (DbWeight::get().read * 2) + (DbWeight::get().write * (1 + 5)); - let weight = SessionCall::purge_keys::().get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_phragmen_vote_is_correct() { - // #[weight = 100_000_000] - let expected_weight = 350_000_000; - let weight = PhragmenCall::vote::(Default::default(), Default::default()).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_phragmen_submit_candidacy_is_correct() { - let expected_weight = WEIGHT_PER_MICROS * 35 + 1 * 375 * WEIGHT_PER_NANOS + DbWeight::get().reads_writes(4, 1); - let weight = PhragmenCall::submit_candidacy::(1).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_phragmen_renounce_candidacy_is_correct() { - let expected_weight = 46 * WEIGHT_PER_MICROS + DbWeight::get().reads_writes(2, 2); - let weight = PhragmenCall::renounce_candidacy::(pallet_elections_phragmen::Renouncing::Member) - .get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_treasury_propose_spend_is_correct() { - // #[weight = 120_000_000 + T::DbWeight::get().reads_writes(1, 2)] - let expected_weight = 120_000_000 + DbWeight::get().read + 2 * DbWeight::get().write; - let weight = - TreasuryCall::propose_spend::(Default::default(), Default::default()).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_treasury_approve_proposal_is_correct() { - // #[weight = (34_000_000 + T::DbWeight::get().reads_writes(2, 1), DispatchClass::Operational)] - let expected_weight = 34_000_000 + 2 * DbWeight::get().read + DbWeight::get().write; - let weight = TreasuryCall::approve_proposal::(Default::default()).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} - -#[test] -fn weight_of_treasury_tip_is_correct() { - let max_len: Weight = ::Tippers::max_len() as Weight; - - // #[weight = 68_000_000 + 2_000_000 * T::Tippers::max_len() as Weight - // + T::DbWeight::get().reads_writes(2, 1)] - let expected_weight = 68_000_000 + 2_000_000 * max_len + 2 * DbWeight::get().read + DbWeight::get().write; - let weight = TreasuryCall::tip::(Default::default(), Default::default()).get_dispatch_info().weight; - - assert_eq!(weight, expected_weight); -} diff --git a/runtime/rococo-v1/Cargo.toml b/runtime/rococo/Cargo.toml similarity index 87% rename from runtime/rococo-v1/Cargo.toml rename to runtime/rococo/Cargo.toml index 31256c260a16e0d843801049d6fd90000ec3cb03..cde9101492dfd7b5297a928c765ee681b9051fbd 100644 --- a/runtime/rococo-v1/Cargo.toml +++ b/runtime/rococo/Cargo.toml @@ -1,15 +1,15 @@ [package] -name = "rococo-v1-runtime" -version = "0.8.24" +name = "rococo-runtime" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" [dependencies] -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } -serde = { version = "1.0.102", default-features = false } -serde_derive = { version = "1.0.102", optional = true } -smallvec = "1.4.1" +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +serde = { version = "1.0.118", default-features = false } +serde_derive = { version = "1.0.117", optional = true } +smallvec = "1.6.1" frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -29,6 +29,7 @@ offchain-primitives = { package = "sp-offchain", git = "https://github.com/parit pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -52,8 +53,12 @@ primitives = { package = "polkadot-primitives", path = "../../primitives", defau polkadot-parachain = { path = "../../parachain", default-features = false } runtime-parachains = { package = "polkadot-runtime-parachains", path = "../parachains", default-features = false } +xcm = { package = "xcm", path = "../../xcm", default-features = false } +xcm-executor = { package = "xcm-executor", path = "../../xcm/xcm-executor", default-features = false } +xcm-builder = { package = "xcm-builder", path = "../../xcm/xcm-builder", default-features = false } + [build-dependencies] -wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.6" } +substrate-wasm-builder = "3.0.0" [features] default = ["std"] @@ -65,9 +70,10 @@ std = [ "pallet-babe/std", "babe-primitives/std", "pallet-balances/std", - "codec/std", + "parity-scale-codec/std", "frame-executive/std", "pallet-grandpa/std", + "pallet-sudo/std", "pallet-indices/std", "pallet-im-online/std", "inherents/std", @@ -97,6 +103,9 @@ std = [ "sp-version/std", "serde_derive", "serde/std", + "xcm/std", + "xcm-executor/std", + "xcm-builder/std", ] # When enabled, the runtime api will not be build. # diff --git a/runtime/rococo/README.md b/runtime/rococo/README.md new file mode 100644 index 0000000000000000000000000000000000000000..bc47556792e4bc06fabaa0c0327f9d398378b259 --- /dev/null +++ b/runtime/rococo/README.md @@ -0,0 +1,11 @@ +# Rococo: v1 + +Rococo is a testnet runtime with no stability guarantees. + +## How to run + +> TODO: figure out how to run this properly. + +### Alice + +`cargo run --release -- --alice --tmp --validator --chain rococo-local` diff --git a/runtime/rococo-v1/build.rs b/runtime/rococo/build.rs similarity index 91% rename from runtime/rococo-v1/build.rs rename to runtime/rococo/build.rs index dff1419829974d5c86b0c765974413d040d661a8..f287ec0e1eea35ba59531a7f1f5c4b89bd31e227 100644 --- a/runtime/rococo-v1/build.rs +++ b/runtime/rococo/build.rs @@ -14,12 +14,11 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use wasm_builder_runner::WasmBuilder; +use substrate_wasm_builder::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("2.0.0") .import_memory() .export_heap_base() .build() diff --git a/runtime/rococo-v1/src/constants.rs b/runtime/rococo/src/constants.rs similarity index 87% rename from runtime/rococo-v1/src/constants.rs rename to runtime/rococo/src/constants.rs index a565ca4dbcfde6dc9d1e625e938bf69928b017b1..d213acb778c7927ea3159a9a9259852337c70d6e 100644 --- a/runtime/rococo-v1/src/constants.rs +++ b/runtime/rococo/src/constants.rs @@ -33,7 +33,9 @@ pub mod time { use primitives::v0::{Moment, BlockNumber}; pub const MILLISECS_PER_BLOCK: Moment = 6000; pub const SLOT_DURATION: Moment = MILLISECS_PER_BLOCK; - pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 1 * HOURS; + frame_support::parameter_types! { + pub storage EpochDurationInBlocks: BlockNumber = 1 * HOURS; + } // These time units are defined in number of blocks. pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); @@ -86,8 +88,8 @@ pub mod fee { #[cfg(test)] mod tests { - use frame_support::weights::WeightToFeePolynomial; - use runtime_common::{MaximumBlockWeight, ExtrinsicBaseWeight}; + use frame_support::weights::{WeightToFeePolynomial, DispatchClass}; + use runtime_common::BlockWeights; use super::fee::WeightToFee; use super::currency::{CENTS, DOLLARS, MILLICENTS}; @@ -95,8 +97,8 @@ mod tests { // This function tests that the fee for `MaximumBlockWeight` of weight is correct fn full_block_fee_is_correct() { // A full block should cost 16 DOLLARS - println!("Base: {}", ExtrinsicBaseWeight::get()); - let x = WeightToFee::calc(&MaximumBlockWeight::get()); + println!("Base: {}", BlockWeights::get().get(DispatchClass::Normal).base_extrinsic); + let x = WeightToFee::calc(&BlockWeights::get().max_block); let y = 16 * DOLLARS; assert!(x.max(y) - x.min(y) < MILLICENTS); } @@ -105,8 +107,9 @@ mod tests { // This function tests that the fee for `ExtrinsicBaseWeight` of weight is correct fn extrinsic_base_fee_is_correct() { // `ExtrinsicBaseWeight` should cost 1/10 of a CENT - println!("Base: {}", ExtrinsicBaseWeight::get()); - let x = WeightToFee::calc(&ExtrinsicBaseWeight::get()); + let base_weight = BlockWeights::get().get(DispatchClass::Normal).base_extrinsic; + println!("Base: {}", base_weight); + let x = WeightToFee::calc(&base_weight); let y = CENTS / 10; assert!(x.max(y) - x.min(y) < MILLICENTS); } diff --git a/runtime/rococo-v1/src/lib.rs b/runtime/rococo/src/lib.rs similarity index 75% rename from runtime/rococo-v1/src/lib.rs rename to runtime/rococo/src/lib.rs index fe812a1389c918865db4f855736622096d3516c3..b75a29309fee1e67c37977bb0a34036cbfe569ae 100644 --- a/runtime/rococo-v1/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -18,21 +18,23 @@ #![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"] +#![recursion_limit = "256"] +use pallet_transaction_payment::CurrencyAdapter; use sp_std::prelude::*; -use codec::Encode; +use sp_std::collections::btree_map::BTreeMap; +use parity_scale_codec::Encode; use primitives::v1::{ AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, GroupRotationInfo, CoreState, Id, ValidationData, ValidationCode, CandidateEvent, ValidatorId, ValidatorIndex, CommittedCandidateReceipt, OccupiedCoreAssumption, - PersistedValidationData, + PersistedValidationData, InboundDownwardMessage, InboundHrmpMessage, + SessionInfo as SessionInfoData, }; use runtime_common::{ SlowAdjustingFeeUpdate, - impls::{CurrencyToVoteHandler, ToAuthor}, - BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, MaximumBlockLength, - BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, MaximumExtrinsicWeight, + impls::ToAuthor, + BlockHashCount, BlockWeights, BlockLength, RocksDbWeight, OffchainSolutionWeightLimit, }; use runtime_parachains::{ self, @@ -54,6 +56,8 @@ use sp_runtime::{ }; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; +#[cfg(any(feature = "std", test))] +use sp_version::NativeVersion; use sp_version::RuntimeVersion; use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; use pallet_grandpa::{AuthorityId as GrandpaId, fg_primitives}; @@ -61,16 +65,32 @@ use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use pallet_session::historical as session_historical; use frame_system::EnsureRoot; -use runtime_common::paras_sudo_wrapper as paras_sudo_wrapper; +use runtime_common::{paras_sudo_wrapper, paras_registrar}; +use runtime_parachains::origin as parachains_origin; use runtime_parachains::configuration as parachains_configuration; use runtime_parachains::inclusion as parachains_inclusion; use runtime_parachains::inclusion_inherent as parachains_inclusion_inherent; use runtime_parachains::initializer as parachains_initializer; +use runtime_parachains::session_info as parachains_session_info; use runtime_parachains::paras as parachains_paras; +use runtime_parachains::dmp as parachains_dmp; +use runtime_parachains::ump as parachains_ump; +use runtime_parachains::hrmp as parachains_hrmp; use runtime_parachains::scheduler as parachains_scheduler; +use runtime_parachains::reward_points::RewardValidatorsWithEraPoints; pub use pallet_balances::Call as BalancesCall; +pub use pallet_staking::StakerStatus; + +use polkadot_parachain::primitives::Id as ParaId; +use xcm::v0::{MultiLocation, NetworkId}; +use xcm_executor::traits::IsConcrete; +use xcm_builder::{ + AccountId32Aliases, ChildParachainConvertsVia, SovereignSignedViaLocation, + CurrencyAdapter as XcmCurrencyAdapter, ChildParachainAsNative, + SignedAccountId32AsNative, ChildSystemParachainAsSuperuser, LocationInverter, +}; /// Constant values used within the runtime. pub mod constants; @@ -80,6 +100,29 @@ use constants::{time::*, currency::*, fee::*}; #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +/// Runtime version (Rococo). +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("rococo"), + impl_name: create_runtime_str!("parity-rococo-v1"), + authoring_version: 0, + spec_version: 14, + impl_version: 0, + #[cfg(not(feature = "disable-runtime-api"))] + apis: RUNTIME_API_VERSIONS, + #[cfg(feature = "disable-runtime-api")] + apis: sp_version::create_apis_vec![[]], + transaction_version: 0, +}; + +/// Native version. +#[cfg(any(feature = "std", test))] +pub fn native_version() -> NativeVersion { + NativeVersion { + runtime_version: VERSION, + can_author_with: Default::default(), + } +} + /// The address format for describing accounts. pub type Address = AccountId; /// Block header type as expected by this runtime. @@ -101,226 +144,6 @@ pub type SignedExtra = ( pallet_transaction_payment::ChargeTransactionPayment, ); -#[cfg(not(feature = "disable-runtime-api"))] -sp_api::impl_runtime_apis! { - 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 { - Runtime::metadata().into() - } - } - - impl block_builder_api::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: inherents::InherentData, - ) -> inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - - fn random_seed() -> ::Hash { - Babe::randomness().into() - } - } - - impl tx_pool_api::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx) - } - } - - impl offchain_primitives::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl primitives::v1::ParachainHost for Runtime { - fn validators() -> Vec { - runtime_api_impl::validators::() - } - - fn validator_groups() -> (Vec>, GroupRotationInfo) { - runtime_api_impl::validator_groups::() - } - - fn availability_cores() -> Vec> { - runtime_api_impl::availability_cores::() - } - - fn full_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) - -> Option> { - runtime_api_impl::full_validation_data::(para_id, assumption) - } - - fn persisted_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) - -> Option> { - runtime_api_impl::persisted_validation_data::(para_id, assumption) - } - - fn session_index_for_child() -> SessionIndex { - runtime_api_impl::session_index_for_child::() - } - - fn validation_code(para_id: Id, assumption: OccupiedCoreAssumption) - -> Option { - runtime_api_impl::validation_code::(para_id, assumption) - } - - fn candidate_pending_availability(para_id: Id) -> Option> { - runtime_api_impl::candidate_pending_availability::(para_id) - } - - fn candidate_events() -> Vec> { - runtime_api_impl::candidate_events::(|ev| { - match ev { - Event::parachains_inclusion(ev) => { - Some(ev) - } - _ => None, - } - }) - } - } - - impl fg_primitives::GrandpaApi for Runtime { - fn grandpa_authorities() -> Vec<(GrandpaId, u64)> { - Grandpa::grandpa_authorities() - } - - fn submit_report_equivocation_unsigned_extrinsic( - equivocation_proof: fg_primitives::EquivocationProof< - ::Hash, - sp_runtime::traits::NumberFor, - >, - key_owner_proof: fg_primitives::OpaqueKeyOwnershipProof, - ) -> Option<()> { - let key_owner_proof = key_owner_proof.decode()?; - - Grandpa::submit_unsigned_equivocation_report( - equivocation_proof, - key_owner_proof, - ) - } - - fn generate_key_ownership_proof( - _set_id: fg_primitives::SetId, - authority_id: fg_primitives::AuthorityId, - ) -> Option { - use codec::Encode; - - Historical::prove((fg_primitives::KEY_TYPE, authority_id)) - .map(|p| p.encode()) - .map(fg_primitives::OpaqueKeyOwnershipProof::new) - } - } - - impl babe_primitives::BabeApi for Runtime { - fn configuration() -> babe_primitives::BabeGenesisConfiguration { - // The choice of `c` parameter (where `1 - c` represents the - // probability of a slot being empty), is done in accordance to the - // slot duration and expected target block time, for safely - // resisting network delays of maximum two seconds. - // - babe_primitives::BabeGenesisConfiguration { - slot_duration: Babe::slot_duration(), - epoch_length: EpochDuration::get(), - c: PRIMARY_PROBABILITY, - genesis_authorities: Babe::authorities(), - randomness: Babe::randomness(), - allowed_slots: babe_primitives::AllowedSlots::PrimaryAndSecondaryPlainSlots, - } - } - - fn current_epoch_start() -> babe_primitives::SlotNumber { - Babe::current_epoch_start() - } - - fn generate_key_ownership_proof( - _slot_number: babe_primitives::SlotNumber, - authority_id: babe_primitives::AuthorityId, - ) -> Option { - use codec::Encode; - - Historical::prove((babe_primitives::KEY_TYPE, authority_id)) - .map(|p| p.encode()) - .map(babe_primitives::OpaqueKeyOwnershipProof::new) - } - - fn submit_report_equivocation_unsigned_extrinsic( - equivocation_proof: babe_primitives::EquivocationProof<::Header>, - key_owner_proof: babe_primitives::OpaqueKeyOwnershipProof, - ) -> Option<()> { - let key_owner_proof = key_owner_proof.decode()?; - - Babe::submit_unsigned_equivocation_report( - equivocation_proof, - key_owner_proof, - ) - } - } - - impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { - fn authorities() -> Vec { - AuthorityDiscovery::authorities() - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, sp_core::crypto::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< - Block, - Balance, - > for Runtime { - fn query_info(uxt: ::Extrinsic, len: u32) -> RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - } -} /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type that has already been checked. @@ -332,9 +155,12 @@ pub type SignedPayload = generic::SignedPayload; impl_opaque_keys! { pub struct SessionKeys { + pub grandpa: Grandpa, pub babe: Babe, pub im_online: ImOnline, - pub parachain_validator: Initializer, + pub para_validator: Initializer, + pub para_assignment: SessionInfo, + pub authority_discovery: AuthorityDiscovery, } } @@ -365,14 +191,23 @@ construct_runtime! { AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, // Parachains modules. - Config: parachains_configuration::{Module, Call, Storage}, + ParachainsOrigin: parachains_origin::{Module, Origin}, + ParachainsConfiguration: parachains_configuration::{Module, Call, Storage, Config}, Inclusion: parachains_inclusion::{Module, Call, Storage, Event}, - InclusionInherent: parachains_inclusion_inherent::{Module, Call, Storage}, + InclusionInherent: parachains_inclusion_inherent::{Module, Call, Storage, Inherent}, Scheduler: parachains_scheduler::{Module, Call, Storage}, Paras: parachains_paras::{Module, Call, Storage}, Initializer: parachains_initializer::{Module, Call, Storage}, + Dmp: parachains_dmp::{Module, Call, Storage}, + Ump: parachains_ump::{Module, Call, Storage}, + Hrmp: parachains_hrmp::{Module, Call, Storage}, + SessionInfo: parachains_session_info::{Module, Call, Storage}, + Registrar: paras_registrar::{Module, Call, Storage}, ParasSudoWrapper: paras_sudo_wrapper::{Module, Call}, + + // Sudo + Sudo: pallet_sudo::{Module, Call, Storage, Event, Config}, } } @@ -383,26 +218,16 @@ impl Filter for BaseFilter { } } -/// Runtime version (Rococo). -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("rococo-v1"), - impl_name: create_runtime_str!("parity-rococo-v1"), - authoring_version: 0, - spec_version: 1, - impl_version: 0, - #[cfg(not(feature = "disable-runtime-api"))] - apis: RUNTIME_API_VERSIONS, - #[cfg(feature = "disable-runtime-api")] - apis: sp_version::create_apis_vec![[]], - transaction_version: 2, -}; - parameter_types! { pub const Version: RuntimeVersion = VERSION; + pub const SS58Prefix: u8 = 42; } -impl frame_system::Trait for Runtime { +impl frame_system::Config for Runtime { type BaseCallFilter = BaseFilter; + type BlockWeights = BlockWeights; + type BlockLength = BlockLength; + type DbWeight = RocksDbWeight; type Origin = Origin; type Call = Call; type Index = Nonce; @@ -414,19 +239,13 @@ impl frame_system::Trait for Runtime { type Header = generic::Header; type Event = Event; type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = RocksDbWeight; - type BlockExecutionWeight = BlockExecutionWeight; - type ExtrinsicBaseWeight = ExtrinsicBaseWeight; - type MaximumExtrinsicWeight = MaximumExtrinsicWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; - type ModuleToIndex = ModuleToIndex; + type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); + type SS58Prefix = SS58Prefix; } parameter_types! { @@ -446,7 +265,7 @@ impl frame_system::offchain::CreateSignedTransaction for R call: Call, public: ::Signer, account: AccountId, - nonce: ::Index, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { // take the biggest period possible. let period = BlockHashCount::get() @@ -485,7 +304,7 @@ impl frame_system::offchain::SigningTypes for Runtime { type Signature = Signature; } -impl pallet_session::historical::Trait for Runtime { +impl pallet_session::historical::Config for Runtime { type FullIdentification = pallet_staking::Exposure; type FullIdentificationOf = pallet_staking::ExposureOf; } @@ -511,13 +330,13 @@ parameter_types! { pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominatorRewardedPerValidator: u32 = 64; // quarter of the last session will be for election. - pub const ElectionLookahead: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; + pub ElectionLookahead: BlockNumber = EpochDurationInBlocks::get() / 4; pub const MaxIterations: u32 = 10; pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000); } parameter_types! { - pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; + pub SessionDuration: BlockNumber = EpochDurationInBlocks::get() as _; } parameter_types! { @@ -525,7 +344,7 @@ parameter_types! { pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); } -impl pallet_im_online::Trait for Runtime { +impl pallet_im_online::Config for Runtime { type AuthorityId = ImOnlineId; type Event = Event; type ReportUnresponsiveness = Offences; @@ -534,10 +353,10 @@ impl pallet_im_online::Trait for Runtime { type WeightInfo = (); } -impl pallet_staking::Trait for Runtime { +impl pallet_staking::Config for Runtime { type Currency = Balances; type UnixTime = Timestamp; - type CurrencyToVote = CurrencyToVoteHandler; + type CurrencyToVote = frame_support::traits::U128CurrencyToVote; type RewardRemainder = (); type Event = Event; type Slash = (); @@ -555,20 +374,23 @@ impl pallet_staking::Trait for Runtime { type Call = Call; type UnsignedPriority = StakingUnsignedPriority; type MaxIterations = MaxIterations; + type OffchainSolutionWeightLimit = OffchainSolutionWeightLimit; type MinSolutionScoreBump = MinSolutionScoreBump; type WeightInfo = (); } parameter_types! { pub const ExistentialDeposit: Balance = 1 * CENTS; + pub const MaxLocks: u32 = 50; } -impl pallet_balances::Trait for Runtime { +impl pallet_balances::Config for Runtime { type Balance = Balance; type DustRemoval = (); type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type MaxLocks = MaxLocks; type WeightInfo = (); } @@ -586,23 +408,22 @@ parameter_types! { } parameter_types! { - pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); + pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * BlockWeights::get().max_block; } -impl pallet_offences::Trait for Runtime { +impl pallet_offences::Config for Runtime { type Event = Event; type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; - type WeightInfo = (); } -impl pallet_authority_discovery::Trait for Runtime {} +impl pallet_authority_discovery::Config for Runtime {} parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; } -impl pallet_timestamp::Trait for Runtime { +impl pallet_timestamp::Config for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; @@ -613,9 +434,8 @@ parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; } -impl pallet_transaction_payment::Trait for Runtime { - type Currency = Balances; - type OnTransactionPayment = ToAuthor; +impl pallet_transaction_payment::Config for Runtime { + type OnChargeTransaction = CurrencyAdapter>; type TransactionByteFee = TransactionByteFee; type WeightToFee = WeightToFee; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; @@ -625,7 +445,7 @@ parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } -impl pallet_session::Trait for Runtime { +impl pallet_session::Config for Runtime { type Event = Event; type ValidatorId = AccountId; type ValidatorIdOf = pallet_staking::StashOf; @@ -639,12 +459,11 @@ impl pallet_session::Trait for Runtime { } parameter_types! { - pub const EpochDuration: u64 = EPOCH_DURATION_IN_BLOCKS as u64; pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } -impl pallet_babe::Trait for Runtime { - type EpochDuration = EpochDuration; +impl pallet_babe::Config for Runtime { + type EpochDuration = EpochDurationInBlocks; type ExpectedBlockTime = ExpectedBlockTime; // session module is the trigger @@ -664,13 +483,15 @@ impl pallet_babe::Trait for Runtime { type HandleEquivocation = pallet_babe::EquivocationHandler; + + type WeightInfo = (); } parameter_types! { pub const IndexDeposit: Balance = 1 * DOLLARS; } -impl pallet_indices::Trait for Runtime { +impl pallet_indices::Config for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; @@ -682,7 +503,7 @@ parameter_types! { pub const AttestationPeriod: BlockNumber = 50; } -impl pallet_grandpa::Trait for Runtime { +impl pallet_grandpa::Config for Runtime { type Event = Event; type Call = Call; @@ -697,6 +518,8 @@ impl pallet_grandpa::Trait for Runtime { )>>::IdentificationTuple; type HandleEquivocation = pallet_grandpa::EquivocationHandler; + + type WeightInfo = (); } parameter_types! { @@ -704,27 +527,352 @@ parameter_types! { } // TODO: substrate#2986 implement this properly -impl pallet_authorship::Trait for Runtime { +impl pallet_authorship::Config for Runtime { type FindAuthor = pallet_session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); type EventHandler = (Staking, ImOnline); } -impl parachains_configuration::Trait for Runtime { } +impl parachains_origin::Config for Runtime {} + +impl parachains_configuration::Config for Runtime {} -impl parachains_inclusion::Trait for Runtime { +impl parachains_inclusion::Config for Runtime { type Event = Event; + type RewardValidators = RewardValidatorsWithEraPoints; +} + +impl parachains_paras::Config for Runtime { + type Origin = Origin; } -impl parachains_paras::Trait for Runtime { } +parameter_types! { + pub const RocLocation: MultiLocation = MultiLocation::Null; + pub const RococoNetwork: NetworkId = NetworkId::Polkadot; + pub const Ancestry: MultiLocation = MultiLocation::Null; +} + +pub type LocationConverter = ( + ChildParachainConvertsVia, + AccountId32Aliases, +); + +pub type LocalAssetTransactor = + XcmCurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // We can convert the MultiLocations with our converter above: + LocationConverter, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + >; + +type LocalOriginConverter = ( + SovereignSignedViaLocation, + ChildParachainAsNative, + SignedAccountId32AsNative, + ChildSystemParachainAsSuperuser, +); + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type Call = Call; + type XcmSender = (); + type AssetTransactor = LocalAssetTransactor; + type OriginConverter = LocalOriginConverter; + type IsReserve = (); + type IsTeleporter = (); + type LocationInverter = LocationInverter; +} + +impl parachains_session_info::Config for Runtime {} + +impl parachains_ump::Config for Runtime { + type UmpSink = crate::parachains_ump::XcmSink; +} + +impl parachains_dmp::Config for Runtime {} + +impl parachains_hrmp::Config for Runtime { + type Origin = Origin; +} -impl parachains_inclusion_inherent::Trait for Runtime { } +impl parachains_inclusion_inherent::Config for Runtime {} -impl parachains_scheduler::Trait for Runtime { } +impl parachains_scheduler::Config for Runtime {} -impl parachains_initializer::Trait for Runtime { +impl parachains_initializer::Config for Runtime { type Randomness = Babe; } -impl paras_sudo_wrapper::Trait for Runtime { } +impl paras_sudo_wrapper::Config for Runtime {} + +impl paras_registrar::Config for Runtime { + type Currency = Balances; + type ParathreadDeposit = ParathreadDeposit; + type Origin = Origin; +} + +impl pallet_sudo::Config for Runtime { + type Event = Event; + type Call = Call; +} + +#[cfg(not(feature = "disable-runtime-api"))] +sp_api::impl_runtime_apis! { + 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 { + Runtime::metadata().into() + } + } + + impl block_builder_api::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: inherents::InherentData, + ) -> inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + + fn random_seed() -> ::Hash { + Babe::randomness().into() + } + } + + impl tx_pool_api::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx) + } + } + + impl offchain_primitives::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl primitives::v1::ParachainHost for Runtime { + fn validators() -> Vec { + runtime_api_impl::validators::() + } + + fn validator_groups() -> (Vec>, GroupRotationInfo) { + runtime_api_impl::validator_groups::() + } + + fn availability_cores() -> Vec> { + runtime_api_impl::availability_cores::() + } + + fn full_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) + -> Option> { + runtime_api_impl::full_validation_data::(para_id, assumption) + } + + fn persisted_validation_data(para_id: Id, assumption: OccupiedCoreAssumption) + -> Option> { + runtime_api_impl::persisted_validation_data::(para_id, assumption) + } + + fn check_validation_outputs( + para_id: Id, + outputs: primitives::v1::CandidateCommitments, + ) -> bool { + runtime_api_impl::check_validation_outputs::(para_id, outputs) + } + + fn session_index_for_child() -> SessionIndex { + runtime_api_impl::session_index_for_child::() + } + + fn validation_code(para_id: Id, assumption: OccupiedCoreAssumption) + -> Option { + runtime_api_impl::validation_code::(para_id, assumption) + } + + fn historical_validation_code(para_id: Id, context_height: BlockNumber) + -> Option + { + runtime_api_impl::historical_validation_code::(para_id, context_height) + } + + fn candidate_pending_availability(para_id: Id) -> Option> { + runtime_api_impl::candidate_pending_availability::(para_id) + } + + fn candidate_events() -> Vec> { + runtime_api_impl::candidate_events::(|ev| { + match ev { + Event::parachains_inclusion(ev) => { + Some(ev) + } + _ => None, + } + }) + } + + fn session_info(index: SessionIndex) -> Option { + runtime_api_impl::session_info::(index) + } + + fn dmq_contents(recipient: Id) -> Vec> { + runtime_api_impl::dmq_contents::(recipient) + } + + fn inbound_hrmp_channels_contents( + recipient: Id + ) -> BTreeMap>> { + runtime_api_impl::inbound_hrmp_channels_contents::(recipient) + } + } + + impl fg_primitives::GrandpaApi for Runtime { + fn grandpa_authorities() -> Vec<(GrandpaId, u64)> { + Grandpa::grandpa_authorities() + } + + fn submit_report_equivocation_unsigned_extrinsic( + equivocation_proof: fg_primitives::EquivocationProof< + ::Hash, + sp_runtime::traits::NumberFor, + >, + key_owner_proof: fg_primitives::OpaqueKeyOwnershipProof, + ) -> Option<()> { + let key_owner_proof = key_owner_proof.decode()?; + + Grandpa::submit_unsigned_equivocation_report( + equivocation_proof, + key_owner_proof, + ) + } + + fn generate_key_ownership_proof( + _set_id: fg_primitives::SetId, + authority_id: fg_primitives::AuthorityId, + ) -> Option { + use parity_scale_codec::Encode; + + Historical::prove((fg_primitives::KEY_TYPE, authority_id)) + .map(|p| p.encode()) + .map(fg_primitives::OpaqueKeyOwnershipProof::new) + } + } + + impl babe_primitives::BabeApi for Runtime { + fn configuration() -> babe_primitives::BabeGenesisConfiguration { + // The choice of `c` parameter (where `1 - c` represents the + // probability of a slot being empty), is done in accordance to the + // slot duration and expected target block time, for safely + // resisting network delays of maximum two seconds. + // + babe_primitives::BabeGenesisConfiguration { + slot_duration: Babe::slot_duration(), + epoch_length: EpochDurationInBlocks::get().into(), + c: PRIMARY_PROBABILITY, + genesis_authorities: Babe::authorities(), + randomness: Babe::randomness(), + allowed_slots: babe_primitives::AllowedSlots::PrimaryAndSecondaryPlainSlots, + } + } + + fn current_epoch_start() -> babe_primitives::SlotNumber { + Babe::current_epoch_start() + } + + fn current_epoch() -> babe_primitives::Epoch { + Babe::current_epoch() + } + + fn next_epoch() -> babe_primitives::Epoch { + Babe::next_epoch() + } + + fn generate_key_ownership_proof( + _slot_number: babe_primitives::SlotNumber, + authority_id: babe_primitives::AuthorityId, + ) -> Option { + use parity_scale_codec::Encode; + + Historical::prove((babe_primitives::KEY_TYPE, authority_id)) + .map(|p| p.encode()) + .map(babe_primitives::OpaqueKeyOwnershipProof::new) + } + + fn submit_report_equivocation_unsigned_extrinsic( + equivocation_proof: babe_primitives::EquivocationProof<::Header>, + key_owner_proof: babe_primitives::OpaqueKeyOwnershipProof, + ) -> Option<()> { + let key_owner_proof = key_owner_proof.decode()?; + + Babe::submit_unsigned_equivocation_report( + equivocation_proof, + key_owner_proof, + ) + } + } + + impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { + fn authorities() -> Vec { + AuthorityDiscovery::authorities() + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, sp_core::crypto::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< + Block, + Balance, + > for Runtime { + fn query_info(uxt: ::Extrinsic, len: u32) -> RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + } +} diff --git a/runtime/test-runtime/Cargo.toml b/runtime/test-runtime/Cargo.toml index 37c5d843d3727bd67dac4aa360342eb7b921aa71..1ee7c0718db8dd2d29333a78ce91524416190317 100644 --- a/runtime/test-runtime/Cargo.toml +++ b/runtime/test-runtime/Cargo.toml @@ -1,25 +1,25 @@ [package] name = "polkadot-test-runtime" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } -log = { version = "0.3.9", optional = true } -rustc-hex = { version = "2.0.1", default-features = false } -serde = { version = "1.0.102", default-features = false } -serde_derive = { version = "1.0.102", optional = true } -smallvec = "1.4.1" +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +log = { version = "0.4.11", optional = true } +rustc-hex = { version = "2.1.0", default-features = false } +serde = { version = "1.0.118", default-features = false } +serde_derive = { version = "1.0.117", optional = true } +smallvec = "1.6.1" authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } offchain-primitives = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -rstd = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -36,7 +36,6 @@ pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "m pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-finality-tracker = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-indices = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-nicks = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -55,17 +54,18 @@ pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "ma runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } polkadot-parachain = { path = "../../parachain", default-features = false } +polkadot-runtime-parachains = { path = "../parachains", default-features = false } [dev-dependencies] -hex-literal = "0.2.1" -libsecp256k1 = "0.3.2" -tiny-keccak = "1.5.0" +hex-literal = "0.3.1" +libsecp256k1 = "0.3.5" +tiny-keccak = "2.0.2" keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -serde_json = "1.0.41" +serde_json = "1.0.61" [build-dependencies] -wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.6" } +substrate-wasm-builder = "3.0.0" [features] default = ["std"] @@ -77,7 +77,7 @@ std = [ "bitvec/std", "primitives/std", "rustc-hex/std", - "codec/std", + "parity-scale-codec/std", "inherents/std", "sp-core/std", "polkadot-parachain/std", @@ -85,7 +85,7 @@ std = [ "tx-pool-api/std", "block-builder-api/std", "offchain-primitives/std", - "rstd/std", + "sp-std/std", "sp-io/std", "frame-support/std", "pallet-authorship/std", @@ -93,7 +93,6 @@ std = [ "pallet-transaction-payment/std", "pallet-transaction-payment-rpc-runtime-api/std", "frame-executive/std", - "pallet-finality-tracker/std", "pallet-grandpa/std", "pallet-indices/std", "pallet-nicks/std", diff --git a/runtime/test-runtime/build.rs b/runtime/test-runtime/build.rs index af219a29319898d2f6180ef13bbe5263cd114727..a75ebb4edbe1b3c55e23a2700a5d48efcaae1e54 100644 --- a/runtime/test-runtime/build.rs +++ b/runtime/test-runtime/build.rs @@ -1,25 +1,24 @@ // Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. -// Substrate is free software: you can redistribute it and/or modify +// 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. -// Substrate is distributed in the hope that it will be useful, +// 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 Substrate. If not, see . +// along with Polkadot. If not, see . -use wasm_builder_runner::WasmBuilder; +use substrate_wasm_builder::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("2.0.0") .import_memory() .export_heap_base() .build() diff --git a/runtime/test-runtime/client/src/lib.rs b/runtime/test-runtime/client/src/lib.rs deleted file mode 100644 index 698de3d3cf1f15f0b93665a6fd782417d46583ca..0000000000000000000000000000000000000000 --- a/runtime/test-runtime/client/src/lib.rs +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright 2020 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 . - -//! Client testing utilities. - -#![warn(missing_docs)] - -use std::sync::Arc; -use std::collections::BTreeMap; -use std::convert::TryFrom; -pub use substrate_test_client::*; -pub use polkadot_test_runtime as runtime; - -use sp_core::{ChangesTrieConfiguration, map, twox_128}; -use sp_core::storage::{ChildInfo, Storage, StorageChild}; -use polkadot_test_runtime::GenesisConfig; -use polkadot_test_service::polkadot_local_testnet_genesis; -use sp_runtime::{ - traits::{Block as BlockT, Header as HeaderT, Hash as HashT, HashFor}, - BuildStorage, -}; -use sc_consensus::LongestChain; -use sc_client_api::light::{RemoteCallRequest, RemoteBodyRequest}; -use sc_service::client::{ - genesis, Client as SubstrateClient, LocalCallExecutor -}; -use sc_light::{ - call_executor::GenesisCallExecutor, backend as light_backend, - new_light_blockchain, new_light_backend, -}; - -/// A prelude to import in tests. -pub mod prelude { - // Trait extensions - pub use super::{ClientExt, ClientBlockImportExt}; - // Client structs - pub use super::{ - TestClient, TestClientBuilder, Backend, LightBackend, - Executor, LightExecutor, LocalExecutor, NativeExecutor, WasmExecutionMethod, - }; - // Keyring - pub use super::{AccountKeyring, Sr25519Keyring}; -} - -sc_executor::native_executor_instance! { - pub LocalExecutor, - polkadot_test_runtime::api::dispatch, - polkadot_test_runtime::native_version, -} - -/// Test client database backend. -pub type Backend = substrate_test_client::Backend; - -/// Test client executor. -pub type Executor = LocalCallExecutor< - Backend, - NativeExecutor, ->; - -/// Test client light database backend. -pub type LightBackend = substrate_test_client::LightBackend; - -/// Test client light executor. -pub type LightExecutor = GenesisCallExecutor< - LightBackend, - LocalCallExecutor< - light_backend::Backend< - sc_client_db::light::LightStorage, - HashFor - >, - NativeExecutor - > ->; - -/// Parameters of test-client builder with test-runtime. -#[derive(Default)] -pub struct GenesisParameters { - changes_trie_config: Option, - extra_storage: Storage, -} - -impl GenesisParameters { - fn genesis_config(&self) -> GenesisConfig { - let config = polkadot_local_testnet_genesis(self.changes_trie_config.clone()); - config.assimilate_storage(&mut self.extra_storage.clone()).expect("Adding `system::GensisConfig` to the genesis"); - - config - } -} - -fn additional_storage_with_genesis(genesis_block: &polkadot_test_runtime::Block) -> BTreeMap, Vec> { - map![ - twox_128(&b"latest"[..]).to_vec() => genesis_block.hash().as_fixed_bytes().to_vec() - ] -} - -impl substrate_test_client::GenesisInit for GenesisParameters { - fn genesis_storage(&self) -> Storage { - use codec::Encode; - - let mut storage = self.genesis_config().build_storage().unwrap(); - - let child_roots = storage.children_default.iter().map(|(sk, child_content)| { - let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - child_content.data.clone().into_iter().collect() - ); - (sk.clone(), state_root.encode()) - }); - let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - storage.top.clone().into_iter().chain(child_roots).collect() - ); - let block: runtime::Block = genesis::construct_genesis_block(state_root); - storage.top.extend(additional_storage_with_genesis(&block)); - - storage - } -} - -/// A `TestClient` with `test-runtime` builder. -pub type TestClientBuilder = substrate_test_client::TestClientBuilder< - polkadot_test_runtime::Block, - E, - B, - GenesisParameters, ->; - -/// Test client type with `LocalExecutor` and generic Backend. -pub type Client = SubstrateClient< - B, - LocalCallExecutor>, - polkadot_test_runtime::Block, - polkadot_test_runtime::RuntimeApi, ->; - -/// A test client with default backend. -pub type TestClient = Client; - -/// A `TestClientBuilder` with default backend and executor. -pub trait DefaultTestClientBuilderExt: Sized { - /// Create new `TestClientBuilder` - fn new() -> Self; -} - -impl DefaultTestClientBuilderExt for TestClientBuilder { - fn new() -> Self { - Self::with_default_backend() - } -} - -/// A `test-runtime` extensions to `TestClientBuilder`. -pub trait TestClientBuilderExt: Sized { - /// Returns a mutable reference to the genesis parameters. - fn genesis_init_mut(&mut self) -> &mut GenesisParameters; - - /// Set changes trie configuration for genesis. - fn changes_trie_config(mut self, config: Option) -> Self { - self.genesis_init_mut().changes_trie_config = config; - self - } - - /// Add an extra value into the genesis storage. - /// - /// # Panics - /// - /// Panics if the key is empty. - fn add_extra_child_storage>, K: Into>, V: Into>>( - mut self, - storage_key: SK, - child_info: ChildInfo, - key: K, - value: V, - ) -> Self { - let storage_key = storage_key.into(); - let key = key.into(); - assert!(!storage_key.is_empty()); - assert!(!key.is_empty()); - self.genesis_init_mut().extra_storage.children_default - .entry(storage_key) - .or_insert_with(|| StorageChild { - data: Default::default(), - child_info: child_info.to_owned(), - }).data.insert(key, value.into()); - self - } - - /// Add an extra child value into the genesis storage. - /// - /// # Panics - /// - /// Panics if the key is empty. - fn add_extra_storage>, V: Into>>(mut self, key: K, value: V) -> Self { - let key = key.into(); - assert!(!key.is_empty()); - self.genesis_init_mut().extra_storage.top.insert(key, value.into()); - self - } - - /// Build the test client. - fn build(self) -> Client { - self.build_with_longest_chain().0 - } - - /// Build the test client and longest chain selector. - fn build_with_longest_chain(self) -> (Client, LongestChain); - - /// Build the test client and the backend. - fn build_with_backend(self) -> (Client, Arc); -} - -impl TestClientBuilderExt for TestClientBuilder< - LocalCallExecutor>, - Backend -> { - fn genesis_init_mut(&mut self) -> &mut GenesisParameters { - Self::genesis_init_mut(self) - } - - fn build_with_longest_chain(self) -> (Client, LongestChain) { - self.build_with_native_executor(None) - } - - fn build_with_backend(self) -> (Client, Arc) { - let backend = self.backend(); - (self.build_with_native_executor(None).0, backend) - } -} - -/// Type of optional fetch callback. -type MaybeFetcherCallback = Option Result + Send + Sync>>; - -/// Implementation of light client fetcher used in tests. -#[derive(Default)] -pub struct LightFetcher { - call: MaybeFetcherCallback, Vec>, - body: MaybeFetcherCallback, Vec>, -} - -impl LightFetcher { - /// Sets remote call callback. - pub fn with_remote_call( - self, - call: MaybeFetcherCallback, Vec>, - ) -> Self { - LightFetcher { - call, - body: self.body, - } - } - - /// Sets remote body callback. - pub fn with_remote_body( - self, - body: MaybeFetcherCallback, Vec>, - ) -> Self { - LightFetcher { - call: self.call, - body, - } - } -} - -/// Creates new client instance used for tests. -pub fn new() -> Client { - TestClientBuilder::new().build() -} - -/// Creates new light client instance used for tests. -pub fn new_light() -> ( - SubstrateClient< - LightBackend, - LightExecutor, - polkadot_test_runtime::Block, - polkadot_test_runtime::RuntimeApi - >, - Arc, -) { - - let storage = sc_client_db::light::LightStorage::new_test(); - let blockchain =new_light_blockchain(storage); - let backend = new_light_backend(blockchain.clone()); - let executor = new_native_executor(); - let local_call_executor = LocalCallExecutor::new( - backend.clone(), - executor, - Box::new(sp_core::testing::TaskExecutor::new()), - Default::default() - ); - let call_executor = LightExecutor::new( - backend.clone(), - local_call_executor, - ); - - ( - TestClientBuilder::with_backend(backend.clone()) - .build_with_executor(call_executor) - .0, - backend, - ) -} - -/// Creates new light client fetcher used for tests. -pub fn new_light_fetcher() -> LightFetcher { - LightFetcher::default() -} - -/// Create a new native executor. -pub fn new_native_executor() -> sc_executor::NativeExecutor { - sc_executor::NativeExecutor::new(sc_executor::WasmExecutionMethod::Interpreted, None, 8) -} - -/// Extrinsics that must be included in each block. -/// -/// The index of the block must be provided to calculate a valid timestamp for the block. The value starts at 0 and -/// should be incremented by one for every block produced. -pub fn needed_extrinsics( - i: u64, -) -> Vec { - let timestamp = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH) - .expect("now always later than unix epoch; qed") - .as_millis() + (i * polkadot_test_runtime::constants::time::SLOT_DURATION / 2) as u128; - - vec![ - polkadot_test_runtime::UncheckedExtrinsic { - function: polkadot_test_runtime::Call::Timestamp(pallet_timestamp::Call::set( - u64::try_from(timestamp).expect("unexpected big timestamp"), - )), - signature: None, - } - ] -} diff --git a/runtime/test-runtime/src/constants.rs b/runtime/test-runtime/src/constants.rs index b18501b714b1f903d9d1144d833f96adff55db83..4c00475f4b9af76a76100ab143025d6d76b87e8a 100644 --- a/runtime/test-runtime/src/constants.rs +++ b/runtime/test-runtime/src/constants.rs @@ -28,10 +28,10 @@ pub mod currency { pub mod time { use primitives::v0::{Moment, BlockNumber}; // Testnet - pub const MILLISECS_PER_BLOCK: Moment = 1000; + pub const MILLISECS_PER_BLOCK: Moment = 6000; pub const SLOT_DURATION: Moment = MILLISECS_PER_BLOCK; - // Testnet - pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = 10 * MINUTES; + // 30 seconds for now + pub const EPOCH_DURATION_IN_BLOCKS: BlockNumber = MINUTES / 2; // These time units are defined in number of blocks. pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); diff --git a/runtime/test-runtime/src/lib.rs b/runtime/test-runtime/src/lib.rs index ce20c720e177636a91ec67785bf7adbda4d7356e..58b0df5dffd4693f48a4a39663a91140b1e27536 100644 --- a/runtime/test-runtime/src/lib.rs +++ b/runtime/test-runtime/src/lib.rs @@ -18,18 +18,34 @@ #![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"] +#![recursion_limit = "256"] + +use pallet_transaction_payment::CurrencyAdapter; +use sp_std::prelude::*; +use sp_std::collections::btree_map::BTreeMap; +use parity_scale_codec::Encode; + +use polkadot_runtime_parachains::configuration as parachains_configuration; +use polkadot_runtime_parachains::inclusion as parachains_inclusion; +use polkadot_runtime_parachains::inclusion_inherent as parachains_inclusion_inherent; +use polkadot_runtime_parachains::initializer as parachains_initializer; +use polkadot_runtime_parachains::session_info as parachains_session_info; +use polkadot_runtime_parachains::paras as parachains_paras; +use polkadot_runtime_parachains::dmp as parachains_dmp; +use polkadot_runtime_parachains::ump as parachains_ump; +use polkadot_runtime_parachains::hrmp as parachains_hrmp; +use polkadot_runtime_parachains::scheduler as parachains_scheduler; +use polkadot_runtime_parachains::runtime_api_impl::v1 as runtime_impl; -use rstd::prelude::*; -use codec::{Encode, Decode}; -use primitives::v0 as p_v0; use primitives::v1::{ - AccountId, AccountIndex, Balance, BlockNumber, Hash as HashT, Nonce, Signature, Moment, + AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CommittedCandidateReceipt, + CoreState, GroupRotationInfo, Hash as HashT, Id as ParaId, Moment, Nonce, OccupiedCoreAssumption, + PersistedValidationData, Signature, ValidationCode, ValidationData, ValidatorId, ValidatorIndex, + InboundDownwardMessage, InboundHrmpMessage, SessionInfo as SessionInfoData, }; use runtime_common::{ - claims, SlowAdjustingFeeUpdate, impls::CurrencyToVoteHandler, - BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, - MaximumBlockLength, BlockExecutionWeight, ExtrinsicBaseWeight, ParachainSessionKeyPlaceholder, + claims, SlowAdjustingFeeUpdate, paras_sudo_wrapper, + BlockHashCount, BlockWeights, BlockLength, }; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, @@ -57,6 +73,7 @@ use frame_support::{ use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; use pallet_session::historical as session_historical; +use polkadot_runtime_parachains::reward_points::RewardValidatorsWithEraPoints; #[cfg(feature = "std")] pub use pallet_staking::StakerStatus; @@ -64,6 +81,8 @@ pub use pallet_staking::StakerStatus; pub use sp_runtime::BuildStorage; pub use pallet_timestamp::Call as TimestampCall; pub use pallet_balances::Call as BalancesCall; +pub use paras_sudo_wrapper::Call as ParasSudoWrapperCall; +pub use pallet_sudo::Call as SudoCall; /// Constant values used within the runtime. pub mod constants; @@ -78,7 +97,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("polkadot-test-runtime"), impl_name: create_runtime_str!("parity-polkadot-test-runtime"), authoring_version: 2, - spec_version: 1054, + spec_version: 1055, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, @@ -93,12 +112,23 @@ pub fn native_version() -> NativeVersion { } } +sp_api::decl_runtime_apis! { + pub trait GetLastTimestamp { + /// Returns the last timestamp of a runtime. + fn get_last_timestamp() -> u64; + } +} + parameter_types! { pub const Version: RuntimeVersion = VERSION; + pub const SS58Prefix: u8 = 42; } -impl frame_system::Trait for Runtime { +impl frame_system::Config for Runtime { type BaseCallFilter = (); + type BlockWeights = BlockWeights; + type BlockLength = BlockLength; + type DbWeight = (); type Origin = Origin; type Call = Call; type Index = Nonce; @@ -110,19 +140,13 @@ impl frame_system::Trait for Runtime { type Header = generic::Header; type Event = Event; type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); - type BlockExecutionWeight = BlockExecutionWeight; - type ExtrinsicBaseWeight = ExtrinsicBaseWeight; - type MaximumExtrinsicWeight = MaximumBlockWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; - type ModuleToIndex = ModuleToIndex; + type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); type SystemWeightInfo = (); + type SS58Prefix = SS58Prefix; } impl frame_system::offchain::SendTransactionTypes for Runtime where @@ -137,7 +161,7 @@ parameter_types! { pub storage ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } -impl pallet_babe::Trait for Runtime { +impl pallet_babe::Config for Runtime { type EpochDuration = EpochDuration; type ExpectedBlockTime = ExpectedBlockTime; @@ -157,13 +181,15 @@ impl pallet_babe::Trait for Runtime { )>>::IdentificationTuple; type HandleEquivocation = (); + + type WeightInfo = (); } parameter_types! { pub storage IndexDeposit: Balance = 1 * DOLLARS; } -impl pallet_indices::Trait for Runtime { +impl pallet_indices::Config for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; @@ -173,14 +199,16 @@ impl pallet_indices::Trait for Runtime { parameter_types! { pub storage ExistentialDeposit: Balance = 1 * CENTS; + pub storage MaxLocks: u32 = 50; } -impl pallet_balances::Trait for Runtime { +impl pallet_balances::Config for Runtime { type Balance = Balance; type DustRemoval = (); type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; + type MaxLocks = MaxLocks; type WeightInfo = (); } @@ -188,9 +216,8 @@ parameter_types! { pub storage TransactionByteFee: Balance = 10 * MILLICENTS; } -impl pallet_transaction_payment::Trait for Runtime { - type Currency = Balances; - type OnTransactionPayment = (); +impl pallet_transaction_payment::Config for Runtime { + type OnChargeTransaction = CurrencyAdapter; type TransactionByteFee = TransactionByteFee; type WeightToFee = WeightToFee; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; @@ -200,7 +227,7 @@ parameter_types! { pub storage SlotDuration: u64 = SLOT_DURATION; pub storage MinimumPeriod: u64 = SlotDuration::get() / 2; } -impl pallet_timestamp::Trait for Runtime { +impl pallet_timestamp::Config for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; @@ -212,7 +239,7 @@ parameter_types! { } // TODO: substrate#2986 implement this properly -impl pallet_authorship::Trait for Runtime { +impl pallet_authorship::Config for Runtime { type FindAuthor = pallet_session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); @@ -228,7 +255,9 @@ impl_opaque_keys! { pub struct SessionKeys { pub grandpa: Grandpa, pub babe: Babe, - pub parachain_validator: ParachainSessionKeyPlaceholder, + pub para_validator: Initializer, + pub para_assignment: SessionInfo, + pub authority_discovery: AuthorityDiscovery, } } @@ -236,7 +265,7 @@ parameter_types! { pub storage DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } -impl pallet_session::Trait for Runtime { +impl pallet_session::Config for Runtime { type Event = Event; type ValidatorId = AccountId; type ValidatorIdOf = pallet_staking::StashOf; @@ -249,7 +278,7 @@ impl pallet_session::Trait for Runtime { type WeightInfo = (); } -impl pallet_session::historical::Trait for Runtime { +impl pallet_session::historical::Config for Runtime { type FullIdentification = pallet_staking::Exposure; type FullIdentificationOf = pallet_staking::ExposureOf; } @@ -280,10 +309,10 @@ parameter_types! { pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000); } -impl pallet_staking::Trait for Runtime { +impl pallet_staking::Config for Runtime { type Currency = Balances; type UnixTime = Timestamp; - type CurrencyToVote = CurrencyToVoteHandler; + type CurrencyToVote = frame_support::traits::U128CurrencyToVote; type RewardRemainder = (); type Event = Event; type Slash = (); @@ -301,12 +330,13 @@ impl pallet_staking::Trait for Runtime { type Call = Call; type UnsignedPriority = StakingUnsignedPriority; type MaxIterations = MaxIterations; + type OffchainSolutionWeightLimit = (); type MinSolutionScoreBump = MinSolutionScoreBump; type WeightInfo = (); } -impl pallet_grandpa::Trait for Runtime { +impl pallet_grandpa::Config for Runtime { type Event = Event; type Call = Call; @@ -321,6 +351,8 @@ impl pallet_grandpa::Trait for Runtime { )>>::IdentificationTuple; type HandleEquivocation = (); + + type WeightInfo = (); } impl frame_system::offchain::CreateSignedTransaction for Runtime where @@ -330,7 +362,7 @@ impl frame_system::offchain::CreateSignedTransaction for R call: Call, public: ::Signer, account: AccountId, - nonce: ::Index, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { let period = BlockHashCount::get() .checked_next_power_of_two() @@ -368,18 +400,17 @@ impl frame_system::offchain::SigningTypes for Runtime { } parameter_types! { - pub storage OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); + pub storage OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * BlockWeights::get().max_block; } -impl pallet_offences::Trait for Runtime { +impl pallet_offences::Config for Runtime { type Event = Event; type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; - type WeightInfo = (); } -impl pallet_authority_discovery::Trait for Runtime {} +impl pallet_authority_discovery::Config for Runtime {} parameter_types! { pub storage LeasePeriod: BlockNumber = 100_000; @@ -390,18 +421,19 @@ parameter_types! { pub Prefix: &'static [u8] = b"Pay KSMs to the Kusama account:"; } -impl claims::Trait for Runtime { +impl claims::Config for Runtime { type Event = Event; type VestingSchedule = Vesting; type Prefix = Prefix; type MoveClaimOrigin = frame_system::EnsureRoot; + type WeightInfo = claims::TestWeightInfo; } parameter_types! { pub storage MinVestedTransfer: Balance = 100 * DOLLARS; } -impl pallet_vesting::Trait for Runtime { +impl pallet_vesting::Config for Runtime { type Event = Event; type Currency = Balances; type BlockNumberToBalance = ConvertInto; @@ -409,11 +441,44 @@ impl pallet_vesting::Trait for Runtime { type WeightInfo = (); } -impl pallet_sudo::Trait for Runtime { +impl pallet_sudo::Config for Runtime { type Event = Event; type Call = Call; } +impl parachains_configuration::Config for Runtime {} + +impl parachains_inclusion::Config for Runtime { + type Event = Event; + type RewardValidators = RewardValidatorsWithEraPoints; +} + +impl parachains_inclusion_inherent::Config for Runtime {} + +impl parachains_initializer::Config for Runtime { + type Randomness = RandomnessCollectiveFlip; +} + +impl parachains_session_info::Config for Runtime {} + +impl parachains_paras::Config for Runtime { + type Origin = Origin; +} + +impl parachains_dmp::Config for Runtime {} + +impl parachains_ump::Config for Runtime { + type UmpSink = (); +} + +impl parachains_hrmp::Config for Runtime { + type Origin = Origin; +} + +impl parachains_scheduler::Config for Runtime {} + +impl paras_sudo_wrapper::Config for Runtime {} + construct_runtime! { pub enum Runtime where Block = Block, @@ -447,7 +512,16 @@ construct_runtime! { // Vesting. Usable initially, but removed once all vesting is finished. Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, - // Sudo. Last module. + // Parachains runtime modules + ParachainsConfiguration: parachains_configuration::{Module, Call, Storage, Config}, + Inclusion: parachains_inclusion::{Module, Call, Storage, Event}, + InclusionInherent: parachains_inclusion_inherent::{Module, Call, Storage, Inherent}, + Initializer: parachains_initializer::{Module, Call, Storage}, + Paras: parachains_paras::{Module, Call, Storage, Origin}, + Scheduler: parachains_scheduler::{Module, Call, Storage}, + ParasSudoWrapper: paras_sudo_wrapper::{Module, Call}, + SessionInfo: parachains_session_info::{Module, Call, Storage}, + Sudo: pallet_sudo::{Module, Call, Storage, Config, Event}, } } @@ -547,59 +621,82 @@ sp_api::impl_runtime_apis! { impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { fn authorities() -> Vec { - Vec::new() + AuthorityDiscovery::authorities() } } - // Dummy implementation to continue supporting old parachains runtime temporarily. - impl p_v0::ParachainHost for Runtime { - fn validators() -> Vec { - // this is a compile-time check of size equality. note that we don't invoke - // the function and nothing here is unsafe. - let _ = core::mem::transmute::; - - // Yes, these aren't actually the parachain session keys. - // It doesn't matter, but we shouldn't return a zero-sized vector here. - // As there are no parachains - Session::validators() - .into_iter() - .map(|k| k.using_encoded(|s| Decode::decode(&mut &s[..])) - .expect("correct size and raw-bytes; qed")) - .collect() - } - fn duty_roster() -> p_v0::DutyRoster { - let v = Session::validators(); - p_v0::DutyRoster { validator_duty: (0..v.len()).map(|_| p_v0::Chain::Relay).collect() } - } - fn active_parachains() -> Vec<(p_v0::Id, Option<(p_v0::CollatorId, p_v0::Retriable)>)> { - Vec::new() - } - fn global_validation_data() -> p_v0::GlobalValidationData { - p_v0::GlobalValidationData { - max_code_size: 1, - max_head_data_size: 1, - block_number: System::block_number().saturating_sub(1), - } + impl primitives::v1::ParachainHost for Runtime { + fn validators() -> Vec { + runtime_impl::validators::() } - fn local_validation_data(_id: p_v0::Id) -> Option { - None + + fn validator_groups() -> (Vec>, GroupRotationInfo) { + runtime_impl::validator_groups::() } - fn parachain_code(_id: p_v0::Id) -> Option { - None + + fn availability_cores() -> Vec> { + runtime_impl::availability_cores::() } - fn get_heads(_extrinsics: Vec<::Extrinsic>) - -> Option> + + fn full_validation_data(para_id: ParaId, assumption: OccupiedCoreAssumption) + -> Option> { - None + runtime_impl::full_validation_data::(para_id, assumption) } - fn signing_context() -> p_v0::SigningContext { - p_v0::SigningContext { - parent_hash: System::parent_hash(), - session_index: Session::current_index(), - } + + fn persisted_validation_data(para_id: ParaId, assumption: OccupiedCoreAssumption) + -> Option> + { + runtime_impl::persisted_validation_data::(para_id, assumption) + } + + fn check_validation_outputs( + para_id: ParaId, + outputs: primitives::v1::CandidateCommitments, + ) -> bool { + runtime_impl::check_validation_outputs::(para_id, outputs) + } + + fn session_index_for_child() -> SessionIndex { + runtime_impl::session_index_for_child::() + } + + fn validation_code(para_id: ParaId, assumption: OccupiedCoreAssumption) + -> Option + { + runtime_impl::validation_code::(para_id, assumption) + } + + fn historical_validation_code(para_id: ParaId, context_height: BlockNumber) + -> Option + { + runtime_impl::historical_validation_code::(para_id, context_height) } - fn downward_messages(_id: p_v0::Id) -> Vec { - Vec::new() + + + fn candidate_pending_availability(para_id: ParaId) -> Option> { + runtime_impl::candidate_pending_availability::(para_id) + } + + fn candidate_events() -> Vec> { + use core::convert::TryInto; + runtime_impl::candidate_events::(|trait_event| trait_event.try_into().ok()) + } + + fn session_info(index: SessionIndex) -> Option { + runtime_impl::session_info::(index) + } + + fn dmq_contents( + recipient: ParaId, + ) -> Vec> { + runtime_impl::dmq_contents::(recipient) + } + + fn inbound_hrmp_channels_contents( + recipient: ParaId, + ) -> BTreeMap>> { + runtime_impl::inbound_hrmp_channels_contents::(recipient) } } @@ -647,6 +744,14 @@ sp_api::impl_runtime_apis! { Babe::current_epoch_start() } + fn current_epoch() -> babe_primitives::Epoch { + Babe::current_epoch() + } + + fn next_epoch() -> babe_primitives::Epoch { + Babe::next_epoch() + } + fn generate_key_ownership_proof( _slot_number: babe_primitives::SlotNumber, _authority_id: babe_primitives::AuthorityId, @@ -688,4 +793,10 @@ sp_api::impl_runtime_apis! { TransactionPayment::query_info(uxt, len) } } + + impl crate::GetLastTimestamp for Runtime { + fn get_last_timestamp() -> u64 { + Timestamp::now() + } + } } diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index 7dfc1b7ee903de0903c398892c0421b70b756e35..8db466b03d682ac3cb1439fbaedf91aad07a9bca 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -1,18 +1,18 @@ [package] name = "westend-runtime" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" [dependencies] bitvec = { version = "0.17.4", default-features = false, features = ["alloc"] } -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } -log = { version = "0.3.9", optional = true } -rustc-hex = { version = "2.0.1", default-features = false } -serde = { version = "1.0.102", default-features = false } -serde_derive = { version = "1.0.102", optional = true } -smallvec = "1.4.1" +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +log = { version = "0.4.11", optional = true } +rustc-hex = { version = "2.1.0", default-features = false } +serde = { version = "1.0.118", default-features = false } +serde_derive = { version = "1.0.117", optional = true } +smallvec = "1.6.1" static_assertions = "1.1.0" authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -40,7 +40,6 @@ pallet-collective = { git = "https://github.com/paritytech/substrate", branch = pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-elections-phragmen = { package = "pallet-elections-phragmen", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-finality-tracker = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -70,22 +69,22 @@ frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-offences-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-session-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -hex-literal = { version = "0.2.1" } +hex-literal = { version = "0.3.1", optional = true } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } polkadot-parachain = { path = "../../parachain", default-features = false } [dev-dependencies] -hex-literal = "0.2.1" -libsecp256k1 = "0.3.2" -tiny-keccak = "1.5.0" +hex-literal = "0.3.1" +libsecp256k1 = "0.3.5" +tiny-keccak = "2.0.2" keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -serde_json = "1.0.41" +serde_json = "1.0.61" [build-dependencies] -wasm-builder-runner = { package = "substrate-wasm-builder-runner", version = "1.0.6" } +substrate-wasm-builder = "3.0.0" [features] default = ["std"] @@ -97,7 +96,7 @@ std = [ "bitvec/std", "primitives/std", "rustc-hex/std", - "codec/std", + "parity-scale-codec/std", "inherents/std", "sp-core/std", "polkadot-parachain/std", @@ -116,7 +115,6 @@ std = [ "pallet-elections-phragmen/std", "pallet-democracy/std", "frame-executive/std", - "pallet-finality-tracker/std", "pallet-grandpa/std", "pallet-identity/std", "pallet-im-online/std", @@ -154,15 +152,19 @@ runtime-benchmarks = [ "runtime-common/runtime-benchmarks", "frame-benchmarking", "frame-support/runtime-benchmarks", - "frame-system-benchmarking", "frame-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", + "pallet-babe/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-collective/runtime-benchmarks", "pallet-democracy/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-multisig/runtime-benchmarks", + "pallet-proxy/runtime-benchmarks", "pallet-scheduler/runtime-benchmarks", "pallet-society/runtime-benchmarks", "pallet-staking/runtime-benchmarks", @@ -172,9 +174,10 @@ runtime-benchmarks = [ "pallet-vesting/runtime-benchmarks", "pallet-offences-benchmarking", "pallet-session-benchmarking", - # uncomment when it is made optional again - # "hex-literal", + "frame-system-benchmarking", + "hex-literal", ] + # When enabled, the runtime api will not be build. # # This is required by Cumulus to access certain types of the diff --git a/runtime/westend/build.rs b/runtime/westend/build.rs index af219a29319898d2f6180ef13bbe5263cd114727..e4a139a06ae1a85fa05f0f90f568a1a7c2839160 100644 --- a/runtime/westend/build.rs +++ b/runtime/westend/build.rs @@ -1,7 +1,7 @@ // Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. -// Substrate is free software: you can redistribute it and/or modify +// 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. @@ -12,14 +12,13 @@ // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with Polkadot. If not, see . -use wasm_builder_runner::WasmBuilder; +use substrate_wasm_builder::WasmBuilder; fn main() { WasmBuilder::new() .with_current_project() - .with_wasm_builder_from_crates("2.0.0") .import_memory() .export_heap_base() .build() diff --git a/runtime/westend/src/constants.rs b/runtime/westend/src/constants.rs index 6fb7e934e1f1d166056ea21f6ca3fe9ff8199fb0..ed740007041bd9f7d99d00c7b1ac7b55db82f3cf 100644 --- a/runtime/westend/src/constants.rs +++ b/runtime/westend/src/constants.rs @@ -61,7 +61,7 @@ pub mod fee { /// node's balance type. /// /// This should typically create a mapping between the following ranges: - /// - [0, frame_system::MaximumBlockWeight] + /// - [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: @@ -87,16 +87,16 @@ pub mod fee { #[cfg(test)] mod tests { use frame_support::weights::WeightToFeePolynomial; - use runtime_common::{MaximumBlockWeight, ExtrinsicBaseWeight}; + use runtime_common::{MAXIMUM_BLOCK_WEIGHT, ExtrinsicBaseWeight}; use super::fee::WeightToFee; use super::currency::{CENTS, DOLLARS, MILLICENTS}; #[test] - // This function tests that the fee for `MaximumBlockWeight` of weight is correct + // This function tests that the fee for `MAXIMUM_BLOCK_WEIGHT` of weight is correct fn full_block_fee_is_correct() { // A full block should cost 16 DOLLARS println!("Base: {}", ExtrinsicBaseWeight::get()); - let x = WeightToFee::calc(&MaximumBlockWeight::get()); + let x = WeightToFee::calc(&MAXIMUM_BLOCK_WEIGHT); let y = 16 * DOLLARS; assert!(x.max(y) - x.min(y) < MILLICENTS); } diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index ca5f7d12208752e0fb1007f459fb675fe4504e3b..72915cc867cc3e5d9a036fff928f2d589ed500e9 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -18,20 +18,23 @@ #![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"] +#![recursion_limit = "256"] +use pallet_transaction_payment::CurrencyAdapter; use sp_std::prelude::*; -use codec::{Encode, Decode}; +use sp_std::collections::btree_map::BTreeMap; +use parity_scale_codec::{Encode, Decode}; use primitives::v1::{ - AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment, + AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CommittedCandidateReceipt, + CoreState, GroupRotationInfo, Hash, Id, Moment, Nonce, OccupiedCoreAssumption, + PersistedValidationData, Signature, ValidationCode, ValidationData, ValidatorId, ValidatorIndex, + InboundDownwardMessage, InboundHrmpMessage, SessionInfo, AssignmentId, }; -use primitives::v0 as p_v0; use runtime_common::{ - dummy, purchase, SlowAdjustingFeeUpdate, - impls::{CurrencyToVoteHandler, ToAuthor}, - BlockHashCount, MaximumBlockWeight, AvailableBlockRatio, MaximumBlockLength, - BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, MaximumExtrinsicWeight, - ParachainSessionKeyPlaceholder, + SlowAdjustingFeeUpdate, CurrencyToVote, + impls::ToAuthor, + BlockHashCount, BlockWeights, BlockLength, RocksDbWeight, OffchainSolutionWeightLimit, + ParachainSessionKeyPlaceholder, AssignmentSessionKeyPlaceholder, }; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, @@ -84,8 +87,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 43, - impl_version: 1, + spec_version: 48, + impl_version: 0, #[cfg(not(feature = "disable-runtime-api"))] apis: RUNTIME_API_VERSIONS, #[cfg(feature = "disable-runtime-api")] @@ -112,10 +115,13 @@ impl Filter for BaseFilter { parameter_types! { pub const Version: RuntimeVersion = VERSION; + pub const SS58Prefix: u8 = 42; } -impl frame_system::Trait for Runtime { +impl frame_system::Config for Runtime { type BaseCallFilter = BaseFilter; + type BlockWeights = BlockWeights; + type BlockLength = BlockLength; type Origin = Origin; type Call = Call; type Index = Nonce; @@ -127,29 +133,31 @@ impl frame_system::Trait for Runtime { type Header = generic::Header; type Event = Event; type BlockHashCount = BlockHashCount; - type MaximumBlockWeight = MaximumBlockWeight; type DbWeight = RocksDbWeight; - type BlockExecutionWeight = BlockExecutionWeight; - type ExtrinsicBaseWeight = ExtrinsicBaseWeight; - type MaximumExtrinsicWeight = MaximumExtrinsicWeight; - type MaximumBlockLength = MaximumBlockLength; - type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; - type ModuleToIndex = ModuleToIndex; + type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; type OnNewAccount = (); type OnKilledAccount = (); - type SystemWeightInfo = weights::frame_system::WeightInfo; + type SystemWeightInfo = weights::frame_system::WeightInfo; + type SS58Prefix = SS58Prefix; } -impl pallet_scheduler::Trait for Runtime { +parameter_types! { + pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * + BlockWeights::get().max_block; + pub const MaxScheduledPerBlock: u32 = 50; +} + +impl pallet_scheduler::Config for Runtime { type Event = Event; type Origin = Origin; type PalletsOrigin = OriginCaller; type Call = Call; - type MaximumWeight = MaximumBlockWeight; + type MaximumWeight = MaximumSchedulerWeight; type ScheduleOrigin = EnsureRoot; - type WeightInfo = (); + type MaxScheduledPerBlock = MaxScheduledPerBlock; + type WeightInfo = weights::pallet_scheduler::WeightInfo; } parameter_types! { @@ -157,7 +165,7 @@ parameter_types! { pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK; } -impl pallet_babe::Trait for Runtime { +impl pallet_babe::Config for Runtime { type EpochDuration = EpochDuration; type ExpectedBlockTime = ExpectedBlockTime; @@ -178,40 +186,43 @@ impl pallet_babe::Trait for Runtime { type HandleEquivocation = pallet_babe::EquivocationHandler; + + type WeightInfo = (); } parameter_types! { pub const IndexDeposit: Balance = 1 * DOLLARS; } -impl pallet_indices::Trait for Runtime { +impl pallet_indices::Config for Runtime { type AccountIndex = AccountIndex; type Currency = Balances; type Deposit = IndexDeposit; type Event = Event; - type WeightInfo = (); + type WeightInfo = weights::pallet_indices::WeightInfo; } parameter_types! { pub const ExistentialDeposit: Balance = 1 * CENTS; + pub const MaxLocks: u32 = 50; } -impl pallet_balances::Trait for Runtime { +impl pallet_balances::Config for Runtime { type Balance = Balance; type DustRemoval = (); type Event = Event; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; - type WeightInfo = weights::pallet_balances::WeightInfo; + type MaxLocks = MaxLocks; + type WeightInfo = weights::pallet_balances::WeightInfo; } parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; } -impl pallet_transaction_payment::Trait for Runtime { - type Currency = Balances; - type OnTransactionPayment = ToAuthor; +impl pallet_transaction_payment::Config for Runtime { + type OnChargeTransaction = CurrencyAdapter>; type TransactionByteFee = TransactionByteFee; type WeightToFee = WeightToFee; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; @@ -220,11 +231,11 @@ impl pallet_transaction_payment::Trait for Runtime { parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; } -impl pallet_timestamp::Trait for Runtime { +impl pallet_timestamp::Config for Runtime { type Moment = u64; type OnTimestampSet = Babe; type MinimumPeriod = MinimumPeriod; - type WeightInfo = weights::pallet_timestamp::WeightInfo; + type WeightInfo = weights::pallet_timestamp::WeightInfo; } parameter_types! { @@ -232,7 +243,7 @@ parameter_types! { } // TODO: substrate#2986 implement this properly -impl pallet_authorship::Trait for Runtime { +impl pallet_authorship::Config for Runtime { type FindAuthor = pallet_session::FindAccountFromAuthorIndex; type UncleGenerations = UncleGenerations; type FilterUncle = (); @@ -244,21 +255,51 @@ parameter_types! { pub const Offset: BlockNumber = 0; } +impl_opaque_keys! { + pub struct OldSessionKeys { + pub grandpa: Grandpa, + pub babe: Babe, + pub im_online: ImOnline, + pub para_validator: ParachainSessionKeyPlaceholder, + pub authority_discovery: AuthorityDiscovery, + } +} + impl_opaque_keys! { pub struct SessionKeys { pub grandpa: Grandpa, pub babe: Babe, pub im_online: ImOnline, - pub parachain_validator: ParachainSessionKeyPlaceholder, + pub para_validator: ParachainSessionKeyPlaceholder, + pub para_assignment: AssignmentSessionKeyPlaceholder, pub authority_discovery: AuthorityDiscovery, } } +fn transform_session_keys(v: AccountId, old: OldSessionKeys) -> SessionKeys { + SessionKeys { + grandpa: old.grandpa, + babe: old.babe, + im_online: old.im_online, + para_validator: old.para_validator, + para_assignment: { + // We need to produce a dummy value that's unique for the validator. + let mut id = AssignmentId::default(); + let id_raw: &mut [u8] = id.as_mut(); + id_raw.copy_from_slice(v.as_ref()); + id_raw[0..4].copy_from_slice(b"asgn"); + + id + }, + authority_discovery: old.authority_discovery, + } +} + parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17); } -impl pallet_session::Trait for Runtime { +impl pallet_session::Config for Runtime { type Event = Event; type ValidatorId = AccountId; type ValidatorIdOf = pallet_staking::StashOf; @@ -268,10 +309,10 @@ impl pallet_session::Trait for Runtime { type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; type DisabledValidatorsThreshold = DisabledValidatorsThreshold; - type WeightInfo = (); + type WeightInfo = weights::pallet_session::WeightInfo; } -impl pallet_session::historical::Trait for Runtime { +impl pallet_session::historical::Config for Runtime { type FullIdentification = pallet_staking::Exposure; type FullIdentificationOf = pallet_staking::ExposureOf; } @@ -302,10 +343,10 @@ parameter_types! { pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000); } -impl pallet_staking::Trait for Runtime { +impl pallet_staking::Config for Runtime { type Currency = Balances; type UnixTime = Timestamp; - type CurrencyToVote = CurrencyToVoteHandler; + type CurrencyToVote = CurrencyToVote; type RewardRemainder = (); type Event = Event; type Slash = (); @@ -324,7 +365,8 @@ impl pallet_staking::Trait for Runtime { type UnsignedPriority = StakingUnsignedPriority; type MaxIterations = MaxIterations; type MinSolutionScoreBump = MinSolutionScoreBump; - type WeightInfo = weights::pallet_staking::WeightInfo; + type OffchainSolutionWeightLimit = OffchainSolutionWeightLimit; + type WeightInfo = weights::pallet_staking::WeightInfo; } parameter_types! { @@ -340,18 +382,17 @@ parameter_types! { } parameter_types! { - pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); + pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * BlockWeights::get().max_block; } -impl pallet_offences::Trait for Runtime { +impl pallet_offences::Config for Runtime { type Event = Event; type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; type WeightSoftLimit = OffencesWeightSoftLimit; - type WeightInfo = (); } -impl pallet_authority_discovery::Trait for Runtime {} +impl pallet_authority_discovery::Config for Runtime {} parameter_types! { pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _; @@ -362,16 +403,16 @@ parameter_types! { pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); } -impl pallet_im_online::Trait for Runtime { +impl pallet_im_online::Config for Runtime { type AuthorityId = ImOnlineId; type Event = Event; type ReportUnresponsiveness = Offences; type SessionDuration = SessionDuration; type UnsignedPriority = StakingUnsignedPriority; - type WeightInfo = (); + type WeightInfo = weights::pallet_im_online::WeightInfo; } -impl pallet_grandpa::Trait for Runtime { +impl pallet_grandpa::Config for Runtime { type Event = Event; type Call = Call; @@ -386,17 +427,8 @@ impl pallet_grandpa::Trait for Runtime { )>>::IdentificationTuple; type HandleEquivocation = pallet_grandpa::EquivocationHandler; -} - -parameter_types! { - pub WindowSize: BlockNumber = pallet_finality_tracker::DEFAULT_WINDOW_SIZE.into(); - pub ReportLatency: BlockNumber = pallet_finality_tracker::DEFAULT_REPORT_LATENCY.into(); -} -impl pallet_finality_tracker::Trait for Runtime { - type OnFinalizationStalled = (); - type WindowSize = WindowSize; - type ReportLatency = ReportLatency; + type WeightInfo = (); } /// Submits a transaction with the node's public and signature type. Adheres to the signed extension @@ -408,7 +440,7 @@ impl frame_system::offchain::CreateSignedTransaction for R call: Call, public: ::Signer, account: AccountId, - nonce: ::Index, + nonce: ::Index, ) -> Option<(Call, ::SignaturePayload)> { // take the biggest period possible. let period = BlockHashCount::get() @@ -464,7 +496,7 @@ parameter_types! { pub const MaxRegistrars: u32 = 20; } -impl pallet_identity::Trait for Runtime { +impl pallet_identity::Config for Runtime { type Event = Event; type Currency = Balances; type Slashed = (); @@ -476,13 +508,13 @@ impl pallet_identity::Trait for Runtime { type MaxRegistrars = MaxRegistrars; type RegistrarOrigin = frame_system::EnsureRoot; type ForceOrigin = frame_system::EnsureRoot; - type WeightInfo = (); + type WeightInfo = weights::pallet_identity::WeightInfo; } -impl pallet_utility::Trait for Runtime { +impl pallet_utility::Config for Runtime { type Event = Event; type Call = Call; - type WeightInfo = weights::pallet_utility::WeightInfo; + type WeightInfo = weights::pallet_utility::WeightInfo; } parameter_types! { @@ -493,14 +525,14 @@ parameter_types! { pub const MaxSignatories: u16 = 100; } -impl pallet_multisig::Trait for Runtime { +impl pallet_multisig::Config for Runtime { type Event = Event; type Call = Call; type Currency = Balances; type DepositBase = DepositBase; type DepositFactor = DepositFactor; type MaxSignatories = MaxSignatories; - type WeightInfo = (); + type WeightInfo = weights::pallet_multisig::WeightInfo; } parameter_types! { @@ -510,7 +542,7 @@ parameter_types! { pub const RecoveryDeposit: Balance = 5 * DOLLARS; } -impl pallet_recovery::Trait for Runtime { +impl pallet_recovery::Config for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -524,15 +556,15 @@ parameter_types! { pub const MinVestedTransfer: Balance = 100 * DOLLARS; } -impl pallet_vesting::Trait for Runtime { +impl pallet_vesting::Config for Runtime { type Event = Event; type Currency = Balances; type BlockNumberToBalance = ConvertInto; type MinVestedTransfer = MinVestedTransfer; - type WeightInfo = (); + type WeightInfo = weights::pallet_vesting::WeightInfo; } -impl pallet_sudo::Trait for Runtime { +impl pallet_sudo::Config for Runtime { type Event = Event; type Call = Call; } @@ -575,13 +607,9 @@ impl InstanceFilter for ProxyType { Call::Staking(..) | Call::Offences(..) | Call::Session(..) | - Call::FinalityTracker(..) | Call::Grandpa(..) | Call::ImOnline(..) | Call::AuthorityDiscovery(..) | - Call::DummyParachains(..) | - Call::DummyAttestations(..) | - Call::DummyRegistrar(..) | Call::Utility(..) | Call::Identity(..) | Call::Recovery(pallet_recovery::Call::as_recovered(..)) | @@ -600,7 +628,9 @@ impl InstanceFilter for ProxyType { Call::Multisig(..) ), ProxyType::Staking => matches!(c, - Call::Staking(..) | Call::Utility(..) + Call::Staking(..) | + Call::Session(..) | + Call::Utility(..) ), ProxyType::SudoBalances => match c { Call::Sudo(pallet_sudo::Call::sudo(ref x)) => matches!(x.as_ref(), &Call::Balances(..)), @@ -608,8 +638,8 @@ impl InstanceFilter for ProxyType { _ => false, }, ProxyType::IdentityJudgement => matches!(c, - Call::Identity(pallet_identity::Call::provide_judgement(..)) - | Call::Utility(pallet_utility::Call::batch(..)) + Call::Identity(pallet_identity::Call::provide_judgement(..)) | + Call::Utility(..) ) } } @@ -624,7 +654,7 @@ impl InstanceFilter for ProxyType { } } -impl pallet_proxy::Trait for Runtime { +impl pallet_proxy::Config for Runtime { type Event = Event; type Call = Call; type Currency = Balances; @@ -632,17 +662,13 @@ impl pallet_proxy::Trait for Runtime { type ProxyDepositBase = ProxyDepositBase; type ProxyDepositFactor = ProxyDepositFactor; type MaxProxies = MaxProxies; - type WeightInfo = weights::pallet_proxy::WeightInfo; + type WeightInfo = weights::pallet_proxy::WeightInfo; type MaxPending = MaxPending; type CallHasher = BlakeTwo256; type AnnouncementDepositBase = AnnouncementDepositBase; type AnnouncementDepositFactor = AnnouncementDepositFactor; } -impl dummy::Trait for Runtime { - type Event = Event; -} - construct_runtime! { pub enum Runtime where Block = Block, @@ -650,56 +676,50 @@ construct_runtime! { UncheckedExtrinsic = UncheckedExtrinsic { // Basic stuff; balances is uncallable initially. - System: frame_system::{Module, Call, Storage, Config, Event}, - RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage}, + System: frame_system::{Module, Call, Storage, Config, Event} = 0, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage} = 25, // Must be before session. - Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned}, + Babe: pallet_babe::{Module, Call, Storage, Config, Inherent, ValidateUnsigned} = 1, - Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent}, - Indices: pallet_indices::{Module, Call, Storage, Config, Event}, - Balances: pallet_balances::{Module, Call, Storage, Config, Event}, - TransactionPayment: pallet_transaction_payment::{Module, Storage}, + Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent} = 2, + Indices: pallet_indices::{Module, Call, Storage, Config, Event} = 3, + Balances: pallet_balances::{Module, Call, Storage, Config, Event} = 4, + TransactionPayment: pallet_transaction_payment::{Module, Storage} = 26, // Consensus support. - Authorship: pallet_authorship::{Module, Call, Storage}, - Staking: pallet_staking::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - Offences: pallet_offences::{Module, Call, Storage, Event}, - Historical: session_historical::{Module}, - Session: pallet_session::{Module, Call, Storage, Event, Config}, - FinalityTracker: pallet_finality_tracker::{Module, Call, Storage, Inherent}, - Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned}, - ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config}, - AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config}, - - // Old Parachains stuff. All dummies to avoid messing up the transaction indices. - DummyParachains: dummy::::{Module, Call}, - DummyAttestations: dummy::::{Module, Call}, - DummyRegistrar: dummy::::{Module, Call, Event}, + Authorship: pallet_authorship::{Module, Call, Storage} = 5, + Staking: pallet_staking::{Module, Call, Storage, Config, Event, ValidateUnsigned} = 6, + Offences: pallet_offences::{Module, Call, Storage, Event} = 7, + Historical: session_historical::{Module} = 27, + Session: pallet_session::{Module, Call, Storage, Event, Config} = 8, + Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event, ValidateUnsigned} = 10, + ImOnline: pallet_im_online::{Module, Call, Storage, Event, ValidateUnsigned, Config} = 11, + AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config} = 12, // Utility module. - Utility: pallet_utility::{Module, Call, Event}, + Utility: pallet_utility::{Module, Call, Event} = 16, // Less simple identity module. - Identity: pallet_identity::{Module, Call, Storage, Event}, + Identity: pallet_identity::{Module, Call, Storage, Event} = 17, // Social recovery module. - Recovery: pallet_recovery::{Module, Call, Storage, Event}, + Recovery: pallet_recovery::{Module, Call, Storage, Event} = 18, // Vesting. Usable initially, but removed once all vesting is finished. - Vesting: pallet_vesting::{Module, Call, Storage, Event, Config}, + Vesting: pallet_vesting::{Module, Call, Storage, Event, Config} = 19, // System scheduler. - Scheduler: pallet_scheduler::{Module, Call, Storage, Event}, + Scheduler: pallet_scheduler::{Module, Call, Storage, Event} = 20, // Sudo. - Sudo: pallet_sudo::{Module, Call, Storage, Event, Config}, + Sudo: pallet_sudo::{Module, Call, Storage, Event, Config} = 21, // Proxy module. Late addition. - Proxy: pallet_proxy::{Module, Call, Storage, Event}, + Proxy: pallet_proxy::{Module, Call, Storage, Event} = 22, // Multisig module. Late addition. - Multisig: pallet_multisig::{Module, Call, Storage, Event}, + Multisig: pallet_multisig::{Module, Call, Storage, Event} = 23, } } @@ -734,15 +754,24 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllModules, - CustomOnRuntimeUpgrade, + UpgradeSessionKeys, >; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; +// When this is removed, should also remove `OldSessionKeys`. +pub struct UpgradeSessionKeys; +impl frame_support::traits::OnRuntimeUpgrade for UpgradeSessionKeys { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + Session::upgrade_keys::(transform_session_keys); + Perbill::from_percent(50) * BlockWeights::get().max_block + } +} + pub struct CustomOnRuntimeUpgrade; impl frame_support::traits::OnRuntimeUpgrade for CustomOnRuntimeUpgrade { fn on_runtime_upgrade() -> frame_support::weights::Weight { - purchase::remove_pallet::() + 0 } } @@ -808,56 +837,71 @@ sp_api::impl_runtime_apis! { } } - // Dummy implementation to continue supporting old parachains runtime temporarily. - impl p_v0::ParachainHost for Runtime { - fn validators() -> Vec { - // this is a compile-time check of size equality. note that we don't invoke - // the function and nothing here is unsafe. - let _ = core::mem::transmute::; - - // Yes, these aren't actually the parachain session keys. - // It doesn't matter, but we shouldn't return a zero-sized vector here. - // As there are no parachains - Session::validators() - .into_iter() - .map(|k| k.using_encoded(|s| Decode::decode(&mut &s[..])) - .expect("correct size and raw-bytes; qed")) - .collect() + impl primitives::v1::ParachainHost for Runtime { + fn validators() -> Vec { + Vec::new() } - fn duty_roster() -> p_v0::DutyRoster { - let v = Session::validators(); - p_v0::DutyRoster { validator_duty: (0..v.len()).map(|_| p_v0::Chain::Relay).collect() } + + fn validator_groups() -> (Vec>, GroupRotationInfo) { + (Vec::new(), GroupRotationInfo { session_start_block: 0, group_rotation_frequency: 0, now: 0 }) } - fn active_parachains() -> Vec<(p_v0::Id, Option<(p_v0::CollatorId, p_v0::Retriable)>)> { + + fn availability_cores() -> Vec> { Vec::new() } - fn global_validation_data() -> p_v0::GlobalValidationData { - p_v0::GlobalValidationData { - max_code_size: 1, - max_head_data_size: 1, - block_number: System::block_number().saturating_sub(1), - } + + fn full_validation_data(_: Id, _: OccupiedCoreAssumption) + -> Option> { + None + } + + fn persisted_validation_data(_: Id, _: OccupiedCoreAssumption) + -> Option> { + None + } + + fn historical_validation_code(_: Id, _: BlockNumber) -> Option { + None } - fn local_validation_data(_id: p_v0::Id) -> Option { + + fn check_validation_outputs( + _: Id, + _: primitives::v1::CandidateCommitments + ) -> bool { + false + } + + fn session_index_for_child() -> SessionIndex { + 0 + } + + fn session_info(_: SessionIndex) -> Option { None } - fn parachain_code(_id: p_v0::Id) -> Option { + + fn validation_code(_: Id, _: OccupiedCoreAssumption) -> Option { None } - fn get_heads(_extrinsics: Vec<::Extrinsic>) - -> Option> - { + + fn candidate_pending_availability(_: Id) -> Option> { None } - fn signing_context() -> p_v0::SigningContext { - p_v0::SigningContext { - parent_hash: System::parent_hash(), - session_index: Session::current_index(), - } + + fn candidate_events() -> Vec> { + Vec::new() } - fn downward_messages(_id: p_v0::Id) -> Vec { + + fn dmq_contents( + _recipient: Id, + ) -> Vec> { Vec::new() } + + fn inbound_hrmp_channels_contents( + _recipient: Id + ) -> BTreeMap>> { + BTreeMap::new() + } } impl fg_primitives::GrandpaApi for Runtime { @@ -884,7 +928,7 @@ sp_api::impl_runtime_apis! { _set_id: fg_primitives::SetId, authority_id: fg_primitives::AuthorityId, ) -> Option { - use codec::Encode; + use parity_scale_codec::Encode; Historical::prove((fg_primitives::KEY_TYPE, authority_id)) .map(|p| p.encode()) @@ -913,11 +957,19 @@ sp_api::impl_runtime_apis! { Babe::current_epoch_start() } + fn current_epoch() -> babe_primitives::Epoch { + Babe::current_epoch() + } + + fn next_epoch() -> babe_primitives::Epoch { + Babe::next_epoch() + } + fn generate_key_ownership_proof( _slot_number: babe_primitives::SlotNumber, authority_id: babe_primitives::AuthorityId, ) -> Option { - use codec::Encode; + use parity_scale_codec::Encode; Historical::prove((babe_primitives::KEY_TYPE, authority_id)) .map(|p| p.encode()) @@ -983,9 +1035,9 @@ sp_api::impl_runtime_apis! { use pallet_offences_benchmarking::Module as OffencesBench; use frame_system_benchmarking::Module as SystemBench; - impl pallet_session_benchmarking::Trait for Runtime {} - impl pallet_offences_benchmarking::Trait for Runtime {} - impl frame_system_benchmarking::Trait for Runtime {} + impl pallet_session_benchmarking::Config for Runtime {} + impl pallet_offences_benchmarking::Config for Runtime {} + impl frame_system_benchmarking::Config for Runtime {} let whitelist: Vec = vec![ // Block Number @@ -1008,7 +1060,10 @@ sp_api::impl_runtime_apis! { add_benchmark!(params, batches, pallet_balances, Balances); add_benchmark!(params, batches, pallet_identity, Identity); add_benchmark!(params, batches, pallet_im_online, ImOnline); + add_benchmark!(params, batches, pallet_indices, Indices); + add_benchmark!(params, batches, pallet_multisig, Multisig); add_benchmark!(params, batches, pallet_offences, OffencesBench::); + add_benchmark!(params, batches, pallet_proxy, Proxy); add_benchmark!(params, batches, pallet_scheduler, Scheduler); add_benchmark!(params, batches, pallet_session, SessionBench::); add_benchmark!(params, batches, pallet_staking, Staking); diff --git a/runtime/westend/src/weights/frame_system.rs b/runtime/westend/src/weights/frame_system.rs index 9522fa75203906ab3c7264154a4b33835375843c..a3f5ee5b891d34c2cbb4e53899f81c49c052084e 100644 --- a/runtime/westend/src/weights/frame_system.rs +++ b/runtime/westend/src/weights/frame_system.rs @@ -1,58 +1,75 @@ -// This file is part of Substrate. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. -// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// 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. -// 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. +// 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 . +//! Weights for frame_system +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-10-31, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// ./target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=frame_system +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 #![allow(unused_parens)] +#![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl frame_system::WeightInfo for WeightInfo { - // WARNING! Some components were not used: ["b"] - fn remark() -> Weight { - (1305000 as Weight) +/// Weight functions for frame_system. +pub struct WeightInfo(PhantomData); +impl frame_system::WeightInfo for WeightInfo { + fn remark(_b: u32, ) -> Weight { + (1_859_000 as Weight) } fn set_heap_pages() -> Weight { - (2023000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (2_452_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // WARNING! Some components were not used: ["d"] fn set_changes_trie_config() -> Weight { - (10026000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (10_157_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn set_storage(i: u32, ) -> Weight { (0 as Weight) - .saturating_add((656000 as Weight).saturating_mul(i as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + .saturating_add((806_000 as Weight).saturating_mul(i as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) } fn kill_storage(i: u32, ) -> Weight { - (4327000 as Weight) - .saturating_add((478000 as Weight).saturating_mul(i as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) + (0 as Weight) + .saturating_add((544_000 as Weight).saturating_mul(i as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) } fn kill_prefix(p: u32, ) -> Weight { - (8349000 as Weight) - .saturating_add((838000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) + (0 as Weight) + .saturating_add((866_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) } fn suicide() -> Weight { - (29247000 as Weight) + (34_442_000 as Weight) } } diff --git a/runtime/westend/src/weights/mod.rs b/runtime/westend/src/weights/mod.rs index 0008cd7f2a803db2ebfa2432445db69e5e990ee4..afc76fd214eaa223fbcb15052ed4562417c3e890 100644 --- a/runtime/westend/src/weights/mod.rs +++ b/runtime/westend/src/weights/mod.rs @@ -1,24 +1,30 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// 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. +// 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. -// 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 collection of weight modules used for pallets in the runtime. +//! A list of the different weight modules for our runtime. pub mod frame_system; pub mod pallet_balances; +pub mod pallet_identity; +pub mod pallet_im_online; +pub mod pallet_indices; +pub mod pallet_multisig; pub mod pallet_proxy; +pub mod pallet_scheduler; +pub mod pallet_session; pub mod pallet_staking; pub mod pallet_timestamp; pub mod pallet_utility; +pub mod pallet_vesting; diff --git a/runtime/westend/src/weights/pallet_balances.rs b/runtime/westend/src/weights/pallet_balances.rs index 53431ba48f2f4d878476122b30daaf481ac03487..361ad5a6f82aa841e995587858c1893bace39858 100644 --- a/runtime/westend/src/weights/pallet_balances.rs +++ b/runtime/westend/src/weights/pallet_balances.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -13,35 +13,59 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +//! Autogenerated weights for pallet_balances +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 -/// Weights for the Balances Pallet +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_balances +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; -pub struct WeightInfo; -impl pallet_balances::WeightInfo for WeightInfo { + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_balances. +pub struct WeightInfo(PhantomData); +impl pallet_balances::WeightInfo for WeightInfo { fn transfer() -> Weight { - (65949000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (95_429_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn transfer_keep_alive() -> Weight { - (46665000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (66_088_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_creating() -> Weight { - (27086000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (35_936_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_balance_killing() -> Weight { - (33424000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (45_397_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_transfer() -> Weight { - (65343000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (93_993_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } } diff --git a/runtime/westend/src/weights/pallet_identity.rs b/runtime/westend/src/weights/pallet_identity.rs new file mode 100644 index 0000000000000000000000000000000000000000..c69428f7801c253ffcffc41867be3f809451df1f --- /dev/null +++ b/runtime/westend/src/weights/pallet_identity.rs @@ -0,0 +1,179 @@ +// Copyright 2017-2020 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_identity +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_identity +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_identity. +pub struct WeightInfo(PhantomData); +impl pallet_identity::WeightInfo for WeightInfo { + fn add_registrar(r: u32, ) -> Weight { + (27_481_000 as Weight) + // Standard Error: 2_000 + .saturating_add((300_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_identity(r: u32, x: u32, ) -> Weight { + (71_220_000 as Weight) + // Standard Error: 19_000 + .saturating_add((269_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 2_000 + .saturating_add((1_814_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_subs_new(s: u32, ) -> Weight { + (52_505_000 as Weight) + // Standard Error: 1_000 + .saturating_add((9_913_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + } + fn set_subs_old(p: u32, ) -> Weight { + (47_853_000 as Weight) + // Standard Error: 0 + .saturating_add((3_432_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(p as Weight))) + } + fn clear_identity(r: u32, s: u32, x: u32, ) -> Weight { + (62_074_000 as Weight) + // Standard Error: 8_000 + .saturating_add((169_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 0 + .saturating_add((3_436_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_058_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + } + fn request_judgement(r: u32, x: u32, ) -> Weight { + (72_697_000 as Weight) + // Standard Error: 8_000 + .saturating_add((316_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_000 + .saturating_add((2_064_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn cancel_request(r: u32, x: u32, ) -> Weight { + (62_349_000 as Weight) + // Standard Error: 11_000 + .saturating_add((203_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_000 + .saturating_add((2_048_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_fee(r: u32, ) -> Weight { + (10_602_000 as Weight) + // Standard Error: 1_000 + .saturating_add((265_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_account_id(r: u32, ) -> Weight { + (12_087_000 as Weight) + // Standard Error: 2_000 + .saturating_add((264_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn set_fields(r: u32, ) -> Weight { + (10_578_000 as Weight) + // Standard Error: 1_000 + .saturating_add((268_000 as Weight).saturating_mul(r as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn provide_judgement(r: u32, x: u32, ) -> Weight { + (48_552_000 as Weight) + // Standard Error: 8_000 + .saturating_add((279_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 1_000 + .saturating_add((2_067_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn kill_identity(r: u32, s: u32, x: u32, ) -> Weight { + (60_031_000 as Weight) + // Standard Error: 4_000 + .saturating_add((140_000 as Weight).saturating_mul(r as Weight)) + // Standard Error: 0 + .saturating_add((3_423_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + } + fn add_sub(s: u32, ) -> Weight { + (71_751_000 as Weight) + // Standard Error: 0 + .saturating_add((185_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn rename_sub(s: u32, ) -> Weight { + (23_607_000 as Weight) + // Standard Error: 0 + .saturating_add((23_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn remove_sub(s: u32, ) -> Weight { + (68_696_000 as Weight) + // Standard Error: 0 + .saturating_add((160_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn quit_sub(s: u32, ) -> Weight { + (45_448_000 as Weight) + // Standard Error: 0 + .saturating_add((155_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/westend/src/weights/pallet_im_online.rs b/runtime/westend/src/weights/pallet_im_online.rs new file mode 100644 index 0000000000000000000000000000000000000000..6bcb46d94e3dbfb7c4a5e58a4a4b872975f9409b --- /dev/null +++ b/runtime/westend/src/weights/pallet_im_online.rs @@ -0,0 +1,55 @@ +// Copyright 2017-2020 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 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_im_online +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_im_online. +pub struct WeightInfo(PhantomData); +impl pallet_im_online::WeightInfo for WeightInfo { + fn validate_unsigned_and_then_heartbeat(k: u32, e: u32, ) -> Weight { + (112_311_000 as Weight) + // Standard Error: 0 + .saturating_add((216_000 as Weight).saturating_mul(k as Weight)) + // Standard Error: 1_000 + .saturating_add((497_000 as Weight).saturating_mul(e as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/westend/src/weights/pallet_indices.rs b/runtime/westend/src/weights/pallet_indices.rs new file mode 100644 index 0000000000000000000000000000000000000000..db2555c63ca085903308d1c4081ff2bd70f67fd2 --- /dev/null +++ b/runtime/westend/src/weights/pallet_indices.rs @@ -0,0 +1,71 @@ +// Copyright 2017-2020 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_indices +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_indices +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_indices. +pub struct WeightInfo(PhantomData); +impl pallet_indices::WeightInfo for WeightInfo { + fn claim() -> Weight { + (52_389_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn transfer() -> Weight { + (58_943_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn free() -> Weight { + (47_207_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn force_transfer() -> Weight { + (48_696_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn freeze() -> Weight { + (44_096_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } +} diff --git a/runtime/westend/src/weights/pallet_multisig.rs b/runtime/westend/src/weights/pallet_multisig.rs new file mode 100644 index 0000000000000000000000000000000000000000..ebd9e865d80f0fa5904f70f8460860ddbeceda35 --- /dev/null +++ b/runtime/westend/src/weights/pallet_multisig.rs @@ -0,0 +1,124 @@ +// Copyright 2017-2020 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_multisig +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_multisig +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_multisig. +pub struct WeightInfo(PhantomData); +impl pallet_multisig::WeightInfo for WeightInfo { + fn as_multi_threshold_1(z: u32, ) -> Weight { + (12_182_000 as Weight) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + } + fn as_multi_create(s: u32, z: u32, ) -> Weight { + (68_501_000 as Weight) + // Standard Error: 0 + .saturating_add((85_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_create_store(s: u32, z: u32, ) -> Weight { + (76_757_000 as Weight) + // Standard Error: 0 + .saturating_add((90_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_approve(s: u32, z: u32, ) -> Weight { + (40_987_000 as Weight) + // Standard Error: 0 + .saturating_add((110_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((1_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn as_multi_approve_store(s: u32, z: u32, ) -> Weight { + (73_764_000 as Weight) + // Standard Error: 0 + .saturating_add((120_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((3_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn as_multi_complete(s: u32, z: u32, ) -> Weight { + (85_252_000 as Weight) + // Standard Error: 0 + .saturating_add((241_000 as Weight).saturating_mul(s as Weight)) + // Standard Error: 0 + .saturating_add((5_000 as Weight).saturating_mul(z as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn approve_as_multi_create(s: u32, ) -> Weight { + (67_717_000 as Weight) + // Standard Error: 0 + .saturating_add((88_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_approve(s: u32, ) -> Weight { + (40_372_000 as Weight) + // Standard Error: 0 + .saturating_add((111_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn approve_as_multi_complete(s: u32, ) -> Weight { + (157_866_000 as Weight) + // Standard Error: 0 + .saturating_add((243_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn cancel_as_multi(s: u32, ) -> Weight { + (109_344_000 as Weight) + // Standard Error: 0 + .saturating_add((90_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/westend/src/weights/pallet_proxy.rs b/runtime/westend/src/weights/pallet_proxy.rs index 5d8655e6c3b0fa31d618b6b112e75c44eaf64f23..8965ccb2006d1da552608e0f39005dbf403c9ef4 100644 --- a/runtime/westend/src/weights/pallet_proxy.rs +++ b/runtime/westend/src/weights/pallet_proxy.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -13,74 +13,109 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +//! Autogenerated weights for pallet_proxy +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_proxy +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; -pub struct WeightInfo; -impl pallet_proxy::WeightInfo for WeightInfo { +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_proxy. +pub struct WeightInfo(PhantomData); +impl pallet_proxy::WeightInfo for WeightInfo { fn proxy(p: u32, ) -> Weight { - (26127000 as Weight) - .saturating_add((214000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) + (31_451_000 as Weight) + // Standard Error: 1_000 + .saturating_add((190_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) } fn proxy_announced(a: u32, p: u32, ) -> Weight { - (55405000 as Weight) - .saturating_add((774000 as Weight).saturating_mul(a as Weight)) - .saturating_add((209000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (65_914_000 as Weight) + // Standard Error: 1_000 + .saturating_add((822_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 1_000 + .saturating_add((183_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn remove_announcement(a: u32, p: u32, ) -> Weight { - (35879000 as Weight) - .saturating_add((783000 as Weight).saturating_mul(a as Weight)) - .saturating_add((20000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (41_597_000 as Weight) + // Standard Error: 1_000 + .saturating_add((821_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 1_000 + .saturating_add((11_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - fn reject_announcement(a: u32, p: u32, ) -> Weight { - (36097000 as Weight) - .saturating_add((780000 as Weight).saturating_mul(a as Weight)) - .saturating_add((12000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + fn reject_announcement(a: u32, _p: u32, ) -> Weight { + (46_884_000 as Weight) + // Standard Error: 12_000 + .saturating_add((886_000 as Weight).saturating_mul(a as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn announce(a: u32, p: u32, ) -> Weight { - (53769000 as Weight) - .saturating_add((675000 as Weight).saturating_mul(a as Weight)) - .saturating_add((214000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (66_635_000 as Weight) + // Standard Error: 1_000 + .saturating_add((716_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 1_000 + .saturating_add((188_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn add_proxy(p: u32, ) -> Weight { - (36082000 as Weight) - .saturating_add((234000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (44_921_000 as Weight) + // Standard Error: 1_000 + .saturating_add((193_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxy(p: u32, ) -> Weight { - (32885000 as Weight) - .saturating_add((267000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (40_276_000 as Weight) + // Standard Error: 1_000 + .saturating_add((230_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn remove_proxies(p: u32, ) -> Weight { - (31735000 as Weight) - .saturating_add((215000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (38_385_000 as Weight) + // Standard Error: 1_000 + .saturating_add((187_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn anonymous(p: u32, ) -> Weight { - (50907000 as Weight) - .saturating_add((61000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (63_987_000 as Weight) + // Standard Error: 1_000 + .saturating_add((29_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn kill_anonymous(p: u32, ) -> Weight { - (33926000 as Weight) - .saturating_add((208000 as Weight).saturating_mul(p as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (41_015_000 as Weight) + // Standard Error: 2_000 + .saturating_add((189_000 as Weight).saturating_mul(p as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } } diff --git a/runtime/westend/src/weights/pallet_scheduler.rs b/runtime/westend/src/weights/pallet_scheduler.rs new file mode 100644 index 0000000000000000000000000000000000000000..acef5c94203d405f70fe280fd6dd42eb0d675edd --- /dev/null +++ b/runtime/westend/src/weights/pallet_scheduler.rs @@ -0,0 +1,74 @@ +// Copyright 2017-2020 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_scheduler +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_scheduler +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_scheduler. +pub struct WeightInfo(PhantomData); +impl pallet_scheduler::WeightInfo for WeightInfo { + fn schedule(s: u32, ) -> Weight { + (33_809_000 as Weight) + // Standard Error: 0 + .saturating_add((43_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn cancel(s: u32, ) -> Weight { + (30_493_000 as Weight) + // Standard Error: 6_000 + .saturating_add((3_041_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn schedule_named(s: u32, ) -> Weight { + (43_391_000 as Weight) + // Standard Error: 1_000 + .saturating_add((62_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn cancel_named(s: u32, ) -> Weight { + (34_735_000 as Weight) + // Standard Error: 6_000 + .saturating_add((3_058_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } +} diff --git a/runtime/westend/src/weights/pallet_session.rs b/runtime/westend/src/weights/pallet_session.rs new file mode 100644 index 0000000000000000000000000000000000000000..c5bf1d72eb4b7824421e94c995c68354d9876475 --- /dev/null +++ b/runtime/westend/src/weights/pallet_session.rs @@ -0,0 +1,56 @@ +// Copyright 2017-2020 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_session +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_session +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_session. +pub struct WeightInfo(PhantomData); +impl pallet_session::WeightInfo for WeightInfo { + fn set_keys() -> Weight { + (91_654_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } + fn purge_keys() -> Weight { + (54_360_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } +} diff --git a/runtime/westend/src/weights/pallet_staking.rs b/runtime/westend/src/weights/pallet_staking.rs index 3379cb76749f2a06bcf83ffc223ea462e147c878..680fe3dac8ec1baec6ef6bf6c7fbab71bfa304d6 100644 --- a/runtime/westend/src/weights/pallet_staking.rs +++ b/runtime/westend/src/weights/pallet_staking.rs @@ -1,168 +1,208 @@ -// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. -// 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. +// 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_staking +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_staking +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ -//! Default weights of pallet-staking. -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc6 #![allow(unused_parens)] #![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl pallet_staking::WeightInfo for WeightInfo { +/// Weight functions for pallet_staking. +pub struct WeightInfo(PhantomData); +impl pallet_staking::WeightInfo for WeightInfo { fn bond() -> Weight { - (144278000 as Weight) - .saturating_add(DbWeight::get().reads(5 as Weight)) - .saturating_add(DbWeight::get().writes(4 as Weight)) + (97_009_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn bond_extra() -> Weight { - (110715000 as Weight) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (76_157_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn unbond() -> Weight { - (99840000 as Weight) - .saturating_add(DbWeight::get().reads(5 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (69_106_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn withdraw_unbonded_update(s: u32, ) -> Weight { - (100728000 as Weight) - .saturating_add((63000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(5 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (69_753_000 as Weight) + // Standard Error: 0 + .saturating_add((28_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn withdraw_unbonded_kill(s: u32, ) -> Weight { - (168879000 as Weight) - .saturating_add((6666000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(7 as Weight)) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + (114_294_000 as Weight) + // Standard Error: 1_000 + .saturating_add((3_968_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } fn validate() -> Weight { - (35539000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (24_191_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn nominate(n: u32, ) -> Weight { - (48596000 as Weight) - .saturating_add((308000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (31_373_000 as Weight) + // Standard Error: 12_000 + .saturating_add((393_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn chill() -> Weight { - (35144000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(2 as Weight)) + (23_668_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } fn set_payee() -> Weight { - (24255000 as Weight) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (16_126_000 as Weight) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_controller() -> Weight { - (52294000 as Weight) - .saturating_add(DbWeight::get().reads(3 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (35_127_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn set_validator_count() -> Weight { - (5185000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_249_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_no_eras() -> Weight { - (5907000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_644_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_new_era() -> Weight { - (5917000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_647_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_new_era_always() -> Weight { - (5952000 as Weight) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_604_000 as Weight) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn set_invulnerables(v: u32, ) -> Weight { - (6324000 as Weight) - .saturating_add((9000 as Weight).saturating_mul(v as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (3_825_000 as Weight) + // Standard Error: 0 + .saturating_add((9_000 as Weight).saturating_mul(v as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn force_unstake(s: u32, ) -> Weight { - (119691000 as Weight) - .saturating_add((6681000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + (77_182_000 as Weight) + // Standard Error: 1_000 + .saturating_add((3_957_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } fn cancel_deferred_slash(s: u32, ) -> Weight { - (5820201000 as Weight) - .saturating_add((34672000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(1 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (5_828_506_000 as Weight) + // Standard Error: 388_000 + .saturating_add((34_623_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(1 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } fn payout_stakers_dead_controller(n: u32, ) -> Weight { - (0 as Weight) - .saturating_add((92486000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(n as Weight))) + (131_768_000 as Weight) + // Standard Error: 13_000 + .saturating_add((59_048_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(11 as Weight)) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(n as Weight))) } fn payout_stakers_alive_staked(n: u32, ) -> Weight { - (0 as Weight) - .saturating_add((117324000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads((5 as Weight).saturating_mul(n as Weight))) - .saturating_add(DbWeight::get().writes((3 as Weight).saturating_mul(n as Weight))) + (166_310_000 as Weight) + // Standard Error: 24_000 + .saturating_add((76_868_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(12 as Weight)) + .saturating_add(T::DbWeight::get().reads((5 as Weight).saturating_mul(n as Weight))) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(n as Weight))) } fn rebond(l: u32, ) -> Weight { - (71316000 as Weight) - .saturating_add((142000 as Weight).saturating_mul(l as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(3 as Weight)) + (47_420_000 as Weight) + // Standard Error: 2_000 + .saturating_add((99_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) } fn set_history_depth(e: u32, ) -> Weight { (0 as Weight) - .saturating_add((51901000 as Weight).saturating_mul(e as Weight)) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(4 as Weight)) - .saturating_add(DbWeight::get().writes((7 as Weight).saturating_mul(e as Weight))) + // Standard Error: 60_000 + .saturating_add((39_014_000 as Weight).saturating_mul(e as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + .saturating_add(T::DbWeight::get().writes((7 as Weight).saturating_mul(e as Weight))) } fn reap_stash(s: u32, ) -> Weight { - (147166000 as Weight) - .saturating_add((6661000 as Weight).saturating_mul(s as Weight)) - .saturating_add(DbWeight::get().reads(4 as Weight)) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + (97_591_000 as Weight) + // Standard Error: 0 + .saturating_add((3_953_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } fn new_era(v: u32, n: u32, ) -> Weight { (0 as Weight) - .saturating_add((1440459000 as Weight).saturating_mul(v as Weight)) - .saturating_add((182580000 as Weight).saturating_mul(n as Weight)) - .saturating_add(DbWeight::get().reads(10 as Weight)) - .saturating_add(DbWeight::get().reads((4 as Weight).saturating_mul(v as Weight))) - .saturating_add(DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) - .saturating_add(DbWeight::get().writes(8 as Weight)) - .saturating_add(DbWeight::get().writes((3 as Weight).saturating_mul(v as Weight))) + // Standard Error: 808_000 + .saturating_add((741_132_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 40_000 + .saturating_add((105_169_000 as Weight).saturating_mul(n as Weight)) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().reads((4 as Weight).saturating_mul(v as Weight))) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(n as Weight))) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(v as Weight))) } fn submit_solution_better(v: u32, n: u32, a: u32, w: u32, ) -> Weight { (0 as Weight) - .saturating_add((964000 as Weight).saturating_mul(v as Weight)) - .saturating_add((432000 as Weight).saturating_mul(n as Weight)) - .saturating_add((204294000 as Weight).saturating_mul(a as Weight)) - .saturating_add((9546000 as Weight).saturating_mul(w as Weight)) - .saturating_add(DbWeight::get().reads(6 as Weight)) - .saturating_add(DbWeight::get().reads((4 as Weight).saturating_mul(a as Weight))) - .saturating_add(DbWeight::get().reads((1 as Weight).saturating_mul(w as Weight))) - .saturating_add(DbWeight::get().writes(2 as Weight)) + // Standard Error: 49_000 + .saturating_add((1_163_000 as Weight).saturating_mul(v as Weight)) + // Standard Error: 19_000 + .saturating_add((484_000 as Weight).saturating_mul(n as Weight)) + // Standard Error: 49_000 + .saturating_add((101_948_000 as Weight).saturating_mul(a as Weight)) + // Standard Error: 103_000 + .saturating_add((7_810_000 as Weight).saturating_mul(w as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().reads((4 as Weight).saturating_mul(a as Weight))) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(w as Weight))) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) } } diff --git a/runtime/westend/src/weights/pallet_timestamp.rs b/runtime/westend/src/weights/pallet_timestamp.rs index cfd5f192d35298b512ee75e4d26acf11355ce3ba..1f7fc5e488c55b744df25ee5558d68fd88366414 100644 --- a/runtime/westend/src/weights/pallet_timestamp.rs +++ b/runtime/westend/src/weights/pallet_timestamp.rs @@ -1,34 +1,54 @@ -// Copyright (C) 2020 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 FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 +// Copyright 2017-2020 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_timestamp +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_timestamp +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ + #![allow(unused_parens)] +#![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl pallet_timestamp::WeightInfo for WeightInfo { - // WARNING! Some components were not used: ["t"] +/// Weight functions for pallet_timestamp. +pub struct WeightInfo(PhantomData); +impl pallet_timestamp::WeightInfo for WeightInfo { fn set() -> Weight { - (9133000 as Weight) - .saturating_add(DbWeight::get().reads(2 as Weight)) - .saturating_add(DbWeight::get().writes(1 as Weight)) + (11_097_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } - // WARNING! Some components were not used: ["t"] fn on_finalize() -> Weight { - (5915000 as Weight) + (6_159_000 as Weight) } } diff --git a/runtime/westend/src/weights/pallet_utility.rs b/runtime/westend/src/weights/pallet_utility.rs index c9ae0d7d2333b19bec65e4f5c1556df65b21e086..06cca4364bb12211eee11292d34059478ee6ca8e 100644 --- a/runtime/westend/src/weights/pallet_utility.rs +++ b/runtime/westend/src/weights/pallet_utility.rs @@ -1,35 +1,59 @@ -// This file is part of Substrate. +// Copyright 2017-2020 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. -// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// 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. -// 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. +// 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_utility +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_utility +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0-rc5 #![allow(unused_parens)] #![allow(unused_imports)] -use frame_support::weights::{Weight, constants::RocksDbWeight as DbWeight}; +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; -pub struct WeightInfo; -impl pallet_utility::WeightInfo for WeightInfo { +/// Weight functions for pallet_utility. +pub struct WeightInfo(PhantomData); +impl pallet_utility::WeightInfo for WeightInfo { fn batch(c: u32, ) -> Weight { - (16461000 as Weight) - .saturating_add((1982000 as Weight).saturating_mul(c as Weight)) + (19_122_000 as Weight) + // Standard Error: 0 + .saturating_add((1_497_000 as Weight).saturating_mul(c as Weight)) } - // WARNING! Some components were not used: ["u"] fn as_derivative() -> Weight { - (4086000 as Weight) + (5_668_000 as Weight) + } + fn batch_all(c: u32, ) -> Weight { + (19_623_000 as Weight) + // Standard Error: 0 + .saturating_add((1_497_000 as Weight).saturating_mul(c as Weight)) } } diff --git a/runtime/westend/src/weights/pallet_vesting.rs b/runtime/westend/src/weights/pallet_vesting.rs new file mode 100644 index 0000000000000000000000000000000000000000..0afc4e98f7465af51b07a32052c3acff2965e831 --- /dev/null +++ b/runtime/westend/src/weights/pallet_vesting.rs @@ -0,0 +1,88 @@ +// Copyright 2017-2020 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_vesting +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 2.0.0 +//! DATE: 2020-12-09, STEPS: [50, ], REPEAT: 20, LOW RANGE: [], HIGH RANGE: [] +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_vesting +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/ + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for pallet_vesting. +pub struct WeightInfo(PhantomData); +impl pallet_vesting::WeightInfo for WeightInfo { + fn vest_locked(l: u32, ) -> Weight { + (55_027_000 as Weight) + // Standard Error: 0 + .saturating_add((130_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + fn vest_unlocked(l: u32, ) -> Weight { + (59_131_000 as Weight) + // Standard Error: 2_000 + .saturating_add((110_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn vest_other_locked(l: u32, ) -> Weight { + (54_746_000 as Weight) + // Standard Error: 0 + .saturating_add((126_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn vest_other_unlocked(l: u32, ) -> Weight { + (58_988_000 as Weight) + // Standard Error: 2_000 + .saturating_add((106_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn vested_transfer(l: u32, ) -> Weight { + (120_685_000 as Weight) + // Standard Error: 8_000 + .saturating_add((167_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + fn force_vested_transfer(l: u32, ) -> Weight { + (119_814_000 as Weight) + // Standard Error: 8_000 + .saturating_add((172_000 as Weight).saturating_mul(l as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } +} diff --git a/scripts/adder-collator.sh b/scripts/adder-collator.sh new file mode 100755 index 0000000000000000000000000000000000000000..ca493eb0a468e72df26e9915def98c529cb6350e --- /dev/null +++ b/scripts/adder-collator.sh @@ -0,0 +1,191 @@ +#!/usr/bin/env bash + +# Run a two node local net with adder-collator. + +set -e + +chainspec="rococo-local" + +# disabled until we can actually successfully register the chain with polkadot-js-api +# if ! command -v polkadot-js-api > /dev/null; then +# echo "polkadot-js-api required; try" +# echo " sudo yarn global add @polkadot/api-cli" +# exit 1 +# fi + +PROJECT_ROOT=$(git rev-parse --show-toplevel) +# shellcheck disable=SC1090 +source "$(dirname "$0")"/common.sh + +cd "$PROJECT_ROOT" + +last_modified_rust_file=$( + find . -path ./target -prune -o -type f -name '*.rs' -printf '%T@ %p\n' | + sort -nr | + head -1 | + cut -d' ' -f2- +) + +polkadot="target/release/polkadot" +adder_collator="target/release/adder-collator" + +# ensure the polkadot binary exists and is up to date +if [ ! -x "$polkadot" ] || [ "$polkadot" -ot "$last_modified_rust_file" ]; then + cargo build --release --features real-overseer +fi +# likewise for the adder collator +if [ ! -x "$adder_collator" ] || [ "$adder_collator" -ot "$last_modified_rust_file" ]; then + cargo build --release --features real-overseer -p test-parachain-adder-collator +fi + +genesis="$(mktemp --directory)" +genesis_state="$genesis/state" +validation_code="$genesis/validation_code" + +"$adder_collator" export-genesis-state > "$genesis_state" +"$adder_collator" export-genesis-wasm > "$validation_code" + + +# setup variables +node_offset=0 +declare -a node_pids +declare -a node_pipes + +# create a sed expression which injects the node name and stream type into each line +function make_sed_expr() { + name="$1" + type="$2" + + printf "s/^/%16s %s: /" "$name" "$type" +} + +# turn a string into a flag +function flagify() { + printf -- '--%s' "$(tr '[:upper:]' '[:lower:]' <<< "$1")" +} + +# start a node and label its output +# +# This function takes a single argument, the node name. +# The name must be one of those which can be passed to the polkadot binary, in un-flagged form, +# one of: +# alice, bob, charlie, dave, eve, ferdie, one, two +function run_node() { + name="$1" + # create a named pipe so we can get the node's PID while also sedding its output + local stdout + local stderr + stdout=$(mktemp --dry-run --tmpdir) + stderr=$(mktemp --dry-run --tmpdir) + mkfifo "$stdout" + mkfifo "$stderr" + node_pipes+=("$stdout") + node_pipes+=("$stderr") + + # compute ports from offset + local port=$((30333+node_offset)) + local rpc_port=$((9933+node_offset)) + local ws_port=$((9944+node_offset)) + local prometheus_port=$((9615+node_offset)) + node_offset=$((node_offset+1)) + + # start the node + "$polkadot" \ + --chain "$chainspec" \ + --tmp \ + --port "$port" \ + --rpc-port "$rpc_port" \ + --ws-port "$ws_port" \ + --prometheus-port "$prometheus_port" \ + --rpc-cors all \ + "$(flagify "$name")" \ + > "$stdout" \ + 2> "$stderr" \ + & + local pid=$! + node_pids+=("$pid") + + # send output from the stdout pipe to stdout, prepending the node name + sed -e "$(make_sed_expr "$name" "OUT")" "$stdout" >&1 & + # send output from the stderr pipe to stderr, prepending the node name + sed -e "$(make_sed_expr "$name" "ERR")" "$stderr" >&2 & +} + +# start an adder collator and label its output +# +# This function takes a single argument, the node name. This affects only the tagging. +function run_adder_collator() { + name="$1" + # create a named pipe so we can get the node's PID while also sedding its output + local stdout + local stderr + stdout=$(mktemp --dry-run --tmpdir) + stderr=$(mktemp --dry-run --tmpdir) + mkfifo "$stdout" + mkfifo "$stderr" + node_pipes+=("$stdout") + node_pipes+=("$stderr") + + # compute ports from offset + local port=$((30333+node_offset)) + local rpc_port=$((9933+node_offset)) + local ws_port=$((9944+node_offset)) + local prometheus_port=$((9615+node_offset)) + node_offset=$((node_offset+1)) + + # start the node + "$adder_collator" \ + --chain "$chainspec" \ + --tmp \ + --port "$port" \ + --rpc-port "$rpc_port" \ + --ws-port "$ws_port" \ + --prometheus-port "$prometheus_port" \ + --rpc-cors all \ + > "$stdout" \ + 2> "$stderr" \ + & + local pid=$! + node_pids+=("$pid") + + # send output from the stdout pipe to stdout, prepending the node name + sed -e "$(make_sed_expr "$name" "OUT")" "$stdout" >&1 & + # send output from the stderr pipe to stderr, prepending the node name + sed -e "$(make_sed_expr "$name" "ERR")" "$stderr" >&2 & +} + + +# clean up the nodes when this script exits +function finish { + for node_pid in "${node_pids[@]}"; do + kill -9 "$node_pid" + done + for node_pipe in "${node_pipes[@]}"; do + rm "$node_pipe" + done + rm -rf "$genesis" +} +trap finish EXIT + +# start the nodes +run_node Alice +run_node Bob +run_adder_collator AdderCollator + +# register the adder collator +# doesn't work yet due to https://github.com/polkadot-js/tools/issues/185 +# polkadot-js-api \ +# --ws ws://localhost:9944 \ +# --sudo \ +# --seed "//Alice" \ +# tx.registrar.registerPara \ +# 100 \ +# '{"scheduling":"Always"}' \ +# "@$validation_code" \ +# "@$genesis_state" + +# now wait; this will exit on its own only if both subprocesses exit +# the practical implication, as both subprocesses are supposed to run forever, is that +# this script will also run forever, until killed, at which point the exit trap should kill +# the subprocesses +wait diff --git a/scripts/docker/Dockerfile b/scripts/docker/Dockerfile index 34fee7481a0f5299f48dde866f486cb4aa64b688..780534f994733fb086cc999d520769ae69898178 100644 --- a/scripts/docker/Dockerfile +++ b/scripts/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:stretch-slim +FROM debian:buster-slim # metadata ARG VCS_REF diff --git a/scripts/docker/release.Dockerfile b/scripts/docker/release.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..b4d3a786ecde77b0dd4bf16964d062fbc1fa4882 --- /dev/null +++ b/scripts/docker/release.Dockerfile @@ -0,0 +1,47 @@ +FROM debian:buster-slim + +# metadata +ARG VCS_REF +ARG BUILD_DATE +ARG POLKADOT_VERSION + +LABEL io.parity.image.authors="devops-team@parity.io" \ + io.parity.image.vendor="Parity Technologies" \ + io.parity.image.title="parity/polkadot" \ + io.parity.image.description="polkadot: a platform for web3" \ + io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/Dockerfile" \ + io.parity.image.revision="${VCS_REF}" \ + io.parity.image.created="${BUILD_DATE}" \ + io.parity.image.documentation="https://github.com/paritytech/polkadot/" + +# show backtraces +ENV RUST_BACKTRACE 1 + +# install tools and dependencies +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + libssl1.1 \ + ca-certificates \ + curl \ + gnupg && \ + useradd -m -u 1000 -U -s /bin/sh -d /polkadot polkadot && \ + gpg --recv-keys --keyserver hkps://keys.mailvelope.com 9D4B2B6EB8F97156D19669A9FF0812D491B96798 && \ + gpg --export 9D4B2B6EB8F97156D19669A9FF0812D491B96798 > /usr/share/keyrings/parity.gpg && \ + echo 'deb [signed-by=/usr/share/keyrings/parity.gpg] https://releases.parity.io/deb release main' > /etc/apt/sources.list.d/parity.list && \ + apt-get update && \ + apt-get install -y --no-install-recommends polkadot=${POLKADOT_VERSION#?} && \ +# apt cleanup + apt-get autoremove -y && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +USER polkadot + +# check if executable works in this container +RUN /usr/bin/polkadot --version + +EXPOSE 30333 9933 9944 +VOLUME ["/polkadot"] + +ENTRYPOINT ["/usr/bin/polkadot"] + diff --git a/scripts/github/generate_release_text.rb b/scripts/github/generate_release_text.rb index d113c5b1f1bdce6ddbc23669614ffebdff7caf5c..3b2a885eed9a57e11ec991eadddc28347eb64037 100644 --- a/scripts/github/generate_release_text.rb +++ b/scripts/github/generate_release_text.rb @@ -1,17 +1,21 @@ # frozen_string_literal: true +require 'base64' require 'changelogerator' -require 'git' require 'erb' -require 'toml' +require 'git' require 'json' +require 'octokit' +require 'toml' require_relative './lib.rb' -version = ENV['GITHUB_REF'] +current_ref = ENV['GITHUB_REF'] token = ENV['GITHUB_TOKEN'] +github_client = Octokit::Client.new( + access_token: token +) polkadot_path = ENV['GITHUB_WORKSPACE'] + '/polkadot/' -pg = Git.open(polkadot_path) # Generate an ERB renderer based on the template .erb file renderer = ERB.new( @@ -19,29 +23,29 @@ renderer = ERB.new( trim_mode: '<>' ) -# get last polkadot version. Use handy Gem::Version for sorting by version -last_version = pg - .tags - .map(&:name) - .grep(/^v\d+\.\d+\.\d+.*$/) - .sort_by { |v| Gem::Version.new(v.slice(1...)) }[-2] +# get ref of last polkadot release +last_ref = 'refs/tags/' + github_client.latest_release(ENV['GITHUB_REPOSITORY']).tag_name polkadot_cl = Changelog.new( - 'paritytech/polkadot', last_version, version, token: token + 'paritytech/polkadot', last_ref, current_ref, token: token ) -# Get prev and cur substrate SHAs - parse the old and current Cargo.lock for -# polkadot and extract the sha that way. -prev_cargo = TOML::Parser.new(pg.show("#{last_version}:Cargo.lock")).parsed -current_cargo = TOML::Parser.new(pg.show("#{version}:Cargo.lock")).parsed - -substrate_prev_sha = prev_cargo['package'] - .find { |p| p['name'] == 'sc-cli' }['source'] - .split('#').last - -substrate_cur_sha = current_cargo['package'] - .find { |p| p['name'] == 'sc-cli' }['source'] - .split('#').last +# Gets the substrate commit hash used for a given polkadot ref +def get_substrate_commit(client, ref) + cargo = TOML::Parser.new( + Base64.decode64( + client.contents( + ENV['GITHUB_REPOSITORY'], + path: 'Cargo.lock', + query: { ref: ref.to_s } + ).content + ) + ).parsed + cargo['package'].find { |p| p['name'] == 'sc-cli' }['source'].split('#').last +end + +substrate_prev_sha = get_substrate_commit(github_client, last_ref) +substrate_cur_sha = get_substrate_commit(github_client, current_ref) substrate_cl = Changelog.new( 'paritytech/substrate', substrate_prev_sha, substrate_cur_sha, @@ -49,7 +53,10 @@ substrate_cl = Changelog.new( prefix: true ) -all_changes = polkadot_cl.changes + substrate_cl.changes +# Combine all changes into a single array and filter out companions +all_changes = (polkadot_cl.changes + substrate_cl.changes).reject do |c| + c[:title] =~ /[Cc]ompanion/ +end # Set all the variables needed for a release @@ -57,12 +64,30 @@ misc_changes = Changelog.changes_with_label(all_changes, 'B1-releasenotes') client_changes = Changelog.changes_with_label(all_changes, 'B5-clientnoteworthy') runtime_changes = Changelog.changes_with_label(all_changes, 'B7-runtimenoteworthy') -release_priority = Changelog.highest_priority_for_changes(all_changes) +# Add the audit status for runtime changes +runtime_changes.each do |c| + if c.labels.any? { |l| l[:name] == 'D1-audited👍' } + c[:pretty_title] = "✅ `audited` #{c[:pretty_title]}" + next + end + if c.labels.any? { |l| l[:name] == 'D9-needsaudit👮' } + c[:pretty_title] = "❌ `AWAITING AUDIT` #{c[:pretty_title]}" + next + end + if c.labels.any? { |l| l[:name] == 'D5-nicetohaveaudit⚠️' } + c[:pretty_title] = "⏳ `pending non-critical audit` #{c[:pretty_title]}" + next + end + c[:pretty_title] = "✅ `trivial` #{c[:pretty_title]}" +end + +# The priority of users upgraded is determined by the highest-priority +# *Client* change +release_priority = Changelog.highest_priority_for_changes(client_changes) # Pulled from the previous Github step rustc_stable = ENV['RUSTC_STABLE'] rustc_nightly = ENV['RUSTC_NIGHTLY'] - polkadot_runtime = get_runtime('polkadot', polkadot_path) kusama_runtime = get_runtime('kusama', polkadot_path) westend_runtime = get_runtime('westend', polkadot_path) diff --git a/scripts/github/polkadot_release.erb b/scripts/github/polkadot_release.erb index dde7165e92efda4b5789f1a20361050b5dc1808b..2078fa3bb96f3e464980bee4b550a831f8df160f 100644 --- a/scripts/github/polkadot_release.erb +++ b/scripts/github/polkadot_release.erb @@ -11,7 +11,7 @@ This release was tested against the following versions of `rustc`. Other version - <%= rustc_stable %> - <%= rustc_nightly %> -WASM runtimes built with [srtool](https://gitlab.com/chevdor/srtool) using `<%= polkadot_json['rustc'] %>`. +WASM runtimes built with [srtool](https://github.com/paritytech/srtool) using `<%= polkadot_json['rustc'] %>`. Proposal hashes: * `polkadot_runtime-v<%= polkadot_runtime %>.compact.wasm - <%= polkadot_json['prop'] %>` diff --git a/scripts/gitlab/check_extrinsics_ordering.sh b/scripts/gitlab/check_extrinsics_ordering.sh new file mode 100755 index 0000000000000000000000000000000000000000..cfdad6369158c72b83b927da7a2582db74943d32 --- /dev/null +++ b/scripts/gitlab/check_extrinsics_ordering.sh @@ -0,0 +1,59 @@ +#!/bin/bash +BIN=./target/release/polkadot +LIVE_WS=wss://rpc.polkadot.io +LOCAL_WS=ws://localhost:9944 + +# Kill the polkadot client before exiting +trap 'kill "$(jobs -p)"' EXIT + +runtimes=( + "westend" + "kusama" + "polkadot" +) + +for RUNTIME in "${runtimes[@]}"; do + echo "[+] Checking runtime: ${RUNTIME}" + + release_transaction_version=$( + git show "origin/release:runtime/${RUNTIME}/src/lib.rs" | \ + grep 'transaction_version' + ) + + current_transaction_version=$( + grep 'transaction_version' "./runtime/${RUNTIME}/src/lib.rs" + ) + + echo "[+] Release: ${release_transaction_version}" + echo "[+] Ours: ${current_transaction_version}" + + if [ ! "$release_transaction_version" = "$current_transaction_version" ]; then + echo "[+] Transaction version for ${RUNTIME} has been bumped since last release." + exit 0 + fi + + if [ "$RUNTIME" = 'polkadot' ]; then + LIVE_WS="wss://rpc.polkadot.io" + else + LIVE_WS="wss://${RUNTIME}-rpc.polkadot.io" + fi + + # Start running the local polkadot node in the background + $BIN --chain="$RUNTIME-local" & + jobs + + changed_extrinsics=$( + polkadot-js-metadata-cmp "$LIVE_WS" "$LOCAL_WS" \ + | sed 's/^ \+//g' | grep -e 'idx: [0-9]\+ -> [0-9]\+' + ) + + if [ -n "$changed_extrinsics" ]; then + echo "[!] Extrinsics indexing/ordering has changed in the ${RUNTIME} runtime! If this change is intentional, please bump transaction_version in lib.rs. Changed extrinsics:" + echo "$changed_extrinsics" + exit 1 + fi + + echo "[+] No change in extrinsics ordering for the ${RUNTIME} runtime" + kill "$(jobs -p)"; sleep 5 +done + diff --git a/scripts/gitlab/check_line_width.sh b/scripts/gitlab/check_line_width.sh index f382d630b183c6396115cc1e76e77dfab4c20047..c31cab4465792b97862c890de47c05037d0a1675 100755 --- a/scripts/gitlab/check_line_width.sh +++ b/scripts/gitlab/check_line_width.sh @@ -2,19 +2,18 @@ # # check if line width of rust source files is not beyond x characters # - +set -e BASE_BRANCH="origin/master" LINE_WIDTH="121" GOOD_LINE_WIDTH="101" - -git diff --name-only ${BASE_BRANCH}...${CI_COMMIT_SHA} \*.rs | ( while read file +git diff --name-only "${BASE_BRANCH}...${CI_COMMIT_SHA}" -- \*.rs | ( while read -r file do - if [ ! -f ${file} ]; + if [ ! -f "${file}" ]; then echo "Skipping removed file." - elif git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} | grep -q "^+.\{${LINE_WIDTH}\}" + elif git diff "${BASE_BRANCH}...${CI_COMMIT_SHA}" -- "${file}" | grep -q "^+.\{${LINE_WIDTH}\}" then if [ -z "${FAIL}" ] then @@ -26,11 +25,11 @@ do FAIL="true" fi echo "| file: ${file}" - git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} \ + git diff "${BASE_BRANCH}...${CI_COMMIT_SHA}" -- "${file}" \ | grep -n "^+.\{${LINE_WIDTH}\}" echo "|" else - if git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} | grep -q "^+.\{${GOOD_LINE_WIDTH}\}" + if git diff "${BASE_BRANCH}...${CI_COMMIT_SHA}" -- "${file}" | grep -q "^+.\{${GOOD_LINE_WIDTH}\}" then if [ -z "${FAIL}" ] then @@ -41,7 +40,7 @@ do echo "|" fi echo "| file: ${file}" - git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} \ + git diff "${BASE_BRANCH}...${CI_COMMIT_SHA}" -- "${file}" \ | grep -n "^+.\{${LINE_WIDTH}\}" echo "|" fi diff --git a/scripts/gitlab/check_runtime.sh b/scripts/gitlab/check_runtime.sh index 0c635c88246c58076a48fd960216b8967a73aef7..21dfc74be923970a8e8c2a89886a57af26081e0b 100755 --- a/scripts/gitlab/check_runtime.sh +++ b/scripts/gitlab/check_runtime.sh @@ -24,7 +24,10 @@ SUBSTRATE_REPO_CARGO="git\+${SUBSTRATE_REPO}" SUBSTRATE_VERSIONS_FILE="bin/node/runtime/src/lib.rs" # figure out the latest release tag -LATEST_TAG="$(git tag -l | sort -V | tail -n 1)" +boldprint "make sure we have all tags (including those from the release branch)" +git fetch --depth="${GIT_DEPTH:-100}" origin release +git fetch --depth="${GIT_DEPTH:-100}" origin 'refs/tags/*:refs/tags/*' +LATEST_TAG="$(git tag -l | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+-?[0-9]*$' | sort -V | tail -n 1)" boldprint "latest release tag ${LATEST_TAG}" boldprint "latest 10 commits of ${CI_COMMIT_REF_NAME}" @@ -33,6 +36,7 @@ git --no-pager log --graph --oneline --decorate=short -n 10 boldprint "make sure the master branch is available in shallow clones" git fetch --depth="${GIT_DEPTH:-100}" origin master + runtimes=( "kusama" "polkadot" diff --git a/scripts/gitlab/test_deterministic_wasm.sh b/scripts/gitlab/test_deterministic_wasm.sh index db391ca0a2fde43b64c5412eb06570e9978f15b2..998d924d4563687e4602d987a1f23fc9b618131d 100755 --- a/scripts/gitlab/test_deterministic_wasm.sh +++ b/scripts/gitlab/test_deterministic_wasm.sh @@ -6,7 +6,7 @@ source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/lib.sh # build runtime WASM_BUILD_NO_COLOR=1 cargo build --verbose --release -p kusama-runtime -p polkadot-runtime -p westend-runtime # make checksum -sha256sum target/release/wbuild/target/wasm32-unknown-unknown/release/*.wasm > checksum.sha256 +sha256sum target/release/wbuild/*-runtime/target/wasm32-unknown-unknown/release/*.wasm > checksum.sha256 # clean up - FIXME: can we reuse some of the artifacts? cargo clean # build again diff --git a/scripts/gitlab/test_linux_stable.sh b/scripts/gitlab/test_linux_stable.sh index a18ff43874097811ef2d26a68b22d53f0234a5a9..b841d8abecf42d4f76564413325f535a2a20bedb 100755 --- a/scripts/gitlab/test_linux_stable.sh +++ b/scripts/gitlab/test_linux_stable.sh @@ -1,6 +1,10 @@ #!/usr/bin/env bash +set -e #shellcheck source=lib.sh source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/lib.sh" -time cargo test --all --release --verbose --locked --features runtime-benchmarks +time cargo test --all --release --verbose --locked --features=runtime-benchmarks --features=real-overseer + +cd parachain/test-parachains/adder/collator/ +time cargo test --release --verbose --locked --features=real-overseer diff --git a/scripts/prepare-test-net.sh b/scripts/prepare-test-net.sh index 6499a1199bde20ae251d7c1ae6271406eb5cd51a..2cf45f496e6bb97c10d69bfb79320da80fd01b71 100755 --- a/scripts/prepare-test-net.sh +++ b/scripts/prepare-test-net.sh @@ -7,11 +7,11 @@ if [ "$#" -ne 1 ]; then fi generate_account_id() { - subkey ${3:-} inspect "$SECRET//$1//$2" | grep "Account ID" | awk '{ print $3 }' + subkey inspect ${3:-} ${4:-} "$SECRET//$1//$2" | grep "Account ID" | awk '{ print $3 }' } generate_address() { - subkey ${3:-} inspect "$SECRET//$1//$2" | grep "SS58 Address" | awk '{ print $3 }' + subkey inspect ${3:-} ${4:-} "$SECRET//$1//$2" | grep "SS58 Address" | awk '{ print $3 }' } generate_address_and_account_id() { @@ -34,11 +34,12 @@ for i in $(seq 1 $V_NUM); do AUTHORITIES+="(\n" AUTHORITIES+="$(generate_address_and_account_id $i stash)\n" AUTHORITIES+="$(generate_address_and_account_id $i controller)\n" - AUTHORITIES+="$(generate_address_and_account_id $i babe '--sr25519' true)\n" - AUTHORITIES+="$(generate_address_and_account_id $i grandpa '--ed25519' true)\n" - AUTHORITIES+="$(generate_address_and_account_id $i im_online '--sr25519' true)\n" - AUTHORITIES+="$(generate_address_and_account_id $i parachains '--sr25519' true)\n" - AUTHORITIES+="$(generate_address_and_account_id $i authority_discovery '--sr25519' true)\n" + AUTHORITIES+="$(generate_address_and_account_id $i babe '--scheme sr25519' true)\n" + AUTHORITIES+="$(generate_address_and_account_id $i grandpa '--scheme ed25519' true)\n" + AUTHORITIES+="$(generate_address_and_account_id $i im_online '--scheme sr25519' true)\n" + AUTHORITIES+="$(generate_address_and_account_id $i para_validator '--scheme sr25519' true)\n" + AUTHORITIES+="$(generate_address_and_account_id $i para_assignment '--scheme sr25519' true)\n" + AUTHORITIES+="$(generate_address_and_account_id $i authority_discovery '--scheme sr25519' true)\n" AUTHORITIES+="),\n" done diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000000000000000000000000000000000000..323fee1af01be50ae4f4c8f526ba8bd6d39be8ce --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -e + +# This script is to be run when we are happy with a release candidate. +# It accepts a single argument: version, in the format 'v1.2.3' + +version="$1" +if [ -z "$version" ]; then + echo "No version specified, cannot continue" + exit 1 +fi + +if [[ ! "$version" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Version should be in the format v1.2.3" + exit 1 +fi + +echo '[+] Checking out the release branch' +git checkout release +echo '[+] Pulling latest version of the release branch from github' +git pull +echo '[+] Attempting to merge the release-candidate branch to the release branch' +git merge "$version" +echo '[+] Tagging the release' +git tag -s -m "$version" "$version" +echo '[+] Pushing the release branch and tag to Github. A new release will be created shortly' +git push origin release +git push origin "refs/tags/$version" diff --git a/scripts/two-node-local-net.sh b/scripts/two-node-local-net.sh new file mode 100755 index 0000000000000000000000000000000000000000..16db4304f15553302e74053e36c3ec0f150a6f4a --- /dev/null +++ b/scripts/two-node-local-net.sh @@ -0,0 +1,116 @@ +#!/usr/bin/env bash + +# Run a two node local net. +# Unlike the docker-compose script in the /docker folder, this version builds the nodes based +# on the current state of the code, instead of depending on a published version. + +set -e + +# chainspec defaults to polkadot-local if no arguments are passed to this script; +# if arguments are passed in, the first is the chainspec +chainspec="${1:-polkadot-local}" + +PROJECT_ROOT=$(git rev-parse --show-toplevel) +# shellcheck disable=SC1090 +source "$(dirname "$0")"/common.sh + +cd "$PROJECT_ROOT" + +last_modified_rust_file=$( + find . -path ./target -prune -o -type f -name '*.rs' -printf '%T@ %p\n' | + sort -nr | + head -1 | + cut -d' ' -f2- +) + +polkadot="target/release/polkadot" + +# ensure the polkadot binary exists and is up to date +if [ ! -x "$polkadot" ] || [ "$polkadot" -ot "$last_modified_rust_file" ]; then + cargo build --release --features real-overseer +fi + +# setup variables +node_offset=0 +declare -a node_pids +declare -a node_pipes + +# create a sed expression which injects the node name and stream type into each line +function make_sed_expr() { + name="$1" + type="$2" + + printf "s/^/%8s %s: /" "$name" "$type" +} + +# turn a string into a flag +function flagify() { + printf -- '--%s' "$(tr '[:upper:]' '[:lower:]' <<< "$1")" +} + +# start a node and label its output +# +# This function takes a single argument, the node name. +# The name must be one of those which can be passed to the polkadot binary, in un-flagged form, +# one of: +# alice, bob, charlie, dave, eve, ferdie, one, two +function run_node() { + name="$1" + # create a named pipe so we can get the node's PID while also sedding its output + local stdout + local stderr + stdout=$(mktemp --dry-run --tmpdir) + stderr=$(mktemp --dry-run --tmpdir) + mkfifo "$stdout" + mkfifo "$stderr" + node_pipes+=("$stdout") + node_pipes+=("$stderr") + + # compute ports from offset + local port=$((30333+node_offset)) + local rpc_port=$((9933+node_offset)) + local ws_port=$((9944+node_offset)) + node_offset=$((node_offset+1)) + + # start the node + "$polkadot" \ + --chain "$chainspec" \ + --tmp \ + --port "$port" \ + --rpc-port "$rpc_port" \ + --ws-port "$ws_port" \ + --rpc-cors all \ + "$(flagify "$name")" \ + > "$stdout" \ + 2> "$stderr" \ + & + local pid=$! + node_pids+=("$pid") + + # send output from the stdout pipe to stdout, prepending the node name + sed -e "$(make_sed_expr "$name" "OUT")" "$stdout" >&1 & + # send output from the stderr pipe to stderr, prepending the node name + sed -e "$(make_sed_expr "$name" "ERR")" "$stderr" >&2 & +} + + +# clean up the nodes when this script exits +function finish { + for node_pid in "${node_pids[@]}"; do + kill -9 "$node_pid" + done + for node_pipe in "${node_pipes[@]}"; do + rm "$node_pipe" + done +} +trap finish EXIT + +# start the nodes +run_node Alice +run_node Bob + +# now wait; this will exit on its own only if both subprocesses exit +# the practical implication, as both subprocesses are supposed to run forever, is that +# this script will also run forever, until killed, at which point the exit trap should kill +# the subprocesses +wait diff --git a/service/Cargo.toml b/service/Cargo.toml deleted file mode 100644 index 3af2e7d2daffc77b572e3eef99cacf57ad87e3e1..0000000000000000000000000000000000000000 --- a/service/Cargo.toml +++ /dev/null @@ -1,69 +0,0 @@ -[package] -name = "polkadot-service" -version = "0.8.24" -authors = ["Parity Technologies "] -edition = "2018" - -[dependencies] -parking_lot = "0.9.0" -serde = { version = "1.0.102", features = ["derive"] } -lazy_static = "1.4.0" -log = "0.4.8" -futures = "0.3.4" -slog = "2.5.2" -hex-literal = "0.2.1" -consensus = { package = "polkadot-validation", path = "../validation", optional = true } -polkadot-primitives = { path = "../primitives" } -polkadot-runtime = { path = "../runtime/polkadot" } -kusama-runtime = { path = "../runtime/kusama" } -westend-runtime = { path = "../runtime/westend" } -polkadot-rpc = { path = "../rpc" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-db = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -consensus_common = { package = "sp-consensus", git = "https://github.com/paritytech/substrate", branch = "master" } -grandpa = { package = "sc-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } -grandpa_primitives = { package = "sp-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } -inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master" } -service = { package = "sc-service", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -telemetry = { package = "sc-telemetry", git = "https://github.com/paritytech/substrate", branch = "master" } -sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master" } -authority-discovery = { package = "sc-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master" } -authority-discovery-primitives = { package = "sp-authority-discovery", git = "https://github.com/paritytech/substrate", branch = "master" } -babe = { package = "sc-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } -babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -codec = { package = "parity-scale-codec", version = "1.3.4" } -sp-session = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-offchain = { package = "sp-offchain", git = "https://github.com/paritytech/substrate", branch = "master" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", git = "https://github.com/paritytech/substrate", branch = "master" } -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-storage = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[dev-dependencies] -polkadot-test-runtime-client = { path = "../runtime/test-runtime/client" } -sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -env_logger = "0.7.0" - -[features] -default = ["db", "full-node"] -db = ["service/db"] -runtime-benchmarks = ["polkadot-runtime/runtime-benchmarks", "kusama-runtime/runtime-benchmarks", "westend-runtime/runtime-benchmarks"] -full-node = ["consensus"] diff --git a/service/README.adoc b/service/README.adoc deleted file mode 100644 index 2196d5467806cd63751c89c6ab63674c554a5e87..0000000000000000000000000000000000000000 --- a/service/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Service - -placeholder -//TODO Write content :) (https://github.com/paritytech/polkadot/issues/159) diff --git a/service/src/chain_spec.rs b/service/src/chain_spec.rs deleted file mode 100644 index 900742c3a2404aac9140e145296beeb85136374f..0000000000000000000000000000000000000000 --- a/service/src/chain_spec.rs +++ /dev/null @@ -1,942 +0,0 @@ -// Copyright 2017-2020 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 . - -//! Polkadot chain configurations. - -use sp_core::{Pair, Public, crypto::UncheckedInto, sr25519}; -use polkadot_primitives::v0::{AccountId, AccountPublic, ValidatorId}; -use polkadot_runtime as polkadot; -use kusama_runtime as kusama; -use westend_runtime as westend; -use polkadot::constants::currency::DOTS; -use kusama::constants::currency::DOTS as KSM; -use westend::constants::currency::DOTS as WND; -use sc_chain_spec::{ChainSpecExtension, ChainType}; -use sp_runtime::{traits::IdentifyAccount, Perbill}; -use serde::{Serialize, Deserialize}; -use telemetry::TelemetryEndpoints; -use hex_literal::hex; -use babe_primitives::AuthorityId as BabeId; -use grandpa::AuthorityId as GrandpaId; -use pallet_im_online::sr25519::{AuthorityId as ImOnlineId}; -use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; -use pallet_staking::Forcing; - -const POLKADOT_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; -const KUSAMA_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; -const WESTEND_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; -const DEFAULT_PROTOCOL_ID: &str = "dot"; - -/// Node `ChainSpec` extensions. -/// -/// Additional parameters for some Substrate core modules, -/// customizable from the chain spec. -#[derive(Default, Clone, Serialize, Deserialize, ChainSpecExtension)] -#[serde(rename_all = "camelCase")] -pub struct Extensions { - /// Block numbers with known hashes. - pub fork_blocks: sc_client_api::ForkBlocks, - /// Known bad block hashes. - pub bad_blocks: sc_client_api::BadBlocks, -} - -/// The `ChainSpec parametrised for polkadot runtime`. -pub type PolkadotChainSpec = service::GenericChainSpec< - polkadot::GenesisConfig, - Extensions, ->; - -/// The `ChainSpec parametrised for kusama runtime`. -pub type KusamaChainSpec = service::GenericChainSpec< - kusama::GenesisConfig, - Extensions, ->; - -/// The `ChainSpec parametrised for westend runtime`. -pub type WestendChainSpec = service::GenericChainSpec< - westend::GenesisConfig, - Extensions, ->; - -pub fn polkadot_config() -> Result { - PolkadotChainSpec::from_json_bytes(&include_bytes!("../res/polkadot.json")[..]) -} - -pub fn kusama_config() -> Result { - KusamaChainSpec::from_json_bytes(&include_bytes!("../res/kusama.json")[..]) -} - -pub fn westend_config() -> Result { - WestendChainSpec::from_json_bytes(&include_bytes!("../res/westend.json")[..]) -} - -fn polkadot_session_keys( - babe: BabeId, - grandpa: GrandpaId, - im_online: ImOnlineId, - parachain_validator: ValidatorId, - authority_discovery: AuthorityDiscoveryId -) -> polkadot::SessionKeys { - polkadot::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } -} - -fn kusama_session_keys( - babe: BabeId, - grandpa: GrandpaId, - im_online: ImOnlineId, - parachain_validator: ValidatorId, - authority_discovery: AuthorityDiscoveryId -) -> kusama::SessionKeys { - kusama::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } -} - -fn westend_session_keys( - babe: BabeId, - grandpa: GrandpaId, - im_online: ImOnlineId, - parachain_validator: ValidatorId, - authority_discovery: AuthorityDiscoveryId -) -> westend::SessionKeys { - westend::SessionKeys { babe, grandpa, im_online, parachain_validator, authority_discovery } -} - -fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { - // subkey inspect "$SECRET" - let endowed_accounts = vec![]; - - let initial_authorities: Vec<( - AccountId, - AccountId, - BabeId, - GrandpaId, - ImOnlineId, - ValidatorId, - AuthorityDiscoveryId - )> = vec![]; - - const ENDOWMENT: u128 = 1_000_000 * DOTS; - const STASH: u128 = 100 * DOTS; - - polkadot::GenesisConfig { - frame_system: Some(polkadot::SystemConfig { - code: wasm_binary.to_vec(), - changes_trie_config: Default::default(), - }), - pallet_balances: Some(polkadot::BalancesConfig { - balances: endowed_accounts.iter() - .map(|k: &AccountId| (k.clone(), ENDOWMENT)) - .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) - .collect(), - }), - pallet_indices: Some(polkadot::IndicesConfig { - indices: vec![], - }), - pallet_session: Some(polkadot::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - polkadot_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), - }), - pallet_staking: Some(polkadot::StakingConfig { - validator_count: 50, - minimum_validator_count: 4, - stakers: initial_authorities - .iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, polkadot::StakerStatus::Validator)) - .collect(), - invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - force_era: Forcing::ForceNone, - slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() - }), - pallet_elections_phragmen: Some(Default::default()), - pallet_democracy: Some(Default::default()), - pallet_collective_Instance1: Some(polkadot::CouncilConfig { - members: vec![], - phantom: Default::default(), - }), - pallet_collective_Instance2: Some(polkadot::TechnicalCommitteeConfig { - members: vec![], - phantom: Default::default(), - }), - pallet_membership_Instance1: Some(Default::default()), - pallet_babe: Some(Default::default()), - pallet_grandpa: Some(Default::default()), - pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { - keys: vec![], - }), - claims: Some(polkadot::ClaimsConfig { - claims: vec![], - vesting: vec![], - }), - pallet_vesting: Some(polkadot::VestingConfig { - vesting: vec![], - }), - } -} - -fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { -// subkey inspect "$SECRET" - let endowed_accounts = vec![ - // 5ENpP27BrVdJTdUfY6djmcw3d3xEJ6NzSUU52CCPmGpMrdEY - hex!["6648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f7342"].into(), - ]; - - // for i in 1 2 3 4; do for j in stash controller; do subkey inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in babe; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in grandpa; do subkey --ed25519 inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in im_online; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in parachains; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done - let initial_authorities: Vec<( - AccountId, - AccountId, - BabeId, - GrandpaId, - ImOnlineId, - ValidatorId, - AuthorityDiscoveryId - )> = vec![( - // 5FZoQhgUCmqBxnkHX7jCqThScS2xQWiwiF61msg63CFL3Y8f - hex!["9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d"].into(), - // 5ExdKyXFhtrjiFhexnyQPDyGSP8xU9qHc4KDwVrtWxaP2RP6 - hex!["8011fb3641f0641f5570ba8787a64a0ff7d9c9999481f333d7207c4abd7e981c"].into(), - // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 - hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(), - // 5FSscBiPfaPaEhFbAt2qRhcYjryKBKf714X76F5nFfwtdXLa - hex!["959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd652"].unchecked_into(), - // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 - hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(), - // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 - hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(), - // 5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 - hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(), - ),( - // 5G1ojzh47Yt8KoYhuAjXpHcazvsoCXe3G8LZchKDvumozJJJ - hex!["aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934"].into(), - // 5GeoZ1Mzix6Xnj32X8Xpj7q89X1SQHU5XTK1cnUVNXKTvXdK - hex!["caf27345aebc2fefeca85c9a67f4859eab3178d28ef92244714402290f3f415a"].into(), - // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 - hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(), - // 5Hpn3HVViECsuxMDFtinWjRj2dNfpRp1kB24nZHvQCJsSUek - hex!["feca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff93"].unchecked_into(), - // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 - hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(), - // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 - hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(), - // 5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 - hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(), - ),( - // 5HYYWyhyUQ7Ae11f8fCid58bhJ7ikLHM9bU8A6Ynwoc3dStR - hex!["f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836"].into(), - // 5DnUXT3xiQn6ZRttFT6eSCJbT9P2tiLdexr5WsvnbLG8igqW - hex!["4c17a9bfdd19411f452fa32420fa7acab622e87e57351f4ba3248ae40ce75123"].into(), - // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure - hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(), - // 5Hmvd2qjb1zatrJTkPwgFicxPfZuwaTwa2L7adSRmz6mVxfb - hex!["fc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a91956"].unchecked_into(), - // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure - hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(), - // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure - hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(), - // 5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure - hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(), - ),( - // 5CFPcUJgYgWryPaV1aYjSbTpbTLu42V32Ytw1L9rfoMAsfGh - hex!["08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d"].into(), - // 5F6z64cYZFRAmyMUhp7rnge6jaZmbY6o7XfA9czJyuAUiaFD - hex!["8671d451c3d4f6de8c16ea0bc61cf714914d6b2ffa2899872620525419327478"].into(), - // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD - hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(), - // 5FgBijJLL6p7nDZgQed56L3BM7ovgwc4t4FYsv9apYtRGAGv - hex!["9fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2d"].unchecked_into(), - // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD - hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(), - // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD - hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(), - // 5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD - hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(), - )]; - - const ENDOWMENT: u128 = 1_000_000 * WND; - const STASH: u128 = 100 * WND; - - westend::GenesisConfig { - frame_system: Some(westend::SystemConfig { - code: wasm_binary.to_vec(), - changes_trie_config: Default::default(), - }), - pallet_balances: Some(westend::BalancesConfig { - balances: endowed_accounts.iter() - .map(|k: &AccountId| (k.clone(), ENDOWMENT)) - .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) - .collect(), - }), - pallet_indices: Some(westend::IndicesConfig { - indices: vec![], - }), - pallet_session: Some(westend::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - westend_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), - }), - pallet_staking: Some(westend::StakingConfig { - validator_count: 50, - minimum_validator_count: 4, - stakers: initial_authorities - .iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, westend::StakerStatus::Validator)) - .collect(), - invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - force_era: Forcing::ForceNone, - slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() - }), - pallet_babe: Some(Default::default()), - pallet_grandpa: Some(Default::default()), - pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { - keys: vec![], - }), - pallet_vesting: Some(westend::VestingConfig { - vesting: vec![], - }), - pallet_sudo: Some(westend::SudoConfig { - key: endowed_accounts[0].clone(), - }), - } -} - -fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { - // subkey inspect "$SECRET" - let endowed_accounts = vec![ - // 5CVFESwfkk7NmhQ6FwHCM9roBvr9BGa4vJHFYU8DnGQxrXvz - hex!["12b782529c22032ed4694e0f6e7d486be7daa6d12088f6bc74d593b3900b8438"].into(), - ]; - - // for i in 1 2 3 4; do for j in stash controller; do subkey inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in babe; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in grandpa; do subkey --ed25519 inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in im_online; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in parachains; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done - let initial_authorities: Vec<( - AccountId, - AccountId, - BabeId, - GrandpaId, - ImOnlineId, - ValidatorId, - AuthorityDiscoveryId - )> = vec![( - // 5DD7Q4VEfPTLEdn11CnThoHT5f9xKCrnofWJL5SsvpTghaAT - hex!["32a5718e87d16071756d4b1370c411bbbb947eb62f0e6e0b937d5cbfc0ea633b"].into(), - // 5GNzaEqhrZAtUQhbMe2gn9jBuNWfamWFZHULryFwBUXyd1cG - hex!["bee39fe862c85c91aaf343e130d30b643c6ea0b4406a980206f1df8331f7093b"].into(), - // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 - hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"].unchecked_into(), - // 5EjvdwATjyFFikdZibVvx1q5uBHhphS2Mnsq5c7yfaYK25vm - hex!["76620f7c98bce8619979c2b58cf2b0aff71824126d2b039358729dad993223db"].unchecked_into(), - // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 - hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"].unchecked_into(), - // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 - hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"].unchecked_into(), - // 5FpewyS2VY8Cj3tKgSckq8ECkjd1HKHvBRnWhiHqRQsWfFC1 - hex!["a639b507ee1585e0b6498ff141d6153960794523226866d1b44eba3f25f36356"].unchecked_into(), - ),( - // 5G9VGb8ESBeS8Ca4or43RfhShzk9y7T5iTmxHk5RJsjZwsRx - hex!["b496c98a405ceab59b9e970e59ef61acd7765a19b704e02ab06c1cdfe171e40f"].into(), - // 5F7V9Y5FcxKXe1aroqvPeRiUmmeQwTFcL3u9rrPXcMuMiCNx - hex!["86d3a7571dd60139d297e55d8238d0c977b2e208c5af088f7f0136b565b0c103"].into(), - // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY - hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"].unchecked_into(), - // 5HBDAaybNqjmY7ww8ZcZZY1L5LHxvpnyfqJwoB7HhR6raTmG - hex!["e2234d661bee4a04c38392c75d1566200aa9e6ae44dd98ee8765e4cc9af63cb7"].unchecked_into(), - // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY - hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"].unchecked_into(), - // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY - hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"].unchecked_into(), - // 5GvuM53k1Z4nAB5zXJFgkRSHv4Bqo4BsvgbQWNWkiWZTMwWY - hex!["765e46067adac4d1fe6c783aa2070dfa64a19f84376659e12705d1734b3eae01"].unchecked_into(), - ),( - // 5FzwpgGvk2kk9agow6KsywLYcPzjYc8suKej2bne5G5b9YU3 - hex!["ae12f70078a22882bf5135d134468f77301927aa67c376e8c55b7ff127ace115"].into(), - // 5EqoZhVC2BcsM4WjvZNidu2muKAbu5THQTBKe3EjvxXkdP7A - hex!["7addb914ec8486bbc60643d2647685dcc06373401fa80e09813b630c5831d54b"].into(), - // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 - hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"].unchecked_into(), - // 5E8ULLQrDAtWhfnVfZmX41Yux86zNAwVJYguWJZVWrJvdhBe - hex!["5b57ed1443c8967f461db1f6eb2ada24794d163a668f1cf9d9ce3235dfad8799"].unchecked_into(), - // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 - hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"].unchecked_into(), - // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 - hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"].unchecked_into(), - // 5CXNq1mSKJT4Sc2CbyBBdANeSkbUvdWvE4czJjKXfBHi9sX5 - hex!["664eae1ca4713dd6abf8c15e6c041820cda3c60df97dc476c2cbf7cb82cb2d2e"].unchecked_into(), - ),( - // 5CFj6Kg9rmVn1vrqpyjau2ztyBzKeVdRKwNPiA3tqhB5HPqq - hex!["0867dbb49721126df589db100dda728dc3b475cbf414dad8f72a1d5e84897252"].into(), - // 5CwQXP6nvWzigFqNhh2jvCaW9zWVzkdveCJY3tz2MhXMjTon - hex!["26ab2b4b2eba2263b1e55ceb48f687bb0018130a88df0712fbdaf6a347d50e2a"].into(), - // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd - hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"].unchecked_into(), - // 5HGLmrZsiTFTPp3QoS1W8w9NxByt8PVq79reqvdxNcQkByqK - hex!["e60d23f49e93c1c1f2d7c115957df5bbd7faf5ebf138d1e9d02e8b39a1f63df0"].unchecked_into(), - // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd - hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"].unchecked_into(), - // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd - hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"].unchecked_into(), - // 5FCd9Y7RLNyxz5wnCAErfsLbXGG34L2BaZRHzhiJcMUMd5zd - hex!["2adb17a5cafbddc7c3e00ec45b6951a8b12ce2264235b4def342513a767e5d3d"].unchecked_into(), - )]; - - const ENDOWMENT: u128 = 1_000_000 * KSM; - const STASH: u128 = 100 * KSM; - - kusama::GenesisConfig { - frame_system: Some(kusama::SystemConfig { - code: wasm_binary.to_vec(), - changes_trie_config: Default::default(), - }), - pallet_balances: Some(kusama::BalancesConfig { - balances: endowed_accounts.iter() - .map(|k: &AccountId| (k.clone(), ENDOWMENT)) - .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) - .collect(), - }), - pallet_indices: Some(kusama::IndicesConfig { - indices: vec![], - }), - pallet_session: Some(kusama::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - kusama_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), - }), - pallet_staking: Some(kusama::StakingConfig { - validator_count: 50, - minimum_validator_count: 4, - stakers: initial_authorities - .iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, kusama::StakerStatus::Validator)) - .collect(), - invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - force_era: Forcing::ForceNone, - slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() - }), - pallet_elections_phragmen: Some(Default::default()), - pallet_democracy: Some(Default::default()), - pallet_collective_Instance1: Some(kusama::CouncilConfig { - members: vec![], - phantom: Default::default(), - }), - pallet_collective_Instance2: Some(kusama::TechnicalCommitteeConfig { - members: vec![], - phantom: Default::default(), - }), - pallet_membership_Instance1: Some(Default::default()), - pallet_babe: Some(Default::default()), - pallet_grandpa: Some(Default::default()), - pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { - keys: vec![], - }), - claims: Some(kusama::ClaimsConfig { - claims: vec![], - vesting: vec![], - }), - pallet_vesting: Some(kusama::VestingConfig { - vesting: vec![], - }), - } -} - -/// Polkadot staging testnet config. -pub fn polkadot_staging_testnet_config() -> Result { - let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; - let boot_nodes = vec![]; - - Ok(PolkadotChainSpec::from_genesis( - "Polkadot Staging Testnet", - "polkadot_staging_testnet", - ChainType::Live, - move || polkadot_staging_testnet_config_genesis(wasm_binary), - boot_nodes, - Some(TelemetryEndpoints::new(vec![(POLKADOT_STAGING_TELEMETRY_URL.to_string(), 0)]) - .expect("Polkadot Staging telemetry url is valid; qed")), - Some(DEFAULT_PROTOCOL_ID), - None, - Default::default(), - )) -} - -/// Staging testnet config. -pub fn kusama_staging_testnet_config() -> Result { - let wasm_binary = kusama::WASM_BINARY.ok_or("Kusama development wasm not available")?; - let boot_nodes = vec![]; - - Ok(KusamaChainSpec::from_genesis( - "Kusama Staging Testnet", - "kusama_staging_testnet", - ChainType::Live, - move || kusama_staging_testnet_config_genesis(wasm_binary), - boot_nodes, - Some(TelemetryEndpoints::new(vec![(KUSAMA_STAGING_TELEMETRY_URL.to_string(), 0)]) - .expect("Kusama Staging telemetry url is valid; qed")), - Some(DEFAULT_PROTOCOL_ID), - None, - Default::default(), - )) -} - -/// Westend staging testnet config. -pub fn westend_staging_testnet_config() -> Result { - let wasm_binary = westend::WASM_BINARY.ok_or("Westend development wasm not available")?; - let boot_nodes = vec![]; - - Ok(WestendChainSpec::from_genesis( - "Westend Staging Testnet", - "westend_staging_testnet", - ChainType::Live, - move || westend_staging_testnet_config_genesis(wasm_binary), - boot_nodes, - Some(TelemetryEndpoints::new(vec![(WESTEND_STAGING_TELEMETRY_URL.to_string(), 0)]) - .expect("Westend Staging telemetry url is valid; qed")), - Some(DEFAULT_PROTOCOL_ID), - None, - Default::default(), - )) -} - -/// Helper function to generate a crypto pair from seed -pub 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 -pub 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 -pub fn get_authority_keys_from_seed(seed: &str) -> ( - AccountId, - AccountId, - BabeId, - GrandpaId, - ImOnlineId, - ValidatorId, - 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![ - 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"), - ] -} - -/// Helper function to create polkadot GenesisConfig for testing -pub fn polkadot_testnet_genesis( - wasm_binary: &[u8], - initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, - _root_key: AccountId, - endowed_accounts: Option>, -) -> polkadot::GenesisConfig { - let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); - - const ENDOWMENT: u128 = 1_000_000 * DOTS; - const STASH: u128 = 100 * DOTS; - - polkadot::GenesisConfig { - frame_system: Some(polkadot::SystemConfig { - code: wasm_binary.to_vec(), - changes_trie_config: Default::default(), - }), - pallet_indices: Some(polkadot::IndicesConfig { - indices: vec![], - }), - pallet_balances: Some(polkadot::BalancesConfig { - balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), - }), - pallet_session: Some(polkadot::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - polkadot_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), - }), - pallet_staking: Some(polkadot::StakingConfig { - minimum_validator_count: 1, - validator_count: 2, - stakers: initial_authorities.iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, polkadot::StakerStatus::Validator)) - .collect(), - invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - force_era: Forcing::NotForcing, - slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() - }), - pallet_elections_phragmen: Some(Default::default()), - pallet_democracy: Some(polkadot::DemocracyConfig::default()), - pallet_collective_Instance1: Some(polkadot::CouncilConfig { - members: vec![], - phantom: Default::default(), - }), - pallet_collective_Instance2: Some(polkadot::TechnicalCommitteeConfig { - members: vec![], - phantom: Default::default(), - }), - pallet_membership_Instance1: Some(Default::default()), - pallet_babe: Some(Default::default()), - pallet_grandpa: Some(Default::default()), - pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(polkadot::AuthorityDiscoveryConfig { - keys: vec![], - }), - claims: Some(polkadot::ClaimsConfig { - claims: vec![], - vesting: vec![], - }), - pallet_vesting: Some(polkadot::VestingConfig { - vesting: vec![], - }), - } -} - -/// Helper function to create kusama GenesisConfig for testing -pub fn kusama_testnet_genesis( - wasm_binary: &[u8], - initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, - _root_key: AccountId, - endowed_accounts: Option>, -) -> kusama::GenesisConfig { - let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); - - const ENDOWMENT: u128 = 1_000_000 * KSM; - const STASH: u128 = 100 * KSM; - - kusama::GenesisConfig { - frame_system: Some(kusama::SystemConfig { - code: wasm_binary.to_vec(), - changes_trie_config: Default::default(), - }), - pallet_indices: Some(kusama::IndicesConfig { - indices: vec![], - }), - pallet_balances: Some(kusama::BalancesConfig { - balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), - }), - pallet_session: Some(kusama::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - kusama_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), - }), - pallet_staking: Some(kusama::StakingConfig { - minimum_validator_count: 1, - validator_count: 2, - stakers: initial_authorities.iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, kusama::StakerStatus::Validator)) - .collect(), - invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - force_era: Forcing::NotForcing, - slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() - }), - pallet_elections_phragmen: Some(Default::default()), - pallet_democracy: Some(kusama::DemocracyConfig::default()), - pallet_collective_Instance1: Some(kusama::CouncilConfig { - members: vec![], - phantom: Default::default(), - }), - pallet_collective_Instance2: Some(kusama::TechnicalCommitteeConfig { - members: vec![], - phantom: Default::default(), - }), - pallet_membership_Instance1: Some(Default::default()), - pallet_babe: Some(Default::default()), - pallet_grandpa: Some(Default::default()), - pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(kusama::AuthorityDiscoveryConfig { - keys: vec![], - }), - claims: Some(kusama::ClaimsConfig { - claims: vec![], - vesting: vec![], - }), - pallet_vesting: Some(kusama::VestingConfig { - vesting: vec![], - }), - } -} - -/// Helper function to create polkadot GenesisConfig for testing -pub fn westend_testnet_genesis( - wasm_binary: &[u8], - initial_authorities: Vec<(AccountId, AccountId, BabeId, GrandpaId, ImOnlineId, ValidatorId, AuthorityDiscoveryId)>, - root_key: AccountId, - endowed_accounts: Option>, -) -> westend::GenesisConfig { - let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); - - const ENDOWMENT: u128 = 1_000_000 * DOTS; - const STASH: u128 = 100 * DOTS; - - westend::GenesisConfig { - frame_system: Some(westend::SystemConfig { - code: wasm_binary.to_vec(), - changes_trie_config: Default::default(), - }), - pallet_indices: Some(westend::IndicesConfig { - indices: vec![], - }), - pallet_balances: Some(westend::BalancesConfig { - balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), - }), - pallet_session: Some(westend::SessionConfig { - keys: initial_authorities.iter().map(|x| ( - x.0.clone(), - x.0.clone(), - westend_session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone(), x.6.clone()), - )).collect::>(), - }), - pallet_staking: Some(westend::StakingConfig { - minimum_validator_count: 1, - validator_count: 2, - stakers: initial_authorities.iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, westend::StakerStatus::Validator)) - .collect(), - invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - force_era: Forcing::NotForcing, - slash_reward_fraction: Perbill::from_percent(10), - .. Default::default() - }), - pallet_babe: Some(Default::default()), - pallet_grandpa: Some(Default::default()), - pallet_im_online: Some(Default::default()), - pallet_authority_discovery: Some(westend::AuthorityDiscoveryConfig { - keys: vec![], - }), - pallet_vesting: Some(westend::VestingConfig { - vesting: vec![], - }), - pallet_sudo: Some(westend::SudoConfig { - key: root_key, - }), - } -} - -fn polkadot_development_config_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { - polkadot_testnet_genesis( - wasm_binary, - vec![ - get_authority_keys_from_seed("Alice"), - ], - get_account_id_from_seed::("Alice"), - None, - ) -} - -fn kusama_development_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { - kusama_testnet_genesis( - wasm_binary, - vec![ - get_authority_keys_from_seed("Alice"), - ], - get_account_id_from_seed::("Alice"), - None, - ) -} - -fn westend_development_config_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { - westend_testnet_genesis( - wasm_binary, - vec![ - get_authority_keys_from_seed("Alice"), - ], - get_account_id_from_seed::("Alice"), - None, - ) -} - -/// Polkadot development config (single validator Alice) -pub fn polkadot_development_config() -> Result { - let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; - - Ok(PolkadotChainSpec::from_genesis( - "Development", - "dev", - ChainType::Development, - move || polkadot_development_config_genesis(wasm_binary), - vec![], - None, - Some(DEFAULT_PROTOCOL_ID), - None, - Default::default(), - )) -} - -/// Kusama development config (single validator Alice) -pub fn kusama_development_config() -> Result { - let wasm_binary = kusama::WASM_BINARY.ok_or("Kusama development wasm not available")?; - - Ok(KusamaChainSpec::from_genesis( - "Development", - "kusama_dev", - ChainType::Development, - move || kusama_development_config_genesis(wasm_binary), - vec![], - None, - Some(DEFAULT_PROTOCOL_ID), - None, - Default::default(), - )) -} - -/// Westend development config (single validator Alice) -pub fn westend_development_config() -> Result { - let wasm_binary = westend::WASM_BINARY.ok_or("Westend development wasm not available")?; - - Ok(WestendChainSpec::from_genesis( - "Development", - "westend_dev", - ChainType::Development, - move || westend_development_config_genesis(wasm_binary), - vec![], - None, - Some(DEFAULT_PROTOCOL_ID), - None, - Default::default(), - )) -} - -fn polkadot_local_testnet_genesis(wasm_binary: &[u8]) -> polkadot::GenesisConfig { - polkadot_testnet_genesis( - wasm_binary, - vec![ - get_authority_keys_from_seed("Alice"), - get_authority_keys_from_seed("Bob"), - ], - get_account_id_from_seed::("Alice"), - None, - ) -} - -/// Polkadot local testnet config (multivalidator Alice + Bob) -pub fn polkadot_local_testnet_config() -> Result { - let wasm_binary = polkadot::WASM_BINARY.ok_or("Polkadot development wasm not available")?; - - Ok(PolkadotChainSpec::from_genesis( - "Local Testnet", - "local_testnet", - ChainType::Local, - move || polkadot_local_testnet_genesis(wasm_binary), - vec![], - None, - Some(DEFAULT_PROTOCOL_ID), - None, - Default::default(), - )) -} - -fn kusama_local_testnet_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfig { - kusama_testnet_genesis( - wasm_binary, - vec![ - get_authority_keys_from_seed("Alice"), - get_authority_keys_from_seed("Bob"), - ], - get_account_id_from_seed::("Alice"), - None, - ) -} - -/// Kusama local testnet config (multivalidator Alice + Bob) -pub fn kusama_local_testnet_config() -> Result { - let wasm_binary = kusama::WASM_BINARY.ok_or("Kusama development wasm not available")?; - - Ok(KusamaChainSpec::from_genesis( - "Kusama Local Testnet", - "kusama_local_testnet", - ChainType::Local, - move || kusama_local_testnet_genesis(wasm_binary), - vec![], - None, - Some(DEFAULT_PROTOCOL_ID), - None, - Default::default(), - )) -} - -fn westend_local_testnet_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { - westend_testnet_genesis( - wasm_binary, - vec![ - get_authority_keys_from_seed("Alice"), - get_authority_keys_from_seed("Bob"), - ], - get_account_id_from_seed::("Alice"), - None, - ) -} - -/// Westend local testnet config (multivalidator Alice + Bob) -pub fn westend_local_testnet_config() -> Result { - let wasm_binary = westend::WASM_BINARY.ok_or("Westend development wasm not available")?; - - Ok(WestendChainSpec::from_genesis( - "Westend Local Testnet", - "westend_local_testnet", - ChainType::Local, - move || westend_local_testnet_genesis(wasm_binary), - vec![], - None, - Some(DEFAULT_PROTOCOL_ID), - None, - Default::default(), - )) -} diff --git a/service/src/client.rs b/service/src/client.rs deleted file mode 100644 index 20e924078ddfc0214a689722926d240c62840827..0000000000000000000000000000000000000000 --- a/service/src/client.rs +++ /dev/null @@ -1,396 +0,0 @@ -// Copyright 2017-2020 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 . - -//! Polkadot Client abstractions. - -use std::sync::Arc; -use sp_api::{ProvideRuntimeApi, CallApiAt, NumberFor}; -use sp_blockchain::HeaderBackend; -use sp_runtime::traits::{Block as BlockT, BlakeTwo256}; -use sp_runtime::generic::{BlockId, SignedBlock}; -use consensus_common::BlockStatus; -use sp_runtime::Justification; -use sp_storage::{StorageData, StorageKey, ChildInfo, PrefixedStorageKey}; -use sc_client_api::{Backend as BackendT, BlockchainEvents, KeyIterator}; -use polkadot_primitives::v0::{Block, ParachainHost, AccountId, Nonce, Balance}; - -/// A set of APIs that polkadot-like runtimes must implement. -pub trait RuntimeApiCollection: - sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::ApiExt - + babe_primitives::BabeApi - + grandpa_primitives::GrandpaApi - + ParachainHost - + sp_block_builder::BlockBuilder - + frame_system_rpc_runtime_api::AccountNonceApi - + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi - + sp_api::Metadata - + sp_offchain::OffchainWorkerApi - + sp_session::SessionKeys - + authority_discovery_primitives::AuthorityDiscoveryApi -where - >::StateBackend: sp_api::StateBackend, -{} - -impl RuntimeApiCollection for Api -where - Api: - sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::ApiExt - + babe_primitives::BabeApi - + grandpa_primitives::GrandpaApi - + ParachainHost - + sp_block_builder::BlockBuilder - + frame_system_rpc_runtime_api::AccountNonceApi - + pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi - + sp_api::Metadata - + sp_offchain::OffchainWorkerApi - + sp_session::SessionKeys - + authority_discovery_primitives::AuthorityDiscoveryApi, - >::StateBackend: sp_api::StateBackend, -{} - -/// Trait that abstracts over all available client implementations. -/// -/// For a concrete type there exists [`Client`]. -pub trait AbstractClient: - BlockchainEvents + Sized + Send + Sync - + ProvideRuntimeApi - + HeaderBackend - + CallApiAt< - Block, - Error = sp_blockchain::Error, - StateBackend = Backend::State - > - where - Block: BlockT, - Backend: BackendT, - Backend::State: sp_api::StateBackend, - Self::Api: RuntimeApiCollection, -{} - -impl AbstractClient for Client - where - Block: BlockT, - Backend: BackendT, - Backend::State: sp_api::StateBackend, - Client: BlockchainEvents + ProvideRuntimeApi + HeaderBackend - + Sized + Send + Sync - + CallApiAt< - Block, - Error = sp_blockchain::Error, - StateBackend = Backend::State - >, - Client::Api: RuntimeApiCollection, -{} - -/// Execute something with the client instance. -/// -/// As there exist multiple chains inside Polkadot, like Polkadot itself, Kusama, Westend etc, -/// there can exist different kinds of client types. As these client types differ in the generics -/// that are being used, we can not easily return them from a function. For returning them from a -/// function there exists [`Client`]. However, the problem on how to use this client instance still -/// exists. This trait "solves" it in a dirty way. It requires a type to implement this trait and -/// than the [`execute_with_client`](ExecuteWithClient::execute_with_client) function can be called -/// with any possible client instance. -/// -/// In a perfect world, we could make a closure work in this way. -pub trait ExecuteWithClient { - /// The return type when calling this instance. - type Output; - - /// Execute whatever should be executed with the given client instance. - fn execute_with_client(self, client: Arc) -> Self::Output - where - >::StateBackend: sp_api::StateBackend, - Backend: sc_client_api::Backend, - Backend::State: sp_api::StateBackend, - Api: crate::RuntimeApiCollection, - Client: AbstractClient + 'static; -} - -/// A handle to a Polkadot client instance. -/// -/// The Polkadot service supports multiple different runtimes (Westend, Polkadot itself, etc). As each runtime has a -/// specialized client, we need to hide them behind a trait. This is this trait. -/// -/// When wanting to work with the inner client, you need to use `execute_with`. -/// -/// See [`ExecuteWithClient`](trait.ExecuteWithClient.html) for more information. -pub trait ClientHandle { - /// Execute the given something with the client. - fn execute_with(&self, t: T) -> T::Output; -} - -/// A client instance of Polkadot. -/// -/// See [`ExecuteWithClient`] for more information. -#[derive(Clone)] -pub enum Client { - Polkadot(Arc>), - Westend(Arc>), - Kusama(Arc>), -} - -impl ClientHandle for Client { - fn execute_with(&self, t: T) -> T::Output { - match self { - Self::Polkadot(client) => { - T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) - }, - Self::Westend(client) => { - T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) - }, - Self::Kusama(client) => { - T::execute_with_client::<_, _, crate::FullBackend>(t, client.clone()) - }, - } - } -} - -impl sc_client_api::UsageProvider for Client { - fn usage_info(&self) -> sc_client_api::ClientInfo { - match self { - Self::Polkadot(client) => client.usage_info(), - Self::Westend(client) => client.usage_info(), - Self::Kusama(client) => client.usage_info(), - } - } -} - -impl sc_client_api::BlockBackend for Client { - fn block_body( - &self, - id: &BlockId - ) -> sp_blockchain::Result::Extrinsic>>> { - match self { - Self::Polkadot(client) => client.block_body(id), - Self::Westend(client) => client.block_body(id), - Self::Kusama(client) => client.block_body(id), - } - } - - fn block(&self, id: &BlockId) -> sp_blockchain::Result>> { - match self { - Self::Polkadot(client) => client.block(id), - Self::Westend(client) => client.block(id), - Self::Kusama(client) => client.block(id), - } - } - - fn block_status(&self, id: &BlockId) -> sp_blockchain::Result { - match self { - Self::Polkadot(client) => client.block_status(id), - Self::Westend(client) => client.block_status(id), - Self::Kusama(client) => client.block_status(id), - } - } - - fn justification( - &self, - id: &BlockId - ) -> sp_blockchain::Result> { - match self { - Self::Polkadot(client) => client.justification(id), - Self::Westend(client) => client.justification(id), - Self::Kusama(client) => client.justification(id), - } - } - - fn block_hash( - &self, - number: NumberFor - ) -> sp_blockchain::Result::Hash>> { - match self { - Self::Polkadot(client) => client.block_hash(number), - Self::Westend(client) => client.block_hash(number), - Self::Kusama(client) => client.block_hash(number), - } - } -} - -impl sc_client_api::StorageProvider for Client { - fn storage( - &self, - id: &BlockId, - key: &StorageKey - ) -> sp_blockchain::Result> { - match self { - Self::Polkadot(client) => client.storage(id, key), - Self::Westend(client) => client.storage(id, key), - Self::Kusama(client) => client.storage(id, key), - } - } - - fn storage_keys( - &self, - id: &BlockId, - key_prefix: &StorageKey - ) -> sp_blockchain::Result> { - match self { - Self::Polkadot(client) => client.storage_keys(id, key_prefix), - Self::Westend(client) => client.storage_keys(id, key_prefix), - Self::Kusama(client) => client.storage_keys(id, key_prefix), - } - } - - fn storage_hash( - &self, - id: &BlockId, - key: &StorageKey - ) -> sp_blockchain::Result::Hash>> { - match self { - Self::Polkadot(client) => client.storage_hash(id, key), - Self::Westend(client) => client.storage_hash(id, key), - Self::Kusama(client) => client.storage_hash(id, key), - } - } - - fn storage_pairs( - &self, - id: &BlockId, - key_prefix: &StorageKey - ) -> sp_blockchain::Result> { - match self { - Self::Polkadot(client) => client.storage_pairs(id, key_prefix), - Self::Westend(client) => client.storage_pairs(id, key_prefix), - Self::Kusama(client) => client.storage_pairs(id, key_prefix), - } - } - - fn storage_keys_iter<'a>( - &self, - id: &BlockId, - prefix: Option<&'a StorageKey>, - start_key: Option<&StorageKey> - ) -> sp_blockchain::Result>::State, Block>> { - match self { - Self::Polkadot(client) => client.storage_keys_iter(id, prefix, start_key), - Self::Westend(client) => client.storage_keys_iter(id, prefix, start_key), - Self::Kusama(client) => client.storage_keys_iter(id, prefix, start_key), - } - } - - fn child_storage( - &self, - id: &BlockId, - child_info: &ChildInfo, - key: &StorageKey - ) -> sp_blockchain::Result> { - match self { - Self::Polkadot(client) => client.child_storage(id, child_info, key), - Self::Westend(client) => client.child_storage(id, child_info, key), - Self::Kusama(client) => client.child_storage(id, child_info, key), - } - } - - fn child_storage_keys( - &self, - id: &BlockId, - child_info: &ChildInfo, - key_prefix: &StorageKey - ) -> sp_blockchain::Result> { - match self { - Self::Polkadot(client) => client.child_storage_keys(id, child_info, key_prefix), - Self::Westend(client) => client.child_storage_keys(id, child_info, key_prefix), - Self::Kusama(client) => client.child_storage_keys(id, child_info, key_prefix), - } - } - - fn child_storage_hash( - &self, - id: &BlockId, - child_info: &ChildInfo, - key: &StorageKey - ) -> sp_blockchain::Result::Hash>> { - match self { - Self::Polkadot(client) => client.child_storage_hash(id, child_info, key), - Self::Westend(client) => client.child_storage_hash(id, child_info, key), - Self::Kusama(client) => client.child_storage_hash(id, child_info, key), - } - } - - fn max_key_changes_range( - &self, - first: NumberFor, - last: BlockId - ) -> sp_blockchain::Result, BlockId)>> { - match self { - Self::Polkadot(client) => client.max_key_changes_range(first, last), - Self::Westend(client) => client.max_key_changes_range(first, last), - Self::Kusama(client) => client.max_key_changes_range(first, last), - } - } - - fn key_changes( - &self, - first: NumberFor, - last: BlockId, - storage_key: Option<&PrefixedStorageKey>, - key: &StorageKey - ) -> sp_blockchain::Result, u32)>> { - match self { - Self::Polkadot(client) => client.key_changes(first, last, storage_key, key), - Self::Westend(client) => client.key_changes(first, last, storage_key, key), - Self::Kusama(client) => client.key_changes(first, last, storage_key, key), - } - } -} - -impl sp_blockchain::HeaderBackend for Client { - fn header(&self, id: BlockId) -> sp_blockchain::Result::Header>> { - match self { - Self::Polkadot(client) => client.header(&id), - Self::Westend(client) => client.header(&id), - Self::Kusama(client) => client.header(&id), - } - } - - fn info(&self) -> sp_blockchain::Info { - match self { - Self::Polkadot(client) => client.info(), - Self::Westend(client) => client.info(), - Self::Kusama(client) => client.info(), - } - } - - fn status(&self, id: BlockId) -> sp_blockchain::Result { - match self { - Self::Polkadot(client) => client.status(id), - Self::Westend(client) => client.status(id), - Self::Kusama(client) => client.status(id), - } - } - - fn number( - &self, - hash: ::Hash - ) -> sp_blockchain::Result>> { - match self { - Self::Polkadot(client) => client.number(hash), - Self::Westend(client) => client.number(hash), - Self::Kusama(client) => client.number(hash), - } - } - - fn hash(&self, number: NumberFor) -> sp_blockchain::Result::Hash>> { - match self { - Self::Polkadot(client) => client.hash(number), - Self::Westend(client) => client.hash(number), - Self::Kusama(client) => client.hash(number), - } - } -} diff --git a/service/src/grandpa_support.rs b/service/src/grandpa_support.rs deleted file mode 100644 index 41179a19c46e6342420c8bf8564e674c8eab63b6..0000000000000000000000000000000000000000 --- a/service/src/grandpa_support.rs +++ /dev/null @@ -1,367 +0,0 @@ -// Copyright 2017-2020 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 . - -//! Polkadot-specific GRANDPA integration utilities. - -use polkadot_primitives::v0::Hash; -use sp_runtime::traits::{Block as BlockT, NumberFor}; - -/// A custom GRANDPA voting rule that "pauses" voting (i.e. keeps voting for the -/// same last finalized block) after a given block at height `N` has been -/// finalized and for a delay of `M` blocks, i.e. until the best block reaches -/// `N` + `M`, the voter will keep voting for block `N`. -pub struct PauseAfterBlockFor(pub N, pub N); - -impl grandpa::VotingRule for PauseAfterBlockFor> where - Block: BlockT, - B: sp_blockchain::HeaderBackend, -{ - fn restrict_vote( - &self, - backend: &B, - base: &Block::Header, - best_target: &Block::Header, - current_target: &Block::Header, - ) -> Option<(Block::Hash, NumberFor)> { - use sp_runtime::generic::BlockId; - use sp_runtime::traits::Header as _; - - // walk backwards until we find the target block - let find_target = | - target_number: NumberFor, - current_header: &Block::Header - | { - let mut target_hash = current_header.hash(); - let mut target_header = current_header.clone(); - - loop { - if *target_header.number() < target_number { - unreachable!( - "we are traversing backwards from a known block; \ - blocks are stored contiguously; \ - qed" - ); - } - - if *target_header.number() == target_number { - return Some((target_hash, target_number)); - } - - target_hash = *target_header.parent_hash(); - target_header = backend.header(BlockId::Hash(target_hash)).ok()? - .expect("Header known to exist due to the existence of one of its descendents; qed"); - } - }; - - // only restrict votes targeting a block higher than the block - // we've set for the pause - if *current_target.number() > self.0 { - // if we're past the pause period (i.e. `self.0 + self.1`) - // then we no longer need to restrict any votes - if *best_target.number() > self.0 + self.1 { - return None; - } - - // if we've finalized the pause block, just keep returning it - // until best number increases enough to pass the condition above - if *base.number() >= self.0 { - return Some((base.hash(), *base.number())); - } - - // otherwise find the target header at the pause block - // to vote on - return find_target(self.0, current_target); - } - - None - } -} - -/// GRANDPA hard forks due to borked migration of session keys after a runtime -/// upgrade (at #1491596), the signalled authority set changes were invalid -/// (blank keys) and were impossible to finalize. The authorities for these -/// intermediary pending changes are replaced with a static list comprised of -/// w3f validators and randomly selected validators from the latest session (at -/// #1500988). -pub(crate) fn kusama_hard_forks() -> Vec<( - grandpa_primitives::SetId, - (Hash, polkadot_primitives::v0::BlockNumber), - grandpa_primitives::AuthorityList, -)> { - use sp_core::crypto::Ss58Codec; - use std::str::FromStr; - - let forks = vec![ - ( - 623, - "01e94e1e7e9cf07b3b0bf4e1717fce7448e5563901c2ef2e3b8e9ecaeba088b1", - 1492283, - ), - ( - 624, - "ddc4323c5e8966844dfaa87e0c2f74ef6b43115f17bf8e4ff38845a62d02b9a9", - 1492436, - ), - ( - 625, - "38ba115b296663e424e32d7b1655cd795719cef4fd7d579271a6d01086cf1628", - 1492586, - ), - ( - 626, - "f3172b6b8497c10fc772f5dada4eeb1f4c4919c97de9de2e1a439444d5a057ff", - 1492955, - ), - ( - 627, - "b26526aea299e9d24af29fdacd5cf4751a663d24894e3d0a37833aa14c58424a", - 1493338, - ), - ( - 628, - "3980d024327d53b8d01ef0d198a052cd058dd579508d8ed6283fe3614e0a3694", - 1493913, - ), - ( - 629, - "31f22997a786c25ee677786373368cae6fd501fd1bc4b212b8e267235c88179d", - 1495083, - ), - ( - 630, - "1c65eb250cf54b466c64f1a4003d1415a7ee275e49615450c0e0525179857eef", - 1497404, - ), - ( - 631, - "9e44116467cc9d7e224e36487bf2cf571698cae16b25f54a7430f1278331fdd8", - 1498598, - ), - ]; - - let authorities = vec![ - "CwjLJ1zPWK5Ao9WChAFp7rWGEgN3AyXXjTRPrqgm5WwBpoS", - "Dp8FHpZTzvoKXztkfrUAkF6xNf6sjVU5ZLZ29NEGUazouou", - "DtK7YfkhNWU6wEPF1dShsFdhtosVAuJPLkoGhKhG1r5LjKq", - "FLnHYBuoyThzqJ45tdb8P6yMLdocM7ir27Pg1AnpYoygm1K", - "FWEfJ5UMghr52UopgYjawAg6hQg3ztbQek75pfeRtLVi8pB", - "ECoLHAu7HKWGTB9od82HAtequYj6hvNHigkGSB9g3ApxAwB", - "GL1Tg3Uppo8GYL9NjKj4dWKcS6tW98REop9G5hpu7HgFwTa", - "ExnjU5LZMktrgtQBE3An6FsQfvaKG1ukxPqwhJydgdgarmY", - "CagLpgCBu5qJqYF2tpFX6BnU4yHvMGSjc7r3Ed1jY3tMbQt", - "DsrtmMsD4ijh3n4uodxPoiW9NZ7v7no5wVvPVj8fL1dfrWB", - "HQB4EctrVR68ozZDyBiRJzLRAEGh1YKgCkAsFjJcegL9RQA", - "H2YTYbXTFkDY1cGnv164ecnDT3hsD2bQXtyiDbcQuXcQZUV", - "H5WL8jXmbkCoEcLfvqJkbLUeGrDFsJiMXkhhRWn3joct1tE", - "DpB37GDrJDYcmg2df2eqsrPKMay1u8hyZ6sQi2FuUiUeNLu", - "FR8yjKRA9MTjvFGK8kfzrdC23Fr6xd7rfBvZXSjAsmuxURE", - "DxHPty3B9fpj3duu6Gc6gCSCAvsydJHJEY5G3oVYT8S5BYJ", - "DbVKC8ZJjevrhqSnZyJMMvmPL7oPPL4ed1roxawYnHVgyin", - "DVJV81kab2J6oTyRJ9T3NCwW2DSrysbWCssvMcE6cwZHnAd", - "Fg4rDAyzoVzf39Zo8JFPo4W314ntNWNwm3shr4xKe8M1fJg", - "GUaNcnAruMVxHGTs7gGpSUpigRJboQYQBBQyPohkFcP6NMH", - "J4BMGF4W9yWiJz4pkhQW73X6QMGpKUzmPppVnqzBCqw5dQq", - "E1cR61L1tdDEop4WdWVqcq1H1x6VqsDpSHvFyUeC41uruVJ", - "GoWLzBsj1f23YtdDpyntnvN1LwXKhF5TEeZvBeTVxofgWGR", - "CwHwmbogSwtRbrkajVBNubPvWmHBGU4bhMido54M9CjuKZD", - "FLT63y9oVXJnyiWMAL4RvWxsQx21Vymw9961Z7NRFmSG7rw", - "FoQ2y6JuHuHTG4rHFL3f2hCxfJMvtrq8wwPWdv8tsdkcyA8", - "D7QQKqqs8ocGorRA12h4QoBSHDia1DkHeXT4eMfjWQ483QH", - "J6z7FP35F9DiiU985bhkDTS3WxyeTBeoo9MtLdLoD3GiWPj", - "EjapydCK25AagodRbDECavHAy8yQY1tmeRhwUXhVWx4cFPv", - "H8admATcRkGCrF1dTDDBCjQDsYjMkuPaN9YwR2mSCj4DWMQ", - "FtHMRU1fxsoswJjBvyCGvECepC7gP2X77QbNpyikYSqqR6k", - "DzY5gwr45GVRUFzRMmeg8iffpqYF47nm3XbJhmjG97FijaE", - "D3HKWAihSUmg8HrfeFrftSwNK7no261yA9RNr3LUUdsuzuJ", - "D82DwwGJGTcSvtB3SmNrZejnSertbPzpkYvDUp3ibScL3ne", - "FTPxLXLQvMDQYFA6VqNLGwWPKhemMYP791XVj8TmDpFuV3b", - "FzGfKmS7N8Z1tvCBU5JH1eBXZQ9pCtRNoMUnNVv38wZNq72", - "GDfm1MyLAQ7Rh8YPtF6FtMweV4hz91zzeDy2sSABNNqAbmg", - "DiVQbq7sozeKp7PXPM1HLFc2m7ih8oepKLRK99oBY3QZak1", - "HErWh7D2RzrjWWB2fTJfcAejD9MJpadeWWZM2Wnk7LiNWfG", - "Es4DbDauYZYyRJbr6VxrhdcM1iufP9GtdBYf3YtSEvdwNyb", - "EBgXT6FaVo4WsN2LmfnB2jnpDFf4zay3E492RGSn6v1tY99", - "Dr9Zg4fxZurexParztL9SezFeHsPwdP8uGgULeRMbk8DDHJ", - "JEnSTZJpLh91cSryptj57RtFxq9xXqf4U5wBH3qoP91ZZhN", - "DqtRkrmtPANa8wrYR7Ce2LxJxk2iNFtiCxv1cXbx54uqdTN", - "GaxmF53xbuTFKopVEseWiaCTa8fC6f99n4YfW8MGPSPYX3s", - "EiCesgkAaighBKMpwFSAUdvwE4mRjBjNmmd5fP6d4FG8DAx", - "HVbwWGUx7kCgUGap1Mfcs37g6JAZ5qsfsM7TsDRcSqvfxmd", - "G45bc8Ajrd6YSXav77gQwjjGoAsR2qiGd1aLzkMy7o1RLwd", - "Cqix2rD93Mdf7ytg8tBavAig2TvhXPgPZ2mejQvkq7qgRPq", - "GpodE2S5dPeVjzHB4Drm8R9rEwcQPtwAspXqCVz1ooFWf5K", - "CwfmfRmzPKLj3ntSCejuVwYmQ1F9iZWY4meQrAVoJ2G8Kce", - "Fhp5NPvutRCJ4Gx3G8vCYGaveGcU3KgTwfrn5Zr8sLSgwVx", - "GeYRRPkyi23wSF3cJGjq82117fKJZUbWsAGimUnzb5RPbB1", - "DzCJ4y5oT611dfKQwbBDVbtCfENTdMCjb4KGMU3Mq6nyUMu", - ]; - - let authorities = authorities - .into_iter() - .map(|address| { - ( - grandpa_primitives::AuthorityId::from_ss58check(address) - .expect("hard fork authority addresses are static and they should be carefully defined; qed."), - 1, - ) - }) - .collect::>(); - - forks - .into_iter() - .map(|(set_id, hash, number)| { - let hash = Hash::from_str(hash) - .expect("hard fork hashes are static and they should be carefully defined; qed."); - - (set_id, (hash, number), authorities.clone()) - }) - .collect() -} - -#[cfg(test)] -mod tests { - use polkadot_test_runtime_client::prelude::*; - use polkadot_test_runtime_client::sp_consensus::BlockOrigin; - use sc_block_builder::BlockBuilderProvider; - use grandpa::VotingRule; - use sp_blockchain::HeaderBackend; - use sp_runtime::generic::BlockId; - use sp_runtime::traits::Header; - use std::sync::Arc; - - #[test] - fn grandpa_pause_voting_rule_works() { - let _ = env_logger::try_init(); - - let client = Arc::new(polkadot_test_runtime_client::new()); - - let mut push_blocks = { - let mut client = client.clone(); - let mut base = 0; - - move |n| { - for i in 0..n { - let mut builder = client.new_block(Default::default()).unwrap(); - - for extrinsic in polkadot_test_runtime_client::needed_extrinsics(base + i) { - builder.push(extrinsic).unwrap() - } - - let block = builder.build().unwrap().block; - client.import(BlockOrigin::Own, block).unwrap(); - } - - base += n; - } - }; - - let get_header = { - let client = client.clone(); - move |n| client.header(&BlockId::Number(n)).unwrap().unwrap() - }; - - // the rule should filter all votes after block #20 - // is finalized until block #50 is imported. - let voting_rule = super::PauseAfterBlockFor(20, 30); - - // add 10 blocks - push_blocks(10); - assert_eq!( - client.info().best_number, - 10, - ); - - // we have not reached the pause block - // therefore nothing should be restricted - assert_eq!( - voting_rule.restrict_vote( - &*client, - &get_header(0), - &get_header(10), - &get_header(10), - ), - None, - ); - - // add 15 more blocks - // best block: #25 - push_blocks(15); - - // we are targeting the pause block, - // the vote should not be restricted - assert_eq!( - voting_rule.restrict_vote( - &*client, - &get_header(10), - &get_header(20), - &get_header(20), - ), - None, - ); - - // we are past the pause block, votes should - // be limited to the pause block. - let pause_block = get_header(20); - assert_eq!( - voting_rule.restrict_vote( - &*client, - &get_header(10), - &get_header(21), - &get_header(21), - ), - Some((pause_block.hash(), *pause_block.number())), - ); - - // we've finalized the pause block, so we'll keep - // restricting our votes to it. - assert_eq!( - voting_rule.restrict_vote( - &*client, - &pause_block, // #20 - &get_header(21), - &get_header(21), - ), - Some((pause_block.hash(), *pause_block.number())), - ); - - // add 30 more blocks - // best block: #55 - push_blocks(30); - - // we're at the last block of the pause, this block - // should still be considered in the pause period - assert_eq!( - voting_rule.restrict_vote( - &*client, - &pause_block, // #20 - &get_header(50), - &get_header(50), - ), - Some((pause_block.hash(), *pause_block.number())), - ); - - // we're past the pause period, no votes should be filtered - assert_eq!( - voting_rule.restrict_vote( - &*client, - &pause_block, // #20 - &get_header(51), - &get_header(51), - ), - None, - ); - } -} diff --git a/service/src/lib.rs b/service/src/lib.rs deleted file mode 100644 index c79c9d1d563692e5bb93f38016ca5b26674f4458..0000000000000000000000000000000000000000 --- a/service/src/lib.rs +++ /dev/null @@ -1,768 +0,0 @@ -// Copyright 2017-2020 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 . - -//! Polkadot service. Specialized wrapper over substrate service. - -pub mod chain_spec; -pub mod grandpa_support; -mod client; - -use std::sync::Arc; -use std::time::Duration; -use polkadot_primitives::v0 as parachain; -use service::error::Error as ServiceError; -use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; -use sc_executor::native_executor_instance; -use log::info; -use sp_trie::PrefixedMemoryDB; -use sc_client_api::ExecutorProvider; -use prometheus_endpoint::Registry; -pub use service::{ - Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis, RpcHandlers, - TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor, - Configuration, ChainSpec, TaskManager, -}; -pub use service::config::{DatabaseConfig, PrometheusConfig}; -pub use sc_executor::NativeExecutionDispatch; -pub use sc_client_api::{Backend, ExecutionStrategy, CallExecutor}; -pub use sc_consensus::LongestChain; -pub use sp_api::{Core as CoreApi, ConstructRuntimeApi, ProvideRuntimeApi, StateBackend}; -pub use sp_runtime::traits::{HashFor, NumberFor}; -pub use consensus_common::{SelectChain, BlockImport, block_validation::Chain}; -pub use polkadot_primitives::v0::{Block, CollatorId, ParachainHost}; -pub use sp_runtime::traits::{Block as BlockT, self as runtime_traits, BlakeTwo256}; -pub use chain_spec::{PolkadotChainSpec, KusamaChainSpec, WestendChainSpec}; -#[cfg(feature = "full-node")] -pub use consensus::run_validation_worker; -pub use codec::Codec; -pub use polkadot_runtime; -pub use kusama_runtime; -pub use westend_runtime; -pub use self::client::*; - -native_executor_instance!( - pub PolkadotExecutor, - polkadot_runtime::api::dispatch, - polkadot_runtime::native_version, - frame_benchmarking::benchmarking::HostFunctions, -); - -native_executor_instance!( - pub KusamaExecutor, - kusama_runtime::api::dispatch, - kusama_runtime::native_version, - frame_benchmarking::benchmarking::HostFunctions, -); - -native_executor_instance!( - pub WestendExecutor, - westend_runtime::api::dispatch, - westend_runtime::native_version, - frame_benchmarking::benchmarking::HostFunctions, -); - -/// Can be called for a `Configuration` to check if it is a configuration for the `Kusama` network. -pub trait IdentifyVariant { - /// Returns if this is a configuration for the `Kusama` network. - fn is_kusama(&self) -> bool; - - /// Returns if this is a configuration for the `Westend` network. - fn is_westend(&self) -> bool; -} - -impl IdentifyVariant for Box { - fn is_kusama(&self) -> bool { - self.id().starts_with("kusama") || self.id().starts_with("ksm") - } - - fn is_westend(&self) -> bool { - self.id().starts_with("westend") || self.id().starts_with("wnd") - } -} - -/// Polkadot's full backend. -pub type FullBackend = service::TFullBackend; - -/// Polkadot's select chain. -pub type FullSelectChain = sc_consensus::LongestChain; - -/// Polkadot's full client. -pub type FullClient = service::TFullClient; - -/// Polkadot's full Grandpa block import. -pub type FullGrandpaBlockImport = grandpa::GrandpaBlockImport< - FullBackend, Block, FullClient, FullSelectChain ->; - -/// Polkadot's light backend. -pub type LightBackend = service::TLightBackendWithHash; - -/// Polkadot's light client. -pub type LightClient = - service::TLightClientWithBackend; - -#[cfg(feature = "full-node")] -pub fn new_partial(config: &mut Configuration, test: bool) -> Result< - service::PartialComponents< - FullClient, FullBackend, FullSelectChain, - consensus_common::DefaultImportQueue>, - sc_transaction_pool::FullPool>, - ( - impl Fn( - polkadot_rpc::DenyUnsafe, - polkadot_rpc::SubscriptionTaskExecutor, - ) -> polkadot_rpc::RpcExtension, - ( - babe::BabeBlockImport< - Block, FullClient, FullGrandpaBlockImport - >, - grandpa::LinkHalf, FullSelectChain>, - babe::BabeLink - ), - grandpa::SharedVoterState, - ) - >, - Error -> - where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: - RuntimeApiCollection>, - Executor: NativeExecutionDispatch + 'static, -{ - if !test { - // If we're using prometheus, use a registry with a prefix of `polkadot`. - if let Some(PrometheusConfig { registry, .. }) = config.prometheus_config.as_mut() { - *registry = Registry::new_custom(Some("polkadot".into()), None)?; - } - } - - let inherent_data_providers = inherents::InherentDataProviders::new(); - - let (client, backend, keystore, task_manager) = - service::new_full_parts::(&config)?; - let client = Arc::new(client); - - let select_chain = sc_consensus::LongestChain::new(backend.clone()); - - let transaction_pool = sc_transaction_pool::BasicPool::new_full( - config.transaction_pool.clone(), - config.prometheus_registry(), - task_manager.spawn_handle(), - client.clone(), - ); - - let grandpa_hard_forks = if config.chain_spec.is_kusama() && !test { - crate::grandpa_support::kusama_hard_forks() - } else { - Vec::new() - }; - - let (grandpa_block_import, grandpa_link) = - grandpa::block_import_with_authority_set_hard_forks( - client.clone(), - &(client.clone() as Arc<_>), - select_chain.clone(), - grandpa_hard_forks, - )?; - - let justification_import = grandpa_block_import.clone(); - - let (block_import, babe_link) = babe::block_import( - babe::Config::get_or_compute(&*client)?, - grandpa_block_import, - client.clone(), - )?; - - let import_queue = babe::import_queue( - babe_link.clone(), - block_import.clone(), - Some(Box::new(justification_import)), - None, - client.clone(), - select_chain.clone(), - inherent_data_providers.clone(), - &task_manager.spawn_handle(), - config.prometheus_registry(), - consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()), - )?; - - let justification_stream = grandpa_link.justification_stream(); - let shared_authority_set = grandpa_link.shared_authority_set().clone(); - let shared_voter_state = grandpa::SharedVoterState::empty(); - - let import_setup = (block_import.clone(), grandpa_link, babe_link.clone()); - let rpc_setup = shared_voter_state.clone(); - - let babe_config = babe_link.config().clone(); - let shared_epoch_changes = babe_link.epoch_changes().clone(); - - let rpc_extensions_builder = { - let client = client.clone(); - let keystore = keystore.clone(); - let transaction_pool = transaction_pool.clone(); - let select_chain = select_chain.clone(); - - move |deny_unsafe, subscription_executor| -> polkadot_rpc::RpcExtension { - let deps = polkadot_rpc::FullDeps { - client: client.clone(), - pool: transaction_pool.clone(), - select_chain: select_chain.clone(), - deny_unsafe, - babe: polkadot_rpc::BabeDeps { - babe_config: babe_config.clone(), - shared_epoch_changes: shared_epoch_changes.clone(), - keystore: keystore.clone(), - }, - grandpa: polkadot_rpc::GrandpaDeps { - shared_voter_state: shared_voter_state.clone(), - shared_authority_set: shared_authority_set.clone(), - justification_stream: justification_stream.clone(), - subscription_executor, - }, - }; - - polkadot_rpc::create_full(deps) - } - }; - - Ok(service::PartialComponents { - client, backend, task_manager, keystore, select_chain, import_queue, transaction_pool, - inherent_data_providers, - other: (rpc_extensions_builder, import_setup, rpc_setup) - }) -} - -#[cfg(feature = "full-node")] -pub struct NewFull { - pub task_manager: TaskManager, - pub client: C, - pub node_handles: FullNodeHandles, - pub network: Arc::Hash>>, - pub network_status_sinks: service::NetworkStatusSinks, - pub rpc_handlers: RpcHandlers, -} - -#[cfg(feature = "full-node")] -impl NewFull { - fn with_client(self, func: impl FnOnce(C) -> Client) -> NewFull { - NewFull { - client: func(self.client), - task_manager: self.task_manager, - node_handles: self.node_handles, - network: self.network, - network_status_sinks: self.network_status_sinks, - rpc_handlers: self.rpc_handlers, - } - } -} - -#[cfg(feature = "full-node")] -pub fn new_full( - mut config: Configuration, - collating_for: Option<(CollatorId, parachain::Id)>, - authority_discovery_enabled: bool, - grandpa_pause: Option<(u32, u32)>, - test: bool, -) -> Result>>, Error> - where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: - RuntimeApiCollection>, - Executor: NativeExecutionDispatch + 'static, -{ - use sc_network::Event; - use futures::stream::StreamExt; - use sp_core::traits::BareCryptoStorePtr; - - let is_collator = collating_for.is_some(); - let role = config.role.clone(); - let is_authority = role.is_authority() && !is_collator; - let force_authoring = config.force_authoring; - let disable_grandpa = config.disable_grandpa; - let name = config.network.node_name.clone(); - - let service::PartialComponents { - client, backend, mut task_manager, keystore, select_chain, import_queue, transaction_pool, - inherent_data_providers, - other: (rpc_extensions_builder, import_setup, rpc_setup) - } = new_partial::(&mut config, test)?; - - let prometheus_registry = config.prometheus_registry().cloned(); - - let finality_proof_provider = - GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); - - let (network, network_status_sinks, system_rpc_tx, network_starter) = - service::build_network(service::BuildNetworkParams { - config: &config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - spawn_handle: task_manager.spawn_handle(), - import_queue, - on_demand: None, - block_announce_validator_builder: None, - finality_proof_request_builder: None, - finality_proof_provider: Some(finality_proof_provider.clone()), - })?; - - if config.offchain_worker.enabled { - service::build_offchain_workers( - &config, backend.clone(), task_manager.spawn_handle(), client.clone(), network.clone(), - ); - } - - let telemetry_connection_sinks = service::TelemetryConnectionSinks::default(); - - let rpc_handlers = service::spawn_tasks(service::SpawnTasksParams { - config, - backend: backend.clone(), - client: client.clone(), - keystore: keystore.clone(), - network: network.clone(), - rpc_extensions_builder: Box::new(rpc_extensions_builder), - transaction_pool: transaction_pool.clone(), - task_manager: &mut task_manager, - on_demand: None, - remote_blockchain: None, - telemetry_connection_sinks: telemetry_connection_sinks.clone(), - network_status_sinks: network_status_sinks.clone(), - system_rpc_tx, - })?; - - let (block_import, link_half, babe_link) = import_setup; - - let shared_voter_state = rpc_setup; - - if role.is_authority() { - let proposer = consensus::ProposerFactory::new( - client.clone(), - transaction_pool, - prometheus_registry.as_ref(), - ); - - let can_author_with = - consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone()); - - let babe_config = babe::BabeParams { - keystore: keystore.clone(), - client: client.clone(), - select_chain, - block_import, - env: proposer, - sync_oracle: network.clone(), - inherent_data_providers: inherent_data_providers.clone(), - force_authoring, - babe_link, - can_author_with, - }; - - let babe = babe::start_babe(babe_config)?; - task_manager.spawn_essential_handle().spawn_blocking("babe", babe); - } - - if matches!(role, Role::Authority{..} | Role::Sentry{..}) { - if authority_discovery_enabled { - let (sentries, authority_discovery_role) = match role { - Role::Authority { ref sentry_nodes } => ( - sentry_nodes.clone(), - authority_discovery::Role::Authority ( - keystore.clone(), - ), - ), - Role::Sentry {..} => ( - vec![], - authority_discovery::Role::Sentry, - ), - _ => unreachable!("Due to outer matches! constraint; qed."), - }; - - let network_event_stream = network.event_stream("authority-discovery"); - let dht_event_stream = network_event_stream.filter_map(|e| async move { match e { - Event::Dht(e) => Some(e), - _ => None, - }}).boxed(); - let (authority_discovery_worker, _service) = authority_discovery::new_worker_and_service( - client.clone(), - network.clone(), - sentries, - dht_event_stream, - authority_discovery_role, - prometheus_registry.clone(), - ); - - task_manager.spawn_handle().spawn("authority-discovery-worker", authority_discovery_worker); - } - } - - // if the node isn't actively participating in consensus then it doesn't - // need a keystore, regardless of which protocol we use below. - let keystore = if is_authority { - Some(keystore as BareCryptoStorePtr) - } else { - None - }; - - let config = grandpa::Config { - // FIXME substrate#1578 make this available through chainspec - gossip_duration: Duration::from_millis(1000), - justification_period: 512, - name: Some(name), - observer_enabled: false, - keystore, - is_authority: role.is_network_authority(), - }; - - let enable_grandpa = !disable_grandpa; - if enable_grandpa { - // start the full GRANDPA voter - // NOTE: unlike in substrate we are currently running the full - // GRANDPA voter protocol for all full nodes (regardless of whether - // they're validators or not). at this point the full voter should - // provide better guarantees of block and vote data availability than - // the observer. - - // add a custom voting rule to temporarily stop voting for new blocks - // after the given pause block is finalized and restarting after the - // given delay. - let voting_rule = match grandpa_pause { - Some((block, delay)) => { - info!("GRANDPA scheduled voting pause set for block #{} with a duration of {} blocks.", - block, - delay, - ); - - grandpa::VotingRulesBuilder::default() - .add(crate::grandpa_support::PauseAfterBlockFor(block, delay)) - .build() - }, - None => - grandpa::VotingRulesBuilder::default() - .build(), - }; - - let grandpa_config = grandpa::GrandpaParams { - config, - link: link_half, - network: network.clone(), - inherent_data_providers: inherent_data_providers.clone(), - telemetry_on_connect: Some(telemetry_connection_sinks.on_connect_stream()), - voting_rule, - prometheus_registry: prometheus_registry.clone(), - shared_voter_state, - }; - - task_manager.spawn_essential_handle().spawn_blocking( - "grandpa-voter", - grandpa::run_grandpa_voter(grandpa_config)? - ); - } else { - grandpa::setup_disabled_grandpa( - client.clone(), - &inherent_data_providers, - network.clone(), - )?; - } - - network_starter.start_network(); - - Ok(NewFull { - task_manager, client, node_handles: FullNodeHandles, network, network_status_sinks, - rpc_handlers, - }) -} - -#[cfg(feature = "full-node")] -pub fn new_full_nongeneric( - config: Configuration, - collating_for: Option<(CollatorId, parachain::Id)>, - authority_discovery_enabled: bool, - grandpa_pause: Option<(u32, u32)>, - test: bool, -) -> Result, Error> { - if config.chain_spec.is_kusama() { - new_full::( - config, - collating_for, - authority_discovery_enabled, - grandpa_pause, - test, - ).map(|full| full.with_client(Client::Kusama)) - } else if config.chain_spec.is_westend() { - new_full::( - config, - collating_for, - authority_discovery_enabled, - grandpa_pause, - false, - ).map(|full| full.with_client(Client::Westend)) - } else { - new_full::( - config, - collating_for, - authority_discovery_enabled, - grandpa_pause, - false, - ).map(|full| full.with_client(Client::Polkadot)) - } -} - -/// Builds a new service for a light client. -fn new_light(mut config: Configuration) -> Result<(TaskManager, RpcHandlers), Error> - where - Runtime: 'static + Send + Sync + ConstructRuntimeApi>, - >>::RuntimeApi: - RuntimeApiCollection>, - Dispatch: NativeExecutionDispatch + 'static, -{ - use sc_client_api::backend::RemoteBackend; - - // If we're using prometheus, use a registry with a prefix of `polkadot`. - if let Some(PrometheusConfig { registry, .. }) = config.prometheus_config.as_mut() { - *registry = Registry::new_custom(Some("polkadot".into()), None)?; - } - - let (client, backend, keystore, mut task_manager, on_demand) = - service::new_light_parts::(&config)?; - - let select_chain = sc_consensus::LongestChain::new(backend.clone()); - - let transaction_pool = Arc::new(sc_transaction_pool::BasicPool::new_light( - config.transaction_pool.clone(), - config.prometheus_registry(), - task_manager.spawn_handle(), - client.clone(), - on_demand.clone(), - )); - - let grandpa_block_import = grandpa::light_block_import( - client.clone(), backend.clone(), &(client.clone() as Arc<_>), - Arc::new(on_demand.checker().clone()), - )?; - - let finality_proof_import = grandpa_block_import.clone(); - let finality_proof_request_builder = - finality_proof_import.create_finality_proof_request_builder(); - - let (babe_block_import, babe_link) = babe::block_import( - babe::Config::get_or_compute(&*client)?, - grandpa_block_import, - client.clone(), - )?; - - let inherent_data_providers = inherents::InherentDataProviders::new(); - - // FIXME: pruning task isn't started since light client doesn't do `AuthoritySetup`. - let import_queue = babe::import_queue( - babe_link, - babe_block_import, - None, - Some(Box::new(finality_proof_import)), - client.clone(), - select_chain.clone(), - inherent_data_providers.clone(), - &task_manager.spawn_handle(), - config.prometheus_registry(), - consensus_common::NeverCanAuthor, - )?; - - let finality_proof_provider = - GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); - - let (network, network_status_sinks, system_rpc_tx, network_starter) = - service::build_network(service::BuildNetworkParams { - config: &config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - spawn_handle: task_manager.spawn_handle(), - import_queue, - on_demand: Some(on_demand.clone()), - block_announce_validator_builder: None, - finality_proof_request_builder: Some(finality_proof_request_builder), - finality_proof_provider: Some(finality_proof_provider), - })?; - - if config.offchain_worker.enabled { - service::build_offchain_workers( - &config, backend.clone(), task_manager.spawn_handle(), client.clone(), network.clone(), - ); - } - - let light_deps = polkadot_rpc::LightDeps { - remote_blockchain: backend.remote_blockchain(), - fetcher: on_demand.clone(), - client: client.clone(), - pool: transaction_pool.clone(), - }; - - let rpc_extensions = polkadot_rpc::create_light(light_deps); - - let rpc_handlers = service::spawn_tasks(service::SpawnTasksParams { - on_demand: Some(on_demand), - remote_blockchain: Some(backend.remote_blockchain()), - rpc_extensions_builder: Box::new(service::NoopRpcExtensionBuilder(rpc_extensions)), - task_manager: &mut task_manager, - telemetry_connection_sinks: service::TelemetryConnectionSinks::default(), - config, keystore, backend, transaction_pool, client, network, network_status_sinks, - system_rpc_tx, - })?; - - network_starter.start_network(); - - Ok((task_manager, rpc_handlers)) -} - -/// Builds a new object suitable for chain operations. -#[cfg(feature = "full-node")] -pub fn new_chain_ops(mut config: &mut Configuration) -> Result< - ( - Arc, - Arc, - consensus_common::import_queue::BasicQueue>, - TaskManager, - ), - ServiceError -> { - config.keystore = service::config::KeystoreConfig::InMemory; - - if config.chain_spec.is_kusama() { - let service::PartialComponents { client, backend, import_queue, task_manager, .. } - = new_partial::(config, false)?; - Ok((Arc::new(Client::Kusama(client)), backend, import_queue, task_manager)) - } else if config.chain_spec.is_westend() { - let service::PartialComponents { client, backend, import_queue, task_manager, .. } - = new_partial::(config, false)?; - Ok((Arc::new(Client::Westend(client)), backend, import_queue, task_manager)) - } else { - let service::PartialComponents { client, backend, import_queue, task_manager, .. } - = new_partial::(config, false)?; - Ok((Arc::new(Client::Polkadot(client)), backend, import_queue, task_manager)) - } -} - -/// Create a new Polkadot service for a full node. -#[cfg(feature = "full-node")] -pub fn polkadot_new_full( - config: Configuration, - collating_for: Option<(CollatorId, parachain::Id)>, - authority_discovery_enabled: bool, - grandpa_pause: Option<(u32, u32)>, -) - -> Result<( - TaskManager, - Arc>, - FullNodeHandles, - ), ServiceError> -{ - let NewFull { - task_manager, client, node_handles, .. - } = new_full::( - config, - collating_for, - authority_discovery_enabled, - grandpa_pause, - false, - )?; - - Ok((task_manager, client, node_handles)) -} - -/// Create a new Kusama service for a full node. -#[cfg(feature = "full-node")] -pub fn kusama_new_full( - config: Configuration, - collating_for: Option<(CollatorId, parachain::Id)>, - authority_discovery_enabled: bool, - grandpa_pause: Option<(u32, u32)>, -) -> Result<( - TaskManager, - Arc>, - FullNodeHandles - ), ServiceError> -{ - let NewFull { - task_manager, client, node_handles, .. - } = new_full::( - config, - collating_for, - authority_discovery_enabled, - grandpa_pause, - false, - )?; - - Ok((task_manager, client, node_handles)) -} - -/// Create a new Westend service for a full node. -#[cfg(feature = "full-node")] -pub fn westend_new_full( - config: Configuration, - collating_for: Option<(CollatorId, parachain::Id)>, - authority_discovery_enabled: bool, - grandpa_pause: Option<(u32, u32)>, -) - -> Result<( - TaskManager, - Arc>, - FullNodeHandles, - ), ServiceError> -{ - let NewFull { - task_manager, client, node_handles, .. - } = new_full::( - config, - collating_for, - authority_discovery_enabled, - grandpa_pause, - false, - )?; - - Ok((task_manager, client, node_handles)) -} - -/// Handles to other sub-services that full nodes instantiate, which consumers -/// of the node may use. -#[cfg(feature = "full-node")] -#[derive(Default)] -pub struct FullNodeHandles; - -/// Build a new light node. -pub fn build_light(config: Configuration) -> Result<(TaskManager, RpcHandlers), ServiceError> { - if config.chain_spec.is_kusama() { - new_light::(config) - } else if config.chain_spec.is_westend() { - new_light::(config) - } else { - new_light::(config) - } -} - -/// Build a new full node. -#[cfg(feature = "full-node")] -pub fn build_full( - config: Configuration, - collating_for: Option<(CollatorId, parachain::Id)>, - authority_discovery_enabled: bool, - grandpa_pause: Option<(u32, u32)>, -) -> Result<(TaskManager, Client, FullNodeHandles), ServiceError> { - new_full_nongeneric( - config, - collating_for, - authority_discovery_enabled, - grandpa_pause, - false, - ).map(|NewFull { task_manager, client, node_handles, .. }| (task_manager, client, node_handles)) -} diff --git a/src/main.rs b/src/main.rs index 58f475471e5ad48e4220ada36721dc44d8c4eedd..d7baf303970ce2f3034fee292b98990b01476e23 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,10 @@ #![warn(missing_docs)] -fn main() -> cli::Result<()> { - cli::run() +use color_eyre::eyre; + +fn main() -> eyre::Result<()> { + color_eyre::install()?; + cli::run()?; + Ok(()) } diff --git a/statement-table/Cargo.toml b/statement-table/Cargo.toml index 24c5b8db84ea2328b68b8eba1361c1fca92af61c..235f2c905a8ee6f690207a242c2141a93f6b87a6 100644 --- a/statement-table/Cargo.toml +++ b/statement-table/Cargo.toml @@ -1,10 +1,10 @@ [package] name = "polkadot-statement-table" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" [dependencies] -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } primitives = { package = "polkadot-primitives", path = "../primitives" } diff --git a/statement-table/src/generic.rs b/statement-table/src/generic.rs index cb95d74d62237f48fd38aa25d0cc8bcf3456cda8..fe51965a232e652abc0c42aa18bae6bda07f9d29 100644 --- a/statement-table/src/generic.rs +++ b/statement-table/src/generic.rs @@ -30,7 +30,7 @@ use std::fmt::Debug; use primitives::v1::{ValidityAttestation as PrimitiveValidityAttestation, ValidatorSignature}; -use codec::{Encode, Decode}; +use parity_scale_codec::{Encode, Decode}; /// Context for the statement table. pub trait Context { @@ -159,7 +159,7 @@ enum ValidityVote { } /// A summary of import of a statement. -#[derive(Clone, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq, Debug)] pub struct Summary { /// The digest of the candidate referenced. pub candidate: D, @@ -256,15 +256,14 @@ impl CandidateData { // if it has enough validity votes // and no authorities have called it bad. fn can_be_included(&self, validity_threshold: usize) -> bool { - self.indicated_bad_by.is_empty() - && self.validity_votes.len() >= validity_threshold + self.validity_votes.len() >= validity_threshold } fn summary(&self, digest: C::Digest) -> Summary { Summary { candidate: digest, group_id: self.group_id.clone(), - validity_votes: self.validity_votes.len() - self.indicated_bad_by.len(), + validity_votes: self.validity_votes.len(), signalled_bad: self.indicated_bad(), } } @@ -362,6 +361,20 @@ impl Table { }) } + /// Get the attested candidate for `digest`. + /// + /// Returns `Some(_)` if the candidate exists and is includable. + pub fn attested_candidate(&self, digest: &C::Digest, context: &C) + -> Option> + { + self.candidate_votes.get(digest).and_then(|data| { + let v_threshold = context.requisite_votes(&data.group_id); + data.attested(v_threshold) + }) + } + /// Import a signed statement. Signatures should be checked for validity, and the /// sender should be checked to actually be an authority. /// @@ -489,7 +502,7 @@ impl Table { if new_proposal { self.candidate_votes.entry(digest.clone()).or_insert_with(move || CandidateData { group_id: group, - candidate: candidate, + candidate, validity_votes: HashMap::new(), indicated_bad_by: Vec::new(), }); @@ -581,7 +594,7 @@ impl Table { } Entry::Vacant(vacant) => { if let ValidityVote::Invalid(_) = vote { - votes.indicated_bad_by.push(from); + votes.indicated_bad_by.push(from.clone()); } vacant.insert(vote); @@ -595,7 +608,12 @@ impl Table { } } -fn update_includable_count(map: &mut HashMap, group_id: &G, was_includable: bool, is_includable: bool) { +fn update_includable_count( + map: &mut HashMap, + group_id: &G, + was_includable: bool, + is_includable: bool, +) { if was_includable && !is_includable { if let Entry::Occupied(mut entry) = map.entry(group_id.clone()) { *entry.get_mut() -= 1; @@ -989,7 +1007,7 @@ mod tests { candidate.indicated_bad_by.push(AuthorityId(1024)); - assert!(!candidate.can_be_included(validity_threshold)); + assert!(candidate.can_be_included(validity_threshold)); } #[test] @@ -1039,8 +1057,8 @@ mod tests { table.import_statement(&context, vote); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(3))); - assert!(!table.candidate_includable(&candidate_digest, &context)); - assert!(table.includable_count.is_empty()); + assert!(table.candidate_includable(&candidate_digest, &context)); + assert!(table.includable_count.get(&GroupId(2)).is_some()); } #[test] diff --git a/statement-table/src/lib.rs b/statement-table/src/lib.rs index fed60ded0da2a08a60e82d37ec80c3951e1a810b..a00b582b7dc7d6ab0fdd4c5b22995cb7023ccf6a 100644 --- a/statement-table/src/lib.rs +++ b/statement-table/src/lib.rs @@ -18,63 +18,21 @@ pub mod generic; pub use generic::{Table, Context}; -/// Concrete instantiations suitable for v0 primitives. -pub mod v0 { - use crate::generic; - use primitives::v0::{ - Hash, - Id, AbridgedCandidateReceipt, CompactStatement as PrimitiveStatement, ValidatorSignature, ValidatorIndex, - }; - - /// Statements about candidates on the network. - pub type Statement = generic::Statement; - - /// Signed statements about candidates. - pub type SignedStatement = generic::SignedStatement< - AbridgedCandidateReceipt, - Hash, - ValidatorIndex, - ValidatorSignature, - >; - - /// Kinds of misbehavior, along with proof. - pub type Misbehavior = generic::Misbehavior< - AbridgedCandidateReceipt, - Hash, - ValidatorIndex, - ValidatorSignature, - >; - - /// A summary of import of a statement. - pub type Summary = generic::Summary; - - impl<'a> From<&'a Statement> for PrimitiveStatement { - fn from(s: &'a Statement) -> PrimitiveStatement { - match *s { - generic::Statement::Valid(s) => PrimitiveStatement::Valid(s), - generic::Statement::Invalid(s) => PrimitiveStatement::Invalid(s), - generic::Statement::Candidate(ref s) => PrimitiveStatement::Candidate(s.hash()), - } - } - } -} - /// Concrete instantiations suitable for v1 primitives. pub mod v1 { use crate::generic; use primitives::v1::{ - Hash, - Id, CommittedCandidateReceipt, CompactStatement as PrimitiveStatement, + CandidateHash, Id, CommittedCandidateReceipt, CompactStatement as PrimitiveStatement, ValidatorSignature, ValidatorIndex, }; /// Statements about candidates on the network. - pub type Statement = generic::Statement; + pub type Statement = generic::Statement; /// Signed statements about candidates. pub type SignedStatement = generic::SignedStatement< CommittedCandidateReceipt, - Hash, + CandidateHash, ValidatorIndex, ValidatorSignature, >; @@ -82,13 +40,13 @@ pub mod v1 { /// Kinds of misbehavior, along with proof. pub type Misbehavior = generic::Misbehavior< CommittedCandidateReceipt, - Hash, + CandidateHash, ValidatorIndex, ValidatorSignature, >; /// 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/tests/purge_chain_works.rs b/tests/purge_chain_works.rs index 0051884cb3c6206a330c3da9068fd182414eb008..dcb5693e09eb51008d7d5e377ea85936a7abb8ae 100644 --- a/tests/purge_chain_works.rs +++ b/tests/purge_chain_works.rs @@ -35,8 +35,11 @@ fn purge_chain_works() { .unwrap(); // Let it produce some blocks. - thread::sleep(Duration::from_secs(30)); - assert!(cmd.try_wait().unwrap().is_none(), "the process should still be running"); + // poll once per second for faster failure + for _ in 0..30 { + thread::sleep(Duration::from_secs(1)); + assert!(cmd.try_wait().unwrap().is_none(), "the process should still be running"); + } // Stop the process kill(Pid::from_raw(cmd.id().try_into().unwrap()), SIGINT).unwrap(); diff --git a/validation/Cargo.toml b/validation/Cargo.toml index 8199980b0c636b8618af66425fb9d993520888c5..7800d39d76b62f40139854921557fc4c052f1367 100644 --- a/validation/Cargo.toml +++ b/validation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-validation" -version = "0.8.24" +version = "0.8.27" authors = ["Parity Technologies "] edition = "2018" @@ -13,10 +13,9 @@ sc-basic-authorship = { git = "https://github.com/paritytech/substrate", branch sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } consensus = { package = "sp-consensus", git = "https://github.com/paritytech/substrate", branch = "master" } runtime_primitives = { package = "sp-runtime", git = "https://github.com/paritytech/substrate", branch = "master" } -futures = "0.3.4" -log = "0.4.8" -derive_more = "0.14.1" -codec = { package = "parity-scale-codec", version = "1.3.4", default-features = false, features = ["derive"] } +futures = "0.3.8" +log = "0.4.11" +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } grandpa = { package = "sc-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master" } primitives = { package = "sp-core", git = "https://github.com/paritytech/substrate", branch = "master" } @@ -26,6 +25,7 @@ block-builder = { package = "sc-block-builder", git = "https://github.com/parity trie = { package = "sp-trie", git = "https://github.com/paritytech/substrate", branch = "master" } babe-primitives = { package = "sp-consensus-babe", git = "https://github.com/paritytech/substrate", branch = "master" } prometheus-endpoint = { package = "substrate-prometheus-endpoint", git = "https://github.com/paritytech/substrate", branch = "master" } +thiserror = "1.0.23" [dev-dependencies] sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/validation/src/block_production.rs b/validation/src/block_production.rs index 047a12a457bc9c7eaa5dbf493418768c90166b32..517d8ced816830ea33f88493e18444c3d9dfa7f9 100644 --- a/validation/src/block_production.rs +++ b/validation/src/block_production.rs @@ -28,6 +28,7 @@ use std::{ use sp_blockchain::HeaderBackend; use block_builder::{BlockBuilderApi, BlockBuilderProvider}; use consensus::{Proposal, RecordProof}; +use primitives::traits::SpawnNamed; use polkadot_primitives::v0::{NEW_HEADS_IDENTIFIER, Block, Header, AttestedCandidate}; use runtime_primitives::traits::{DigestFor, HashFor}; use txpool_api::TransactionPool; @@ -47,11 +48,13 @@ pub struct ProposerFactory { impl ProposerFactory { /// Create a new proposer factory. pub fn new( + spawn_handle: Box, client: Arc, transaction_pool: Arc, prometheus: Option<&PrometheusRegistry>, ) -> Self { let factory = sc_basic_authorship::ProposerFactory::new( + spawn_handle, client, transaction_pool, prometheus, diff --git a/validation/src/error.rs b/validation/src/error.rs index 913b110e7f6718e44916271f79bec607c8c05af7..0665a70f331289ae2508a84d07365f7d96e652f6 100644 --- a/validation/src/error.rs +++ b/validation/src/error.rs @@ -16,24 +16,25 @@ //! Errors that can occur during the validation process. +use thiserror::Error; + /// Error type for validation -#[derive(Debug, derive_more::Display, derive_more::From)] +#[derive(Debug, Error)] pub enum Error { /// Client error - Client(sp_blockchain::Error), + #[error(transparent)] + Client(#[from] sp_blockchain::Error), /// Consensus error - Consensus(consensus::error::Error), + #[error(transparent)] + Consensus(#[from] consensus::error::Error), /// Unexpected error checking inherents - #[display(fmt = "Unexpected error while checking inherents: {}", _0)] + #[error("Unexpected error while checking inherents: {0}")] InherentError(inherents::Error), } -impl std::error::Error for Error { - fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - match self { - Error::Client(ref err) => Some(err), - Error::Consensus(ref err) => Some(err), - _ => None, - } + +impl std::convert::From for Error { + fn from(inner: inherents::Error) -> Self { + Self::InherentError(inner) } } diff --git a/xcm/Cargo.toml b/xcm/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..27151453a73637672100811aed64afe61230fe74 --- /dev/null +++ b/xcm/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "xcm" +version = "0.8.22" +authors = ["Parity Technologies x"] +description = "The basic XCM datastructures." +edition = "2018" + +[dependencies] +parity-scale-codec = { version = "1.3.5", default-features = false, features = [ "derive" ] } + +[features] +default = ["std"] +wasm-api = [] +std = [ + "parity-scale-codec/std", +] diff --git a/xcm/src/lib.rs b/xcm/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..3dc99e07c705b6c35035a964acd93e468b0253b4 --- /dev/null +++ b/xcm/src/lib.rs @@ -0,0 +1,46 @@ +// Copyright 2020 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 . + +//! Cross-Consensus Message format data structures. + +// NOTE, this crate is meant to be used in many different environments, notably wasm, but not +// necessarily related to FRAME or even Substrate. +// +// Hence, `no_std` rather than sp-runtime. +#![no_std] +extern crate alloc; + +use parity_scale_codec::{Encode, Decode}; + +pub mod v0; + +/// A single XCM message, together with its version code. +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug)] +pub enum VersionedXcm { + V0(v0::Xcm), +} + +/// A versioned multi-location, a relative location of a cross-consensus system identifier. +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug)] +pub enum VersionedMultiLocation { + V0(v0::MultiLocation), +} + +/// A versioned multi-asset, an identifier for an asset within a consensus system. +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug)] +pub enum VersionedMultiAsset { + V0(v0::MultiAsset), +} diff --git a/xcm/src/v0/junction.rs b/xcm/src/v0/junction.rs new file mode 100644 index 0000000000000000000000000000000000000000..df11ab3fdedeac526e073401228a730372c8f85e --- /dev/null +++ b/xcm/src/v0/junction.rs @@ -0,0 +1,101 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// 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 Cumulus. If not, see . + +//! Support datastructures for `MultiLocation`, primarily the `Junction` datatype. + +use alloc::vec::Vec; +use parity_scale_codec::{self, Encode, Decode}; + +/// A global identifier of an account-bearing consensus system. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +pub enum NetworkId { + /// Unidentified/any. + Any, + /// Some named network. + Named(Vec), + /// The Polkadot Relay chain + Polkadot, + /// Kusama. + Kusama, +} + +/// A single item in a path to describe the relative location of a consensus system. +/// +/// Each item assumes a pre-existing location as its context and is defined in terms of it. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +pub enum Junction { + /// The consensus system of which the context is a member and state-wise super-set. + /// + /// NOTE: This item is *not* a sub-consensus item: a consensus system may not identify itself trustlessly as + /// a location that includes this junction. + Parent, + /// An indexed parachain belonging to and operated by the context. + /// + /// Generally used when the context is a Polkadot Relay-chain. + Parachain { #[codec(compact)] id: u32 }, + /// A 32-byte identifier for an account of a specific network that is respected as a sovereign endpoint within + /// the context. + /// + /// Generally used when the context is a Substrate-based chain. + AccountId32 { network: NetworkId, id: [u8; 32] }, + /// An 8-byte index for an account of a specific network that is respected as a sovereign endpoint within + /// the context. + /// + /// May be used when the context is a Frame-based chain and includes e.g. an indices pallet. + AccountIndex64 { network: NetworkId, #[codec(compact)] index: u64 }, + /// A 20-byte identifier for an account of a specific network that is respected as a sovereign endpoint within + /// the context. + /// + /// May be used when the context is an Ethereum or Bitcoin chain or smart-contract. + AccountKey20 { network: NetworkId, key: [u8; 20] }, + /// An instanced, indexed pallet that forms a constituent part of the context. + /// + /// Generally used when the context is a Frame-based chain. + PalletInstance { id: u8 }, + /// A non-descript index within the context location. + /// + /// Usage will vary widely owing to its generality. + /// + /// NOTE: Try to avoid using this and instead use a more specific item. + GeneralIndex { #[codec(compact)] id: u128 }, + /// A nondescript datum acting as a key within the context location. + /// + /// Usage will vary widely owing to its generality. + /// + /// NOTE: Try to avoid using this and instead use a more specific item. + GeneralKey(Vec), + /// The unambiguous child. + /// + /// Not currently used except as a fallback when deriving ancestry. + OnlyChild, +} + +impl Junction { + pub fn is_sub_consensus(&self) -> bool { + match self { + Junction::Parent => false, + + Junction::Parachain { .. } | + Junction::AccountId32 { .. } | + Junction::AccountIndex64 { .. } | + Junction::AccountKey20 { .. } | + Junction::PalletInstance { .. } | + Junction::GeneralIndex { .. } | + Junction::GeneralKey(..) | + Junction::OnlyChild => true, + } + } +} diff --git a/xcm/src/v0/mod.rs b/xcm/src/v0/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..c69093d4f8511523ff41aa166cc935304ff08385 --- /dev/null +++ b/xcm/src/v0/mod.rs @@ -0,0 +1,221 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// 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 Cumulus. If not, see . + +//! Version 0 of the Cross-Consensus Message format data structures. + +use core::{result, convert::TryFrom}; +use alloc::{boxed::Box, vec::Vec}; + +use parity_scale_codec::{self, Encode, Decode}; +use super::{VersionedXcm, VersionedMultiAsset}; + +mod junction; +mod multi_asset; +mod multi_location; +mod order; +mod traits; +pub use junction::{Junction, NetworkId}; +pub use multi_asset::{MultiAsset, AssetInstance}; +pub use multi_location::MultiLocation; +pub use order::Order; +pub use traits::{Error, Result, SendXcm, ExecuteXcm}; + +// TODO: Efficient encodings for Vec, Vec, using initial byte values 128+ to encode the number of +// items in the vector. + +/// Basically just the XCM (more general) version of `ParachainDispatchOrigin`. +#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode, Debug)] +pub enum OriginKind { + /// Origin should just be the native origin for the sender. For Cumulus/Frame chains this is + /// the `Parachain` origin. + Native, + + /// Origin should just be the standard account-based origin with the sovereign account of + /// the sender. For Cumulus/Frame chains, this is the `Signed` origin. + SovereignAccount, + + /// Origin should be the super-user. For Cumulus/Frame chains, this is the `Root` origin. + /// This will not usually be an available option. + Superuser, +} + +/// Cross-Consensus Message: A message from one consensus system to another. +/// +/// Consensus systems that may send and receive messages include blockchains and smart contracts. +/// +/// All messages are delivered from a known *origin*, expressed as a `MultiLocation`. +/// +/// This is the inner XCM format and is version-sensitive. Messages are typically passed using the outer +/// XCM format, known as `VersionedXcm`. +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug)] +pub enum Xcm { + /// Withdraw asset(s) (`assets`) from the ownership of `origin` and place them into `holding`. Execute the + /// orders (`effects`). + /// + /// - `assets`: The asset(s) to be withdrawn into holding. + /// - `effects`: The order(s) to execute on the holding account. + /// + /// Kind: *Instruction*. + /// + /// Errors: + WithdrawAsset { assets: Vec, effects: Vec }, + + /// Asset(s) (`assets`) have been received into the ownership of this system on the `origin` system. + /// + /// Some orders are given (`effects`) which should be executed once the corresponding derivative assets have + /// been placed into `holding`. + /// + /// - `assets`: The asset(s) that are minted into holding. + /// - `effects`: The order(s) to execute on the holding account. + /// + /// Safety: `origin` must be trusted to have received and be storing `assets` such that they may later be + /// withdrawn should this system send a corresponding message. + /// + /// Kind: *Trusted Indication*. + /// + /// Errors: + ReserveAssetDeposit { assets: Vec, effects: Vec }, + + /// Asset(s) (`assets`) have been destroyed on the `origin` system and equivalent assets should be + /// created on this system. + /// + /// Some orders are given (`effects`) which should be executed once the corresponding derivative assets have + /// been placed into `holding`. + /// + /// - `assets`: The asset(s) that are minted into holding. + /// - `effects`: The order(s) to execute on the holding account. + /// + /// Safety: `origin` must be trusted to have irrevocably destroyed the `assets` prior as a consequence of + /// sending this message. + /// + /// Kind: *Trusted Indication*. + /// + /// Errors: + TeleportAsset { assets: Vec, effects: Vec }, + + /// Indication of the contents of the holding account corresponding to the `QueryHolding` order of `query_id`. + /// + /// - `query_id`: The identifier of the query that resulted in this message being sent. + /// - `assets`: The message content. + /// + /// Safety: No concerns. + /// + /// Kind: *Information*. + /// + /// Errors: + Balances { #[codec(compact)] query_id: u64, assets: Vec }, + + /// Apply the encoded transaction `call`, whose dispatch-origin should be `origin` as expressed by the kind + /// of origin `origin_type`. + /// + /// - `origin_type`: The means of expressing the message origin as a dispatch origin. + /// - `call`: The encoded transaction to be applied. + /// + /// Safety: No concerns. + /// + /// Kind: *Instruction*. + /// + /// Errors: + Transact { origin_type: OriginKind, call: Vec }, + + /// Relay an inner message (`inner`) to a locally reachable destination ID `dest`. + /// + /// The message sent to the destination will be wrapped into a `RelayedFrom` message, with the + /// `superorigin` being this location. + /// + /// - `dest: MultiLocation`: The location of the to be relayed into. This may never contain `Parent`, and + /// it must be immediately reachable from the interpreting context. + /// - `inner: VersionedXcm`: The message to be wrapped and relayed. + /// + /// Safety: No concerns. + /// + /// Kind: *Instruction*. + /// + /// Errors: + RelayTo { dest: MultiLocation, inner: Box }, + + /// A message (`inner`) was sent to `origin` from `superorigin` with the intention of being relayed. + /// + /// - `superorigin`: The location of the `inner` message origin, **relative to `origin`**. + /// - `inner`: The message sent by the super origin. + /// + /// Safety: `superorigin` must express a sub-consensus only; it may *NEVER* contain a `Parent` junction. + /// + /// Kind: *Trusted Indication*. + /// + /// Errors: + RelayedFrom { superorigin: MultiLocation, inner: Box }, + + /// A message to notify about a new incoming HRMP channel. This message is meant to be sent by the + /// relay-chain to a para. + /// + /// - `sender`: The sender in the to-be opened channel. Also, the initiator of the channel opening. + /// - `max_message_size`: The maximum size of a message proposed by the sender. + /// - `max_capacity`: The maximum number of messages that can be queued in the channel. + /// + /// Safety: The message should originate directly from the relay-chain. + /// + /// Kind: *System Notification* + HrmpNewChannelOpenRequest { + #[codec(compact)] sender: u32, + #[codec(compact)] max_message_size: u32, + #[codec(compact)] max_capacity: u32, + }, + + /// A message to notify about that a previously sent open channel request has been accepted by + /// the recipient. That means that the channel will be opened during the next relay-chain session + /// change. This message is meant to be sent by the relay-chain to a para. + /// + /// Safety: The message should originate directly from the relay-chain. + /// + /// Kind: *System Notification* + /// + /// Errors: + HrmpChannelAccepted { + #[codec(compact)] recipient: u32, + }, + + /// A message to notify that the other party in an open channel decided to close it. In particular, + /// `inititator` is going to close the channel opened from `sender` to the `recipient`. The close + /// will be enacted at the next relay-chain session change. This message is meant to be sent by + /// the relay-chain to a para. + /// + /// Safety: The message should originate directly from the relay-chain. + /// + /// Kind: *System Notification* + /// + /// Errors: + HrmpChannelClosing { + #[codec(compact)] initiator: u32, + #[codec(compact)] sender: u32, + #[codec(compact)] recipient: u32, + }, +} + +impl From for VersionedXcm { + fn from(x: Xcm) -> Self { + VersionedXcm::V0(x) + } +} + +impl TryFrom for Xcm { + type Error = (); + fn try_from(x: VersionedXcm) -> result::Result { + match x { + VersionedXcm::V0(x) => Ok(x), + } + } +} diff --git a/xcm/src/v0/multi_asset.rs b/xcm/src/v0/multi_asset.rs new file mode 100644 index 0000000000000000000000000000000000000000..700bc78d60ba6b5b097dd59b273945c39e2bc8bb --- /dev/null +++ b/xcm/src/v0/multi_asset.rs @@ -0,0 +1,162 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// 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 Cumulus. If not, see . + +//! Cross-Consensus Message format data structures. + +use core::{result, convert::TryFrom}; +use alloc::vec::Vec; + +use parity_scale_codec::{self, Encode, Decode}; +use super::{MultiLocation, VersionedMultiAsset}; + +/// A general identifier for an instance of a non-fungible asset class. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +pub enum AssetInstance { + /// Undefined - used if the NFA class has only one instance. + Undefined, + + /// A compact index. Technically this could be greater than u128, but this implementation supports only + /// values up to `2**128 - 1`. + Index { #[codec(compact)] id: u128 }, + + /// A 4-byte fixed-length datum. + Array4([u8; 4]), + + /// An 8-byte fixed-length datum. + Array8([u8; 8]), + + /// A 16-byte fixed-length datum. + Array16([u8; 16]), + + /// A 32-byte fixed-length datum. + Array32([u8; 32]), + + /// An arbitrary piece of data. Use only when necessary. + Blob(Vec), +} + +/// A single general identifier for an asset. +/// +/// Represents both fungible and non-fungible assets. May only be used to represent a single asset class. +/// +/// Wildcards may or may not be allowed by the interpreting context. +/// +/// Assets classes may be identified in one of two ways: either an abstract identifier or a concrete identifier. +/// Implementations may support only one of these. A single asset may be referenced from multiple asset identifiers, +/// though will tend to have only a single *preferred* identifier. +/// +/// ### Abstract identifiers +/// +/// Abstract identifiers are absolute identifiers that represent a notional asset which can exist within multiple +/// consensus systems. These tend to be simpler to deal with since their broad meaning is unchanged regardless stay +/// of the consensus system in which it is interpreted. +/// +/// However, in the attempt to provide uniformity across consensus systems, they may conflate different instantiations +/// of some notional asset (e.g. the reserve asset and a local reserve-backed derivative of it) under the same name, +/// leading to confusion. It also implies that one notional asset is accounted for locally in only one way. This may +/// not be the case, e.g. where there are multiple bridge instances each providing a bridged "BTC" token yet none +/// being fungible between the others. +/// +/// Since they are meant to be absolute and universal, a global registry is needed to ensure that name collisions +/// do not occur. +/// +/// An abstract identifier is represented as a simple variable-size byte string. As of writing, no global registry +/// exists and no proposals have been put forth for asset labeling. +/// +/// ### Concrete identifiers +/// +/// Concrete identifiers are *relative identifiers* that specifically identify a single asset through its location in +/// a consensus system relative to the context interpreting. Use of a `MultiLocation` ensures that similar but non +/// fungible variants of the same underlying asset can be properly distinguished, and obviates the need for any kind +/// of central registry. +/// +/// The limitation is that the asset identifier cannot be trivially copied between consensus +/// systems and must instead be "re-anchored" whenever being moved to a new consensus system, using the two systems' +/// relative paths. +/// +/// Throughout XCM, messages are authored such that *when interpreted from the receiver's point of view* they will +/// have the desired meaning/effect. This means that relative paths should always by constructed to be read from the +/// point of view of the receiving system, *which may be have a completely different meaning in the authoring system*. +/// +/// Concrete identifiers are the preferred way of identifying an asset since they are entirely unambiguous. +/// +/// A concrete identifier is represented by a `MultiLocation`. If a system has an unambiguous primary asset (such as +/// Bitcoin with BTC or Ethereum with ETH), then it will conventionally be identified as the chain itself. Alternative +/// and more specific ways of referring to an asset within a system include: +/// +/// - `/PalletInstance()` for a Frame chain with a single-asset pallet instance (such as an instance of the +/// Balances pallet). +/// - `/PalletInstance()/GeneralIndex()` for a Frame chain with an indexed multi-asset pallet +/// instance (such as an instance of the Assets pallet). +/// - `/AccountId32` for an ERC-20-style single-asset smart-contract on a Frame-based contracts chain. +/// - `/AccountKey20` for an ERC-20-style single-asset smart-contract on an Ethereum-like chain. +/// +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +pub enum MultiAsset { + /// No assets. Rarely used. + None, + + /// All assets. Typically used for the subset of assets to be used for an `Order`, and in that context means + /// "all assets currently in holding". + All, + + /// All fungible assets. Typically used for the subset of assets to be used for an `Order`, and in that context + /// means "all fungible assets currently in holding". + AllFungible, + + /// All non-fungible assets. Typically used for the subset of assets to be used for an `Order`, and in that + /// context means "all non-fungible assets currently in holding". + AllNonFungible, + + /// All fungible assets of a given abstract asset `id`entifier. + AllAbstractFungible { id: Vec }, + + /// All non-fungible assets of a given abstract asset `class`. + AllAbstractNonFungible { class: Vec }, + + /// All fungible assets of a given concrete asset `id`entifier. + AllConcreteFungible { id: MultiLocation }, + + /// All non-fungible assets of a given concrete asset `class`. + AllConcreteNonFungible { class: MultiLocation }, + + /// Some specific `amount` of the fungible asset identified by an abstract `id`. + AbstractFungible { id: Vec, #[codec(compact)] amount: u128 }, + + /// Some specific `instance` of the non-fungible asset whose `class` is identified abstractly. + AbstractNonFungible { class: Vec, instance: AssetInstance }, + + /// Some specific `amount` of the fungible asset identified by an concrete `id`. + ConcreteFungible { id: MultiLocation, #[codec(compact)] amount: u128 }, + + /// Some specific `instance` of the non-fungible asset whose `class` is identified concretely. + ConcreteNonFungible { class: MultiLocation, instance: AssetInstance }, +} + +impl From for VersionedMultiAsset { + fn from(x: MultiAsset) -> Self { + VersionedMultiAsset::V0(x) + } +} + +impl TryFrom for MultiAsset { + type Error = (); + fn try_from(x: VersionedMultiAsset) -> result::Result { + match x { + VersionedMultiAsset::V0(x) => Ok(x), + } + } +} diff --git a/xcm/src/v0/multi_location.rs b/xcm/src/v0/multi_location.rs new file mode 100644 index 0000000000000000000000000000000000000000..ba3ef8c827dba67ec05cee780d5a37b598f83b01 --- /dev/null +++ b/xcm/src/v0/multi_location.rs @@ -0,0 +1,393 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// 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 Cumulus. If not, see . + +//! Cross-Consensus Message format data structures. + +use core::{result, mem, convert::TryFrom}; + +use parity_scale_codec::{self, Encode, Decode}; +use super::Junction; +use crate::VersionedMultiLocation; + +/// A relative path between state-bearing consensus systems. +/// +/// A location in a consensus system is defined as an *isolatable state machine* held within global consensus. The +/// location in question need not have a sophisticated consensus algorithm of its own; a single account within +/// Ethereum, for example, could be considered a location. +/// +/// A very-much non-exhaustive list of types of location include: +/// - A (normal, layer-1) block chain, e.g. the Bitcoin mainnet or a parachain. +/// - A layer-0 super-chain, e.g. the Polkadot Relay chain. +/// - A layer-2 smart contract, e.g. an ERC-20 on Ethereum. +/// - A logical functional component of a chain, e.g. a single instance of a pallet on a Frame-based Substrate chain. +/// - An account. +/// +/// A `MultiLocation` is a *relative identifier*, meaning that it can only be used to define the relative path +/// between two locations, and cannot generally be used to refer to a location universally. It is comprised of a +/// number of *junctions*, each morphing the previous location, either diving down into one of its internal locations, +/// called a *sub-consensus*, or going up into its parent location. Correct `MultiLocation` values must have all +/// `Parent` junctions as a prefix to all *sub-consensus* junctions. +/// +/// This specific `MultiLocation` implementation uses a Rust `enum` in order to make pattern matching easier. +/// +/// The `MultiLocation` value of `Null` simply refers to the interpreting consensus system. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug)] +pub enum MultiLocation { + /// The interpreting consensus system. + Null, + /// A relative path comprising one junction. + X1(Junction), + /// A relative path comprising two junctions. + X2(Junction, Junction), + /// A relative path comprising three junctions. + X3(Junction, Junction, Junction), + /// A relative path comprising four junctions. + X4(Junction, Junction, Junction, Junction), +} + +impl From for MultiLocation { + fn from(x: Junction) -> Self { + MultiLocation::X1(x) + } +} + +impl From<()> for MultiLocation { + fn from(_: ()) -> Self { + MultiLocation::Null + } +} +impl From<(Junction,)> for MultiLocation { + fn from(x: (Junction,)) -> Self { + MultiLocation::X1(x.0) + } +} +impl From<(Junction, Junction)> for MultiLocation { + fn from(x: (Junction, Junction)) -> Self { + MultiLocation::X2(x.0, x.1) + } +} +impl From<(Junction, Junction, Junction)> for MultiLocation { + fn from(x: (Junction, Junction, Junction)) -> Self { + MultiLocation::X3(x.0, x.1, x.2) + } +} +impl From<(Junction, Junction, Junction, Junction)> for MultiLocation { + fn from(x: (Junction, Junction, Junction, Junction)) -> Self { + MultiLocation::X4(x.0, x.1, x.2, x.3) + } +} + +impl From<[Junction; 0]> for MultiLocation { + fn from(_: [Junction; 0]) -> Self { + MultiLocation::Null + } +} +impl From<[Junction; 1]> for MultiLocation { + fn from(x: [Junction; 1]) -> Self { + let [x0] = x; + MultiLocation::X1(x0) + } +} +impl From<[Junction; 2]> for MultiLocation { + fn from(x: [Junction; 2]) -> Self { + let [x0, x1] = x; + MultiLocation::X2(x0, x1) + } +} +impl From<[Junction; 3]> for MultiLocation { + fn from(x: [Junction; 3]) -> Self { + let [x0, x1, x2] = x; + MultiLocation::X3(x0, x1, x2) + } +} +impl From<[Junction; 4]> for MultiLocation { + fn from(x: [Junction; 4]) -> Self { + let [x0, x1, x2, x3] = x; + MultiLocation::X4(x0, x1, x2, x3) + } +} + +pub struct MultiLocationIterator(MultiLocation); +impl Iterator for MultiLocationIterator { + type Item = Junction; + fn next(&mut self) -> Option { + self.0.take_first() + } +} + +pub struct MultiLocationReverseIterator(MultiLocation); +impl Iterator for MultiLocationReverseIterator { + type Item = Junction; + fn next(&mut self) -> Option { + self.0.take_last() + } +} + +pub struct MultiLocationRefIterator<'a>(&'a MultiLocation, usize); +impl<'a> Iterator for MultiLocationRefIterator<'a> { + type Item = &'a Junction; + fn next(&mut self) -> Option<&'a Junction> { + let result = self.0.at(self.1); + self.1 += 1; + result + } +} + +pub struct MultiLocationReverseRefIterator<'a>(&'a MultiLocation, usize); +impl<'a> Iterator for MultiLocationReverseRefIterator<'a> { + type Item = &'a Junction; + fn next(&mut self) -> Option<&'a Junction> { + self.1 += 1; + self.0.at(self.0.len().checked_sub(self.1)?) + } +} + +impl MultiLocation { + /// Returns first junction, or `None` if the location is empty. + pub fn first(&self) -> Option<&Junction> { + match &self { + MultiLocation::Null => None, + MultiLocation::X1(ref a) => Some(a), + MultiLocation::X2(ref a, ..) => Some(a), + MultiLocation::X3(ref a, ..) => Some(a), + MultiLocation::X4(ref a, ..) => Some(a), + } + } + + /// Returns last junction, or `None` if the location is empty. + pub fn last(&self) -> Option<&Junction> { + match &self { + MultiLocation::Null => None, + MultiLocation::X1(ref a) => Some(a), + MultiLocation::X2(.., ref a) => Some(a), + MultiLocation::X3(.., ref a) => Some(a), + MultiLocation::X4(.., ref a) => Some(a), + } + } + + /// Splits off the first junction, returning the remaining suffix (first item in tuple) and the first element + /// (second item in tuple) or `None` if it was empty. + pub fn split_first(self) -> (MultiLocation, Option) { + match self { + MultiLocation::Null => (MultiLocation::Null, None), + MultiLocation::X1(a) => (MultiLocation::Null, Some(a)), + MultiLocation::X2(a, b) => (MultiLocation::X1(b), Some(a)), + MultiLocation::X3(a, b, c) => (MultiLocation::X2(b, c), Some(a)), + MultiLocation::X4(a, b, c ,d) => (MultiLocation::X3(b, c, d), Some(a)), + } + } + + /// Splits off the last junction, returning the remaining prefix (first item in tuple) and the last element + /// (second item in tuple) or `None` if it was empty. + pub fn split_last(self) -> (MultiLocation, Option) { + match self { + MultiLocation::Null => (MultiLocation::Null, None), + MultiLocation::X1(a) => (MultiLocation::Null, Some(a)), + MultiLocation::X2(a, b) => (MultiLocation::X1(a), Some(b)), + MultiLocation::X3(a, b, c) => (MultiLocation::X2(a, b), Some(c)), + MultiLocation::X4(a, b, c ,d) => (MultiLocation::X3(a, b, c), Some(d)), + } + } + + /// Removes the first element from `self`, returning it (or `None` if it was empty). + pub fn take_first(&mut self) -> Option { + let mut d = MultiLocation::Null; + mem::swap(&mut *self, &mut d); + let (tail, head) = d.split_first(); + *self = tail; + head + } + + /// Removes the last element from `self`, returning it (or `None` if it was empty). + pub fn take_last(&mut self) -> Option { + let mut d = MultiLocation::Null; + mem::swap(&mut *self, &mut d); + let (head, tail) = d.split_last(); + *self = head; + tail + } + + /// Consumes `self` and returns a `MultiLocation` suffixed with `new`, or an `Err` with the original value of + /// `self` in case of overflow. + pub fn pushed_with(self, new: Junction) -> result::Result { + Ok(match self { + MultiLocation::Null => MultiLocation::X1(new), + MultiLocation::X1(a) => MultiLocation::X2(a, new), + MultiLocation::X2(a, b) => MultiLocation::X3(a, b, new), + MultiLocation::X3(a, b, c) => MultiLocation::X4(a, b, c, new), + s => Err(s)?, + }) + } + + /// Consumes `self` and returns a `MultiLocation` prefixed with `new`, or an `Err` with the original value of + /// `self` in case of overflow. + pub fn pushed_front_with(self, new: Junction) -> result::Result { + Ok(match self { + MultiLocation::Null => MultiLocation::X1(new), + MultiLocation::X1(a) => MultiLocation::X2(new, a), + MultiLocation::X2(a, b) => MultiLocation::X3(new, a, b), + MultiLocation::X3(a, b, c) => MultiLocation::X4(new, a, b, c), + s => Err(s)?, + }) + } + + /// Returns the number of junctions in `self`. + pub fn len(&self) -> usize { + match &self { + MultiLocation::Null => 0, + MultiLocation::X1(..) => 1, + MultiLocation::X2(..) => 2, + MultiLocation::X3(..) => 3, + MultiLocation::X4(..) => 4, + } + } + + /// Returns the junction at index `i`, or `None` if the location doesn't contain that many elements. + pub fn at(&self, i: usize) -> Option<&Junction> { + Some(match (i, &self) { + (0, MultiLocation::X1(ref a)) => a, + (0, MultiLocation::X2(ref a, ..)) => a, + (0, MultiLocation::X3(ref a, ..)) => a, + (0, MultiLocation::X4(ref a, ..)) => a, + (1, MultiLocation::X2(_, ref a)) => a, + (1, MultiLocation::X3(_, ref a, ..)) => a, + (1, MultiLocation::X4(_, ref a, ..)) => a, + (2, MultiLocation::X3(_, _, ref a)) => a, + (2, MultiLocation::X4(_, _, ref a, ..)) => a, + (3, MultiLocation::X4(_, _, _, ref a)) => a, + _ => return None, + }) + } + + /// Returns a mutable reference to the junction at index `i`, or `None` if the location doesn't contain that many + /// elements. + pub fn at_mut(&mut self, i: usize) -> Option<&mut Junction> { + Some(match (i, self) { + (0, MultiLocation::X1(ref mut a)) => a, + (0, MultiLocation::X2(ref mut a, ..)) => a, + (0, MultiLocation::X3(ref mut a, ..)) => a, + (0, MultiLocation::X4(ref mut a, ..)) => a, + (1, MultiLocation::X2(_, ref mut a)) => a, + (1, MultiLocation::X3(_, ref mut a, ..)) => a, + (1, MultiLocation::X4(_, ref mut a, ..)) => a, + (2, MultiLocation::X3(_, _, ref mut a)) => a, + (2, MultiLocation::X4(_, _, ref mut a, ..)) => a, + (3, MultiLocation::X4(_, _, _, ref mut a)) => a, + _ => return None, + }) + } + + /// Returns a reference iterator over the junctions. + pub fn iter(&self) -> MultiLocationRefIterator { + MultiLocationRefIterator(&self, 0) + } + + /// Returns a reference iterator over the junctions in reverse. + pub fn iter_rev(&self) -> MultiLocationReverseRefIterator { + MultiLocationReverseRefIterator(&self, 0) + } + + /// Consumes `self` and returns an iterator over the junctions. + pub fn into_iter(self) -> MultiLocationIterator { + MultiLocationIterator(self) + } + + /// Consumes `self` and returns an iterator over the junctions in reverse. + pub fn into_iter_rev(self) -> MultiLocationReverseIterator { + MultiLocationReverseIterator(self) + } + + /// Mutates `self`, suffixing it with `new`. Returns `Err` in case of overflow. + pub fn push(&mut self, new: Junction) -> result::Result<(), ()> { + let mut n = MultiLocation::Null; + mem::swap(&mut *self, &mut n); + match n.pushed_with(new) { + Ok(result) => { *self = result; Ok(()) } + Err(old) => { *self = old; Err(()) } + } + } + + + /// Mutates `self`, prefixing it with `new`. Returns `Err` in case of overflow. + pub fn push_front(&mut self, new: Junction) -> result::Result<(), ()> { + let mut n = MultiLocation::Null; + mem::swap(&mut *self, &mut n); + match n.pushed_front_with(new) { + Ok(result) => { *self = result; Ok(()) } + Err(old) => { *self = old; Err(()) } + } + } + + /// Returns the number of `Parent` junctions at the beginning of `self`. + pub fn parent_count(&self) -> usize { + match self { + MultiLocation::X4(Junction::Parent, Junction::Parent, Junction::Parent, Junction::Parent) => 4, + MultiLocation::X4(Junction::Parent, Junction::Parent, Junction::Parent, ..) => 3, + MultiLocation::X3(Junction::Parent, Junction::Parent, Junction::Parent) => 3, + MultiLocation::X4(Junction::Parent, Junction::Parent, ..) => 2, + MultiLocation::X3(Junction::Parent, Junction::Parent, ..) => 2, + MultiLocation::X2(Junction::Parent, Junction::Parent) => 2, + MultiLocation::X4(Junction::Parent, ..) => 1, + MultiLocation::X3(Junction::Parent, ..) => 1, + MultiLocation::X2(Junction::Parent, ..) => 1, + MultiLocation::X1(Junction::Parent) => 1, + _ => 0, + } + } + + /// Mutate `self` so that it is prefixed with `prefix`. The correct normalised form is returned, removing any + /// internal `Parent`s. + /// + /// Does not modify `self` and returns `Err` with `prefix` in case of overflow. + pub fn prepend_with(&mut self, prefix: MultiLocation) -> Result<(), MultiLocation> { + let self_parents = self.parent_count(); + let prefix_rest = prefix.len() - prefix.parent_count(); + let skipped = self_parents.min(prefix_rest); + if self.len() + prefix.len() - 2 * skipped > 4 { + return Err(prefix); + } + + let mut prefix = prefix; + while match (prefix.last(), self.first()) { + (Some(x), Some(Junction::Parent)) if x != &Junction::Parent => { + prefix.take_last(); + self.take_first(); + true + } + _ => false, + } {} + + for j in prefix.into_iter_rev() { + self.push_front(j).expect("len + prefix minus 2*skipped is less than 4; qed"); + } + Ok(()) + } +} + +impl From for VersionedMultiLocation { + fn from(x: MultiLocation) -> Self { + VersionedMultiLocation::V0(x) + } +} + +impl TryFrom for MultiLocation { + type Error = (); + fn try_from(x: VersionedMultiLocation) -> result::Result { + match x { + VersionedMultiLocation::V0(x) => Ok(x), + } + } +} diff --git a/xcm/src/v0/order.rs b/xcm/src/v0/order.rs new file mode 100644 index 0000000000000000000000000000000000000000..df7a215015ec42eab346bf35ec7f8575fe791746 --- /dev/null +++ b/xcm/src/v0/order.rs @@ -0,0 +1,92 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// 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 Cumulus. If not, see . + +//! Version 0 of the Cross-Consensus Message format data structures. + +use alloc::vec::Vec; +use parity_scale_codec::{self, Encode, Decode}; +use super::{MultiAsset, MultiLocation}; + +/// An instruction to be executed on some or all of the assets in holding, used by asset-related XCM messages. +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug)] +pub enum Order { + /// Do nothing. Not generally used. + Null, + + /// Remove the asset(s) (`assets`) from holding and place equivalent assets under the ownership of `dest` within + /// this consensus system. + /// + /// - `assets`: The asset(s) to remove from holding. + /// - `dest`: The new owner for the assets. + /// + /// Errors: + DepositAsset { assets: Vec, dest: MultiLocation }, + + /// Remove the asset(s) (`assets`) from holding and place equivalent assets under the ownership of `dest` within + /// this consensus system. + /// + /// Send an onward XCM message to `dest` of `ReserveAssetDeposit` with the + /// + /// - `assets`: The asset(s) to remove from holding. + /// - `dest`: The new owner for the assets. + /// - `effects`: The orders that should be contained in the `ReserveAssetDeposit` which is sent onwards to + /// `dest. + /// + /// Errors: + DepositReserveAsset { assets: Vec, dest: MultiLocation, effects: Vec }, + + /// Remove the asset(s) (`give`) from holding and replace them with alternative assets. + /// + /// The minimum amount of assets to be received into holding for the order not to fail may be stated. + /// + /// - `give`: The asset(s) to remove from holding. + /// - `receive`: The minimum amount of assets(s) which `give` should be exchanged for. The meaning of wildcards + /// is undefined and they should be not be used. + /// + /// Errors: + ExchangeAsset { give: Vec, receive: Vec }, + + /// Remove the asset(s) (`assets`) from holding and send a `WithdrawAsset` XCM message to a reserve location. + /// + /// - `assets`: The asset(s) to remove from holding. + /// - `reserve`: A valid location that acts as a reserve for all asset(s) in `assets`. The sovereign account + /// of this consensus system *on the reserve location* will have appropriate assets withdrawn and `effects` will + /// be executed on them. There will typically be only one valid location on any given asset/chain combination. + /// - `effects`: The orders to execute on the assets once withdrawn *on the reserve location*. + /// + /// Errors: + InitiateReserveWithdraw { assets: Vec, reserve: MultiLocation, effects: Vec }, + + /// Remove the asset(s) (`assets`) from holding and send a `TeleportAsset` XCM message to a destination location. + /// + /// - `assets`: The asset(s) to remove from holding. + /// - `destination`: A valid location that has a bi-lateral teleportation arrangement. + /// - `effects`: The orders to execute on the assets once arrived *on the destination location*. + /// + /// Errors: + InitiateTeleport { assets: Vec, dest: MultiLocation, effects: Vec }, + + /// Send a `Balances` XCM message with the `assets` value equal to the holding contents, or a portion thereof. + /// + /// - `query_id`: An identifier that will be replicated into the returned XCM message. + /// - `dest`: A valid destination for the returned XCM message. This may be limited to the current origin. + /// - `assets`: A filter for the assets that should be reported back. The assets reported back will be, asset- + /// wise, *the lesser of this value and the holding account*. No wildcards will be used when reporting assets + /// back. + /// + /// Errors: + QueryHolding { #[codec(compact)] query_id: u64, dest: MultiLocation, assets: Vec }, +} diff --git a/xcm/src/v0/traits.rs b/xcm/src/v0/traits.rs new file mode 100644 index 0000000000000000000000000000000000000000..661e71fe0877da6891cfec4e4c461719847fac77 --- /dev/null +++ b/xcm/src/v0/traits.rs @@ -0,0 +1,67 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// 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 Cumulus. If not, see . + +//! Cross-Consensus Message format data structures. + +use core::result; +use parity_scale_codec::{Encode, Decode}; + +use super::{MultiLocation, Xcm}; + +#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Ord, PartialOrd, Debug)] +pub enum Error { + Undefined, + Unimplemented, + UnhandledXcmVersion, + UnhandledXcmMessage, + UnhandledEffect, + EscalationOfPrivilege, + UntrustedReserveLocation, + UntrustedTeleportLocation, + DestinationBufferOverflow, + CannotReachDestination, + MultiLocationFull, + FailedToDecode, + BadOrigin, +} + +impl From<()> for Error { + fn from(_: ()) -> Self { + Self::Undefined + } +} + +pub type Result = result::Result<(), Error>; + +pub trait ExecuteXcm { + fn execute_xcm(origin: MultiLocation, msg: Xcm) -> Result; +} + +impl ExecuteXcm for () { + fn execute_xcm(_origin: MultiLocation, _msg: Xcm) -> Result { + Err(Error::Unimplemented) + } +} + +pub trait SendXcm { + fn send_xcm(dest: MultiLocation, msg: Xcm) -> Result; +} + +impl SendXcm for () { + fn send_xcm(_dest: MultiLocation, _msg: Xcm) -> Result { + Err(Error::Unimplemented) + } +} diff --git a/xcm/xcm-builder/Cargo.toml b/xcm/xcm-builder/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..ec9fa17ceb63db8c44a50bd2a0091562ebe0ba37 --- /dev/null +++ b/xcm/xcm-builder/Cargo.toml @@ -0,0 +1,33 @@ +[package] +authors = ["Parity Technologies "] +edition = "2018" +name = "xcm-builder" +description = "Tools & types for building with XCM and its executor." +version = "0.8.22" + +[dependencies] +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +xcm = { path = "..", default-features = false } +xcm-executor = { path = "../xcm-executor", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +# Polkadot dependencies +polkadot-parachain = { path = "../../parachain", default-features = false } + +[features] +default = ["std"] +std = [ + "parity-scale-codec/std", + "xcm/std", + "xcm-executor/std", + "sp-std/std", + "sp-arithmetic/std", + "sp-io/std", + "sp-runtime/std", + "frame-support/std", + "polkadot-parachain/std", +] diff --git a/xcm/xcm-builder/src/currency_adapter.rs b/xcm/xcm-builder/src/currency_adapter.rs new file mode 100644 index 0000000000000000000000000000000000000000..09b61ab6bb57b3e15ffa14e4e580e1f34104c144 --- /dev/null +++ b/xcm/xcm-builder/src/currency_adapter.rs @@ -0,0 +1,54 @@ +// Copyright 2020 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 sp_std::{result, convert::TryInto, marker::PhantomData}; +use xcm::v0::{Error, Result, MultiAsset, MultiLocation}; +use sp_arithmetic::traits::SaturatedConversion; +use frame_support::traits::{ExistenceRequirement::AllowDeath, WithdrawReasons}; +use xcm_executor::traits::{MatchesFungible, LocationConversion, TransactAsset}; + +pub struct CurrencyAdapter( + PhantomData, + PhantomData, + PhantomData, + PhantomData, +); + +impl< + Matcher: MatchesFungible, + AccountIdConverter: LocationConversion, + Currency: frame_support::traits::Currency, + AccountId, // can't get away without it since Currency is generic over it. +> TransactAsset for CurrencyAdapter { + + fn deposit_asset(what: &MultiAsset, who: &MultiLocation) -> Result { + // Check we handle this asset. + let amount: u128 = Matcher::matches_fungible(&what).ok_or(())?.saturated_into(); + let who = AccountIdConverter::from_location(who).ok_or(())?; + let balance_amount = amount.try_into().map_err(|_| ())?; + let _imbalance = Currency::deposit_creating(&who, balance_amount); + Ok(()) + } + + fn withdraw_asset(what: &MultiAsset, who: &MultiLocation) -> result::Result { + // Check we handle this asset. + let amount: u128 = Matcher::matches_fungible(&what).ok_or(())?.saturated_into(); + let who = AccountIdConverter::from_location(who).ok_or(())?; + let balance_amount = amount.try_into().map_err(|_| ())?; + Currency::withdraw(&who, balance_amount, WithdrawReasons::TRANSFER, AllowDeath).map_err(|_| ())?; + Ok(what.clone()) + } +} diff --git a/xcm/xcm-builder/src/lib.rs b/xcm/xcm-builder/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..9dd62f84305e231c762de36904aac3cd61af9076 --- /dev/null +++ b/xcm/xcm-builder/src/lib.rs @@ -0,0 +1,56 @@ +// Copyright 2020 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 . + +#![cfg_attr(not(feature = "std"), no_std)] + +mod location_conversion; +pub use location_conversion::{ + Account32Hash, ParentIsDefault, ChildParachainConvertsVia, SiblingParachainConvertsVia, AccountId32Aliases +}; + +mod origin_conversion; +pub use origin_conversion::{ + SovereignSignedViaLocation, ParentAsSuperuser, ChildSystemParachainAsSuperuser, SiblingSystemParachainAsSuperuser, + ChildParachainAsNative, SiblingParachainAsNative, RelayChainAsNative, SignedAccountId32AsNative +}; + +mod currency_adapter; +pub use currency_adapter::CurrencyAdapter; + +use sp_std::marker::PhantomData; +use xcm_executor::traits::InvertLocation; +use xcm::v0::{MultiLocation, Junction}; +use frame_support::traits::Get; + +/// Simple location inverter; give it this location's ancestry and it'll +pub struct LocationInverter(PhantomData); + +impl> InvertLocation for LocationInverter { + fn invert_location(location: &MultiLocation) -> MultiLocation { + let mut ancestry = Ancestry::get(); + let mut result = location.clone(); + for (i, j) in location.iter_rev() + .map(|j| match j { + Junction::Parent => ancestry.take_first().unwrap_or(Junction::OnlyChild), + _ => Junction::Parent, + }) + .enumerate() + { + *result.at_mut(i).expect("location and result begin equal; same size; qed") = j; + } + result + } +} diff --git a/xcm/xcm-builder/src/location_conversion.rs b/xcm/xcm-builder/src/location_conversion.rs new file mode 100644 index 0000000000000000000000000000000000000000..88575b6df61b7698db4a9dd6149420bdebed99b9 --- /dev/null +++ b/xcm/xcm-builder/src/location_conversion.rs @@ -0,0 +1,126 @@ +// Copyright 2020 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 sp_std::marker::PhantomData; +use sp_io::hashing::blake2_256; +use sp_runtime::traits::AccountIdConversion; +use frame_support::traits::Get; +use parity_scale_codec::Encode; +use xcm::v0::{MultiLocation, NetworkId, Junction}; +use xcm_executor::traits::LocationConversion; + +pub struct Account32Hash(PhantomData<(Network, AccountId)>); + +impl< + Network: Get, + AccountId: From<[u8; 32]> + Into<[u8; 32]>, +> LocationConversion for Account32Hash { + fn from_location(location: &MultiLocation) -> Option { + Some(("multiloc", location).using_encoded(blake2_256).into()) + } + + fn try_into_location(who: AccountId) -> Result { + Err(who) + } +} + +pub struct ParentIsDefault(PhantomData); + +impl< + AccountId: Default + Eq, +> LocationConversion for ParentIsDefault { + fn from_location(location: &MultiLocation) -> Option { + if let MultiLocation::X1(Junction::Parent) = location { + Some(AccountId::default()) + } else { + None + } + } + + fn try_into_location(who: AccountId) -> Result { + if who == AccountId::default() { + Ok(Junction::Parent.into()) + } else { + Err(who) + } + } +} + +pub struct ChildParachainConvertsVia(PhantomData<(ParaId, AccountId)>); + +impl< + ParaId: From + Into + AccountIdConversion, + AccountId, +> LocationConversion for ChildParachainConvertsVia { + fn from_location(location: &MultiLocation) -> Option { + if let MultiLocation::X1(Junction::Parachain { id }) = location { + Some(ParaId::from(*id).into_account()) + } else { + None + } + } + + fn try_into_location(who: AccountId) -> Result { + if let Some(id) = ParaId::try_from_account(&who) { + Ok(Junction::Parachain { id: id.into() }.into()) + } else { + Err(who) + } + } +} + +pub struct SiblingParachainConvertsVia(PhantomData<(ParaId, AccountId)>); + +impl< + ParaId: From + Into + AccountIdConversion, + AccountId, +> LocationConversion for SiblingParachainConvertsVia { + fn from_location(location: &MultiLocation) -> Option { + if let MultiLocation::X2(Junction::Parent, Junction::Parachain { id }) = location { + Some(ParaId::from(*id).into_account()) + } else { + None + } + } + + fn try_into_location(who: AccountId) -> Result { + if let Some(id) = ParaId::try_from_account(&who) { + Ok([Junction::Parent, Junction::Parachain { id: id.into() }].into()) + } else { + Err(who) + } + } +} + +pub struct AccountId32Aliases(PhantomData<(Network, AccountId)>); + +impl< + Network: Get, + AccountId: From<[u8; 32]> + Into<[u8; 32]>, +> LocationConversion for AccountId32Aliases { + fn from_location(location: &MultiLocation) -> Option { + if let MultiLocation::X1(Junction::AccountId32 { id, network }) = location { + if matches!(network, NetworkId::Any) || network == &Network::get() { + return Some((*id).into()) + } + } + None + } + + fn try_into_location(who: AccountId) -> Result { + Ok(Junction::AccountId32 { id: who.into(), network: Network::get() }.into()) + } +} diff --git a/xcm/xcm-builder/src/origin_conversion.rs b/xcm/xcm-builder/src/origin_conversion.rs new file mode 100644 index 0000000000000000000000000000000000000000..86b9b263609dd3bc2209fd9f0ff963de0a655d84 --- /dev/null +++ b/xcm/xcm-builder/src/origin_conversion.rs @@ -0,0 +1,150 @@ +// Copyright 2020 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 sp_std::marker::PhantomData; +use frame_support::traits::{Get, OriginTrait}; +use xcm::v0::{MultiLocation, OriginKind, NetworkId, Junction}; +use xcm_executor::traits::{LocationConversion, ConvertOrigin}; +use polkadot_parachain::primitives::IsSystem; + +/// Sovereign accounts use the system's `Signed` origin with an account ID derived from the +/// `LocationConverter`. +pub struct SovereignSignedViaLocation( + PhantomData<(LocationConverter, Origin)> +); +impl< + LocationConverter: LocationConversion, + Origin: OriginTrait, +> ConvertOrigin for SovereignSignedViaLocation { + fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + if let OriginKind::SovereignAccount = kind { + let location = LocationConverter::from_location(&origin).ok_or(origin)?; + Ok(Origin::signed(location).into()) + } else { + Err(origin) + } + } +} + +pub struct ParentAsSuperuser(PhantomData); +impl< + Origin: OriginTrait, +> ConvertOrigin for ParentAsSuperuser { + fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + match (kind, origin) { + (OriginKind::Superuser, MultiLocation::X1(Junction::Parent)) => + Ok(Origin::root()), + (_, origin) => Err(origin), + } + } +} + +pub struct ChildSystemParachainAsSuperuser(PhantomData<(ParaId, Origin)>); +impl< + ParaId: IsSystem + From, + Origin: OriginTrait, +> ConvertOrigin for ChildSystemParachainAsSuperuser { + fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + match (kind, origin) { + (OriginKind::Superuser, MultiLocation::X1(Junction::Parachain { id })) + if ParaId::from(id).is_system() => + Ok(Origin::root()), + (_, origin) => Err(origin), + } + } +} + +pub struct SiblingSystemParachainAsSuperuser(PhantomData<(ParaId, Origin)>); +impl< + ParaId: IsSystem + From, + Origin: OriginTrait +> ConvertOrigin for SiblingSystemParachainAsSuperuser { + fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + match (kind, origin) { + (OriginKind::Superuser, MultiLocation::X2(Junction::Parent, Junction::Parachain { id })) + if ParaId::from(id).is_system() => + Ok(Origin::root()), + (_, origin) => Err(origin), + } + } +} + +pub struct ChildParachainAsNative( + PhantomData<(ParachainOrigin, Origin)> +); +impl< + ParachainOrigin: From, + Origin: From, +> ConvertOrigin for ChildParachainAsNative { + fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + match (kind, origin) { + (OriginKind::Native, MultiLocation::X1(Junction::Parachain { id })) + => Ok(Origin::from(ParachainOrigin::from(id))), + (_, origin) => Err(origin), + } + } +} + +pub struct SiblingParachainAsNative( + PhantomData<(ParachainOrigin, Origin)> +); +impl< + ParachainOrigin: From, + Origin: From, +> ConvertOrigin for SiblingParachainAsNative { + fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + match (kind, origin) { + (OriginKind::Native, MultiLocation::X2(Junction::Parent, Junction::Parachain { id })) + => Ok(Origin::from(ParachainOrigin::from(id))), + (_, origin) => Err(origin), + } + } +} + +// Our Relay-chain has a native origin given by the `Get`ter. +pub struct RelayChainAsNative( + PhantomData<(RelayOrigin, Origin)> +); +impl< + RelayOrigin: Get, + Origin, +> ConvertOrigin for RelayChainAsNative { + fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + match (kind, origin) { + (OriginKind::Native, MultiLocation::X1(Junction::Parent)) => Ok(RelayOrigin::get()), + (_, origin) => Err(origin), + } + } +} + +pub struct SignedAccountId32AsNative( + PhantomData<(Network, Origin)> +); +impl< + Network: Get, + Origin: OriginTrait, +> ConvertOrigin for SignedAccountId32AsNative where + Origin::AccountId: From<[u8; 32]>, +{ + fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + match (kind, origin) { + (OriginKind::Native, MultiLocation::X1(Junction::AccountId32 { id, network })) + if matches!(network, NetworkId::Any) || network == Network::get() + => Ok(Origin::signed(id.into())), + (_, origin) => Err(origin), + } + } +} diff --git a/xcm/xcm-executor/Cargo.toml b/xcm/xcm-executor/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..a3637bb008d0f9506a1651d03b1f66df745c8cb3 --- /dev/null +++ b/xcm/xcm-executor/Cargo.toml @@ -0,0 +1,30 @@ +[package] +authors = ["Parity Technologies "] +edition = "2018" +name = "xcm-executor" +description = "An abstract and configurable XCM message executor." +version = "0.8.22" + +[dependencies] +impl-trait-for-tuples = "0.2.0" +parity-scale-codec = { version = "1.3.5", default-features = false, features = ["derive"] } +xcm = { path = "..", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "parity-scale-codec/std", + "xcm/std", + "sp-std/std", + "sp-io/std", + "sp-arithmetic/std", + "sp-core/std", + "sp-runtime/std", + "frame-support/std", +] diff --git a/xcm/xcm-executor/src/assets.rs b/xcm/xcm-executor/src/assets.rs new file mode 100644 index 0000000000000000000000000000000000000000..1f37c28d9be3ccd62b7235f4aeb10d1675a7965f --- /dev/null +++ b/xcm/xcm-executor/src/assets.rs @@ -0,0 +1,622 @@ +// Copyright 2020 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 sp_std::{prelude::*, mem, collections::{btree_map::BTreeMap, btree_set::BTreeSet}}; +use xcm::v0::{MultiAsset, MultiLocation, AssetInstance}; +use sp_runtime::RuntimeDebug; + +/// Classification of an asset being concrete or abstract. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, RuntimeDebug)] +pub enum AssetId { + Concrete(MultiLocation), + Abstract(Vec), +} + +impl AssetId { + /// Prepend a MultiLocation to a concrete asset, giving it a new root location. + pub fn reanchor(&mut self, prepend: &MultiLocation) -> Result<(), ()> { + if let AssetId::Concrete(ref mut l) = self { + l.prepend_with(prepend.clone()).map_err(|_| ())?; + } + Ok(()) + } +} + +/// List of concretely identified fungible and non-fungible assets. +#[derive(Default, Clone, RuntimeDebug)] +pub struct Assets { + pub fungible: BTreeMap, + pub non_fungible: BTreeSet<(AssetId, AssetInstance)>, +} + +impl From> for Assets { + fn from(assets: Vec) -> Assets { + let mut result = Self::default(); + for asset in assets.into_iter() { + result.saturating_subsume(asset) + } + result + } +} + +impl From for Vec { + fn from(a: Assets) -> Self { + a.into_assets_iter().collect() + } +} + +impl Assets { + /// An iterator over the fungible assets. + pub fn fungible_assets_iter<'a>(&'a self) -> impl Iterator + 'a { + self.fungible.iter() + .map(|(id, &amount)| match id.clone() { + AssetId::Concrete(id) => MultiAsset::ConcreteFungible { id, amount }, + AssetId::Abstract(id) => MultiAsset::AbstractFungible { id, amount }, + }) + } + + /// An iterator over the non-fungible assets. + pub fn non_fungible_assets_iter<'a>(&'a self) -> impl Iterator + 'a { + self.non_fungible.iter() + .map(|&(ref class, ref instance)| match class.clone() { + AssetId::Concrete(class) => MultiAsset::ConcreteNonFungible { class, instance: instance.clone() }, + AssetId::Abstract(class) => MultiAsset::AbstractNonFungible { class, instance: instance.clone() }, + }) + } + + /// An iterator over all assets. + pub fn into_assets_iter(self) -> impl Iterator { + let fungible = self.fungible.into_iter() + .map(|(id, amount)| match id { + AssetId::Concrete(id) => MultiAsset::ConcreteFungible { id, amount }, + AssetId::Abstract(id) => MultiAsset::AbstractFungible { id, amount }, + }); + let non_fungible = self.non_fungible.into_iter() + .map(|(id, instance)| match id { + AssetId::Concrete(class) => MultiAsset::ConcreteNonFungible { class, instance }, + AssetId::Abstract(class) => MultiAsset::AbstractNonFungible { class, instance }, + }); + fungible.chain(non_fungible) + } + + /// An iterator over all assets. + pub fn assets_iter<'a>(&'a self) -> impl Iterator + 'a { + let fungible = self.fungible_assets_iter(); + let non_fungible = self.non_fungible_assets_iter(); + fungible.chain(non_fungible) + } + + /// Modify `self` to include a `MultiAsset`, saturating if necessary. + /// Only works on concretely identified assets; wildcards will be swallowed without error. + pub fn saturating_subsume(&mut self, asset: MultiAsset) { + match asset { + MultiAsset::ConcreteFungible { id, amount } => { + self.saturating_subsume_fungible(AssetId::Concrete(id), amount); + } + MultiAsset::AbstractFungible { id, amount } => { + self.saturating_subsume_fungible(AssetId::Abstract(id), amount); + } + MultiAsset::ConcreteNonFungible { class, instance} => { + self.saturating_subsume_non_fungible(AssetId::Concrete(class), instance); + } + MultiAsset::AbstractNonFungible { class, instance} => { + self.saturating_subsume_non_fungible(AssetId::Abstract(class), instance); + } + _ => (), + } + } + + /// Modify `self` to include a new fungible asset by `id` and `amount`, + /// saturating if necessary. + pub fn saturating_subsume_fungible(&mut self, id: AssetId, amount: u128) { + self.fungible + .entry(id) + .and_modify(|e| *e = e.saturating_add(amount)) + .or_insert(amount); + } + + /// Modify `self` to include a new non-fungible asset by `class` and `instance`. + pub fn saturating_subsume_non_fungible(&mut self, class: AssetId, instance: AssetInstance) { + self.non_fungible.insert((class, instance)); + } + + /// Alter any concretely identified assets according to the given `MultiLocation`. + /// + /// WARNING: For now we consider this infallible and swallow any errors. It is thus the caller's responsibility to + /// ensure that any internal asset IDs are able to be prepended without overflow. + pub fn reanchor(&mut self, prepend: &MultiLocation) { + let mut fungible = Default::default(); + mem::swap(&mut self.fungible, &mut fungible); + self.fungible = fungible.into_iter() + .map(|(mut id, amount)| { let _ = id.reanchor(prepend); (id, amount) }) + .collect(); + let mut non_fungible = Default::default(); + mem::swap(&mut self.non_fungible, &mut non_fungible); + self.non_fungible = non_fungible.into_iter() + .map(|(mut class, inst)| { let _ = class.reanchor(prepend); (class, inst) }) + .collect(); + } + + /// Return the assets in `self`, but (asset-wise) of no greater value than `assets`. + /// + /// Result is undefined if `assets` includes elements which match to the same asset more than once. + /// + /// Example: + /// + /// ``` + /// use xcm_executor::Assets; + /// use xcm::v0::{MultiAsset, MultiLocation}; + /// let assets_i_have: Assets = vec![ + /// MultiAsset::ConcreteFungible { id: MultiLocation::Null, amount: 100 }, + /// MultiAsset::AbstractFungible { id: vec![0], amount: 100 }, + /// ].into(); + /// let assets_they_want: Assets = vec![ + /// MultiAsset::ConcreteFungible { id: MultiLocation::Null, amount: 200 }, + /// MultiAsset::AbstractFungible { id: vec![0], amount: 50 }, + /// ].into(); + /// + /// let assets_we_can_trade: Assets = assets_i_have.min(assets_they_want.assets_iter()); + /// assert_eq!(assets_we_can_trade.into_assets_iter().collect::>(), vec![ + /// MultiAsset::ConcreteFungible { id: MultiLocation::Null, amount: 100 }, + /// MultiAsset::AbstractFungible { id: vec![0], amount: 50 }, + /// ]); + /// ``` + pub fn min<'a, M, I>(&self, assets: I) -> Self + where + M: 'a + sp_std::borrow::Borrow, + I: IntoIterator, + { + let mut result = Assets::default(); + for asset in assets.into_iter() { + match asset.borrow() { + MultiAsset::None => (), + MultiAsset::All => return self.clone(), + MultiAsset::AllFungible => { + // Replace `result.fungible` with all fungible assets, + // keeping `result.non_fungible` the same. + result = Assets { + fungible: self.fungible.clone(), + non_fungible: result.non_fungible, + } + }, + MultiAsset::AllNonFungible => { + // Replace `result.non_fungible` with all non-fungible assets, + // keeping `result.fungible` the same. + result = Assets { + fungible: result.fungible, + non_fungible: self.non_fungible.clone(), + } + }, + MultiAsset::AllAbstractFungible { id } => { + for asset in self.fungible_assets_iter() { + match &asset { + MultiAsset::AbstractFungible { id: identifier, .. } => { + if id == identifier { result.saturating_subsume(asset) } + }, + _ => (), + } + } + }, + MultiAsset::AllAbstractNonFungible { class } => { + for asset in self.non_fungible_assets_iter() { + match &asset { + MultiAsset::AbstractNonFungible { class: c, .. } => { + if class == c { result.saturating_subsume(asset) } + }, + _ => (), + } + } + } + MultiAsset::AllConcreteFungible { id } => { + for asset in self.fungible_assets_iter() { + match &asset { + MultiAsset::ConcreteFungible { id: identifier, .. } => { + if id == identifier { result.saturating_subsume(asset) } + }, + _ => (), + } + } + }, + MultiAsset::AllConcreteNonFungible { class } => { + for asset in self.non_fungible_assets_iter() { + match &asset { + MultiAsset::ConcreteNonFungible { class: c, .. } => { + if class == c { result.saturating_subsume(asset) } + }, + _ => (), + } + } + } + x @ MultiAsset::ConcreteFungible { .. } | x @ MultiAsset::AbstractFungible { .. } => { + let (id, amount) = match x { + MultiAsset::ConcreteFungible { id, amount } => (AssetId::Concrete(id.clone()), *amount), + MultiAsset::AbstractFungible { id, amount } => (AssetId::Abstract(id.clone()), *amount), + _ => unreachable!(), + }; + if let Some(v) = self.fungible.get(&id) { + result.saturating_subsume_fungible(id, amount.min(*v)); + } + }, + x @ MultiAsset::ConcreteNonFungible { .. } | x @ MultiAsset::AbstractNonFungible { .. } => { + let (class, instance) = match x { + MultiAsset::ConcreteNonFungible { class, instance } => (AssetId::Concrete(class.clone()), instance.clone()), + MultiAsset::AbstractNonFungible { class, instance } => (AssetId::Abstract(class.clone()), instance.clone()), + _ => unreachable!(), + }; + let item = (class, instance); + if self.non_fungible.contains(&item) { + result.non_fungible.insert(item); + } + } + } + } + result + } + + /// Take all possible assets up to `assets` from `self`, mutating `self` and returning the + /// assets taken. + /// + /// Wildcards work. + /// + /// Example: + /// + /// ``` + /// use xcm_executor::Assets; + /// use xcm::v0::{MultiAsset, MultiLocation}; + /// let mut assets_i_have: Assets = vec![ + /// MultiAsset::ConcreteFungible { id: MultiLocation::Null, amount: 100 }, + /// MultiAsset::AbstractFungible { id: vec![0], amount: 100 }, + /// ].into(); + /// let assets_they_want = vec![ + /// MultiAsset::AllAbstractFungible { id: vec![0] }, + /// ]; + /// + /// let assets_they_took: Assets = assets_i_have.saturating_take(assets_they_want); + /// assert_eq!(assets_they_took.into_assets_iter().collect::>(), vec![ + /// MultiAsset::AbstractFungible { id: vec![0], amount: 100 }, + /// ]); + /// assert_eq!(assets_i_have.into_assets_iter().collect::>(), vec![ + /// MultiAsset::ConcreteFungible { id: MultiLocation::Null, amount: 100 }, + /// ]); + /// ``` + pub fn saturating_take(&mut self, assets: I) -> Assets + where + I: IntoIterator, + { + let mut result = Assets::default(); + for asset in assets.into_iter() { + match asset { + MultiAsset::None => (), + MultiAsset::All => return self.swapped(Assets::default()), + MultiAsset::AllFungible => { + // Remove all fungible assets, and copy them into `result`. + let fungible = mem::replace(&mut self.fungible, Default::default()); + fungible.into_iter().for_each(|(id, amount)| { + result.saturating_subsume_fungible(id, amount); + }) + }, + MultiAsset::AllNonFungible => { + // Remove all non-fungible assets, and copy them into `result`. + let non_fungible = mem::replace(&mut self.non_fungible, Default::default()); + non_fungible.into_iter().for_each(|(class, instance)| { + result.saturating_subsume_non_fungible(class, instance); + }); + }, + x @ MultiAsset::AllAbstractFungible { .. } | x @ MultiAsset::AllConcreteFungible { .. } => { + let id = match x { + MultiAsset::AllConcreteFungible { id } => AssetId::Concrete(id), + MultiAsset::AllAbstractFungible { id } => AssetId::Abstract(id), + _ => unreachable!(), + }; + // At the end of this block, we will be left with only the non-matching fungibles. + let mut non_matching_fungibles = BTreeMap::::new(); + let fungible = mem::replace(&mut self.fungible, Default::default()); + fungible.into_iter().for_each(|(iden, amount)| { + if iden == id { + result.saturating_subsume_fungible(iden, amount); + } else { + non_matching_fungibles.insert(iden, amount); + } + }); + self.fungible = non_matching_fungibles; + }, + x @ MultiAsset::AllAbstractNonFungible { .. } | x @ MultiAsset::AllConcreteNonFungible { .. } => { + let class = match x { + MultiAsset::AllConcreteNonFungible { class } => AssetId::Concrete(class), + MultiAsset::AllAbstractNonFungible { class } => AssetId::Abstract(class), + _ => unreachable!(), + }; + // At the end of this block, we will be left with only the non-matching non-fungibles. + let mut non_matching_non_fungibles = BTreeSet::<(AssetId, AssetInstance)>::new(); + let non_fungible = mem::replace(&mut self.non_fungible, Default::default()); + non_fungible.into_iter().for_each(|(c, instance)| { + if class == c { + result.saturating_subsume_non_fungible(c, instance); + } else { + non_matching_non_fungibles.insert((c, instance)); + } + }); + self.non_fungible = non_matching_non_fungibles; + }, + x @ MultiAsset::ConcreteFungible {..} | x @ MultiAsset::AbstractFungible {..} => { + let (id, amount) = match x { + MultiAsset::ConcreteFungible { id, amount } => (AssetId::Concrete(id), amount), + MultiAsset::AbstractFungible { id, amount } => (AssetId::Abstract(id), amount), + _ => unreachable!(), + }; + // remove the maxmimum possible up to id/amount from self, add the removed onto + // result + let maybe_value = self.fungible.get(&id); + if let Some(&e) = maybe_value { + if e > amount { + self.fungible.insert(id.clone(), e - amount); + result.saturating_subsume_fungible(id, amount); + } else { + self.fungible.remove(&id); + result.saturating_subsume_fungible(id, e.clone()); + } + } + } + x @ MultiAsset::ConcreteNonFungible {..} | x @ MultiAsset::AbstractNonFungible {..} => { + let (class, instance) = match x { + MultiAsset::ConcreteNonFungible { class, instance } => (AssetId::Concrete(class), instance), + MultiAsset::AbstractNonFungible { class, instance } => (AssetId::Abstract(class), instance), + _ => unreachable!(), + }; + // remove the maxmimum possible up to id/amount from self, add the removed onto + // result + if let Some(entry) = self.non_fungible.take(&(class, instance)) { + result.non_fungible.insert(entry); + } + } + } + } + result + } + + /// Swaps two mutable Assets, without deinitializing either one. + pub fn swapped(&mut self, mut with: Assets) -> Self { + mem::swap(&mut *self, &mut with); + with + } +} + +#[cfg(test)] +mod tests { + use super::*; + #[allow(non_snake_case)] + fn AF(id: u8, amount: u128) -> MultiAsset { + MultiAsset::AbstractFungible { id: vec![id], amount } + } + #[allow(non_snake_case)] + fn ANF(class: u8, instance_id: u128) -> MultiAsset { + MultiAsset::AbstractNonFungible { class: vec![class], instance: AssetInstance::Index { id: instance_id } } + } + #[allow(non_snake_case)] + fn CF(amount: u128) -> MultiAsset { + MultiAsset::ConcreteFungible { id: MultiLocation::Null, amount } + } + #[allow(non_snake_case)] + fn CNF(instance_id: u128) -> MultiAsset { + MultiAsset::ConcreteNonFungible { class: MultiLocation::Null, instance: AssetInstance::Index { id: instance_id } } + } + + fn test_assets() -> Assets { + let mut assets_vec: Vec = Vec::new(); + assets_vec.push(AF(1, 100)); + assets_vec.push(ANF(2, 200)); + assets_vec.push(CF(300)); + assets_vec.push(CNF(400)); + assets_vec.into() + } + + #[test] + fn into_assets_iter_works() { + let assets = test_assets(); + let mut iter = assets.into_assets_iter(); + // Order defined by implementation: CF, AF, CNF, ANF + assert_eq!(Some(CF(300)), iter.next()); + assert_eq!(Some(AF(1, 100)), iter.next()); + assert_eq!(Some(CNF(400)), iter.next()); + assert_eq!(Some(ANF(2, 200)), iter.next()); + assert_eq!(None, iter.next()); + } + + #[test] + fn assets_into_works() { + let mut assets_vec: Vec = Vec::new(); + assets_vec.push(AF(1, 100)); + assets_vec.push(ANF(2, 200)); + assets_vec.push(CF(300)); + assets_vec.push(CNF(400)); + // Push same group of tokens again + assets_vec.push(AF(1, 100)); + assets_vec.push(ANF(2, 200)); + assets_vec.push(CF(300)); + assets_vec.push(CNF(400)); + + let assets: Assets = assets_vec.into(); + let mut iter = assets.into_assets_iter(); + // Fungibles add + assert_eq!(Some(CF(600)), iter.next()); + assert_eq!(Some(AF(1, 200)), iter.next()); + // Non-fungibles collapse + assert_eq!(Some(CNF(400)), iter.next()); + assert_eq!(Some(ANF(2, 200)), iter.next()); + assert_eq!(None, iter.next()); + } + + #[test] + fn min_all_and_none_works() { + let assets = test_assets(); + let none = vec![MultiAsset::None]; + let all = vec![MultiAsset::All]; + + let none_min = assets.min(none.iter()); + assert_eq!(None, none_min.assets_iter().next()); + let all_min = assets.min(all.iter()); + assert!(all_min.assets_iter().eq(assets.assets_iter())); + } + + #[test] + fn min_all_fungible_and_all_non_fungible_works() { + let assets = test_assets(); + let fungible = vec![MultiAsset::AllFungible]; + let non_fungible = vec![MultiAsset::AllNonFungible]; + + let fungible = assets.min(fungible.iter()); + let fungible = fungible.assets_iter().collect::>(); + assert_eq!(fungible, vec![CF(300), AF(1, 100)]); + let non_fungible = assets.min(non_fungible.iter()); + let non_fungible = non_fungible.assets_iter().collect::>(); + assert_eq!(non_fungible, vec![CNF(400), ANF(2, 200)]); + } + + #[test] + fn min_all_abstract_works() { + let assets = test_assets(); + let fungible = vec![MultiAsset::AllAbstractFungible { id: vec![1] }]; + let non_fungible = vec![MultiAsset::AllAbstractNonFungible { class: vec![2] }]; + + let fungible = assets.min(fungible.iter()); + let fungible = fungible.assets_iter().collect::>(); + assert_eq!(fungible, vec![AF(1, 100)]); + let non_fungible = assets.min(non_fungible.iter()); + let non_fungible = non_fungible.assets_iter().collect::>(); + assert_eq!(non_fungible, vec![ANF(2, 200)]); + } + + #[test] + fn min_all_concrete_works() { + let assets = test_assets(); + let fungible = vec![MultiAsset::AllConcreteFungible { id: MultiLocation::Null }]; + let non_fungible = vec![MultiAsset::AllConcreteNonFungible { class: MultiLocation::Null }]; + + let fungible = assets.min(fungible.iter()); + let fungible = fungible.assets_iter().collect::>(); + assert_eq!(fungible, vec![CF(300)]); + let non_fungible = assets.min(non_fungible.iter()); + let non_fungible = non_fungible.assets_iter().collect::>(); + assert_eq!(non_fungible, vec![CNF(400)]); + } + + #[test] + fn min_basic_works() { + let assets1 = test_assets(); + + let mut assets2_vec: Vec = Vec::new(); + // This is less than 100, so it will decrease to 50 + assets2_vec.push(AF(1, 50)); + // This asset does not exist, so not included + assets2_vec.push(ANF(2, 400)); + // This is more then 300, so it should stay at 300 + assets2_vec.push(CF(600)); + // This asset should be included + assets2_vec.push(CNF(400)); + let assets2: Assets = assets2_vec.into(); + + let assets_min = assets1.min(assets2.assets_iter()); + let assets_min = assets_min.into_assets_iter().collect::>(); + assert_eq!(assets_min, vec![CF(300), AF(1, 50), CNF(400)]); + } + + #[test] + fn saturating_take_all_and_none_works() { + let mut assets = test_assets(); + let none = vec![MultiAsset::None]; + let all = vec![MultiAsset::All]; + + let taken_none = assets.saturating_take(none); + assert_eq!(None, taken_none.assets_iter().next()); + let taken_all = assets.saturating_take(all); + // Everything taken + assert_eq!(None, assets.assets_iter().next()); + let all_iter = taken_all.assets_iter(); + assert!(all_iter.eq(test_assets().assets_iter())); + } + + #[test] + fn saturating_take_all_fungible_and_all_non_fungible_works() { + let mut assets = test_assets(); + let fungible = vec![MultiAsset::AllFungible]; + let non_fungible = vec![MultiAsset::AllNonFungible]; + + let fungible = assets.saturating_take(fungible); + let fungible = fungible.assets_iter().collect::>(); + assert_eq!(fungible, vec![CF(300), AF(1, 100)]); + let non_fungible = assets.saturating_take(non_fungible); + let non_fungible = non_fungible.assets_iter().collect::>(); + assert_eq!(non_fungible, [CNF(400), ANF(2, 200)]); + // Assets completely drained + assert_eq!(None, assets.assets_iter().next()); + } + + #[test] + fn saturating_take_all_abstract_works() { + let mut assets = test_assets(); + let fungible = vec![MultiAsset::AllAbstractFungible { id: vec![1] }]; + let non_fungible = vec![MultiAsset::AllAbstractNonFungible { class: vec![2] }]; + + let fungible = assets.saturating_take(fungible); + let fungible = fungible.assets_iter().collect::>(); + assert_eq!(fungible, vec![AF(1, 100)]); + let non_fungible = assets.saturating_take(non_fungible); + let non_fungible = non_fungible.assets_iter().collect::>(); + assert_eq!(non_fungible, vec![ANF(2, 200)]); + // Assets drained of abstract + let final_assets = assets.assets_iter().collect::>(); + assert_eq!(final_assets, vec![CF(300), CNF(400)]); + } + + #[test] + fn saturating_take_all_concrete_works() { + let mut assets = test_assets(); + let fungible = vec![MultiAsset::AllConcreteFungible { id: MultiLocation::Null }]; + let non_fungible = vec![MultiAsset::AllConcreteNonFungible { class: MultiLocation::Null }]; + + let fungible = assets.saturating_take(fungible); + let fungible = fungible.assets_iter().collect::>(); + assert_eq!(fungible, vec![CF(300)]); + let non_fungible = assets.saturating_take(non_fungible); + let non_fungible = non_fungible.assets_iter().collect::>(); + assert_eq!(non_fungible, vec![CNF(400)]); + // Assets drained of concrete + let assets = assets.assets_iter().collect::>(); + assert_eq!(assets, vec![AF(1, 100), ANF(2, 200)]); + } + + #[test] + fn saturating_take_basic_works() { + let mut assets1 = test_assets(); + + let mut assets2_vec: Vec = Vec::new(); + // We should take 50 + assets2_vec.push(AF(1, 50)); + // This asset should not be taken + assets2_vec.push(ANF(2, 400)); + // This is more then 300, so it takes everything + assets2_vec.push(CF(600)); + // This asset should be taken + assets2_vec.push(CNF(400)); + + let taken = assets1.saturating_take(assets2_vec); + let taken = taken.into_assets_iter().collect::>(); + assert_eq!(taken, vec![CF(300), AF(1, 50), CNF(400)]); + + let assets = assets1.into_assets_iter().collect::>(); + assert_eq!(assets, vec![AF(1, 50), ANF(2, 200)]); + } +} diff --git a/xcm/xcm-executor/src/config.rs b/xcm/xcm-executor/src/config.rs new file mode 100644 index 0000000000000000000000000000000000000000..e1008c5563b149ef94f90fa5ef97c81a122a038c --- /dev/null +++ b/xcm/xcm-executor/src/config.rs @@ -0,0 +1,43 @@ +// Copyright 2020 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::v0::SendXcm; +use frame_support::dispatch::{Dispatchable, Parameter}; +use crate::traits::{TransactAsset, ConvertOrigin, FilterAssetLocation, InvertLocation}; + +/// The trait to parametrize the `XcmExecutor`. +pub trait Config { + /// The outer call dispatch type. + type Call: Parameter + Dispatchable; + + /// How to send an onward XCM message. + type XcmSender: SendXcm; + + /// How to withdraw and deposit an asset. + type AssetTransactor: TransactAsset; + + /// How to get a call origin from a `OriginKind` value. + type OriginConverter: ConvertOrigin<::Origin>; + + /// Combinations of (Location, Asset) pairs which we unilateral trust as reserves. + type IsReserve: FilterAssetLocation; + + /// Combinations of (Location, Asset) pairs which we bilateral trust as teleporters. + type IsTeleporter: FilterAssetLocation; + + /// Means of inverting a location. + type LocationInverter: InvertLocation; +} diff --git a/xcm/xcm-executor/src/lib.rs b/xcm/xcm-executor/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..5bef32bf1eb5872179f3ff48b05beda49aa7c189 --- /dev/null +++ b/xcm/xcm-executor/src/lib.rs @@ -0,0 +1,157 @@ +// Copyright 2020 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 . + +#![cfg_attr(not(feature = "std"), no_std)] + +use sp_std::{prelude::*, marker::PhantomData, convert::TryInto}; +use frame_support::{ensure, dispatch::Dispatchable}; +use parity_scale_codec::Decode; +use xcm::v0::{ + Xcm, Order, ExecuteXcm, SendXcm, Error as XcmError, Result as XcmResult, + MultiLocation, MultiAsset, Junction, +}; + +pub mod traits; +mod assets; +mod config; + +use traits::{TransactAsset, ConvertOrigin, FilterAssetLocation, InvertLocation}; +pub use assets::{Assets, AssetId}; +pub use config::Config; + +pub struct XcmExecutor(PhantomData); + +impl ExecuteXcm for XcmExecutor { + fn execute_xcm(origin: MultiLocation, msg: Xcm) -> XcmResult { + let (mut holding, effects) = match (origin.clone(), msg) { + (origin, Xcm::RelayedFrom { superorigin, inner }) => { + // We ensure that it doesn't contain any `Parent` Junctions which would imply a privilege escalation. + let mut new_origin = origin; + for j in superorigin.into_iter() { + ensure!(j.is_sub_consensus(), XcmError::EscalationOfPrivilege); + new_origin.push(j).map_err(|_| XcmError::MultiLocationFull)?; + } + return Self::execute_xcm( + new_origin, + (*inner).try_into().map_err(|_| XcmError::UnhandledXcmVersion)? + ) + } + (origin, Xcm::WithdrawAsset { assets, effects }) => { + // Take `assets` from the origin account (on-chain) and place in holding. + let mut holding = Assets::default(); + for asset in assets { + let withdrawn = Config::AssetTransactor::withdraw_asset(&asset, &origin)?; + holding.saturating_subsume(withdrawn); + } + (holding, effects) + } + (origin, Xcm::ReserveAssetDeposit { assets, effects }) => { + // check whether we trust origin to be our reserve location for this asset. + if assets.iter().all(|asset| Config::IsReserve::filter_asset_location(asset, &origin)) { + // We only trust the origin to send us assets that they identify as their + // sovereign assets. + (Assets::from(assets), effects) + } else { + Err(XcmError::UntrustedReserveLocation)? + } + } + (origin, Xcm::TeleportAsset { assets, effects }) => { + // check whether we trust origin to teleport this asset to us via config trait. + // TODO: should de-wildcard `assets` before passing in. + frame_support::debug::print!("Teleport from {:?}", origin); + if assets.iter().all(|asset| Config::IsTeleporter::filter_asset_location(asset, &origin)) { + // We only trust the origin to send us assets that they identify as their + // sovereign assets. + (Assets::from(assets), effects) + } else { + Err(XcmError::UntrustedTeleportLocation)? + } + } + (origin, Xcm::Transact { origin_type, call }) => { + // We assume that the Relay-chain is allowed to use transact on this parachain. + + // TODO: Weight fees should be paid. + + // TODO: allow this to be configurable in the trait. + // TODO: allow the trait to issue filters for the relay-chain + let message_call = Config::Call::decode(&mut &call[..]).map_err(|_| XcmError::FailedToDecode)?; + let dispatch_origin = Config::OriginConverter::convert_origin(origin, origin_type) + .map_err(|_| XcmError::BadOrigin)?; + let _ok = message_call.dispatch(dispatch_origin).is_ok(); + // Not much to do with the result as it is. It's up to the parachain to ensure that the + // message makes sense. + return Ok(()); + } + (origin, Xcm::RelayTo { dest: MultiLocation::X1(Junction::Parachain { id }), inner }) => { + let msg = Xcm::RelayedFrom { superorigin: origin, inner }.into(); + return Config::XcmSender::send_xcm(Junction::Parachain { id }.into(), msg) + }, + _ => Err(XcmError::UnhandledXcmMessage)?, // Unhandled XCM message. + }; + + // TODO: stuff that should happen after holding is populated but before effects, + // including depositing fees for effects from holding account. + + for effect in effects.into_iter() { + let _ = Self::execute_effects(&origin, &mut holding, effect)?; + } + + // TODO: stuff that should happen after effects including refunding unused fees. + + Ok(()) + } +} + +impl XcmExecutor { + fn reanchored(mut assets: Assets, dest: &MultiLocation) -> Vec { + let inv_dest = Config::LocationInverter::invert_location(&dest); + assets.reanchor(&inv_dest); + assets.into_assets_iter().collect::>() + } + + fn execute_effects(_origin: &MultiLocation, holding: &mut Assets, effect: Order) -> XcmResult { + match effect { + Order::DepositAsset { assets, dest } => { + let deposited = holding.saturating_take(assets); + for asset in deposited.into_assets_iter() { + Config::AssetTransactor::deposit_asset(&asset, &dest)?; + } + Ok(()) + }, + Order::DepositReserveAsset { assets, dest, effects } => { + let deposited = holding.saturating_take(assets); + for asset in deposited.assets_iter() { + Config::AssetTransactor::deposit_asset(&asset, &dest)?; + } + let assets = Self::reanchored(deposited, &dest); + Config::XcmSender::send_xcm(dest, Xcm::ReserveAssetDeposit { assets, effects }) + }, + Order::InitiateReserveWithdraw { assets, reserve, effects} => { + let assets = Self::reanchored(holding.saturating_take(assets), &reserve); + Config::XcmSender::send_xcm(reserve, Xcm::WithdrawAsset { assets, effects }) + } + Order::InitiateTeleport { assets, dest, effects} => { + let assets = Self::reanchored(holding.saturating_take(assets), &dest); + Config::XcmSender::send_xcm(dest, Xcm::TeleportAsset { assets, effects }) + } + Order::QueryHolding { query_id, dest, assets } => { + let assets = Self::reanchored(holding.min(assets.iter()), &dest); + Config::XcmSender::send_xcm(dest, Xcm::Balances { query_id, assets }) + } + _ => Err(XcmError::UnhandledEffect)?, + } + } +} diff --git a/xcm/xcm-executor/src/traits.rs b/xcm/xcm-executor/src/traits.rs new file mode 100644 index 0000000000000000000000000000000000000000..d01791dfa2344dde7ff933bc98bf49caa22c35e4 --- /dev/null +++ b/xcm/xcm-executor/src/traits.rs @@ -0,0 +1,159 @@ +// Copyright 2020 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 sp_std::{result::Result, marker::PhantomData, convert::TryFrom}; +use sp_runtime::traits::CheckedConversion; +use xcm::v0::{Error as XcmError, Result as XcmResult, MultiAsset, MultiLocation, OriginKind}; +use frame_support::traits::Get; + +pub trait FilterAssetLocation { + /// A filter to distinguish between asset/location pairs. + fn filter_asset_location(asset: &MultiAsset, origin: &MultiLocation) -> bool; +} + +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl FilterAssetLocation for Tuple { + fn filter_asset_location(what: &MultiAsset, origin: &MultiLocation) -> bool { + for_tuples!( #( + if Tuple::filter_asset_location(what, origin) { return true } + )* ); + false + } +} + +pub struct NativeAsset; +impl FilterAssetLocation for NativeAsset { + fn filter_asset_location(asset: &MultiAsset, origin: &MultiLocation) -> bool { + matches!(asset, MultiAsset::ConcreteFungible { ref id, .. } if id == origin) + } +} + + +pub struct Case(PhantomData); +impl> FilterAssetLocation for Case { + fn filter_asset_location(asset: &MultiAsset, origin: &MultiLocation) -> bool { + let (a, o) = T::get(); + &a == asset && &o == origin + } +} + +/// Facility for asset transacting. +/// +/// This should work with as many asset/location combinations as possible. Locations to support may include non- +/// account locations such as a `MultiLocation::X1(Junction::Parachain)`. Different chains may handle them in +/// different ways. +pub trait TransactAsset { + /// Deposit the `what` asset into the account of `who`. + fn deposit_asset(what: &MultiAsset, who: &MultiLocation) -> XcmResult; + + /// Withdraw the given asset from the consensus system. Return the actual asset withdrawn. In + /// the case of `what` being a wildcard, this may be something more specific. + fn withdraw_asset(what: &MultiAsset, who: &MultiLocation) -> Result; + + /// Move an `asset` `from` one location in `to` another location. + /// + /// Undefined if from account doesn't own this asset. + fn transfer_asset(asset: &MultiAsset, from: &MultiLocation, to: &MultiLocation) -> Result { + let withdrawn = Self::withdraw_asset(asset, from)?; + Self::deposit_asset(&withdrawn, to)?; + Ok(withdrawn) + } +} + +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl TransactAsset for Tuple { + fn deposit_asset(what: &MultiAsset, who: &MultiLocation) -> XcmResult { + for_tuples!( #( + match Tuple::deposit_asset(what, who) { o @ Ok(_) => return o, _ => () } + )* ); + Err(XcmError::Unimplemented) + } + fn withdraw_asset(what: &MultiAsset, who: &MultiLocation) -> Result { + for_tuples!( #( + match Tuple::withdraw_asset(what, who) { o @ Ok(_) => return o, _ => () } + )* ); + Err(XcmError::Unimplemented) + } +} + + +pub trait MatchesFungible { + fn matches_fungible(a: &MultiAsset) -> Option; +} +pub struct IsConcrete(PhantomData); +impl, B: TryFrom> MatchesFungible for IsConcrete { + fn matches_fungible(a: &MultiAsset) -> Option { + match a { + MultiAsset::ConcreteFungible { id, amount } if id == &T::get() => + CheckedConversion::checked_from(*amount), + _ => None, + } + } +} +pub struct IsAbstract(PhantomData); +impl, B: TryFrom> MatchesFungible for IsAbstract { + fn matches_fungible(a: &MultiAsset) -> Option { + match a { + MultiAsset::AbstractFungible { id, amount } if &id[..] == T::get() => + CheckedConversion::checked_from(*amount), + _ => None, + } + } +} +impl, X: MatchesFungible, Y: MatchesFungible> MatchesFungible for (X, Y) { + fn matches_fungible(a: &MultiAsset) -> Option { + X::matches_fungible(a).or_else(|| Y::matches_fungible(a)) + } +} + +pub trait LocationConversion { + fn from_location(location: &MultiLocation) -> Option; + fn try_into_location(who: AccountId) -> Result; +} + +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl LocationConversion for Tuple { + fn from_location(location: &MultiLocation) -> Option { + for_tuples!( #( + if let Some(result) = Tuple::from_location(location) { return Some(result) } + )* ); + None + } + fn try_into_location(who: AccountId) -> Result { + for_tuples!( #( + let who = match Tuple::try_into_location(who) { Err(w) => w, r => return r }; + )* ); + Err(who) + } +} + +pub trait ConvertOrigin { + fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result; +} + +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl ConvertOrigin for Tuple { + fn convert_origin(origin: MultiLocation, kind: OriginKind) -> Result { + for_tuples!( #( + let origin = match Tuple::convert_origin(origin, kind) { Err(o) => o, r => return r }; + )* ); + Err(origin) + } +} + +pub trait InvertLocation { + fn invert_location(l: &MultiLocation) -> MultiLocation; +}